Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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-01city 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
Authorizationcabeç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-keycabeç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
ingestionPermissionOptionspara 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-authorizationcabeç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 ou resposta sintetizada (dependendo do modo de saída)
- Array de atividades
- Matriz de referências
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.typetem um valor válido:text.A
maxOutputSizepropriedade na base de conhecimento determina o comprimento da cadeia.Importante
Um documento que exceda o
maxOutputSizeorç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
- Definir referências para cada fonte de conhecimento
- Use o mínimo de esforço de raciocínio
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.
Conteúdo relacionado
- Recuperação agentiva em Pesquisa de IA do Azure
- Aplicação da ACL e RBAC no tempo de consulta
- Utilize um indexador blob ou uma fonte de conhecimento para ingerir os metadados dos escopos de RBAC
- Agentic RAG: Constrói um motor de recuperação de raciocínio com Pesquisa de IA do Azure (vídeo do YouTube)
- Demo de Azure OpenAI com recuperação agentiva