Consultar uma base de conhecimento por meio da ação de recuperação ou do endpoint MCP

Nota

Esse recurso está atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou ter recursos restritos. Para obter mais informações, consulte Supplemental Terms of Use for Microsoft Azure Previews.

Em um fluxo de recuperação agêncico, a ação de recuperação invoca o processamento de consulta paralela de uma base de conhecimento. Você pode chamar a ação de recuperação diretamente usando as APIs REST do Serviço de Pesquisa ou um SDK do Azure. Cada base de dados de conhecimento também expõe um ponto de extremidade MCP (Protocolo de Contexto de Modelo) para consumo por agentes compatíveis com MCP.

Este artigo explica como chamar ambos os métodos de recuperação com a aplicação opcional de permissões e interpretar a resposta em três etapas. Para configurar um pipeline que conecta Pesquisa de IA do Azure  ao Serviço do Agente do Foundry por meio do MCP, consulte Tutorial: criar uma solução de recuperação agente de ponta a ponta.

Pré-requisitos

  • Um serviço Pesquisa de IA do Azure  com uma base de conhecimento.

  • Permissões para consultar a base de dados de conhecimento. Configure a autenticação sem chave com a função Leitor de Dados de Índice de Pesquisa atribuída à sua conta de usuário (recomendado) ou use uma chave de API.

  • Se a base de dados de conhecimento especificar uma LLM, o serviço de pesquisa deverá ter uma identidade gerenciada com permissões Cognitive Services User no recurso Microsoft Foundry.

Chamar a ação de recuperação

Especifique a ação de recuperação em uma base de dados de conhecimento. A entrada é o histórico de conversa de chat em linguagem natural, em que o array messages contém a conversa. O mecanismo de recuperação agente só dá suporte a mensagens se o esforço de raciocínio de recuperação for baixo ou médio.

using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Create knowledge base retrieval client
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<YOUR SEARCH SERVICE URL>"),
    knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
    tokenCredential: new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You can answer questions about the Earth at night. "
                + "Sources have a JSON format with a ref_id that must be cited in the answer. "
                + "If you do not have the answer, respond with 'I do not know'."
            )
        }
    ) { Role = "assistant" }
);
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "Why is the Phoenix nighttime street grid so sharply visible from space, "
                + "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
            )
        }
    ) { Role = "user" }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

# Create knowledge base retrieval client
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<YOUR SEARCH SERVICE URL>",
    knowledge_base_name="<YOUR KNOWLEDGE BASE NAME>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You can answer questions about the Earth at night. "
                    "Sources have a JSON format with a ref_id that must be cited in the answer. "
                    "If you do not have the answer, respond with 'I do not know'."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Why is the Phoenix nighttime street grid so sharply visible from space, "
                    "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="earth-at-night-blob-ks",
        )
    ],
)

result = kb_client.retrieve(retrieval_request=request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

@search-url = <YOUR SEARCH SERVICE URL> // Example: https://my-service.search.windows.net
@accessToken = <YOUR ACCESS TOKEN> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv

POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2025-11-01-preview
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You can answer questions about the Earth at night. Sources have a JSON format with a ref_id that must be cited in the answer. If you do not have the answer, respond with 'I do not know'."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Why is the Phoenix nighttime street grid so sharply visible from space, whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "earth-at-night-blob-ks",
            "kind": "searchIndex"
        }
    ]
}

Referência:Recuperação de Conhecimento – Recuperar

Filtrar no momento da consulta (índice de pesquisa)

Ao recuperar informações de uma fonte de conhecimento a partir de um índice de pesquisa, você pode aplicar um filtro OData no momento da consulta para restringir os resultados a documentos ou campos específicos. A expressão de filtro usa a sintaxe OData e é passada por meio do filterAddOn parâmetro.

Sintaxe de filtro e exemplos

