Compartilhar via


Criar um índice para recuperação agêntica no Azure AI Search

Observação

Esse recurso está atualmente em versão prévia pública. Essa visualização é fornecida sem um contrato de nível de serviço e não é recomendada para utilização em produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares para Versões Prévias do Microsoft Azure.

Na Pesquisa de IA do Azure, a recuperação agêntica é uma nova arquitetura de consulta paralela que usa um modelo de conclusão de chat para planejamento de consultas, gerando subconsultas que ampliam o escopo do que é pesquisável e relevante.

As subconsultas são criadas internamente. Determinados aspectos das subconsultas são determinados pelo índice de pesquisa. Este artigo explica quais elementos de índice têm um efeito na lógica de consulta. Nenhum dos elementos necessários é novo ou específico à recuperação agentiva, o que significa que você pode usar um índice existente se ele atender aos critérios identificados neste artigo, mesmo que tenha sido criado usando versões anteriores da API.

Um índice de pesquisa usado na recuperação agêncica é especificado como fonte de conhecimento em um agente de conhecimento e é:

  • Uma indexação existente que contém conteúdo pesquisável. Esse índice é disponibilizado para recuperação por meio de agentes através de uma definição de fonte de conhecimento do índice de pesquisa.

  • Um índice gerado a partir de um pipeline do indexador de blobs. Esse índice é gerado e preenchido usando informações de uma fonte de conhecimento de blob. Ele é baseado em um modelo que atende a todos os critérios para agentes de conhecimento e recuperação por meio de agentes.

Critérios para a recuperação por meio de agentes

Um índice usado na recuperação por meio de agentes deve ter estes elementos:

  • Campos de cadeia de caracteres atribuídos como searchable e retrievable
  • Uma configuração semântica, com um defaultSemanticConfiguration
  • Campos de vetor e um vetorizador se você quiser incluir consultas de vetor no pipeline

Ele também deve ter campos que possam ser usados para citações, como nome de documento ou arquivo, nome de página ou capítulo ou pelo menos uma ID de parte.

Opcionalmente, os seguintes elementos de índice aumentam suas oportunidades de otimização:

  • scoringProfile com um defaultScoringProfile, para aumentar a relevância
  • synonymMaps para terminologia ou jargão
  • analyzers para regras ou padrões linguísticos (como preservação de espaço em branco ou caracteres especiais)

Definição de índice de exemplo

Este é um índice de exemplo que funciona para recuperação com agentes. Ele atende aos critérios dos elementos necessários.

{
  "name": "earth_at_night",
  "description": "Contains images an descriptions of our planet in darkness as captured from space by Earth-observing satellites and astronauts on the International Space Station over the past 25 years.",
  "fields": [
    {
      "name": "id", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "key": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
      "analyzer": "en.microsoft",
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk_vector_text_3_large", "type": "Collection(Edm.Single)",
      "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
      "dimensions": 3072,
      "vectorSearchProfile": "hnsw_text_3_large",
      "stored": false,
      "synonymMaps": []
    },
    {
      "name": "page_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "chapter_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    }
  ],
  "scoringProfiles": [],
  "suggesters": [],
  "analyzers": [],
  "normalizers": [],
  "tokenizers": [],
  "tokenFilters": [],
  "charFilters": [],
  "semantic": {
    "defaultConfiguration": "semantic_config",
    "configurations": [
      {
        "name": "semantic_config",
        "flightingOptIn": false,
        "prioritizedFields": {
          "prioritizedContentFields": [
            {
              "fieldName": "page_chunk"
            }
          ],
          "prioritizedKeywordsFields": []
        }
      }
    ]
  },
  "vectorSearch": {
    "algorithms": [
      {
        "name": "alg",
        "kind": "hnsw",
        "hnswParameters": {
          "metric": "cosine",
          "m": 4,
          "efConstruction": 400,
          "efSearch": 500
        }
      }
    ],
    "profiles": [
      {
        "name": "hnsw_text_3_large",
        "algorithm": "alg",
        "vectorizer": "azure_openai_text_3_large"
      }
    ],
    "vectorizers": [
      {
        "name": "azure_openai_text_3_large",
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
          "deploymentId": "text-embedding-3-large",
          "apiKey": "<redacted>",
          "modelName": "text-embedding-3-large"
        }
      }
    ],
    "compressions": []
  }
}

