Consulte uma base de conhecimento usando a ação de recuperação ou o endpoint MCP

Nota

Esta funcionalidade está atualmente em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço e não é recomendada para cargas de trabalho em produção. Certas funcionalidades podem não ser suportadas ou podem ter capacidades limitadas. Para mais informações, consulte Termos de Utilização Suplementares para Microsoft Azure Pré-visualizações.

Num pipeline de recuperação agentica, a ação de recuperação invoca o processamento paralelo de consultas a partir de uma base de conhecimento. 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 conhecimento também expõe um endpoint do Model Context Protocol (MCP) para consumo por agentes compatíveis com MCP.

Este artigo explica como executar ambos os métodos de recuperação com aplicação opcional de controlo de permissões e interpretar a resposta em três vertentes. Para configurar um pipeline que ligue Pesquisa de IA do Azure ao Foundry Agent Service via MCP, veja Tutorial: Construa uma solução de recuperação agentical 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 conhecimento. Configure a autenticação sem chave com o papel de Leitor de Dados de Índice de Pesquisa atribuído à sua conta de utilizador (recomendado) ou utilize uma chave API.

  • Se a base de conhecimento especificar um LLM, o serviço de pesquisa deve ter uma identidade gerida com permissões de usuário de Serviços Cognitivos no recurso Microsoft Foundry.

  • O mais recente pacote de pré-visualização Azure.Search.Documents: dotnet add package Azure.Search.Documents --prerelease
  • O mais recente pacote de pré-visualização azure-search-documents: pip install --pre azure-search-documents
  • A 2025-11-01-preview versão de pré-visualização das APIs REST do Serviço de Pesquisa.

Chama a ação de obtenção de dados

Especificas a ação de recuperação numa base de conhecimento. A entrada é o histórico de conversas do chat em linguagem natural, onde o messages array contém a conversa. O motor de recuperação agentica suporta mensagens apenas 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
);

Referência: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)

Referência: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 extrair dados de uma fonte de conhecimento de um índice de pesquisa, pode-se aplicar um filtro OData no momento da consulta para limitar os resultados a documentos ou campos específicos. A expressão do filtro utiliza a sintaxe OData e é passada através do filterAddOn parâmetro.

Sintaxe do filtro e exemplos

O filterAddOn parâmetro aceita expressões de filtro OData. Exemplos de padrões 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'

Exemplos de expressões de filtro:

  • 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 língua

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 multifiltro

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 do pedido

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

Nome Descrição Tipo Editável Obrigatório
messages Articula as mensagens enviadas a um LLM. O formato da mensagem é semelhante ao das APIs do Azure OpenAI. Objetivo Sim Não
messages.role Define de onde veio a mensagem, como assistant ou user. O modelo que usas determina quais os papéis válidos. Corda Sim Não
messages.content A mensagem ou prompt enviada ao LLM. Nesta pré-visualização, tem de ser texto. Corda Sim Não
knowledgeSourceParams Sobrepõe-se às definições padrão de recuperação por fonte de conhecimento. Útil para personalizar a consulta ou resposta na altura da consulta. Objetivo Sim Não

Recuperação a partir de um índice de pesquisa

Para fontes de conhecimento que visam um índice de pesquisa, todos os searchable campos estão dentro do âmbito para execução de consultas. O tipo de consulta implícita é semantic, e não existe modo de pesquisa.

Se o índice incluir campos vetoriais, precisa de uma definição válida de vetorizador para que o motor de recuperação agential possa vetorizar as entradas das consultas. Caso contrário, os campos vetoriais são ignorados.

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

Utilize o endpoint MCP

O MCP é um protocolo aberto que padroniza a forma como as aplicações de IA se ligam a fontes de dados e ferramentas externas.

Em Pesquisa de IA do Azure, cada base 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 esta ferramenta para consultar a base de conhecimento.

Formato de endpoint MCP

Cada base de conhecimento tem um endpoint 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 MCP