O filterAddOn parâmetro aceita expressões de filtro OData. Os padrões de exemplo incluem:

  • Campos de metadados: city eq 'Phoenix', status eq 'active'
  • Intervalos de datas: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Intervalos numéricos: price ge 100 and price le 5000
  • Correspondência de texto: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Operadores lógicos: (category eq 'News' or category eq 'Analysis') and status eq 'published'

Expressões de filtro de exemplo:

  • status eq 'published'
  • created ge 2025-01-01
  • city eq 'Redmond' and department eq 'Engineering'
  • (priority eq 'High' or priority eq 'Critical') and resolved eq false

Exemplos por idioma

using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<YOUR SEARCH SERVICE URL>"),
    knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
    tokenCredential: new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You are a support agent. Answer questions based on published documentation. "
                + "If you don't know the answer, say so."
            )
        }
    ) { Role = "assistant" }
);

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What is the process for submitting an expense report?"
            )
        }
    ) { Role = "user" }
);

// Apply a filter to search only published documents
var searchIndexParams = new SearchIndexKnowledgeSourceParams(
    knowledgeSourceName: "internal-documentation-ks"
);
searchIndexParams.FilterAddOn = "status eq 'published'";

retrievalRequest.KnowledgeSourceParams.Add(searchIndexParams);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<YOUR SEARCH SERVICE URL>",
    knowledge_base_name="<YOUR KNOWLEDGE BASE NAME>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You are a support agent. Answer questions based on published documentation. "
                    "If you don't know the answer, say so."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="What is the process for submitting an expense report?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="internal-documentation-ks",
            # Apply a filter to search only published documents
            filter_add_on="status eq 'published'",
        )
    ],
)

result = kb_client.retrieve(retrieval_request=request)
print(result.response[0].content[0].text)
POST https://<YOUR SEARCH SERVICE>.search.windows.net/knowledgebases/<YOUR KNOWLEDGE BASE NAME>/retrieve?api-version=2025-11-01-preview
Content-Type: application/json
Authorization: Bearer <YOUR ACCESS TOKEN>

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You are a support agent. Answer questions based on published documentation. If you don't know the answer, say so."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What is the process for submitting an expense report?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "internal-documentation-ks",
            "kind": "searchIndex",
            "filterAddOn": "status eq 'published'"
        }
    ]
}

Exemplo de vários filtros

Você pode combinar vários filtros para refinar ainda mais os resultados:

searchIndexParams.FilterAddOn = "(status eq 'published' or status eq 'internal') and created ge 2025-01-01";
filter_add_on="(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
{
    "knowledgeSourceName": "internal-documentation-ks",
    "kind": "searchIndex",
    "filterAddOn": "(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
}

Parâmetros de solicitação

Passe os parâmetros a seguir para chamar a ação de recuperação.

Nome Descrição Tipo Editável Necessário
messages Articula as mensagens enviadas para uma LLM. O formato da mensagem é semelhante a Azure APIs OpenAI. Objeto Sim Não
messages.role Define de onde veio a mensagem, como assistant ou user. O modelo usado determina quais funções são válidas. String Sim Não
messages.content A mensagem ou prompt enviada para LLM. Nesta versão prévia, ele deve ser texto. String Sim Não
knowledgeSourceParams Substitui as configurações de recuperação padrão para cada fonte de conhecimento. Útil para personalizar a consulta ou a resposta no momento da consulta. Objeto Sim Não

Recuperação de um índice de pesquisa

Para fontes de conhecimento direcionadas a um índice de pesquisa, todos os searchable campos estão no escopo da execução da consulta. O tipo de consulta implícita é semantic, e não há modo de pesquisa.

Se o índice incluir campos de vetor, você precisará de uma definição de vetor válida para que o mecanismo de recuperação agencial possa vetorizar entradas de consulta. Caso contrário, os campos de vetor serão ignorados.

Para obter mais informações, consulte Criar um índice para recuperação agêntica.

Chamar o ponto de extremidade MCP

O MCP é um protocolo aberto que padroniza como os aplicativos de IA se conectam a fontes de dados e ferramentas externas.