Pontos principais:

Na recuperação agêncica, um modelo de linguagem grande (LLM) é utilizado duas vezes. Primeiro, ele é usado para criar um plano de consulta. Depois que o plano de consulta é executado e os resultados da pesquisa são gerados, esses resultados são passados para a LLM novamente, dessa vez como dados de fundamento usados para formular uma resposta.

As LLMs consomem e emitem cadeias tokenizadas de conteúdo de texto simples legível por humanos. Por esse motivo, você deve ter searchable campos que forneçam cadeias de caracteres de texto sem formatação e sejam retrievable na resposta. Campos vetoriais e a busca em vetores também são importantes porque adicionam pesquisa de similaridade à recuperação de informações. Os vetores melhoram a qualidade da pesquisa que produz dados de referência, mas não são estritamente necessários. A Pesquisa de IA do Azure tem recursos internos que simplificam e automatizam a vetorização.

O índice de exemplo anterior inclui um campo de vetor usado no momento da consulta. Você não precisa do vetor nos resultados porque ele não é legível por humanos nem por LLM, mas observe que ele é searchable para busca em vetores. Como você não precisa de vetores na resposta, tanto retrievable quanto stored são falsos.

O vetorizador definido na configuração de pesquisa de vetor é fundamental. Ele determina se o campo de vetor é usado durante a execução da consulta. O vetorizador codifica as subconsultas de cadeia de caracteres em vetores durante a consulta para a busca de similaridade nos vetores. O vetorizador deve ser o mesmo modelo de inserção usado para criar os vetores no índice.

Todos os searchable campos são incluídos na execução da consulta. Não há suporte para uma select instrução que declara explicitamente quais campos consultar.

Adicionar uma descrição

Um campo de índice description é uma cadeia de caracteres definida pelo usuário que você pode usar para fornecer diretrizes para servidores LLMs e protocolo MCP ao decidir usar um índice específico para uma consulta. Esse texto legível por humanos é inestimável quando um sistema deve acessar vários índices e tomar uma decisão com base na descrição.

Uma descrição de índice é uma atualização de esquema e você pode adicioná-la sem precisar recompilar todo o índice.

  • O comprimento da cadeia de caracteres é máximo de 4.000 caracteres.
  • O conteúdo deve ser legível por humanos, no Unicode. Seu caso de uso deve determinar qual idioma usar (por exemplo, inglês ou outro idioma).

Adicionar uma configuração semântica

O índice deve ter pelo menos uma configuração semântica. A configuração semântica deve ter:

  • Um conjunto defaultSemanticConfiguration para uma configuração nomeada.
  • Um conjunto prioritizedContentFields para pelo menos um campo de cadeia de caracteres que seja searchable e retrievable.

Na configuração, prioritizedContentFields é necessário. Título e palavras-chave são opcionais. Para conteúdo em partes, talvez você também não tenha. No entanto, se você adicionar reconhecimento de entidade ou extração de frase-chave, poderá ter algumas palavras-chave associadas a cada parte que podem ser úteis em cenários de pesquisa, talvez em um perfil de pontuação.

Aqui está um exemplo de uma configuração semântica que funciona para recuperação agencial:

"semantic":{
   "defaultConfiguration":"semantic_config",
   "configurations":[
      {
         "name":"semantic_config",
         "flightingOptIn":false,
         "prioritizedFields":{
            "prioritizedFields":{
               "titleField":{
                  "fieldName":""
               },
               "prioritizedContentFields":[
                  {
                     "fieldName":"page_chunk"
                  }
               ],
               "prioritizedKeywordsFields":[
                  {
                     "fieldName":"Category"
                  },
                  {
                     "fieldName":"Tags"
                  },
                  {
                     "fieldName":"Location"
                  }
               ]
            }
         }
      }
   ]
}

Observação

A resposta fornece title, terms e content, que mapeiam para os campos priorizados nessa configuração.

Adicionar um vetorizador

Se você tiver campos vetoriais no índice, o plano de consulta os incluirá se eles estiverem searchable e tiverem uma atribuição vectorizer.

Um vetorizador especifica um modelo de incorporação que fornece conversões de texto para vetor no momento da consulta. Ele deve apontar para o mesmo modelo de inserção usado para codificar o conteúdo do vetor em seu índice. Você pode usar qualquer modelo de inserção compatível com o Azure AI Search. Os vetorizadores são especificados em campos de vetor por meio de um perfil de vetor.