O endpoint MCP requer autenticação através de cabeçalhos personalizados. Tens 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 de Leitor de Dados de Índice de Pesquisa atribuída no serviço de pesquisa. Esta abordagem evita armazenar chaves em ficheiros de configuração. Para mais informações, consulte Ligue a sua aplicação à Pesquisa de IA do Azure usando identidades.

  • Insira uma chave de administrador no api-key cabeçalho. Uma chave de administrador fornece acesso total de leitura e escrita ao serviço de pesquisa, por isso utilize-a com cautela. Para mais informações, veja Conectar-se a Pesquisa de IA do Azure usando chaves API.

Dica

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

  • No Foundry Agent Service, configura a autenticação através de uma ligação ao projeto e adiciona a ferramenta MCP a um agente. O serviço injeta automaticamente os cabeçalhos necessários nos pedidos MCP.

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

Aplicar permissões no momento da consulta

Se as suas fontes de conhecimento conterem conteúdo protegido por permissão, o motor de recuperação pode filtrar os resultados para que cada utilizador veja apenas os documentos a que está autorizado a aceder. Ativas esta filtragem passando a identidade do utilizador final no pedido de recuperação. Sem o token de identidade, os resultados das fontes de conhecimento com permissão são devolvidos sem filtro.

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

  • Tempo de ingestão: Apenas para fontes de conhecimento indexadas, defina ingestionPermissionOptions para ingerir metadados de permissão juntamente com o conteúdo.

  • Tempo de consulta: Passe o token de acesso do utilizador no x-ms-query-source-authorization cabeçalho.

Configuração do tempo de ingestão

A tabela seguinte mostra quais fontes de conhecimento requerem configuração durante a ingestão e como cada fonte aplica as permissões.

Fonte de conhecimento Requer ingestionPermissionOptions Como as permissões são aplicadas
Blob ou ADLS Gen2 Os âmbitos RBAC ou ACLs ingeridos são confrontados com a identidade do utilizador.
OneLake Os âmbitos RBAC ou ACLs ingeridos são confrontados com a identidade do utilizador.
SharePoint Indexado ACLs ingeridos do SharePoint foram comparados com a identidade do utilizador.
SharePoint Remoto A API de Recuperação do Copilot consulta diretamente ao SharePoint usando o token do utilizador.

Importante

Se ingestionPermissionOptions não foi configurado quando a fonte de conhecimento indexada foi criada, não existem metadados de permissão no índice. Os resultados são devolvidos sem filtro, independentemente do cabeçalho. Para corrigir isto, atualize ou recrie a fonte de conhecimento com os valores apropriados ingestionPermissionOptions e reindexe.

Autorização em tempo de interrogação

Para transmitir a identidade do utilizador final, inclua um token de acesso com âmbito https://search.azure.com/.default no pedido de recuperação. Este token é separado da credencial de serviço utilizada para aceder ao serviço de pesquisa. Não precisa de permissões de serviço de pesquisa e representa apenas o utilizador cujo acesso ao conteúdo é avaliado. Para mais informações, consulte Execução de ACL em tempo de execução de consulta e RBAC.

No SDK .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);

Referência: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)

Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

@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

Revise a resposta

A recuperação bem-sucedida devolve um 200 OK código de estado. Se a base de conhecimento não conseguir recuperar de uma ou mais fontes de conhecimento, um 206 Partial Content código de estado retorna. A resposta inclui apenas resultados de fontes que tiveram sucesso. Detalhes sobre a resposta parcial aparecem como erros no array de atividades.

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

Resposta extraída

A resposta extraída é uma única cadeia de caracteres unificada que se passa normalmente a um LLM. O LLM consome-os como dados de base e usa-os para formular uma resposta. A sua chamada de API ao LLM inclui a string unificada e as instruções para o modelo, como se deve usar a base exclusivamente ou como suplemento.

O corpo da resposta também está estruturado no formato de mensagem de chat. Nesta pré-visualização, o conteúdo é JSON serializado.