Em Pesquisa de IA do Azure , cada base de dados de conhecimento é um servidor MCP autônomo que expõe a ferramenta knowledge_base_retrieve. Qualquer cliente compatível com MCP, incluindo Foundry Agent Service, GitHub Copilot, Claude e Cursor, pode invocar essa ferramenta para consultar a base de dados de conhecimento.

Formato de endpoint MCP

Cada base de conhecimento tem um ponto de extremidade MCP na seguinte URL:

https://<your-service-name>.search.windows.net/knowledgebases/<your-knowledge-base-name>/mcp?api-version=2025-11-01-preview

Autenticar no ponto de extremidade do MCP

O endpoint MCP requer autenticação via cabeçalhos personalizados. Você tem duas opções:

  • (Recomendado) Passe um token de portador no Authorization cabeçalho. A identidade por trás do token deve ter a função Leitor de Dados de Índice de Pesquisa atribuída no serviço de pesquisa. Essa abordagem evita o armazenamento de chaves em arquivos de configuração. Para obter mais informações, consulte Conectar seu aplicativo para Pesquisa de IA do Azure  usando identidades.

  • Passe uma chave de administrador no api-key cabeçalho. Uma chave de administrador fornece acesso completo de leitura e gravação ao serviço de pesquisa, portanto, use-a com cuidado. Para obter mais informações, consulte Conectar para Pesquisa de IA do Azure  usando chaves de API.

Dica

Cada cliente MCP configura cabeçalhos personalizados de forma diferente. Por exemplo:

  • No Serviço do Foundry Agent, você configura a autenticação por meio de uma conexão de projeto e adiciona a ferramenta MCP a um agente. O serviço injeta automaticamente os cabeçalhos necessários em solicitações MCP.

  • Em GitHub Copilot, Claude Desktop e clientes semelhantes, você configura cabeçalhos no JSON do servidor MCP, como mcp.json.

Aplicar permissões no momento da consulta

Se suas fontes de conhecimento contiverem conteúdo protegido por permissão, o mecanismo de recuperação poderá filtrar os resultados para que cada usuário veja apenas os documentos que está autorizado a acessar. Habilite essa filtragem passando a identidade do usuário final na solicitação de recuperação. Sem o token de identidade, os resultados de fontes de conhecimento habilitadas para permissão são retornados sem filtro.

A imposição de permissões tem duas partes:

  • Tempo de ingestão: somente para fontes de conhecimento indexadas, defina ingestionPermissionOptions como metadados de permissão de ingestão junto com o conteúdo.

  • Tempo de consulta: passe o token de acesso do usuário no x-ms-query-source-authorization cabeçalho.

Configuração de tempo de ingestão

A tabela a seguir mostra quais fontes de conhecimento exigem a configuração de tempo de ingestão e como cada fonte impõe permissões.

Fonte de conhecimento Requer ingestionPermissionOptions Como as permissões são impostas
Blob ou ADLS Gen2 Escopos RBAC processados ou ACLs verificados em relação à identidade do usuário.
OneLake Escopos RBAC processados ou ACLs verificados em relação à identidade do usuário.
SharePoint Indexado As ACLs do SharePoint ingeridas são comparadas à identidade de usuário.
Emote SharePoint Copilot faz consultas à API de Recuperação do SharePoint diretamente usando o token do usuário.

Importante

Se ingestionPermissionOptions não tiver sido configurado quando a fonte de conhecimento indexada foi criada, nenhum metadado de permissão existirá no índice. Os resultados são retornados sem filtro, independentemente do cabeçalho. Para corrigir isso, atualize ou recrie a fonte de conhecimento com os valores apropriados ingestionPermissionOptions e reindex.

Autorização de tempo de consulta

Para passar a identidade do usuário final, inclua um token de acesso com o escopo https://search.azure.com/.default na requisição de recuperação. Esse token é separado da credencial de serviço usada para acessar o serviço de pesquisa. Ele não precisa de permissões de serviço de pesquisa e representa apenas o usuário cujo acesso ao conteúdo é avaliado. Para obter mais informações, consulte Aplicação de ACL e RBAC em tempo de consulta.