Lembre-se da definição do campo de vetor no exemplo de índice. Os atributos em um campo de vetor incluem dimensões ou o número de inserções geradas pelo modelo e o perfil.

  {
    "name": "page_chunk_text_3_large", "type": "Collection(Edm.Single)",
    "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
    "dimensions": 3072,
    "vectorSearchProfile": "hnsw_text_3_large",
    "stored": false,
    "synonymMaps": []
  }

Perfis de vetor são configurações de vetorizadores, algoritmos e técnicas de compactação. Cada campo de vetor só pode usar um perfil, mas seu índice pode ter muitos caso você queira perfis exclusivos para cada campo de vetor.

Consultar vetores e chamar um vetorizador adiciona latência à solicitação geral, mas se você quiser uma pesquisa de similaridade, isso pode valer a pena.

Aqui está um exemplo de um vetorizador que funciona para recuperação com agentes, como aparece em uma configuração vectorSearch. Não há nada na definição do vetorizador que precise ser alterado para funcionar com a recuperação com agentes.

"vectorSearch": {
  "algorithms": [
    {
      "name": "alg",
      "kind": "hnsw",
      "hnswParameters": {
        "metric": "cosine",
        "m": 4,
        "efConstruction": 400,
        "efSearch": 500
      }
    }
  ],
  "profiles": [
    {
      "name": "hnsw_text_3_large",
      "algorithm": "alg",
      "vectorizer": "azure_openai_text_3_large"
    }
  ],
  "vectorizers": [
    {
      "name": "azure_openai_text_3_large",
      "kind": "azureOpenAI",
      "azureOpenAIParameters": {
        "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
        "deploymentId": "text-embedding-3-large",
        "apiKey": "<redacted>",
        "modelName": "text-embedding-3-large"
      }
    }
  ],
  "compressions": []
}  

Adicionar um perfil de pontuação

Perfis de pontuação são critérios para aumento de relevância. Eles são aplicados a campos não vetoriais (texto e números) e são avaliados durante a execução da consulta, embora o comportamento preciso dependa da versão da API usada para criar o índice.

Se você criar o índice usando 2025-05-01-preview ou posterior, o perfil de pontuação será executado por último. Se o índice for criado usando uma versão anterior da API, os perfis de pontuação serão avaliados antes do reclassificado semântico.

Você pode usar qualquer perfil de pontuação que faça sentido para o índice. Aqui está um exemplo de um que aumenta a pontuação de pesquisa de uma correspondência se a correspondência for encontrada em um campo específico. Os campos são ponderados aumentando os multiplicadores. Por exemplo, se uma correspondência tiver sido encontrada no campo "Categoria", a pontuação aumentada será multiplicada por 5.

"scoringProfiles": [  
    {  
      "name": "boostSearchTerms",  
      "text": {  
        "weights": {  
          "Location": 2,  
          "Category": 5 
        }  
      }  
    }
]

Adicionar analisadores

Os analisadores se aplicam a campos de texto e podem ser analisadores de linguagem ou analisadores personalizados que controlam a tokenização no índice, como preservar caracteres especiais ou espaço em branco.

Os analisadores são definidos em um índice de pesquisa e atribuídos a campos. O exemplo da coleção de campos inclui uma referência do analisador nas partes do texto. Neste exemplo, o analisador padrão (Lucene padrão) é substituído por um analisador de idiomas da Microsoft.

{
  "name": "page_chunk", "type": "Edm.String",
  "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
  "analyzer": "en.microsoft",
  "stored": true,
  "synonymMaps": []
}

Adicionar um mapa de sinônimos

Mapas de sinônimos expandem consultas adicionando sinônimos para termos nomeados. Por exemplo, você pode ter termos científicos ou médicos para termos comuns.

Os mapas de sinônimos são definidos como um recurso de nível superior em um índice de pesquisa e atribuídos a campos. O exemplo da coleção de campos não inclui um mapa de sinônimos, mas se você tiver ortografias variantes de nomes de país no mapa de sinônimos, veja como seria um exemplo se ele fosse atribuído a um campo hipotético de "locais".

{
    "name":"locations",
    "type":"Edm.String",
    "searchable":true,
    "synonymMaps":[ "country-synonyms" ]
}