"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 é um array JSON. É uma única cadeia composta pelos documentos (ou blocos) mais relevantes encontrados no índice de pesquisa, tendo em conta as entradas do histórico de consultas e chat. Este array é o dado de base que um modelo de conclusão de conversação utiliza para formular uma resposta à pergunta do utilizador.

    Esta parte da resposta consiste em 200 blocos ou menos, excluindo quaisquer resultados que não atinjam o limiar mínimo de uma pontuação de reclassificação de 2,5.

    A cadeia começa com o ID de referência do bloco (usado para fins de citação) e quaisquer campos especificados na configuração semântica do índice alvo. Neste exemplo, assuma que a configuração semântica no índice de destino tem um campo "título", um campo "termos" e um campo "conteúdo".

  • Nesta pré-visualização, content.type tem um valor válido: text.

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

    Importante

    Um documento que exceda o maxOutputSize orçamento de produção pode ser silenciosamente omitido da resposta sem aviso. Para mais informações, veja Resolução de Problemas em respostas vazias.

Array de atividades

O array de atividades gera o plano de consulta, que proporciona transparência operacional para acompanhar operações, implicações de faturação e invocações de recursos. Inclui também subconsultas enviadas para o pipeline de recuperação e erros para quaisquer falhas de recuperação, como fontes de conhecimento inacessíveis.

A saída inclui os seguintes componentes:

Secção Descrição
modelQueryPlanning Para bases de conhecimento que usam um LLM para o planeamento de consultas, esta secção informa sobre a contagem de tokens usados para a entrada de dados, e a contagem de tokens para as subconsultas.
Atividade específica da fonte Para cada fonte de conhecimento incluída na consulta, esta secção reporta o tempo decorrido e quais os argumentos usados na consulta, incluindo o ranker semântico. Os tipos de fontes de conhecimento incluem searchIndex, azureBlob, e outras fontes de conhecimento suportadas.
Raciocínio Agênico Esta secção reporta o consumo de tokens para raciocínio agential durante a recuperação, que depende do esforço de raciocínio de recuperação especificado.
modeloRespostaSíntese Para bases de conhecimento que utilizam síntese de respostas, esta secção reporta a contagem de tokens para formular a resposta e a contagem de tokens da resposta resultante.

Este é um exemplo do conjunto 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

O array de referências provém diretamente dos dados de base subjacentes. Inclui o sourceData utilizado para gerar a resposta. Consiste em todos os documentos que o motor de recuperação agentical encontra e classifica semanticamente. Os campos no sourceData incluem um id e campos semânticos: title, terms, e content.

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

O objetivo deste array é fornecer uma estrutura de mensagens de chat para facilitar a integração. Por exemplo, se quiseres serializar os resultados numa estrutura diferente ou se precisares de alguma manipulação programática dos dados antes de os devolveres ao utilizador.

Também podes obter os dados estruturados do objeto de dados de origem no array de referências para os manipular como achares melhor.

Aqui está um exemplo do array 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 seguintes ilustram diferentes formas de chamar a ação de recuperação:

Anule o esforço de raciocínio por defeito e defina limites de pedidos

Este exemplo especifica a síntese de respostas, pelo que retrievalReasoningEffort deve ser "baixo" ou "médio".

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
);

Referência: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)

Referência: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 utiliza o esforço de raciocínio padrão especificado na base de conhecimento. O foco deste exemplo é especificar quanta informação 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
);

Referência: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)

Referência: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 do OneLake indexadas ou SharePoint indexadas, defina includeReferenceSourceData para true para incluir URLs de documentos de origem nas citações.

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

Neste exemplo, não existe um LLM para planeamento inteligente de consultas ou síntese de respostas. A cadeia de consulta vai para o motor de recuperação agential para pesquisa por palavras-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
);

Referência: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)

Referência: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

Resolução de problemas de respostas vazias

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

Para evitar este comportamento, indexe documentos fonte grandes em blocos menores com identificadores estáveis e metadados de origem. Isto aplica-se especialmente a manuais longos, políticas ou artigos de base de conhecimento.