No SDK do .NET, passe o token como o parâmetro xMsQuerySourceAuthorization em RetrieveAsync:

using Azure;
using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Service credential: Authenticates to the search service
var serviceCredential = new DefaultAzureCredential();

// User identity token: Represents the end user for document-level permissions filtering
var userTokenContext = new Azure.Core.TokenRequestContext(
    new[] { "https://search.azure.com/.default" }
);
string userToken = (await serviceCredential.GetTokenAsync(userTokenContext)).Token;

// Create the retrieval client with the service credential
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<YOUR SEARCH SERVICE URL>"),
    knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
    tokenCredential: serviceCredential
);

var request = new KnowledgeBaseRetrievalRequest();
request.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What companies are in the financial sector?")
        }
    ) { Role = "user" }
);

// Pass the user identity token for permissions filtering
var result = await kbClient.RetrieveAsync(
    request, xMsQuerySourceAuthorization: userToken);

var text = (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text;
Console.WriteLine(text);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

No SDK Python, passe o token como o parâmetro x_ms_query_source_authorization em retrieve:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage, KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
)

# Service credential: Authenticates to the search service
service_credential = DefaultAzureCredential()

# User identity token: Represents the end user for document-level permissions filtering
user_token_provider = get_bearer_token_provider(
    service_credential, "https://search.azure.com/.default")
user_token = user_token_provider()

# Create the retrieval client with the service credential
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<YOUR SEARCH SERVICE URL>",
    knowledge_base_name="<YOUR KNOWLEDGE BASE NAME>",
    credential=service_credential,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(
                text="What companies are in the financial sector?")],
        )
    ]
)

# Pass the user identity token for permissions filtering
result = kb_client.retrieve(
    retrieval_request=request, x_ms_query_source_authorization=user_token)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Na API REST, inclua o x-ms-query-source-authorization cabeçalho com o token de acesso do usuário:

@search-url = <YOUR SEARCH SERVICE URL>
@accessToken = <YOUR ACCESS TOKEN> // Service credential
@userAccessToken = <USER ACCESS TOKEN> // User identity token

POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2025-11-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
x-ms-query-source-authorization: {{userAccessToken}}

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What companies are in the financial sector?"
                }
            ]
        }
    ]
}

Referência:Recuperação de Conhecimento – Recuperar

Examinar a resposta

A recuperação bem-sucedida retorna um 200 OK código de status. Se a base de dados de conhecimento não conseguir recuperar de uma ou mais fontes de conhecimento, um 206 Partial Content código de status retornará. A resposta inclui apenas resultados de fontes que tiveram êxito. Os detalhes sobre a resposta parcial aparecem como erros na matriz de atividades.

A ação de recuperação retorna três componentes principais:

Resposta extraída

A resposta extraída é uma única cadeia de caracteres unificada que você normalmente passa para uma LLM. O LLM consome isso como dados de referência e os usa para formular uma resposta. Sua chamada à API para o LLM inclui a cadeia de caracteres unificada e as instruções para o modelo, como usar a base exclusivamente ou como um suplemento.

O corpo da resposta também é estruturado no formato de estilo de mensagem de chat. Nesta versão prévia, o conteúdo é serializado JSON.

"response": [
    {
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "[{\"ref_id\":0,\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
            }
        ]
    }
]

Pontos-chave:

  • content.text é uma matriz JSON. É uma única cadeia de caracteres composta pelos documentos mais relevantes (ou partes) encontrados no índice de pesquisa, considerando as entradas de consulta e histórico de chat. Essa matriz são seus dados de aterramento que um modelo de conclusão de chat usa para formular uma resposta à pergunta do usuário.

    Essa parte da resposta consiste em 200 fragmentos ou menos, excluindo todos os resultados que não alcançarem a pontuação mínima de 2,5 do classificador.

    A cadeia de caracteres começa com a ID de referência da parte (usada para fins de citação) e todos os campos especificados na configuração semântica do índice de destino. Neste exemplo, suponha que a configuração semântica no índice de destino tenha um campo "título", um campo "termos" e um campo "conteúdo".

  • Nesta versão prévia, content.type tem um valor válido: text.

  • A maxOutputSize propriedade na base de dados de conhecimento determina o comprimento da cadeia de caracteres.

    Importante

    Um documento que excede o maxOutputSize orçamento de saída pode ser silenciosamente omitido da resposta sem um aviso. Para obter mais informações, consulte Solucionar problemas de respostas vazias.

