Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Nota
Pesquisa de IA do Azure está disponível por meio do portal Azure, APIs REST e SDKs do Azure. Ele também sustenta o IQ do Foundry, a camada de conhecimento gerenciado que transforma o conteúdo da empresa em bases de conhecimento reutilizáveis e com reconhecimento de permissão para agentes no portal do Microsoft Foundry.
Importante
Recursos, funcionalidades ou propriedades marcados como (versão prévia) não são cobertos por um contrato de nível de serviço (SLA), não são recomendados para cargas de trabalho de produção e podem mudar ou ser restringidos antes da disponibilidade geral. Os termos de visualização do Pesquisa de IA do Azure se aplicam a toda funcionalidade em visualização, seja autônoma ou parte de um recurso de disponibilidade geral.
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 imposição opcional de permissões. Ele aborda primeiro a ação de recuperação e, posteriormente, o ponto de extremidade MCP, porque o resultado da ferramenta MCP atualmente difere do formato de resposta REST e SDK.
Para configurar um pipeline que conecte a Pesquisa de IA do Azure ao Serviço de Agente do Foundry por meio do MCP, consulte o Tutorial: Crie uma solução de recuperação por meio de agentes de ponta a ponta.
Suporte de uso
| Portal do Azure | Portal Foundry da Microsoft | SDK do .NET | SDK do Python | SDK do Java | SDK do JavaScript | REST API |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Pré-requisitos
Um serviço Pesquisa de IA do Azure com uma base de conhecimento.
Para acesso de modelo compartilhado e configuração do cliente, consulte Pré-requisitos para criar uma base de dados de conhecimento.
Permissão para consultar bases 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 de consulta.
Se você chamar o endpoint MCP pela API Responses do Azure OpenAI, será necessário:
Um LLM implantado e a função Usuário do OpenAI de Serviços Cognitivos (ou uma chave de API) no recurso do Foundry. Você pode reutilizar o LLM e o recurso especificados em sua base de dados de conhecimento, se aplicável.
O
Azure.AI.OpenAIpacote:dotnet add package Azure.AI.OpenAI
Pacote necessário:
Azure.Search.DocumentsPara os recursos de
2026-08-01-preview, o pacote de versão prévia mais recente:dotnet add package Azure.Search.Documents --prereleasePara os recursos de
2026-04-01, o pacote estável mais recente:dotnet add package Azure.Search.Documents
Para autenticação sem chave, o
Azure.Identitypacote:dotnet add package Azure.Identity
Se você chamar o endpoint MCP pela API Responses do Azure OpenAI, será necessário:
Um LLM implantado e a função Usuário do OpenAI de Serviços Cognitivos (ou uma chave de API) no recurso do Foundry. Você pode reutilizar o LLM e o recurso especificados em sua base de dados de conhecimento, se aplicável.
O
openaipacote:pip install openai
Pacote necessário:
azure-search-documentsPara os recursos de
2026-08-01-preview, o pacote de versão prévia mais recente:pip install --pre azure-search-documentsPara os recursos de
2026-04-01, o pacote estável mais recente:pip install azure-search-documents
Para autenticação sem chave, o
azure-identitypacote:pip install azure-identity
Versão necessária da API REST do Serviço de Busca:
Para recursos em versão prévia: 2026-08-01-preview
Para recursos disponíveis em geral: 2026-04-01
Para autenticação sem chave, inclua um token Microsoft Entra ID no
Authorizationcabeçalho de cada solicitação HTTP.
Limitations
Para fontes de conhecimento do índice de busca, quando você habilita a reclassificação, a recuperação usa a configuração semântica da fonte de conhecimento. Ele não aplica os perfis de pontuação do índice subjacente, incluindo defaultScoringProfile. As respostas da recuperação também não exibem @search.rerankerBoostedScore.
Chamar a ação de recuperação
Especifique a ação de recuperação em uma base de dados de conhecimento. O corpo da solicitação inclui a entrada da consulta e uma lista opcional de fontes de conhecimento a serem direcionadas.
A versão 2026-04-01 da API oferece suporte apenas à entrada intents e à recuperação extrativa limitada. Recursos somente de visualização, incluindo a entrada messages, planejamento de consulta, síntese de respostas e esforço de raciocínio configurável, não são suportados. Use 2026-08-01-preview para funcionalidade completa.
using Azure.Identity;
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
// Create knowledge base retrieval client
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: 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="<search-endpoint>",
knowledge_base_name="<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(request)
print(result.response[0].content[0].text)
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
@search-endpoint = <search-endpoint> // Example: https://my-service.search.windows.net
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"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
Fornecer imagens para responder à síntese (versão prévia)
Para fontes de conhecimento blob, OneLake indexadas e SharePoint indexadas que você configurar com um repositório de ativos, é possível fornecer ao modelo subsequente de síntese de respostas imagens incorporadas aos documentos juntamente com o texto. Defina enableImageServing na entrada knowledgeSourceParams correspondente para substituir o padrão definido na definição da base de dados de conhecimento. A resposta de recuperação não inclui campos dedicados para os caminhos de imagem individuais ou bytes de imagem fornecidos para o modelo.
O fornecimento de imagens é executado somente quando outputMode está answerSynthesis e não é compatível com fontes de conhecimento que configuram ingestionPermissionOptions. Para ver as etapas de configuração, a tabela de precedência e como inspecionar as estatísticas de disponibilização de imagens, consulte Exibir imagens incorporadas em documentos na recuperação por meio de agentes (versão prévia).
Desabilitar o reclassificador para uma fonte de conhecimento (versão prévia)
A partir da versão da API 2026-08-01-preview, defina "resultsProcessing": "none" em uma entrada knowledgeSourceParams para ignorar a reclassificação de uma fonte de conhecimento específica e preservar a ordem original dos resultados. Você também pode armazenar resultsProcessing na fonte de dados de conhecimento como padrão. Todos os tipos de fonte de conhecimento dão suporte a essa propriedade.
O exemplo a seguir ignora a reclassificação para product-catalog-ks em uma solicitação de recuperação.
using System;
using System.Linq;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var client = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"product-catalog-kb",
new DefaultAzureCredential());
var request = new KnowledgeBaseRetrievalRequest
{
IncludeActivity = true
};
request.Intents.Add(
new KnowledgeRetrievalSemanticIntent(
"Find the power adapter for SKU 88421."));
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("product-catalog-ks")
{
AlwaysQuerySource = true,
IncludeReferences = true,
ResultsProcessing = KnowledgeSourceResultsProcessing.None
});
var result = await client.RetrieveAsync(request);
Console.WriteLine(
$"References with a reranker score: "
+ $"{result.Value.References.Count(x => x.RerankerScore.HasValue)}");
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalSemanticIntent,
SearchIndexKnowledgeSourceParams,
)
client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="product-catalog-kb",
credential=DefaultAzureCredential(),
)
request = KnowledgeBaseRetrievalRequest(
intents=[
KnowledgeRetrievalSemanticIntent(
search="Find the power adapter for SKU 88421."
)
],
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="product-catalog-ks",
always_query_source=True,
include_references=True,
results_processing="none",
)
],
)
result = client.retrieve(request)
reranked_count = sum(
reference.reranker_score is not None
for reference in result.references
)
print("References with a reranker score:", reranked_count)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
@knowledge-base-name = product-catalog-kb
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Find the power adapter for SKU 88421."
}
],
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "product-catalog-ks",
"kind": "searchIndex",
"alwaysQuerySource": true,
"includeReferences": true,
"resultsProcessing": "none"
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Defina "resultsProcessing": "rerank", ou omita-o quando não existir nenhum valor padrão armazenado, para usar o pipeline de reclassificação. Pesquisa de IA do Azure resolve o valor efetivo para cada fonte nesta ordem:
-
resultsProcessingemknowledgeSourceParamsna solicitação de recuperação. -
resultsProcessingarmazenado na fonte de conhecimento. -
rerankquando nenhuma propriedade estiver presente.
Para uma fonte de conhecimento do servidor MCP, um resultsProcessing valor definido em uma ferramenta individual tem precedência sobre a solicitação e os valores armazenados.
Tip
resultsProcessing altera como os resultados são processados, não quais fontes são consultadas. Defina alwaysQuerySource como true se a fonte de conhecimento deve ser consultada.
Quando o valor efetivo for none:
- As referências da fonte de conhecimento omitem
rerankerScore, e os resultados mantêm sua ordem original na atividade de recuperação da fonte. - Quando alguma fonte ignora a reclassificação, a Pesquisa de IA do Azure distribui os resultados finais entre as atividades em esquema round-robin, seguindo a ordem de declaração de fontes de conhecimento. As atividades reclassificados permanecem ordenadas por pontuação.
- Os limites de desduplicação e os limites por fonte, documento e token ainda se aplicam, portanto nem todos os resultados recuperados aparecem na resposta.
Pesquisa de IA do Azure valida rerankerThreshold nesta ordem:
- A pesquisa resolve
resultsProcessinga partir da solicitação de recuperação e do valor armazenado da fonte de conhecimento. - Se o valor resolvido for
nonee a solicitação incluirrerankerThreshold, a pesquisa retornará400 Bad Request. - Para uma ferramenta de servidor MCP, o Search aplica o valor
resultsProcessingno nível da ferramenta após validar a solicitação.
Como resultado, uma configuração de ferramenta MCP não altera se a solicitação passa na validação. Um valor no nível none da ferramenta não causa um erro de limite e um valor no nível rerank da ferramenta não impede um erro quando a solicitação ou o valor armazenado é resolvido para none.
Para confirmar qual modo foi executado, verifique se as referências da fonte de conhecimento incluem rerankerScore. Não confie em semanticConfigurationName, que pode estar null em vez de ser omitido.
Comportamento do índice de pesquisa
Para fontes de conhecimento direcionadas a um índice de pesquisa, o tipo de consulta implícita é semantice não há modo de pesquisa. Quando o reranking é executado, a execução da consulta usa semanticConfigurationName. Outras configurações de origem, incluindo searchFields e sourceDataFields, se aplicam em ambos os modos.
A recuperação agêntica não aceita scoringProfile nem scoringParameters como entrada. Se você precisar de viés de recência para fontes de conhecimento indexadas, use recuperação com reconhecimento de atualidade (versão prévia) em vez de um perfil de pontuação de índice.
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.
Resultados de recuperação de fluxo (versão prévia)
A partir da versão da 2026-08-01-preview API, você pode receber resultados de recuperação como um fluxo de eventos enviados pelo servidor (SSE) em vez de aguardar uma única resposta JSON. Usando streaming, seu cliente pode exibir o planejamento da consulta, a atividade de origem e a resposta sintetizada ou a resposta extraída nessa ordem à medida que cada parte fica disponível.
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var client = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"<knowledge-base-name>",
new DefaultAzureCredential());
var request = new KnowledgeBaseRetrievalRequest
{
OutputMode = KnowledgeRetrievalOutputMode.ExtractiveData,
RetrievalReasoningEffort =
new KnowledgeRetrievalMinimalReasoningEffort(),
IncludeActivity = true,
};
request.Intents.Add(
new KnowledgeRetrievalSemanticIntent("What is the return policy?"));
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"<knowledge-source-name>")
{
ResultsProcessing = KnowledgeSourceResultsProcessing.None,
IncludeReferences = true,
});
var eventCounts = new Dictionary<string, int>();
await foreach (var item in client.RetrieveStreamAsync(request))
{
eventCounts.TryGetValue(item.EventType, out var count);
eventCounts[item.EventType] = count + 1;
}
foreach (var (eventType, count) in eventCounts)
{
Console.WriteLine($"{eventType}: {count}");
}
Reference:KnowledgeBaseRetrievalClient
from collections import Counter
from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
KnowledgeSourceResultsProcessing,
)
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalMinimalReasoningEffort,
KnowledgeRetrievalOutputMode,
KnowledgeRetrievalSemanticIntent,
SearchIndexKnowledgeSourceParams,
)
client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="<knowledge-base-name>",
credential=DefaultAzureCredential(),
)
request = KnowledgeBaseRetrievalRequest(
intents=[
KnowledgeRetrievalSemanticIntent(
search="What is the return policy?"
)
],
output_mode=KnowledgeRetrievalOutputMode.EXTRACTIVE_DATA,
retrieval_reasoning_effort=KnowledgeRetrievalMinimalReasoningEffort(),
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="<knowledge-source-name>",
results_processing=KnowledgeSourceResultsProcessing.NONE,
include_references=True,
)
],
)
event_counts = Counter()
with client.retrieve_stream(request) as stream:
for event in stream:
event_counts[event.event_type] += 1
for event_type, count in event_counts.items():
print(f"{event_type}: {count}")
Reference:KnowledgeBaseRetrievalClient
Para ativar o streaming, inclua o cabeçalho Accept: text/event-stream em uma solicitação de recuperação. Sem esse cabeçalho, a ação de recuperação retorna sua resposta JSON padrão.
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Accept: text/event-stream
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "What is the return policy?"
}
],
"outputMode": "extractiveData",
"retrievalReasoningEffort": {
"kind": "minimal"
},
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "{{knowledge-source-name}}",
"kind": "searchIndex",
"resultsProcessing": "none",
"includeReferences": true
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Ciclo de vida do evento
Em vez de retornar uma única resposta, o serviço mantém uma conexão HTTP aberta (tipo text/event-stream; charset=utf-8de conteúdo) e envia uma sequência de eventos à medida que os dados ficam disponíveis. Cada evento tem uma event: linha que nomeia o tipo de evento, uma data: linha com um valor JSON e uma linha em branco que marca o final do evento.
Um fluxo bem-sucedido usa o seguinte ciclo de vida:
| Acontecimento | Quando é enviado | O que ele contém |
|---|---|---|
retrieval.started |
Primeiro evento em cada solicitação transmitida. | A ID da solicitação, o nome da base de dados de conhecimento, o modo de saída e o esforço de raciocínio efetivo após o serviço resolver os padrões de solicitação e base de dados de conhecimento. Se o valor efetivo kind for auto, o evento informará auto; ele não prevê escalonamento futuro. |
activity.started |
Quando o serviço inicia uma atividade de planejamento de consultas, uma atividade de origem ou uma atividade de modelo. Várias atividades podem ser iniciadas antes da conclusão de uma atividade anterior. | A atividade id, typea hora de início e o nome opcional da fonte de dados de conhecimento. |
activity.completed |
Quando essa atividade terminar. Correlacione-o ao seu evento activity.started fazendo a correspondência de id. |
O registro de atividade concluído. |
answer.completed |
Apenas quando outputMode estiver answerSynthesis. |
messageIndex identifica a posição da mensagem na matriz de resposta final e message contém a resposta sintetizada completa. Não há nenhum evento delta token por token. |
references.completed |
Depois que todas as referências forem resolvidas. | Os dados do evento são o array de referências completo, sem um invólucro de objeto. |
response.completed |
O evento terminal de um fluxo com sucesso total ou parcial. | o código de status 200 ou 206 e o corpo completo da resposta retornada, que tem a mesma estrutura de uma chamada JSON sem streaming. Para obter informações sobre o que cada código de status significa, consulte Solucionar problemas da ação de recuperação. |
error |
Em vez de references.completed e response.completed quando a recuperação falhar após o fluxo ser aberto. |
O erro e registros de atividade finalizados antes da falha. |
Os eventos chegam em ordem. Cada evento activity.started precede o evento activity.completed com o mesmo id, mas as atividades podem se intercalar. Os registros de atividades concluídas também incluem carimbos de data/hora startedAt e completedAt. Enquanto o fluxo está ocioso, o servidor envia um : heartbeat comentário aproximadamente a cada 15 segundos para manter a conexão aberta. Os clientes SSE podem ignorar esses comentários.
O exemplo a seguir mostra uma resposta em fluxo, com os payloads encurtados para facilitar a leitura.
event: retrieval.started
data: {"requestId":"<request-id>","outputMode":"answerSynthesis"}
event: activity.started
data: {"id":0,"type":"searchIndex","startedAt":"<timestamp>"}
: heartbeat
event: activity.completed
data: {"id":0,"startedAt":"<start>","completedAt":"<end>"}
event: answer.completed
data: {"messageIndex":0,"message":{"content":[{"type":"text","text":"..."}]}}
event: references.completed
data: [{"type":"searchIndex","id":"0","activitySource":0}]
event: response.completed
data: {"statusCode":200,"response":{}}
Tratar erros, cancelamento e fallback
Falhas de pré-vôo: se a validação da solicitação falhar antes da abertura do fluxo, como para um corpo de solicitação malformado, a ação de recuperação retornará uma resposta de erro JSON padrão e nunca abrirá o fluxo.
Falhas durante o fluxo: se a recuperação falhar após a abertura do fluxo, o evento terminal será
errorem vez dereferences.completederesponse.completed. O evento pode incluir quaisquer registros de atividade que foram concluídos antes da falha. O código de status HTTP permanece200quando o fluxo é iniciado, portanto, verifique o evento de terminal, não o código de status HTTP, para determinar o êxito.Cancelamento ou desconexão: se o cliente cancelar a solicitação ou se desconectar antes que o fluxo seja concluído, o serviço cancelará a recuperação e encerrará o fluxo sem um evento de terminal. Trate todos os eventos recebidos antes do cancelamento ou da desconexão como incompletos.
Fallback JSON: Com
2026-08-01-preview, um cabeçalho ausenteAcceptou um valor comoapplication/json, ,text/**/*outext/event-stream;q=0retorna a resposta JSON padrão descrita em Examinar a resposta. A solicitaçãotext/event-streamde uma versão anterior da API retorna406 Not Acceptable.
Filtrar fontes de conhecimento do índice de pesquisa no momento da consulta
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'
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: 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="<search-endpoint>",
knowledge_base_name="<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(request)
print(result.response[0].content[0].text)
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-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"
}
Substituir dicas de consulta armazenadas no momento da consulta (versão prévia)
A partir da versão 2026-08-01-preview da API, você pode sobrescrever as dicas de consulta armazenadas em uma fonte de conhecimento de índice de busca em uma única solicitação de recuperação, definindo queryHintOverrides em sua entrada knowledgeSourceParams.
A substituição sobrescreve todo o objeto queryHints armazenado, em vez de mesclá-lo entrada por entrada; por isso, inclua todas as indicações que você desejar aplicar. Omita queryHintOverrides para usar as dicas armazenadas.
Quando o esforço de raciocínio de recuperação não é minimal, uma resposta HTTP 400 depende das dicas de filtro armazenadas, não do conteúdo da substituição nem do tipo de aumento. O serviço valida as dicas de filtro armazenadas em relação ao modelo da base de conhecimento antes de aplicar queryHintOverrides. Portanto, um modelo de família GPT-4o ou GPT-4.1 rejeita a solicitação mesmo quando a substituição está vazia ou contém apenas aumentos. Os impulsos armazenados, por si só, não acionam essa validação. Use um modelo compatível ou remova as dicas de filtro armazenadas primeiro.
O exemplo a seguir substitui todas as dicas armazenadas por um reforço fieldValue para conteúdo em japonês. O serviço não aplica nenhum filtro armazenado ou outro impulso armazenado a essa solicitação.
using System;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var endpoint = new Uri("<search-endpoint>");
var retrievalClient = new KnowledgeBaseRetrievalClient(
endpoint,
"product-kb",
new DefaultAzureCredential());
var languageBoost =
new SearchIndexKnowledgeSourceFieldValueBoost(
"language",
2.0);
languageBoost.FieldValues.Add("ja-JP");
var queryHintOverrides =
new SearchIndexKnowledgeSourceQueryHints();
queryHintOverrides.Boosts.Add(languageBoost);
var request = new KnowledgeBaseRetrievalRequest
{
RetrievalReasoningEffort =
new KnowledgeRetrievalLowReasoningEffort(),
IncludeActivity = true
};
request.Messages.Add(
new KnowledgeBaseMessage([
new KnowledgeBaseMessageTextContent(
"Find Japanese service guidance for Model-X200.")
])
{
Role = "user"
});
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"product-docs-ks")
{
QueryHintOverrides = queryHintOverrides
});
var result = await retrievalClient.RetrieveAsync(request);
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
SearchIndexKnowledgeSourceFieldValueBoost,
SearchIndexKnowledgeSourceQueryHints,
)
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalLowReasoningEffort,
SearchIndexKnowledgeSourceParams,
)
retrieval_client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
credential=DefaultAzureCredential(),
knowledge_base_name="product-kb",
)
query_hint_overrides = SearchIndexKnowledgeSourceQueryHints(
boosts=[
SearchIndexKnowledgeSourceFieldValueBoost(
field="language",
field_values=["ja-JP"],
boost=2.0,
)
]
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[
KnowledgeBaseMessageTextContent(
text="Find Japanese service guidance for Model-X200."
)
],
)
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="product-docs-ks",
query_hint_overrides=query_hint_overrides,
)
],
retrieval_reasoning_effort=(
KnowledgeRetrievalLowReasoningEffort()
),
include_activity=True,
)
result = retrieval_client.retrieve(request)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases('product-kb')/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"messages": [{
"role": "user",
"content": [{
"type": "text",
"text": "Find Japanese service guidance for Model-X200."
}]
}],
"knowledgeSourceParams": [{
"knowledgeSourceName": "product-docs-ks",
"kind": "searchIndex",
"queryHintOverrides": {
"boosts": [{
"kind": "fieldValue",
"field": "language",
"fieldValues": ["ja-JP"],
"boost": 2.0
}]
}
}],
"retrievalReasoningEffort": {"kind": "low"},
"includeActivity": true
}
Referência:Recuperação de Conhecimento – Recuperar
Para confirmar se o serviço aplicou sua substituição, defina includeActivity na solicitação e inspecione a atividade searchIndex retornada. Seu queryHintProcessing objeto relata o que o modelo gerou. Para este exemplo, ele contém um generatedBoost para o aumento de idioma, mas não generatedFilter porque a substituição substituiu a dica de filtro armazenada. Como as dicas de consulta são o melhor esforço, trate essa atividade como confirmação em vez de verificar uma expressão exata.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Para obter a definição armazenada, os tipos de dica com suporte e a composição com filtros determinísticos, consulte Configurar dicas de consulta (versão prévia).
Impor permissões no momento da consulta (versão prévia)
As alterações nas permissões de acesso que você definiu fora de 2026-08-01-preview podem levar tempo para aparecer nos resultados de recuperação em 2026-08-01-preview.
Se suas fontes de conhecimento contiverem conteúdo protegido por permissão, passe a identidade do usuário final na solicitação de recuperação para que cada usuário veja apenas o conteúdo que está autorizado a acessar. Para fontes indexadas, o mecanismo de busca usa essa identidade para filtrar os resultados e retorna resultados não filtrados se ela for omitida. Fontes remotas também usam autorização da solicitação de recuperação, mas impõem permissões na origem e podem exigir um token e cabeçalho específicos da origem.
A imposição de permissões tem duas partes:
Tempo de ingestão: somente para fontes de conhecimento indexadas, defina
ingestionPermissionOptionscomo metadados de permissão de ingestão junto com o conteúdo.Tempo de consulta: passe a autorização do usuário no cabeçalho exigido pela fonte de conhecimento. A maioria das fontes usa
x-ms-query-source-authorization. A exceção é o Work IQ, que usax-ms-query-work-iq-source-authorization.
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 de RBAC, ACLs ou Microsoft Purview ingeridos, comparados com a identidade do usuário. |
| OneLake | ✅ | Documento ingerido: rótulos de confidencialidade do Microsoft Purview comparados com a identidade do usuário. |
| SharePoint Indexado | ✅ | ACLs de SharePoint ingeridas ou rótulos de confidencialidade de Microsoft Purview correspondentes à identidade do usuário. |
| SharePoint remoto | ❌ | Copilot faz consultas à API de Recuperação do SharePoint diretamente usando o token do usuário. |
| Agente de Dados do Fabric | ❌ | O mecanismo de recuperação troca o token do usuário por um token com escopo no Microsoft Fabric e consulta o agente de dados em seu nome. |
| Fabric Ontologia | ❌ | O mecanismo de recuperação troca o token do usuário por um token com escopo do Microsoft Fabric e consulta o item de ontologia em seu nome. |
| Qi de trabalho | ❌ | O mecanismo de recuperação troca uma declaração de usuário para o público-alvo do aplicativo de x-ms-query-work-iq-source-authorization por um token com escopo do Work IQ. |
Se você não configurar ingestionPermissionOptions quando criar a fonte de conhecimento indexada, o índice não conterá metadados de permissão. O sistema retorna resultados não filtrados, independentemente do cabeçalho. Para corrigir esse problema, recrie a fonte de conhecimento com os valores apropriados ingestionPermissionOptions .
Autorização no momento da consulta
Para fontes de conhecimento que não sejam do Work IQ, transmita a identidade do usuário final ao incluir um token de acesso com escopo definido para https://search.azure.com/.default na solicitaçã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, confira ACL em tempo de consulta e imposição de RBAC.
Para fontes de conhecimento do Work IQ, esta seção não se aplica. Use o fluxo de asserção do usuário específico do Work IQ descrito em Impor permissões durante a consulta.
No SDK do .NET, passe o token como o parâmetro querySourceAuthorization 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("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: 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, querySourceAuthorization: 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 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="<search-endpoint>",
knowledge_base_name="<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, 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-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Service credential
@user-access-token = <user-access-token> // User identity token
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
x-ms-query-source-authorization: {{user-access-token}}
{
"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 ação de recuperação retorna três componentes principais:
- Resposta extraída ou resposta sintetizada (versão prévia) (dependendo do modo de saída)
- Matriz de atividades
- Matriz de referências
Resposta extraída
A resposta extraída é uma string única e unificada que você normalmente passa para um LLM. O LLM consome a string como dados de base e a utiliza 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 fundamentação exclusivamente ou como um suplemento.
O corpo da resposta é estruturado no formato de estilo de mensagem de chat e 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.typetem um valor válido:text.content.texté uma cadeia de caracteres codificada em JSON que contém os documentos mais relevantes (ou partes) encontrados no índice de pesquisa, considerando as entradas de consulta e histórico de chat. Essa string são os seus dados de fundamento que um LLM 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".
As respostas da recuperação não incluem
@search.rerankerBoostedScore.A propriedade
maxOutputSizeInTokens(maxOutputSizeno2026-05-01-previewe posteriores) na solicitação de recuperação determina o comprimento da string.- Um documento que excede o
maxOutputSizeInTokensorçamento de saída pode ser omitido da resposta. A matriz de atividades inclui um aviso quando o documento mais relevante excede o tamanho máximo de saída. Para reter mais conteúdo, aumentemaxOutputSizeInTokens. Para obter mais informações, consulte Respostas vazias.
- Um documento que excede o
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 para o pipeline de recuperação. Em uma resposta 206 Partial Content, a matriz inclui erros das fontes de conhecimento que falharam. Uma resposta 502 Bad Gateway pode fornecer detalhes sobre a falha apenas no erro de nível superior.
A matriz de atividades inclui os seguintes componentes:
| Seção | Descrição |
|---|---|
| Atividade específica da fonte | 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. |
agenticReasoning |
Esta seção relata o consumo de tokens para o raciocínio de agentes durante a recuperação, o qual depende do esforço de raciocínio de recuperação (versão prévia) especificado. |
modelQueryPlanning |
Para bases de dados de conhecimento que usam um LLM para planejamento de consultas, esta seção relata a contagem de tokens usada para entrada e a contagem de tokens para as subconsultas. Ele inclui um campo model com um campo modelName que contém o nome público do modelo, e não o nome da implantação, do modelo que executou a atividade. |
modelAnswerSynthesis |
Para bases de dados de conhecimento que usam síntese de resposta (versão prévia), esta seção relata a contagem de tokens para formular a resposta e a contagem de tokens da saída da resposta. Ele inclui um campo model com um campo modelName que contém o nome público do modelo, e não o nome da implantação, do modelo que executou a atividade. |
modelWebSummarization |
Para bases de dados de conhecimento que usam resumo da Web, esta seção relata o consumo de tokens para resumir os resultados da Web. Ele inclui um campo model com um campo modelName que contém o nome público do modelo, e não o nome da implantação, do modelo que executou a atividade. |
model |
Para registros de atividade com backup de modelo, esta seção identifica o modelo usado para executar a atividade. Esta seção será exibida somente quando você definir includeActivity como true. |
imageServing |
Para fontes de conhecimento que têm fornecimento de imagens (versão prévia) habilitado, esta seção informa imagesRetrieved, imagesSentToModel, totalImageSizeBytes e se verbalizationUsed no momento da indexação estava ativado. Inspecione verbalizationUsed e imagesSentToModel independentemente. Uma resposta pode relatar verbalizationUsed como true e ainda enviar imagens para o modelo downstream. Para localizar o número de imagens descartadas, subtraia imagesSentToModel de imagesRetrieved. |
O exemplo a seguir mostra a 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 e é composto por todos os documentos que o mecanismo de recuperação agêntico encontra e classifica semanticamente.
A matriz de referências inclui os seguintes componentes:
| Campo | Descrição |
|---|---|
type |
O tipo de fonte de conhecimento que produziu a referência, como searchIndex. |
id |
A ID de referência de um item dentro de uma resposta. Não é a chave do documento no índice de pesquisa. Use-o para fornecer citações. |
activitySource |
Faz referência ao id do registro de atividade que gerou a referência, o que é útil para a vinculação de citações. |
docKey |
Para uma referência indexada, a chave do documento no índice de pesquisa subjacente. |
sourceData |
Os dados de embasamento usados para gerar a resposta. Para uma referência indexada, os campos podem incluir campos id semânticos, como title, termse content. A forma varia de acordo com o tipo de referência. |
citationUrl (versão prévia) |
Uma URL somente leitura, gerada pelo serviço, que aponta para o documento da referência no índice subjacente. Retornado somente para fontes de conhecimento indexadas. Para seguir a URL, consulte Pesquisar documentos com URLs de citação (versão prévia). |
O exemplo a seguir mostra a matriz de referências.
"references": [
{
"type": "searchIndex",
"id": "0",
"activitySource": 2,
"docKey": "policy=aug-2026",
"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
"sourceData": null
},
{
"type": "searchIndex",
"id": "1",
"activitySource": 2,
"docKey": "2",
"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/2?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
"sourceData": null
}
]
Pesquisar documentos com URLs de citação (versão prévia)
A partir da versão da API 2026-08-01-preview, uma referência de uma fonte de conhecimento indexada pode incluir citationUrl na resposta de recuperação. Use essa URL para buscar os campos indexados para essa referência, como title e content, portanto, você pode renderizar uma visualização de citação mostrando de onde veio uma resposta sem abrir o documento de origem original. O citationUrl é uma consulta autenticada ao índice subjacente, separada do docUrl e do blobUrl de origem.
O exemplo a seguir mostra uma URL de citação higienizada.
"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview"
Os campos selecionados e sua ordem dependem da origem indexada e da configuração de recuperação.
Importante
Siga a URL completa da resposta verbatim e renderize os campos JSON retornados em seu aplicativo. Não construa, analise ou normalize a URL.
Dada uma URL de citação, os exemplos a seguir obtêm um token de acesso para o serviço de busca. Eles chamam a URL com esse token no cabeçalho Authorization. A identidade conectada precisa da função Leitor de Dados do Índice de Pesquisa.
Os métodos de busca de documentos do SDK do Pesquisa de IA do Azure exigem o ponto de extremidade, o nome do índice, a chave do documento, os campos selecionados e a versão da API como parâmetros separados. Eles não aceitam uma URL de citação absoluta. Esses exemplos usam um HTTP GET autenticado para preservar a URL completa gerada pelo serviço.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;
// citationUrl comes from a retrieve response
string citationUrl = "<citation-url>";
var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext(
new[] { "https://search.azure.com/.default" }));
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.Token);
string document = await httpClient.GetStringAsync(citationUrl);
Console.WriteLine(document);
Reference:DefaultAzureCredential
import json
from urllib.request import Request, urlopen
from azure.identity import DefaultAzureCredential
# citation_url comes from a retrieve response
citation_url = "<citation-url>"
credential = DefaultAzureCredential()
token = credential.get_token("https://search.azure.com/.default")
document_request = Request(
citation_url,
headers={"Authorization": f"Bearer {token.token}"},
)
with urlopen(document_request) as response:
document = json.load(response)
print(json.dumps(document, indent=2))
Reference:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Referência:Documentos - Obter
A pesquisa de documento retorna os campos de índice selecionados como JSON:
{
"id": "policy=aug-2026",
"title": "Escaped citation key",
"content": "Citation interoperability uses an escaped document key for the August preview.",
"category": "release",
"language": "en-US"
}
Ao consumir uma URL de citação, tenha o seguinte em mente:
citationUrlVerifique antes de renderizar uma citação. Ele pode estar ausente se a resposta omitir referências ou se o serviço não puder resolver o índice de backup ou a chave do documento.Se a solicitação de recuperação incluir
x-ms-query-source-authorizationpara controle de acesso em nível de documento, use o mesmo token de usuário ao seguir a URL.A URL permanece válida somente enquanto o índice de backup e a chave do documento permanecem inalterados.
Inspecionar metadados de rótulo de confidencialidade na resposta (versão prévia)
O mesmo comportamento de temporização descrito em Aplicar permissões no momento da consulta se aplica aqui: alterações nas permissões de acesso que você define fora de 2026-08-01-preview podem levar tempo para aparecer nas respostas de recuperação em 2026-08-01-preview.
Quando você consulta uma base de dados de conhecimento que ingere rótulos de confidencialidade do Microsoft Purview, a resposta de recuperação inclui metadados de rótulo em dois níveis:
| Localidade | Campo | Descrição |
|---|---|---|
| Por referência | sensitivityLabelInfo |
O rótulo de confidencialidade aplicado a cada documento retornado na matriz references. |
| Resposta | metadata.responseSensitivityLabelInfo |
Um rótulo agregado que representa o rótulo de confidencialidade de maior prioridade entre todos os documentos referenciados na resposta. Útil para banners de exibição no lado do cliente e aplicação de políticas. |
O Microsoft Graph calcula o rótulo no nível da resposta com base nos rótulos de cada referência usando as regras de herança de rótulos do Microsoft Purview. Normalmente, o rótulo mais restritivo ganha.
O exemplo a seguir mostra uma resposta de recuperação com dois documentos referenciados (um Confidential, um Internal) e o rótulo de nível de resposta resultante.
{
"response": [
{
"role": "assistant",
"content": [
{ "type": "text", "text": "[ ... grounding data ... ]" }
]
}
],
"references": [
{
"type": "azureBlob",
"id": "0",
"activitySource": 1,
"docKey": "contract-2026.pdf",
"sensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Confidential",
"color": "#FF0000",
"tooltip": "Confidential — Recipients can read but not forward.",
"isEncrypted": true,
"priority": 3
},
"sourceData": null
},
{
"type": "azureBlob",
"id": "1",
"activitySource": 1,
"docKey": "policy-overview.pdf",
"sensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Internal",
"color": "#FFA500",
"tooltip": "For internal use only.",
"isEncrypted": false,
"priority": 1
},
"sourceData": null
}
],
"metadata": {
"responseSensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Confidential",
"color": "#FF0000",
"tooltip": "Confidential — Recipients can read but not forward.",
"isEncrypted": true,
"priority": 3
}
}
}
Tipos de referência que exibem rótulos de confidencialidade
O nome do campo e a disponibilidade dos metadados de rótulo dependem do tipo de fonte de conhecimento que produziu cada referência.
Referência type |
Campo de rótulo | Disponível quando... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
A fonte de conhecimento do blob inclui sensitivityLabel em ingestionPermissionOptions. |
indexedOneLake |
sensitivityLabelInfo |
A fonte de conhecimento do OneLake inclui sensitivityLabel em ingestionPermissionOptions. |
indexedSharePoint |
sensitivityLabelInfo |
A fonte de conhecimento indexada do SharePoint inclui sensitivityLabel em ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
O índice subjacente tem purviewEnabled definido como true e um campo marcado com sensitivityLabel: true. |
Exibir e auditar recomendações
Use
sensitivityLabelInfo.labelIdpara consultar a definição completa do rótulo por meio das APIs de rótulos de confidencialidade do Microsoft Graph quando precisar de propriedades adicionais, como controles de política ou permissões.Use
metadata.responseSensitivityLabelInfopara exibir um banner de confidencialidade no nível da resposta ou aplicar controles de política, como desabilitar a cópia e o compartilhamento, em toda a resposta.Se sua fonte de conhecimento apontar para um índice fragmentado, como aquele populado por vetorização integrada ou por uma habilidade personalizada de Divisão de Texto, o conjunto de habilidades também deverá projetar o rótulo de confidencialidade em cada linha de fragmento. Sem esse mapeamento, as referências em nível de bloco não são filtradas corretamente no momento da consulta.
Para obter acesso administrativo auditável ao conteúdo rotulado, consulte Leitura com privilégios elevados para investigações administrativas.
Comportamento do servidor MCP
O ponto de extremidade MCP exposto por cada base de conhecimento expõe os mesmos campos de rótulo de confidencialidade que a API REST. Quando um cliente compatível com MCP invoca a ferramenta knowledge_base_retrieve, o resultado da ferramenta contém os mesmos sensitivityLabelInfo por referência e metadata.responseSensitivityLabelInfo no nível da resposta documentados anteriormente nesta seção. Os clientes MCP aplicam controles de exibição e de política sensíveis a rótulos com base nesses campos.
Recuperar exemplos de ação (versão prévia)
Os exemplos a seguir mostram diferentes maneiras de chamar a ação de recuperação usando a versão da 2026-08-01-preview API. Essa versão dá suporte ao conjunto de recursos completo, incluindo síntese de respostas e um esforço de raciocínio configurável. Para o uso de 2026-04-01, consulte as seções anteriores.
- Inspecionar nomes de modelo em logs de atividades
- Exigir que uma fonte de conhecimento tenha sucesso
- Excluir uma fonte de conhecimento de uma solicitação
- Ajustar documentos candidatos para cada fonte de conhecimento
- Limitar documentos finais de fundamentação
- Verificar as configurações padrão de recuperação da base de conhecimento
- Sobrescrever o processo de raciocínio padrão e definir limites de requisição
- Permitir que o serviço escolha o esforço de raciocínio
- Definir referências para cada fonte de conhecimento
- Usar o mínimo de esforço de raciocínio
Inspecionar nomes de modelo em logs de atividades
Defina includeActivity como true para que retorne campos de identificação do modelo em registros de atividade com suporte em modelo. Use estes campos para confirmar qual modelo configurado foi usado para o planejamento da consulta, a síntese da resposta ou o resumo da Web durante uma solicitação de recuperação. O exemplo a seguir substitui o processamento de resultados armazenados para a origem selecionada na solicitação.
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var kbClient = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"<knowledge-base-name>",
new DefaultAzureCredential()
);
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[]
{
new KnowledgeBaseMessageTextContent(
"Which policy applies to returns?"
)
}
) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"<knowledge-source-name>"
)
{
ResultsProcessing = KnowledgeSourceResultsProcessing.None
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
foreach (var activity in result.Value.Activity)
{
KnowledgeBaseActivityRecordModel? model = activity switch
{
KnowledgeBaseModelQueryPlanningActivityRecord queryPlanning =>
queryPlanning.Model,
KnowledgeBaseModelAnswerSynthesisActivityRecord answerSynthesis =>
answerSynthesis.Model,
KnowledgeBaseModelWebSummarizationActivityRecord webSummarization =>
webSummarization.Model,
_ => null
};
if (model is not null)
{
Console.WriteLine(
$"modelName={model.ModelName}, deploymentId={model.DeploymentId}");
}
}
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
KnowledgeBaseModelAnswerSynthesisActivityRecord,
KnowledgeBaseModelQueryPlanningActivityRecord,
KnowledgeBaseModelWebSummarizationActivityRecord,
KnowledgeBaseRetrievalRequest,
SearchIndexKnowledgeSourceParams,
)
kb_client = KnowledgeBaseRetrievalClient(
"<search-endpoint>",
DefaultAzureCredential(),
knowledge_base_name="<knowledge-base-name>",
)
model_activity_types = (
KnowledgeBaseModelQueryPlanningActivityRecord,
KnowledgeBaseModelAnswerSynthesisActivityRecord,
KnowledgeBaseModelWebSummarizationActivityRecord,
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[
KnowledgeBaseMessageTextContent(
text="Which policy applies to returns?"
)
],
)
],
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="<knowledge-source-name>",
results_processing="none",
)
],
)
result = kb_client.retrieve(request)
for entry in result.activity or []:
if isinstance(entry, model_activity_types) and entry.model:
print(
"modelName=", entry.model.model_name,
"deploymentId=", entry.model.deployment_id,
)
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Which policy applies to returns?" }
]
}
],
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "{{knowledge-source-name}}",
"kind": "searchIndex",
"resultsProcessing": "none"
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
O trecho de resposta a seguir mostra a identidade do modelo aninhado:
{
"activity": [
{
"type": "modelQueryPlanning",
"id": 0,
"model": {
"modelName": "gpt-5-mini",
"deploymentId": "gpt-5-mini-deployment"
},
"inputTokens": 1842,
"outputTokens": 87,
"elapsedMs": 1923
},
{
"type": "searchIndex",
"id": 1,
"knowledgeSourceName": "operations-ks",
"count": 12,
"elapsedMs": 234
},
{
"type": "modelAnswerSynthesis",
"id": 2,
"model": {
"modelName": "gpt-5-mini",
"deploymentId": "gpt-5-mini-deployment"
},
"inputTokens": 2418,
"outputTokens": 179,
"elapsedMs": 931
}
]
}
Exija que uma fonte de conhecimento tenha êxito
Defina failOnError em knowledgeSourceParams para marcar uma fonte de conhecimento como obrigatória. Use esse parâmetro quando uma resposta parcial for enganosa ou não compatível se essa origem não estiver disponível. A solicitação retornará 502 Bad Gateway se uma fonte necessária falhar, mesmo que outra fonte seja bem-sucedida. Para obter orientações sobre como proceder, consulte Solucionar problemas na ação de recuperação.
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("Which HR policy applies?")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("hr-policy-ks")
{
FailOnError = true,
AlwaysQuerySource = true
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("hr-faq-ks")
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Referência:SearchIndexKnowledgeSourceParams
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="Which HR policy applies?")],
)
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="hr-policy-ks",
fail_on_error=True,
always_query_source=True,
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="hr-faq-ks",
),
],
)
result = kb_client.retrieve(request)
Referência:SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Which HR policy applies?" }
]
}
],
"knowledgeSourceParams": [
{
"knowledgeSourceName": "hr-policy-ks",
"kind": "searchIndex",
"failOnError": true,
"alwaysQuerySource": true
},
{
"knowledgeSourceName": "hr-faq-ks",
"kind": "searchIndex"
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Excluir uma fonte de conhecimento de uma solicitação
Começando com a versão da 2026-08-01-preview API, defina neverQuerySourcetrue para cada fonte de conhecimento que você deseja excluir de uma solicitação de recuperação. No momento da solicitação, neverQuerySource sobrescreve o valor armazenado alwaysQuerySource nessa solicitação, sem alterar o valor armazenado.
O exemplo a seguir consulta uma base de dados de conhecimento que contém product-docs-ks e troubleshooting-ks, excluindo da solicitação troubleshooting-ks .
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"Explain the official SSO provisioning steps.")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("product-docs-ks")
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("troubleshooting-ks")
{
NeverQuerySource = true
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Referência:SearchIndexKnowledgeSourceParams
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[
KnowledgeBaseMessageTextContent(
text="Explain the official SSO provisioning steps."
)
],
)
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="product-docs-ks",
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="troubleshooting-ks",
never_query_source=True,
),
],
)
result = kb_client.retrieve(request)
Referência:SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Explain the official SSO provisioning steps."
}
]
}
],
"knowledgeSourceParams": [
{
"knowledgeSourceName": "product-docs-ks",
"kind": "searchIndex"
},
{
"knowledgeSourceName": "troubleshooting-ks",
"kind": "searchIndex",
"neverQuerySource": true
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Ajustar documentos candidatos para cada fonte de conhecimento
Defina maxOutputDocuments em knowledgeSourceParams para limitar o número de documentos candidatos que uma fonte de conhecimento específica fornece antes da seleção do resultado final. Use esse parâmetro quando quiser associar a entrada de uma fonte ao pipeline sem afetar outras pessoas.
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What safety procedures apply?")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("operations-ks")
{
MaxOutputDocuments = 50
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Referência:SearchIndexKnowledgeSourceParams
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What safety procedures apply?")],
)
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="operations-ks",
max_output_documents=50,
),
],
)
result = kb_client.retrieve(request)
Referência:SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases/operations-kb/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What safety procedures apply?" }
]
}
],
"knowledgeSourceParams": [
{
"knowledgeSourceName": "operations-ks",
"kind": "searchIndex",
"maxOutputDocuments": 50
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Limitar os documentos de fundamentação finais
O parâmetro de nível superior maxOutputDocuments limita o número de documentos de embasamento retornados na resposta final de recuperação. Use esse parâmetro quando seu aplicativo precisar de uma citação previsível ou uma contagem de referência.
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What is the return policy?")
}
) { Role = "user" }
);
retrievalRequest.OutputMode = "extractedData";
retrievalRequest.MaxOutputDocuments = 3;
retrievalRequest.MaxOutputSizeInTokens = 6000;
var result = await kbClient.RetrieveAsync(retrievalRequest);
Reference:KnowledgeBaseRetrievalRequest
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What is the return policy?")],
)
],
output_mode="extractedData",
max_output_documents=3,
max_output_size_in_tokens=6000,
)
result = kb_client.retrieve(request)
Reference:KnowledgeBaseRetrievalRequest
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What is the return policy?" }
]
}
],
"outputMode": "extractedData",
"maxOutputDocuments": 3,
"maxOutputSizeInTokens": 6000
}
Referência:Recuperação de Conhecimento – Recuperar
A tabela a seguir mostra como maxOutputDocuments e maxOutputSizeInTokens interagem entre todas as quatro combinações.
maxOutputDocuments |
maxOutputSizeInTokens |
Behavior |
|---|---|---|
| Unspecified | Unspecified | Usa o comportamento de limite de resposta padrão maxOutputSizeInTokens . |
| Unspecified | Especificado | Descarta documentos assim que o limite de tamanho da carga útil é atingido. |
| Especificado | Unspecified | Retorna até o número especificado de documentos de fundamentação e não aplica um limite de maxOutputSizeInTokens. |
| Especificado | Especificado | Retorna até maxOutputDocuments documentos ou quantos couberem dentro de maxOutputSizeInTokens, o que ocorrer primeiro. |
Verificar as configurações padrão de recuperação da base de conhecimento
Uma base de conhecimento pode armazenar valores padrão da solicitação em retrieveDefaults. Envie duas solicitações de recuperação para verificar a herança e as substituições específicas da solicitação.
Antes de começar, conclua a configuração de limites de recuperação padrão (versão prévia). A primeira solicitação omite todos os três limites de toda a solicitação, portanto, os valores armazenados de 45 segundos, oito documentos e 12.000 tokens se aplicam. A segunda solicitação substitui esses valores por 20 segundos, um documento e 5.000 tokens.
using System;
using Azure.Identity;
using Azure.Search.Documents;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
string searchEndpoint = "<search-endpoint>";
var options = new SearchClientOptions(
SearchClientOptions.ServiceVersion.V2026_08_01_Preview);
var kbClient = new KnowledgeBaseRetrievalClient(
new Uri(searchEndpoint),
"your-knowledge-base",
new DefaultAzureCredential(),
options);
KnowledgeBaseRetrievalRequest CreateRequest()
{
var request = new KnowledgeBaseRetrievalRequest();
request.Intents.Add(new KnowledgeRetrievalSemanticIntent(
"Summarize the latest support guidance."));
return request;
}
var inherited = await kbClient.RetrieveAsync(CreateRequest());
Console.WriteLine(
$"Stored defaults: {inherited.Value.References.Count} references");
KnowledgeBaseRetrievalRequest overriddenRequest = CreateRequest();
overriddenRequest.MaxRuntimeInSeconds = 20;
overriddenRequest.MaxOutputDocuments = 1;
overriddenRequest.MaxOutputSize = 5000;
var overridden = await kbClient.RetrieveAsync(overriddenRequest);
Console.WriteLine(
$"Request overrides: {overridden.Value.References.Count} references");
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalSemanticIntent,
)
kb_client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="your-knowledge-base",
credential=DefaultAzureCredential(),
api_version="2026-08-01-preview",
)
def create_request(**limits):
return KnowledgeBaseRetrievalRequest(
intents=[
KnowledgeRetrievalSemanticIntent(
search="Summarize the latest support guidance.",
)
],
**limits,
)
inherited = kb_client.retrieve(create_request())
print(f"Stored defaults: {len(inherited.references or [])} references")
overridden = kb_client.retrieve(
create_request(
max_runtime_in_seconds=20,
max_output_documents=1,
max_output_size=5000,
)
)
print(f"Request overrides: {len(overridden.references or [])} references")
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Primeiro, envie uma solicitação que omite os três campos de limite de toda a solicitação.
POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Summarize the latest support guidance."
}
]
}
Em seguida, sobrescreva os três valores para uma solicitação.
POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Summarize the latest support guidance."
}
],
"maxRuntimeInSeconds": 20,
"maxOutputDocuments": 1,
"maxOutputSize": 5000
}
Referência:Recuperação de Conhecimento – Recuperar
A contagem de referência mostra se o valor armazenado ou no nível maxOutputDocuments da solicitação se aplica: a primeira resposta contém no máximo oito referências e a segunda contém no máximo uma. Uma resposta pode conter menos referências quando menos documentos correspondem. A resposta não informa o tempo de execução efetivo nem o orçamento de tokens de saída, mas esses valores ainda controlam o processamento da solicitação. As substituições da solicitação não alteram os valores padrão armazenados.
Sobrepor o esforço de processamento padrão e definir limites de solicitação
O exemplo a seguir especifica a síntese de resposta, portanto, o esforço de raciocínio de recuperação deve ser low ou medium. Ele também define maxRuntimeInSeconds para limitar o tempo de execução da recuperação e maxOutputSizeInTokens para limitar o tamanho da carga útil da resposta.
maxRuntimeInSeconds aceita valores de 10 a 600 segundos e usa como padrão 90 segundos. O máximo de 600 segundos (10 minutos) aplica-se somente à solicitação de recuperação de Pesquisa de IA do Azure .
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.MaxOutputSizeInTokens = 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,
KnowledgeRetrievalOutputMode,
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
)
],
retrieval_reasoning_effort=KnowledgeRetrievalLowReasoningEffort(),
output_mode=KnowledgeRetrievalOutputMode.ANSWER_SYNTHESIS,
max_runtime_in_seconds=30,
max_output_size_in_tokens=6000,
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
POST {{search-endpoint}}/knowledgebases/kb-override/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
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,
"maxOutputSizeInTokens": 6000
}
Referência:Recuperação de Conhecimento – Recuperar
Permitir que o serviço escolha o esforço de raciocínio
Defina retrievalReasoningEffort.kind para auto em uma solicitação de recuperação para substituir o padrão da base de conhecimento. Para obter mais informações sobre o raciocínio automático, consulte Definir o esforço de raciocínio de recuperação (versão prévia).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Referência:Recuperação de Conhecimento – Recuperar
Definir referências para cada fonte de conhecimento
Use includeReferences e includeReferenceSourceData entre knowledgeSourceParams para controlar quais fontes aparecem na matriz de referências e quantos dados de origem cada entrada inclui. O exemplo a seguir usa o esforço de raciocínio padrão da base de dados de conhecimento.
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;
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-financials-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = true
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-communicationservices-ks")
{
IncludeReferences = false,
IncludeReferenceSourceData = false
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-healthcare-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = false,
AlwaysQuerySource = true
}
);
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(request)
print(result.response[0].content[0].text)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases/kb-medium-example/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
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
Usar o mínimo de esforço de raciocínio
No exemplo a seguir, 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 por meio de agentes 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(request)
print(result.response[0].content[0].text)
Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
POST {{search-endpoint}}/knowledgebases/kb-minimal/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"intents": [
{
"type": "semantic",
"search": "what is a brokerage"
}
]
}
Referência:Recuperação de Conhecimento – Recuperar
Solucionar problemas na ação de recuperação
Em 2026-08-01-preview, o status de resposta indica se a recuperação foi bem-sucedida, parcialmente bem-sucedida ou falhou e o que fazer em seguida. Use a tabela a seguir para mapear cada status para seu significado e, em seguida, ver a seção correspondente para obter diretrizes de solução de problemas.
| Status | Meaning |
|---|---|
200 OK |
A recuperação foi realizada com sucesso. Um documento ainda poderá ser omitido se seu conteúdo exceder o orçamento de saída. Para obter mais informações, consulte Respostas vazias. |
400 Bad Request |
A solicitação de recuperação falhou na validação antes do início da recuperação. |
206 Partial Content |
Pelo menos uma fonte foi bem-sucedida e nenhuma fonte com falha foi marcada failOnError. A resposta contém resultados das fontes que tiveram êxito. |
502 Bad Gateway |
Todas as fontes selecionadas falharam ou uma origem marcada failOnError: true falhou. |
Para qualquer resposta diferente de 200, registre a versão da API, a data e hora, o corpo da solicitação saneado, os cabeçalhos da resposta e o ID da solicitação ou de correlação. Esses detalhes ajudam você a diagnosticar a falha e compartilhar o problema com suporte, se necessário.
400 Bad Request
Use o erro de nível superior para identificar a propriedade de solicitação inválida. As causas mais comuns incluem:
- Uma
knowledgeSourceNameemknowledgeSourceParamsnão está anexada à base de conhecimento ou seukindnão corresponde à fonte anexada. - Um valor de solicitação está fora do intervalo com suporte ou uma opção requer outra opção que não está habilitada. Por exemplo, o
includeReferenceSourceDatarequerincludeReferences. -
retrievalReasoningEffort.kindéauto, mas a solicitação usa uma versão de API anterior a2026-08-01-preview. - A solicitação usa
auto,lowoumedium, mas a base de dados de conhecimento não define um modelo. - Para a exclusão da fonte no momento da solicitação (versão prévia), a mesma entrada define
alwaysQuerySourceeneverQuerySourcecomotrue, ou todas as fontes de conhecimento conectadas são excluídas.
Antes de repetir a solicitação, corrija a propriedade identificada pelo erro de nível superior.
206 Partial Content
Inspecione cada entrada activity que contém um error. Uma atividade de recuperação de origem identifica a fonte de conhecimento com falha e uma atividade de modelo identifica o estágio de processamento com falha. O corpo da resposta ainda contém os resultados que foram bem-sucedidos.
Para erros na atividade de recuperação da origem, as causas comuns incluem:
- Entrada de tempo de consulta inválida, como uma expressão
filterAddOnmalformada. - Desalinhamento da configuração da fonte de conhecimento ou do índice, como um campo renomeado, configuração semântica ausente ou vetorizador inválido.
- Autorização de dependência ausente ou inválida, ou permissões insuficientes para a identidade usada para consultar a fonte.
- A limitação de dependência, tempo limite ou falhas de disponibilidade transitórias.
Para um erro na atividade do modelo, use a atividade type para identificar a etapa de processamento com falha. Por exemplo, um modelWebSummarization erro indica que o resumo de resultados da Web falhou.
Se o aplicativo permitir resultados parciais, processe os resultados bem-sucedidos e registre cada estágio de origem ou modelo com falha. Corrija os erros de configuração, autorização e permissão antes de tentar novamente. Para limitação, tempo limite ou falhas transitórias de disponibilidade, use novas tentativas limitadas com retirada.
Se os resultados não forem seguros sem uma fonte específica e o tipo da fonte oferecer suporte a alwaysQuerySource, defina alwaysQuerySource e failOnError. A primeira opção garante que a origem esteja selecionada e a segunda retornará um erro rígido se a consulta falhar.
Fontes de conhecimento do servidor MCP (versão prévia) não são compatíveis com alwaysQuerySource; para essas fontes, failOnError se aplica somente quando a fonte é selecionada.
failOnError não se aplica a falhas de atividade de modelo.
502 Bad Gateway
O erro de nível superior descreve um de dois caminhos de falha grave:
- Falha em todas as fontes selecionadas: Cada origem selecionada retornou um erro. Uma fonte concluída com sucesso sem nenhum documento correspondente não é uma fonte que falhou. Verifique cada falha de origem em busca de um problema comum de configuração, autorização, dependência ou disponibilidade.
-
Falha
failOnErrorna fonte: não foi possível consultar uma fonte necessária. Outras fontes podem ter sido bem-sucedidas, mas o serviço não retorna um resultado parcial porque a origem necessária falhou.
As falhas de origem subjacentes geralmente são os mesmos tipos descritos para 206 Partial Content: entrada específica da origem inválida, descompasso de configuração de origem ou índice, autorização de dependência ou permissões, limitação, tempo limite ou disponibilidade de dependência transitória.
Uma resposta rígida 502 pode omitir o array activity e informar o nome da origem e a falha subjacente apenas na mensagem de erro de nível superior. Corrija os erros de configuração, autorização e permissão antes de tentar novamente. Use as novas tentativas com retirada somente para limitação, tempo limite ou falhas transitórias de disponibilidade. Não interprete uma resposta 502 Bad Gateway como uma interrupção do Pesquisa de IA do Azure sem examinar a falha subjacente na origem.
Respostas vazias
A etapa de pesquisa pode encontrar um documento, mas o serviço ainda pode omiti-lo da resposta final se o conteúdo fundamentado exceder o orçamento de saída maxOutputSizeInTokens (maxOutputSize no 2026-05-01-preview e posteriores). Quando essa condição ocorre, a lista de atividades mostra que foram encontradas correspondências, e o registro da atividade inclui um aviso de que o documento mais relevante excedeu o tamanho máximo de saída. O array de referências e o conteúdo de resposta fundamentada estão vazios nesse documento. Para reter mais conteúdo, aumente maxOutputSizeInTokens.
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.
Chamar o ponto de extremidade do MCP
Warning
As implementações do MCP são suscetíveis a riscos, como ataques, falhas em cascata e perda de supervisão humana. Você pode mitigar esses riscos avaliando os servidores MCP quanto à segurança e à confiabilidade, seguindo as práticas recomendadas da Microsoft e as práticas recomendadas do setor, e implementando mecanismos de aprovação e monitorando os comportamentos em cascata.
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.
Autenticar no ponto de extremidade do MCP
Cada base de conhecimento possui um endpoint MCP na seguinte URL:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
A versão da API especificada determina o que a conexão retorna. Ao usar 2026-08-01-preview, a base de dados de conhecimento retorna respostas sintetizadas quando a base de dados de conhecimento subjacente é configurada com um LLM e um esforço de raciocínio compatível. Ao usar 2026-04-01, a recuperação é sempre mínima e extrativa, e a conexão retorna apenas dados de embasamento.
A forma como você se autentica neste endpoint depende do seu cliente MCP. Ao usar a API de Respostas do Azure OpenAI com a ferramenta MCP knowledge_base_retrieve, você autentica tanto a chamada à API de Respostas para o Azure OpenAI quanto a solicitação MCP para o Pesquisa de IA do Azure . Se o cliente MCP chamar esse endpoint diretamente, você se autentica somente no Pesquisa de IA do Azure .
Para a autenticação do Pesquisa de IA do Azure , use um dos seguintes métodos:
-
Aprovar um token de portador no cabeçalho
Authorization(recomendado) -
Passar uma chave de administrador no
api-keycabeçalho
Nota
Os clientes MCP configuram cabeçalhos personalizados de forma diferente. Por exemplo, o Foundry Agent Service injeta cabeçalhos por meio de conexões de projeto, enquanto clientes como GitHub Copilot exigem cabeçalhos no JSON do servidor MCP.
Usar um token de portador para autenticação de MCP
O método recomendado para autenticação MCP é um token de portador, que evita o armazenamento de chaves confidenciais em arquivos de configuração. A identidade por trás do token deve ter a função Leitor de Dados do Índice de Pesquisa atribuída no serviço de pesquisa. Para obter mais informações, consulte Conectar seu aplicativo para Pesquisa de IA do Azure usando identidades.
#pragma warning disable OPENAI001
using Azure.AI.OpenAI;
using Azure.Core;
using Azure.Identity;
using OpenAI.Responses;
using System;
using System.Collections.Generic;
string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!; // Example: https://<resource-name>.openai.azure.com
string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
DefaultAzureCredential credential = new();
// Create the Azure OpenAI Responses client
AzureOpenAIClient azureClient = new(new Uri(openAiEndpoint), credential);
ResponsesClient openAIClient = azureClient.GetResponsesClient();
// Get a bearer token for Azure AI Search
string searchToken = credential.GetToken(
new TokenRequestContext(new[] { "https://search.azure.com/.default" })
).Token;
// Configure the MCP tool for knowledge base retrieval
McpTool mcpTool = ResponseTool.CreateMcpTool(
serverLabel: "search_kb",
serverUri: new Uri(mcpServerUrl),
headers: new Dictionary<string, string>
{
["Authorization"] = $"Bearer {searchToken}",
},
allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);
// Build the response request with the MCP tool attached
CreateResponseOptions options = new()
{
Model = "MODEL_NAME",
InputItems =
{
ResponseItem.CreateUserMessageItem(
"What causes the strongest nighttime brightness patterns in this dataset?")
},
Tools = { mcpTool }
};
ResponseResult response = await openAIClient.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText());
Referência:Usar a API de Respostas do OpenAI Azure
import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
openai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"] # Example: https://<resource-name>.openai.azure.com
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
credential = DefaultAzureCredential()
# Create token providers for Azure OpenAI and Azure AI Search
openai_token_provider = get_bearer_token_provider(
credential, "https://cognitiveservices.azure.com/.default"
)
search_token_provider = get_bearer_token_provider(
credential, "https://search.azure.com/.default"
)
# Create the Azure OpenAI client
client = AzureOpenAI(
azure_endpoint=openai_endpoint,
azure_ad_token_provider=openai_token_provider,
api_version=os.environ["OPENAI_API_VERSION"], # Example: 2025-04-01-preview
)
# Create a response using the MCP tool configuration
response = client.responses.create(
model="MODEL_NAME",
input="What causes the strongest nighttime brightness patterns in this dataset?",
tools=[
{
"type": "mcp",
"server_label": "search_kb",
"server_url": mcp_server_url,
"allowed_tools": ["knowledge_base_retrieve"],
"headers": {
"Authorization": f"Bearer {search_token_provider()}"
},
"require_approval": "never",
}
],
)
print(response.output_text)
Referência:Usar a API de Respostas do OpenAI Azure
// This code snippet is currently unavailable.
Usar uma chave de administrador para autenticação MCP
Uma chave de administrador concede acesso completo de leitura e gravação ao serviço de pesquisa, portanto, use-a somente em ambientes de desenvolvimento ou quando um token de portador não estiver disponível. Para obter mais informações, consulte Conectar para Pesquisa de IA do Azure usando chaves de API.
Tip
O exemplo a seguir só mostra o cabeçalho que difere do exemplo do token de portador. Para obter a configuração completa, consulte Usar um token de portador para autenticação MCP.
#pragma warning disable OPENAI001
using OpenAI.Responses;
using System;
using System.Collections.Generic;
string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
string searchAdminKey = Environment.GetEnvironmentVariable("AZURE_SEARCH_ADMIN_KEY")!; // Example: <search-api-key>
McpTool mcpTool = ResponseTool.CreateMcpTool(
serverLabel: "search_kb",
serverUri: new Uri(mcpServerUrl),
headers: new Dictionary<string, string> { ["api-key"] = searchAdminKey },
allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);
Referência:Usar a API de Respostas do OpenAI Azure
import os
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
search_admin_key = os.environ["AZURE_SEARCH_ADMIN_KEY"] # Example: <search-api-key>
tools = [
{
"type": "mcp",
"server_label": "search_kb",
"server_url": mcp_server_url,
"allowed_tools": ["knowledge_base_retrieve"],
"headers": {"api-key": search_admin_key},
"require_approval": "never",
}
]
Referência:Usar a API de Respostas do OpenAI Azure
// This code snippet is currently unavailable.
Examinar a resposta do MCP
Quando um cliente MCP invoca knowledge_base_retrieve, ele recebe um resultado de ferramenta MCP em vez do envelope response, activity e references da ação retrieve. Muitos clientes MCP apresentam esse resultado da ferramenta sob um objeto result de nível superior, portanto, a carga útil que você deve esperar é result.content[].
{
"result": {
"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:
result.content[]contém a saída da ferramenta MCP retornada pela base de conhecimento.result.content[].typeétext.result.content[].textcontém os dados de aterramento recuperados como uma cadeia de caracteres codificada em JSON.Ao contrário da ação de recuperação, a resposta MCP atual não retorna arrays
activityoureferencesseparados e não preenche entradasresourcepara o conteúdo retornado.
Conteúdo relacionado
- Recuperação com agentes na Pesquisa de IA do Azure
- Aplicação de ACL e RBAC no momento da consulta (prévia)
- Usar um indexador de blob ou uma fonte de conhecimento para ingerir os metadados dos escopos RBAC (versão prévia)
- Agentic RAG: criar um mecanismo de recuperação de raciocínio com Pesquisa de IA do Azure (vídeo do YouTube)
- Demonstração do OpenAI do Azure com recuperação por meio de agentes