Matriz de atividades

A matriz de atividade gera o plano de consulta, que fornece transparência operacional para operações de acompanhamento, implicações de cobrança e invocações de recursos. Ele também inclui subconsultas enviadas ao pipeline de obtenção de dados e erros em caso de falhas na obtenção, como fontes de conhecimento inacessíveis.

A saída inclui os seguintes componentes:

Seção Descrição
modelQueryPlanning Para bases de dados de conhecimento que usam um LLM para planejamento de consultas, esta seção relata as contagens de tokens usadas para entrada e a contagem de tokens para as subconsultas.
atividade específica da origem Para cada fonte de conhecimento incluída na consulta, esta seção relata o tempo decorrido e quais argumentos foram usados na consulta, incluindo o classificador semântico. Os tipos de fonte de conhecimento incluem searchIndex, azureBlobe outras fontes de conhecimento com suporte.
raciocínio agentivo Esta seção relata o consumo de tokens para o raciocínio agente durante a recuperação, que depende do esforço de raciocínio de recuperação especificado.
modelAnswerSynthesis Para bases de dados de conhecimento que usam síntese de resposta, esta seção relata a contagem de tokens para formular a resposta e a contagem de tokens da saída de resposta.

Aqui está um exemplo da matriz de atividades:

  "activity": [
    {
      "type": "modelQueryPlanning",
      "id": 0,
      "inputTokens": 2302,
      "outputTokens": 109,
      "elapsedMs": 2396
    },
    {
      "type": "searchIndex",
      "id": 1,
      "knowledgeSourceName": "demo-financials-ks",
      "queryTime": "2025-11-04T19:25:23.683Z",
      "count": 26,
      "elapsedMs": 1137,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "searchIndex",
      "id": 2,
      "knowledgeSourceName": "demo-healthcare-ks",
      "queryTime": "2025-11-04T19:25:24.186Z",
      "count": 17,
      "elapsedMs": 494,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "agenticReasoning",
      "id": 3,
      "retrievalReasoningEffort": {
        "kind": "low"
      },
      "reasoningTokens": 103368
    },
    {
      "type": "modelAnswerSynthesis",
      "id": 4,
      "inputTokens": 5821,
      "outputTokens": 344,
      "elapsedMs": 3837
    }
  ]

Matriz de referências

A matriz de referências vem diretamente dos dados de aterramento subjacentes. Ele inclui o sourceData usado para gerar a resposta. Ele consiste em cada documento que o mecanismo de recuperação agente encontra e classifica semanticamente. Os campos no sourceData incluem um id e campos semânticos: title, terms e content.

Ele id atua como uma ID de referência para um item dentro de uma resposta específica. Não é a chave do documento no índice de pesquisa. Use-o para fornecer citações.

A finalidade dessa matriz é fornecer uma estrutura de estilo de mensagem de chat para facilitar a integração. Por exemplo, se você quiser serializar os resultados em uma estrutura diferente ou precisar de alguma manipulação programática dos dados antes de retornar ao usuário.

Você também pode obter os dados estruturados do objeto de dados de origem na matriz de referências para manipulá-los como achar adequado.

Aqui está um exemplo da matriz de referências:

  "references": [
    {
      "type": "AzureSearchDoc",
      "id": "0",
      "activitySource": 2,
      "docKey": "earth_at_night_508_page_104_verbalized",
      "sourceData": null
    },
    {
      "type": "AzureSearchDoc",
      "id": "1",
      "activitySource": 2,
      "docKey": "earth_at_night_508_page_105_verbalized",
      "sourceData": null
    }
  ]

Exemplos

Os exemplos a seguir ilustram diferentes maneiras de chamar a ação de recuperação:

Sobrepor o esforço de processamento padrão e definir limites de solicitação

Este exemplo especifica a síntese de resposta, portanto retrievalReasoningEffort , deve ser "baixa" ou "média".

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort();
retrievalRequest.OutputMode = "answerSynthesis";
retrievalRequest.MaxRuntimeInSeconds = 30;
retrievalRequest.MaxOutputSize = 6000;

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import KnowledgeRetrievalLowReasoningEffort

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    retrieval_reasoning_effort=KnowledgeRetrievalLowReasoningEffort(),
    output_mode="answerSynthesis",
    max_runtime_in_seconds=30,
    max_output_size=6000,
)

result = kb_client.retrieve(retrieval_request=request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-url}}/knowledgebases/kb-override/retrieve?api-version={{api-version}}
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "retrievalReasoningEffort": { "kind": "low" },
    "outputMode": "answerSynthesis",
    "maxRuntimeInSeconds": 30,
    "maxOutputSize": 6000
}

Referência:Recuperação de Conhecimento – Recuperar

Definir referências para cada fonte de conhecimento

Este exemplo usa o esforço de raciocínio padrão especificado na base de dados de conhecimento. O foco deste exemplo é a especificação de quantas informações incluir na resposta.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
// Knowledge source params are configured per source on the request

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-financials-ks",
            include_references=True,
            include_reference_source_data=True,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-communicationservices-ks",
            include_references=False,
            include_reference_source_data=False,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-healthcare-ks",
            include_references=True,
            include_reference_source_data=False,
            always_query_source=True,
        ),
    ],
)

result = kb_client.retrieve(retrieval_request=request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

POST {{search-url}}/knowledgebases/kb-medium-example/retrieve?api-version={{api-version}}
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "demo-financials-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": true
        },
        {
            "knowledgeSourceName": "demo-communicationservices-ks",
            "kind": "searchIndex",
            "includeReferences": false,
            "includeReferenceSourceData": false
        },
        {
            "knowledgeSourceName": "demo-healthcare-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": false,
            "alwaysQuerySource": true
        }
    ]
}

Referência:Recuperação de Conhecimento – Recuperar

Nota

Para fontes de conhecimento indexadas do OneLake ou SharePoint, defina includeReferenceSourceData como true para incluir URLs dos documentos de origem em citações.

Usar o mínimo de esforço de raciocínio

Neste exemplo, não há LLM para planejamento de consulta inteligente ou síntese de resposta. A cadeia de caracteres de consulta vai para o mecanismo de recuperação agente para pesquisa de palavra-chave ou pesquisa híbrida.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Intents.Add(
    new KnowledgeRetrievalSemanticIntent("what is a brokerage")
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="what is a brokerage",
        )
    ]
)

result = kb_client.retrieve(retrieval_request=request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-url}}/knowledgebases/kb-minimal/retrieve?api-version={{api-version}}
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
    "intents": [
        {
            "type": "semantic",
            "search": "what is a brokerage"
        }
    ]
}

Referência:Recuperação de Conhecimento – Recuperar

Solucionar problemas de respostas vazias

Um documento pode ser encontrado durante a etapa de pesquisa, mas ainda pode ser omitido da resposta final se seu conteúdo fundamentado exceder o maxOutputSize orçamento de saída. Quando isso acontece, a matriz de atividades mostra que correspondências foram encontradas, mas a matriz de referências e o conteúdo de resposta fundamentado estão vazios para esse documento. Nenhum aviso de truncamento ou erro explícito é retornado.

Para evitar esse comportamento, indexe documentos de origem grandes como partes menores com identificadores estáveis e metadados de origem. Isso se aplica especialmente a manuais longos, políticas ou artigos da base de dados de conhecimento.