Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Nota
O Pesquisa de IA do Azure está disponível através do portal Azure, APIs REST e SDKs do Azure. Também sustenta o Foundry IQ, a camada de conhecimento gerida que transforma conteúdos empresariais em bases de conhecimento reutilizáveis e conscientes de permissões para agentes no portal Microsoft Foundry.
Importante
Funcionalidades, capacidades ou propriedades assinaladas (pré-visualização) não são abrangidas por um acordo de nível de serviço, não são recomendadas para cargas de trabalho em produção e podem mudar ou ser limitadas antes de se tornarem geralmente disponíveis. Os termos de pré-visualização do Pesquisa de IA do Azure aplicam-se a todas as funcionalidades de pré-visualização, sejam independentes ou parte de uma funcionalidade geralmente disponível.
Num pipeline de recuperação agêntica, a ação de recuperação invoca o processamento paralelo de consultas de uma base de conhecimento. Pode chamar a ação de recuperação diretamente usando as APIs REST do Serviço de Pesquisa ou um SDK do Azure. Cada base de conhecimento também expõe um endpoint do Model Context Protocol (MCP) para consumo por agentes compatíveis com MCP.
Este artigo explica como invocar ambos os métodos de recuperação com imposição opcional de permissões. Abrange primeiro a ação retrieve e, mais tarde, o endpoint MCP, porque o resultado da ferramenta MCP difere atualmente da estrutura de resposta da API REST e do SDK.
Para configurar um pipeline que ligue Pesquisa de IA do Azure ao Foundry Agent Service via MCP, veja Tutorial: Construa uma solução de recuperação agentical de ponta a ponta.
Suporte de utilização
| portal do Azure | Microsoft Foundry portal | .NET SDK | Python SDK | Java SDK | JavaScript SDK | API REST |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Pré-requisitos
Um serviço Pesquisa de IA do Azure com uma base de conhecimento.
Para acesso partilhado ao modelo e configuração do cliente, veja Pré-requisitos para criar uma base de conhecimento.
Permissão para consultar bases de conhecimento. Configure a autenticação sem chave com o papel de Leitor de Dados de Índice de Pesquisa atribuído à sua conta de utilizador (recomendado) ou utilize uma chave API de consulta.
Se chamar o endpoint MCP através da API Azure OpenAI Responses, precisa de:
Um LLM implementado e o papel de Utilizador OpenAI de Serviços Cognitivos (ou uma chave API) no recurso Foundry. Podes reutilizar o LLM e o recurso especificados na tua base de conhecimento, se aplicável.
O
Azure.AI.OpenAIpacote:dotnet add package Azure.AI.OpenAI
Pacote obrigatório
Azure.Search.Documents:Para as funcionalidades
2026-08-01-preview, o pacote de pré-visualização mais recente:dotnet add package Azure.Search.Documents --prereleasePara as funcionalidades 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 chamar o endpoint MCP através da API Azure OpenAI Responses, precisa de:
Um LLM implementado e o papel de Utilizador OpenAI de Serviços Cognitivos (ou uma chave API) no recurso Foundry. Podes reutilizar o LLM e o recurso especificados na tua base de conhecimento, se aplicável.
O
openaipacote:pip install openai
Pacote obrigatório
azure-search-documents:Para as funcionalidades
2026-08-01-preview, o pacote de pré-visualização mais recente:pip install --pre azure-search-documentsPara as funcionalidades 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 obrigatória da API REST do Serviço de Pesquisa:
Para funcionalidades de pré-visualização: 2026-08-01-preview
Para funcionalidades geralmente disponíveis: 2026-04-01
Para autenticação sem chave, inclua um token Microsoft Entra ID no
Authorizationcabeçalho de cada pedido HTTP.
Limitations
Para fontes de conhecimento em índice de pesquisa, quando ativas a reclassificação, o retrieve usa a configuração semântica da fonte de conhecimento. Não aplica os perfis de pontuação do índice subjacente, incluindo defaultScoringProfile. As respostas obtidas também não são apresentadas @search.rerankerBoostedScore.
Chama a acção de recuperação
Especificas a ação de recuperação numa base de conhecimento. O corpo do pedido inclui a entrada da consulta e uma lista opcional de fontes de conhecimento a direcionar.
A versão 2026-04-01 da API só suporta a entrada intents e a recuperação extrativa mínima. As capacidades disponíveis apenas em pré-visualização, incluindo a entrada messages, planeamento de consultas, síntese de respostas e esforço de raciocínio configurável, não são suportadas. Usa 2026-08-01-preview para ter 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
);
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
KnowledgeBaseRetrievalRequest,
SearchIndexKnowledgeSourceParams,
)
# Create knowledge base retrieval client
kb_client = KnowledgeBaseRetrievalClient(
endpoint="<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)
Referência: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 a síntese de respostas (pré-visualização)
Para fontes de conhecimento blob, OneLake indexadas e SharePoint indexadas que configura com um arquivo de recursos, pode fornecer imagens incorporadas nos documentos ao modelo subsequente de síntese de respostas, juntamente com o texto. Define enableImageServing na entrada knowledgeSourceParams correspondente para sobrepor o padrão definido na definição da base de conhecimento. A resposta de recuperação não inclui campos dedicados para os caminhos individuais das imagens nem para os bytes das imagens fornecidas ao modelo.
O serviço de imagem só funciona quando outputMode é answerSynthesis e não é suportado para fontes de conhecimento que configuram ingestionPermissionOptions. Para os passos de configuração, a tabela de precedência e como inspecionar as estatísticas de disponibilização de imagens, consulte Apresentar imagens incorporadas em documentos na recuperação agêntica (pré-visualização).
Desativar a reclassificação para uma fonte de conhecimento (pré-visualização)
A partir da versão 2026-08-01-preview da API, defina "resultsProcessing": "none" numa entrada knowledgeSourceParams para ignorar a reclassificação de uma fonte de conhecimento específica e preservar a ordem subjacente dos resultados. Também podes guardar resultsProcessing na fonte de conhecimento como predefinida. Todos os tipos de fontes de informação apoiam esta propriedade.
O exemplo seguinte contorna a reordenação para product-catalog-ks num pedido de obtençã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)}");
Referência: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)
Referência: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 caso não exista um valor predefinido guardado, para utilizar a canalização de reordenação. O Pesquisa de IA do Azure resolve o valor efetivo de cada fonte nesta ordem:
-
resultsProcessingemknowledgeSourceParamsno pedido de recuperação. -
resultsProcessingarmazenado na fonte de conhecimento. -
rerankquando nenhuma das propriedades está presente.
Para uma fonte de conhecimento do servidor MCP, um valor definido em resultsProcessing para uma ferramenta específica tem prioridade sobre os valores do pedido e os valores armazenados.
Sugestão
resultsProcessing muda a forma como os resultados são processados, não quais as fontes que são consultadas. Defina alwaysQuerySource como true caso seja necessário consultar a fonte de conhecimento.
Quando o valor efetivo é none:
- As referências da fonte de conhecimento omitem
rerankerScore, e os resultados mantêm a sua ordem subjacente dentro da atividade de recuperação da fonte. - Quando qualquer fonte ignora a reclassificação, o Pesquisa de IA do Azure distribui os resultados finais pelas atividades em esquema round-robin, seguindo a ordem de declaração das fontes de conhecimento. As atividades reclassificadas mantêm-se ordenadas por pontuação.
- A deduplicação e os limites por fonte, documento e token continuam a aplicar-se, pelo que nem todos os resultados recuperados aparecem na resposta.
Pesquisa de IA do Azure valida rerankerThreshold por esta ordem:
- A pesquisa determina
resultsProcessinga partir do pedido de recuperação e do valor armazenado da fonte de conhecimento. - Se o valor resolvido for
nonee o pedido incluirrerankerThreshold, a pesquisa retorna400 Bad Request. - Para uma ferramenta de servidor MCP, a pesquisa aplica o valor
resultsProcessingao nível da ferramenta após validar o pedido.
Como resultado, uma definição de ferramenta MCP não altera se o pedido passa a validação. Um valor ao nível none da ferramenta não causa um erro de limiar, e um valor ao nível rerank da ferramenta não impede um erro quando o pedido ou valor armazenado se resolve para none.
Para confirmar qual o modo executado, verifique se as referências da fonte de conhecimento incluem rerankerScore. Não dependa de semanticConfigurationName, que pode ser null em vez de ser omitido.
Comportamento do índice de pesquisa
Para fontes de conhecimento que visam um índice de pesquisa, o tipo de consulta implícita é semantic, e não existe modo de pesquisa. Ao reordenar execuções, a execução de consultas utiliza semanticConfigurationName. Outras definições de fonte, incluindo searchFields e sourceDataFields, aplicam-se em ambos os modos.
A recuperação agêntica não aceita scoringProfile nem scoringParameters como entradas. Se precisar de viés de recência para fontes de conhecimento indexadas, use recuperação sensível à atualidade (pré-visualização) em vez de um perfil de classificação do índice.
Se o índice incluir campos vetoriais, precisa de uma definição válida de vetorizador para que o motor de recuperação agente possa vetorizar as entradas de consulta. Caso contrário, os campos vetoriais são ignorados.
Para mais informações, consulte Criar um índice para recuperação agêntica.
Resultados da recuperação do fluxo (pré-visualização)
A partir da 2026-08-01-preview versão da API, pode receber os resultados de recuperação como um fluxo de eventos enviados pelo servidor (SSE) em vez de esperar por uma única resposta JSON. Ao usar streaming, o seu cliente pode mostrar o planeamento da consulta, a atividade da fonte e a resposta sintetizada ou 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}");
}
Referência: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}")
Referência:KnowledgeBaseRetrievalClient
Para ativar o streaming, inclua o cabeçalho Accept: text/event-stream num pedido de recuperação. Sem este cabeçalho, a ação de recuperação devolve a sua resposta padrão em JSON.
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 devolver uma única resposta, o serviço mantém uma ligaçã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 fim do evento.
Um fluxo bem-sucedido utiliza o seguinte ciclo de vida:
| Event | Quando é enviado | O que contém |
|---|---|---|
retrieval.started |
Primeiro evento em cada pedido transmitido. | O ID da solicitação, o nome da base de conhecimento, o modo de saída e o esforço de raciocínio efetivo após o serviço aplicar os valores predefinidos da solicitação e da base de conhecimento. Se o kind efetivo for auto, o evento indica auto; não prevê uma escalada subsequente. |
activity.started |
Quando o serviço inicia uma atividade de planeamento de consultas, de origem ou de modelo. Várias atividades podem começar antes de uma atividade anterior terminar. | A atividade id, type, hora de início e nome opcional da fonte de conhecimento. |
activity.completed |
Quando essa atividade terminar. Correlacione-o com o respetivo evento activity.started fazendo corresponder id. |
O registo de atividade concluído. |
answer.completed |
Uma vez, só quando outputMode é answerSynthesis. |
messageIndex identifica a posição da mensagem no array final de resposta e message contém a resposta sintetizada completa. Não existe nenhum evento de delta por token. |
references.completed |
Depois de todas as referências estarem resolvidas. | Os dados do evento são o array completo de referências, sem um wrapper de objetos. |
response.completed |
O evento final de um fluxo bem-sucedido ou parcialmente bem-sucedido. | o código de estado 200 ou 206 e o corpo completo da resposta da operação de obtenção, que tem a mesma estrutura que uma chamada JSON sem streaming. Para informações sobre o significado de cada código de estado, veja Solucionar a ação de recuperação. |
error |
Em vez de references.completed e response.completed quando a obtenção falha depois de o fluxo ser aberto. |
O erro e todos os registos de atividade que tenham sido concluídos antes da falha. |
Os eventos chegam por ordem. Cada evento activity.started precede o evento activity.completed com o mesmo id, mas as atividades podem intercalar-se entre si. Os registos de atividades concluídos também incluem startedAt carimbos de data.completedAt Enquanto a transmissão está inativa, o servidor envia um : heartbeat comentário aproximadamente a cada 15 segundos para manter a ligação aberta. Os clientes da SSE podem ignorar estes comentários.
O exemplo seguinte mostra uma resposta transmitida em fluxo, com os dados abreviados para maior legibilidade.
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":{}}
Lidar com erros, cancelamentos e recadação
Falhas nas verificações prévias: Se a validação do pedido falhar antes de o fluxo ser aberto, por exemplo, devido a um corpo do pedido malformado, a operação de recuperação devolve uma resposta de erro JSON padrão e nunca abre o fluxo.
Falhas a meio do fluxo: Se a recuperação falhar após a abertura do fluxo, o evento terminal é
errorem vez dereferences.completederesponse.completed. O evento pode incluir quaisquer registos de atividade que tenham sido concluídos antes da falha. O código de estado HTTP mantém-se200quando o fluxo começa, por isso verifique o evento do terminal, não o código de estado HTTP, para determinar o sucesso.Cancelamento ou desconexão: Se o seu cliente cancelar o pedido ou desligar antes do fim do fluxo, o serviço cancela a recuperação e termina o fluxo sem um evento terminal. Considere incompletos quaisquer eventos recebidos antes do cancelamento ou desligamento.
Alternativa JSON: Com
Accept, a ausência do cabeçalhoapplication/jsonou um valor como*/*,text/*,text/event-stream;q=0ou devolve a resposta JSON padrão descrita em2026-08-01-preview. Pedirtext/event-streamde uma versão anterior da API devolve406 Not Acceptable.
Filtrar fontes de conhecimento do índice de pesquisa no momento da consulta
Ao recuperar uma fonte de conhecimento de um índice de pesquisa, pode aplicar um filtro OData no momento da consulta para limitar os resultados a documentos ou campos específicos. A expressão do filtro utiliza a sintaxe OData e é passada através do filterAddOn parâmetro.
Sintaxe do filtro e exemplos
O filterAddOn parâmetro aceita expressões de filtro OData. Exemplos de padrões incluem:
-
Campos de metadados:
city eq 'Phoenix',status eq 'active' -
Intervalos de datas:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
Intervalos numéricos:
price ge 100 and price le 5000 -
Correspondência de texto:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
Operadores lógicos:
(category eq 'News' or category eq 'Analysis') and status eq 'published'
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 multi-filtro
Podes 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"
}
Sobrescrever dicas de consulta armazenadas no momento da consulta (pré-visualização)
A partir da versão 2026-08-01-preview da API, pode substituir as sugestões de consulta armazenadas numa fonte de conhecimento de um índice de pesquisa num único pedido de obtenção, definindo queryHintOverrides na respetiva entrada knowledgeSourceParams.
O override substitui todo o objeto armazenado queryHints em vez de fundir entrada por entrada, por isso inclua todas as dicas que quiser aplicar. Omita queryHintOverrides para usar as dicas armazenadas.
Quando o esforço de raciocínio da recuperação não é minimal, uma resposta HTTP 400 depende das sugestões de filtro armazenadas, não do conteúdo da sobreposição nem do tipo de reforço. O serviço valida as sugestões de filtro armazenadas em relação ao modelo da base de conhecimento antes de aplicar queryHintOverrides. Assim, um modelo da família GPT-4o ou GPT-4.1 rejeita o pedido mesmo quando a sobreposição está vazia ou contém apenas boosts. Os impulsos armazenados, por si só, não desencadeiam esta validação. Use um modelo compatível ou remova primeiro as dicas do filtro armazenadas.
O exemplo seguinte substitui todas as dicas armazenadas por um reforço fieldValue para conteúdo japonês. O serviço não aplica nenhum filtro armazenado nem outro boost armazenado a este pedido.
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);
Referência: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)
Referência: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 que o serviço aplicou a sua substituição, defina includeActivity no pedido e inspecione a atividade searchIndex devolvida. O seu queryHintProcessing objeto reporta o que o modelo gerou. Neste exemplo, contém um generatedBoost para o aumento da linguagem, mas não generatedFilter porque o override substituiu a dica do filtro armazenada. Como as dicas de consulta são o melhor esforço, trate esta atividade como confirmação em vez de verificar uma expressão exata.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Para a definição armazenada, tipos de dicas suportados e composição com filtros determinísticos, veja Configurar dicas de consulta (pré-visualização).
Aplicar permissões no momento da consulta (pré-visualização)
Alterações às permissões de acesso que definiste fora 2026-08-01-preview podem demorar a aparecer nos 2026-08-01-preview resultados de recuperação.
Se as suas fontes de conhecimento contiverem conteúdo protegido por permissão, passe a identidade do utilizador final no pedido de recuperação para que cada utilizador veja apenas o conteúdo a que está autorizado a aceder. Para fontes indexadas, o motor de recuperação usa esta identidade para filtrar os resultados e devolve resultados sem filtragem se esta for omitida. Fontes remotas também usam autorização do pedido de recuperação, mas aplicam permissões na fonte e podem exigir um token e cabeçalho específicos da fonte.
A execução de permissões tem duas partes:
Tempo de ingestão: Apenas para fontes de conhecimento indexadas, defina
ingestionPermissionOptionspara ingerir metadados de permissão juntamente com o conteúdo.Tempo de consulta: Passe a autorização do utilizador no cabeçalho exigido pela fonte de conhecimento. A maioria das fontes utiliza
x-ms-query-source-authorization. A exceção é o Work IQ, que usax-ms-query-work-iq-source-authorization.
Configuração do tempo de ingestão
A tabela seguinte mostra as fontes de conhecimento que requerem configuração no tempo de ingestão e como cada fonte aplica permissões.
| Fonte de conhecimento | Requer ingestionPermissionOptions |
Como as permissões são aplicadas |
|---|---|---|
| Blob ou ADLS Gen2 | ✅ | Âmbitos de RBAC ingeridos, ACLs ou o Microsoft Purview correspondidos à identidade do utilizador. |
| OneLake | ✅ | Etiquetas de sensibilidade Microsoft Purview do documento ingerido comparadas à identidade do utilizador. |
| SharePoint Indexado | ✅ | ACLs do SharePoint ingeridas ou etiquetas de sensibilidade do Microsoft Purview comparadas com a identidade do utilizador. |
| SharePoint Remoto | ❌ | A API de Recuperação do Copilot consulta diretamente ao SharePoint usando o token do utilizador. |
| Fabric Data Agent | ❌ | O motor de recuperação troca o token do utilizador por um token no âmbito do Microsoft Fabric e consulta o agente de dados em nome do utilizador. |
| Fabric Ontology | ❌ | O motor de recuperação troca o token do utilizador por um token no âmbito do Microsoft Fabric e consulta o item da ontologia em nome do utilizador. |
| QI de trabalho | ❌ | O motor de obtenção troca, junto de x-ms-query-work-iq-source-authorization, uma asserção de utilizador para o público da aplicação por um token no âmbito do Work IQ. |
Se não configurares ingestionPermissionOptions quando crias a fonte de conhecimento indexada, o índice não contém metadados de permissões. O sistema devolve resultados não filtrados, independentemente do cabeçalho. Para resolver este 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, passe a identidade do utilizador final incluindo no pedido de recuperação um token de acesso limitado a https://search.azure.com/.default. Este token é separado da credencial de serviço utilizada para aceder ao serviço de pesquisa. Não precisa de permissões de serviço de pesquisa e representa apenas o utilizador cujo acesso ao conteúdo é avaliado. Para mais informações, consulte Aplicação de ACL e RBAC em tempo de consulta.
Para fontes de conhecimento sobre QI de trabalho, esta secção não se aplica. Utilize o fluxo de afirmação do utilizador específico do Work IQ descrito em Impor permissões em tempo de consulta.
No SDK .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);
Referência: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)
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Na API REST, inclua o x-ms-query-source-authorization cabeçalho com o token de acesso do utilizador:
@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
Revise a resposta
A ação de recuperação retorna três componentes principais:
- Resposta extraída ou resposta sintetizada (pré-visualização) (dependendo do modo de saída)
- Array de atividades
- Matriz de referências
Resposta extraída
A resposta extraída é uma única cadeia unificada que normalmente se passa para um LLM. O LLM consome a string como dados de suporte e usa-os para formular uma resposta. A sua chamada API ao LLM inclui a string unificada e as instruções para o modelo, como se deve usar o grounding exclusivamente ou como suplemento.
O corpo da resposta está estruturado no formato de mensagem de chat, e o conteúdo é JSON serializado.
"response": [
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
}
]
}
]
Pontos-chave:
content.typetem um valor válido:text.content.texté uma cadeia codificada em JSON contendo os documentos (ou blocos) mais relevantes encontrados no índice de pesquisa, tendo em conta as entradas de consulta e histórico de chat. Esta sequência são os seus dados-base que um LLM usa para formular uma resposta à pergunta do utilizador.Esta parte da resposta consiste em 200 blocos ou menos, excluindo quaisquer resultados que não atinjam o limiar mínimo de uma pontuação de reclassificação de 2,5.
A cadeia começa com o ID de referência do bloco (usado para fins de citação) e quaisquer campos especificados na configuração semântica do índice alvo. Neste exemplo, assuma que a configuração semântica no índice de destino tem um campo "título", um campo "termos" e um campo "conteúdo".
As respostas obtidas não incluem
@search.rerankerBoostedScore.A propriedade
maxOutputSizeInTokens(maxOutputSizeem2026-05-01-previewe versões posteriores) no pedido de obtenção determina o comprimento da cadeia de caracteres.- Um documento que exceda o
maxOutputSizeInTokensorçamento de produção pode ser omitido da resposta. O array de atividades inclui um aviso quando o documento mais relevante ultrapassa o tamanho máximo de saída. Para reter mais conteúdo, aumentemaxOutputSizeInTokens. Para mais informações, veja Respostas vazias.
- Um documento que exceda o
Array de atividades
O array de atividades gera o plano de consulta, que proporciona transparência operacional para acompanhar operações, implicações de faturação e invocações de recursos. Inclui também as subconsultas enviadas para o fluxo de recuperação. Numa resposta 206 Partial Content, a matriz inclui erros para as 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:
| Secção | Descrição |
|---|---|
| Atividade específica por fonte | Para cada fonte de conhecimento incluída na consulta, esta secção reporta o tempo decorrido e quais os argumentos usados na consulta, incluindo o ranker semântico. Os tipos de fontes de conhecimento incluem searchIndex, azureBlob, e outras fontes de conhecimento suportadas. |
agenticReasoning |
Esta secção reporta o consumo de tokens para raciocínio agentico durante a recuperação, que depende do esforço de raciocínio de recuperação especificado (pré-visualização). |
modelQueryPlanning |
Para bases de conhecimento que utilizam um LLM para o planeamento de consultas, esta secção indica o número de tokens utilizado na entrada e o número de tokens das subconsultas. Inclui um model campo com um modelName campo contendo o nome público do modelo, e não o nome de implementação, do modelo que executou a atividade. |
modelAnswerSynthesis |
Para bases de conhecimento que utilizam síntese de respostas (pré-visualização), esta secção reporta a contagem de tokens para formular a resposta e a contagem de tokens da resposta resultante. Inclui um model campo com um modelName campo contendo o nome público do modelo, e não o nome de implementação, do modelo que executou a atividade. |
modelWebSummarization |
Para bases de conhecimento que utilizam resumo web, esta secção reporta o consumo de tokens para resumir resultados web. Inclui um model campo com um modelName campo contendo o nome público do modelo, e não o nome de implementação, do modelo que executou a atividade. |
model |
Para registos de atividade apoiados por modelos, esta secção identifica o modelo utilizado para realizar a atividade. Esta secção aparece apenas quando defines includeActivity para true. |
imageServing |
Para fontes de conhecimento que têm a função de imagem (pré-visualização) ativada, esta secção informa imagesRetrieved, imagesSentToModel, totalImageSizeBytes, e se o tempo verbalizationUsed de indexação estava ativado. Inspecionar verbalizationUsed e imagesSentToModel de forma independente. Uma resposta pode indicar verbalizationUsed como true e ainda assim enviar imagens para o modelo subsequente. Para encontrar o número de imagens perdidas, subtrai imagesSentToModel de imagesRetrieved. |
O exemplo seguinte mostra o array de atividades.
"activity": [
{
"type": "modelQueryPlanning",
"id": 0,
"inputTokens": 2302,
"outputTokens": 109,
"elapsedMs": 2396
},
{
"type": "searchIndex",
"id": 1,
"knowledgeSourceName": "demo-financials-ks",
"queryTime": "2025-11-04T19:25:23.683Z",
"count": 26,
"elapsedMs": 1137,
"searchIndexArguments": {
"search": "List of companies in the financial sector according to SEC GICS classification",
"filter": null,
"sourceDataFields": [ ],
"searchFields": [ ],
"semanticConfigurationName": "en-semantic-config"
}
},
{
"type": "searchIndex",
"id": 2,
"knowledgeSourceName": "demo-healthcare-ks",
"queryTime": "2025-11-04T19:25:24.186Z",
"count": 17,
"elapsedMs": 494,
"searchIndexArguments": {
"search": "List of companies in the financial sector according to SEC GICS classification",
"filter": null,
"sourceDataFields": [ ],
"searchFields": [ ],
"semanticConfigurationName": "en-semantic-config"
}
},
{
"type": "agenticReasoning",
"id": 3,
"retrievalReasoningEffort": {
"kind": "low"
},
"reasoningTokens": 103368
},
{
"type": "modelAnswerSynthesis",
"id": 4,
"inputTokens": 5821,
"outputTokens": 344,
"elapsedMs": 3837
}
]
Matriz de referências
O array de referências provém diretamente dos dados de base subjacentes. Inclui o sourceData utilizado para gerar a resposta e consiste em todos os documentos que o motor de recuperação agential encontra e classifica semanticamente.
O array 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 |
O 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 cruzada ao id da entrada de atividade que produziu a referência, o que é útil para a interligação de citações. |
docKey |
Para uma referência indexada, a chave do documento no índice de pesquisa subjacente. |
sourceData |
Os dados de base utilizados para gerar a resposta. Para uma referência indexada, os campos podem incluir um id e campos semânticos, como title, terms, e content. A forma varia consoante o tipo de referência. |
citationUrl (pré-visualização) |
Um URL gerado pelo serviço, só de leitura, que aponta para o documento da referência no índice subjacente. Devolvido apenas para fontes de conhecimento indexadas. Para seguir o URL, consulte Procurar documentos com URLs de citação (pré-visualização). |
O exemplo seguinte mostra o array 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 (pré-visualização)
A partir da versão 2026-08-01-preview da API, uma referência de uma fonte de conhecimento indexada pode incluir um citationUrl na resposta de obtenção. Use este URL para obter os campos indexados dessa referência, como title e content, para que possa renderizar uma pré-visualização da citação mostrando de onde veio uma resposta sem abrir o documento original. O citationUrl é uma consulta autenticada ao índice subjacente, separada da origem docUrl e blobUrl.
O exemplo seguinte mostra uma URL de citação limpa.
"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 a sua ordem dependem da fonte indexada e da configuração de recuperação.
Importante
Siga o URL completo da resposta palavra por palavra e renderize os campos JSON devolvidos na sua aplicação. Não construas, analises ou normalizes a URL.
Dado um URL de citação, os exemplos seguintes recebem um token de acesso para o serviço de pesquisa. Chamam o URL com esse token no cabeçalho Authorization. A identidade com sessão iniciada precisa da função Leitor de Dados do Índice de Pesquisa.
Os métodos de pesquisa de documentos do Pesquisa de IA do Azure SDK requerem o endpoint, o nome do índice, a chave do documento, os campos selecionados e a versão da API como entradas separadas. Eles não aceitam uma URL de citação absoluta. Estes exemplos utilizam 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);
Referência: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))
Referência:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Referência:Documentos - Obtenção
A consulta de documentos devolve 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"
}
Quando consumir uma URL de citação, tenha o seguinte em mente:
Verifique se existe
citationUrlantes de processar uma citação. Pode estar ausente se a resposta omitir referências ou se o serviço não conseguir resolver o índice de apoio ou a chave do documento.Se o pedido de obtenção incluir
x-ms-query-source-authorizationpara controlo de acesso ao nível do documento, use o mesmo token de utilizador quando seguir o URL.A URL permanece válida apenas enquanto o índice de apoio e a chave do documento permanecem inalterados.
Inspecionar os metadados da etiqueta de sensibilidade na resposta (pré-visualização)
O mesmo comportamento de temporização descrito em Aplicar permissões no momento da consulta aplica-se aqui: as alterações às permissões de acesso que definir fora de 2026-08-01-preview podem demorar algum tempo a surgir nas respostas de recuperação de 2026-08-01-preview.
Quando consulta uma base de conhecimento que ingere etiquetas de sensibilidade do Microsoft Purview, a resposta de recuperação inclui metadados de etiquetas em dois níveis:
| Location | Campo | Descrição |
|---|---|---|
| Por referência | sensitivityLabelInfo |
A etiqueta de sensibilidade aplicada a cada documento retornava no references array. |
| Resposta | metadata.responseSensitivityLabelInfo |
Uma etiqueta agregada que representa a etiqueta de sensibilidade de maior prioridade em todos os documentos referenciados na resposta. Útil para banners de exibição do lado do cliente e aplicação de políticas. |
O Microsoft Graph calcula o rótulo ao nível da resposta a partir dos rótulos de cada referência, utilizando as regras de herança de rótulos do Microsoft Purview. Normalmente, o rótulo mais restritivo vence.
O exemplo seguinte mostra uma resposta de recuperação com dois documentos referenciados (um Confidential, um Internal) e o rótulo resultante ao nível da resposta.
{
"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 apresentam etiquetas de confidencialidade
O nome do campo e a disponibilidade dos metadados das etiquetas dependem do tipo de fonte de conhecimento que produziu cada referência.
Referência type |
Campo de etiquetas | 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 no SharePoint inclui sensitivityLabel em ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
O índice subjacente tem purviewEnabled definido como true e um campo marcado com sensitivityLabel: true. |
Mostrar e auditar recomendações
Use
sensitivityLabelInfo.labelIdpara consultar a definição completa do rótulo através das APIs de etiquetas de sensibilidade do Microsoft Graph quando precisar de propriedades adicionais, como controlos de políticas ou permissões.Utilize
metadata.responseSensitivityLabelInfopara apresentar um banner de sensibilidade da resposta ou aplicar controlos de política, como desativar a cópia e a partilha, à resposta inteira.Se a sua fonte de conhecimento apontar para um índice em blocos, como um preenchido através de vetorização integrada ou uma competência personalizada de Divisão de Texto, certifique-se de que o conjunto de competências projeta a etiqueta de sensibilidade para cada linha do bloco. Sem este mapeamento, as referências ao nível de chunks não são filtradas corretamente no momento da consulta.
Para acesso administrativo auditável a conteúdos rotulados, consulte Leitura elevada para investigações administrativas.
Comportamento do servidor MCP
O endpoint MCP exposto por cada base de conhecimento apresenta os mesmos campos de etiqueta de sensibilidade 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 ao nível da resposta documentados anteriormente nesta secção. Os clientes MCP aplicam controlos de visualização e políticas conscientes de etiquetas baseados nestes campos.
Recuperar exemplos de ações (pré-visualização)
Os exemplos seguintes mostram diferentes formas de chamar a ação de recuperação usando a 2026-08-01-preview versão da API. Esta versão suporta todo o conjunto de funcionalidades, incluindo síntese de respostas e um esforço de raciocínio configurável. Para utilizar 2026-04-01, consulte as secções anteriores.
- Inspecionar os nomes dos modelos nos registos de atividade
- Precisa de uma fonte de conhecimento para ter sucesso
- Excluir uma fonte de conhecimento de um pedido
- Configurar documentos candidatos por fonte de conhecimento
- Limitar os documentos finais de fundamentação
- Verificar os valores predefinidos obtidos da base de conhecimento
- Anule o esforço de raciocínio por defeito e defina limites de pedidos
- Deixe que o serviço escolha o esforço de raciocínio
- Definir referências para cada fonte de conhecimento
- Use o mínimo de esforço de raciocínio
Verificar os nomes dos modelos nos registos de atividade
Defina includeActivity como true para que devolva campos de identificação do modelo em registos de atividade baseados em modelos. Use estes campos para confirmar qual modelo configurado tratou do planeamento de consultas, síntese de respostas ou resumo web durante um pedido de recuperação. O exemplo seguinte sobrepõe o processamento de resultados armazenado para a fonte selecionada no pedido.
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}");
}
}
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
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,
)
Referência: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 seguinte excerto de resposta 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
}
]
}
Precisa de uma fonte de conhecimento para ter sucesso
Defina failOnError em knowledgeSourceParams para marcar uma fonte de conhecimento como obrigatória. Use este parâmetro quando uma resposta parcial seria enganadora ou não conforme se essa fonte não estiver disponível. O pedido retorna 502 Bad Gateway se uma fonte necessária falhar, mesmo que outra fonte tenha sucesso. Para orientações sobre o processamento, consulte Resolver problemas da ação de obtençã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 um pedido
Começando pela 2026-08-01-preview versão da API, define neverQuerySource para true cada fonte de conhecimento que queiras excluir de um pedido de recuperação. No momento da solicitação, neverQuerySource substitui o valor armazenado alwaysQuerySource para essa solicitação sem alterar o valor armazenado.
O exemplo seguinte consulta uma base de conhecimento que contém product-docs-ks e troubleshooting-ks, excluindo troubleshooting-ks do pedido.
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
Ajuste os documentos candidatos por fonte de conhecimento
Defina maxOutputDocuments em knowledgeSourceParams para limitar o número de documentos candidatos que uma fonte de conhecimento específica pode contribuir antes da seleção final dos resultados. Usa este parâmetro quando quiseres ligar a entrada de uma fonte ao pipeline sem afetar outras.
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 finais de fundamentação
O parâmetro de nível superior maxOutputDocuments limita o número de documentos de fundamentação devolvidos na resposta final da operação de recuperação. Use este parâmetro quando a sua candidatura precisar de uma quantidade previsível de citações ou referências.
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);
Referência: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)
Referência: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 seguinte mostra como maxOutputDocuments e maxOutputSizeInTokens interagem entre as quatro combinações.
maxOutputDocuments |
maxOutputSizeInTokens |
Comportamento |
|---|---|---|
| Não especificado | Não especificado | Usa o comportamento padrão maxOutputSizeInTokens de limite de resposta. |
| Não especificado | Especificado | Descarta documentos assim que o limite de tamanho da carga útil é atingido. |
| Especificado | Não especificado | Devolve até ao número especificado de documentos de fundamentação e não aplica um limite de maxOutputSizeInTokens. |
| Especificado | Especificado | Devolve até maxOutputDocuments documentos, ou quantos documentos couberem em maxOutputSizeInTokens, consoante o limite que for atingido primeiro. |
Verificar as predefinições de recuperação da base de conhecimento
Uma base de conhecimento pode armazenar valores predefinidos a nível de pedido em retrieveDefaults. Envie dois pedidos de obtenção para verificar a herança e as substituições específicas de cada pedido.
Antes de começar, conclua Configurar os limites de recuperação predefinidos (pré-visualização). O primeiro pedido omite os três limites de todo o pedido, pelo que os valores armazenados de 45 segundos, oito documentos e 12.000 tokens aplicam-se. 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");
Referência: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")
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Primeiro, envie um pedido que omita os três campos de limite a nível de pedido.
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, substitua os três valores num pedido.
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ências mostra se se aplica o valor armazenado ou o valor ao nível do pedido maxOutputDocuments: 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 coincidem. A resposta não reporta o tempo de execução efetivo ou o orçamento de tokens de saída, mas esses valores ainda governam o processamento dos pedidos. As substituições do pedido não alteram as predefinições armazenadas.
Anule o esforço de raciocínio por defeito e defina limites de pedidos
O exemplo seguinte especifica a síntese de respostas, pelo que o esforço de raciocínio de recuperação deve ser low ou medium. 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 tem o valor predefinido de 90 segundos. O máximo de 600 segundos (10 minutos) aplica-se apenas ao pedido de recuperação do 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
);
Referência: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)
Referência: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
Deixe que o serviço escolha o esforço de raciocínio
Defina retrievalReasoningEffort.kind para auto num pedido de obtenção para substituir a predefinição da base de dados de conhecimento. Para mais informações sobre raciocínio automático, veja Definir o esforço de raciocínio de recuperação (pré-visualização).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Referência:Recuperação de Conhecimento - Recuperar
Definir referências para cada fonte de conhecimento
Use includeReferences e includeReferenceSourceData in knowledgeSourceParams para controlar que fontes aparecem no array de referências e quanto de dados de origem cada entrada inclui. O exemplo seguinte utiliza o esforço de raciocínio padrão da base 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
);
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.search.documents.knowledgebases.models import SearchIndexKnowledgeSourceParams
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
)
],
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-financials-ks",
include_references=True,
include_reference_source_data=True,
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-communicationservices-ks",
include_references=False,
include_reference_source_data=False,
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-healthcare-ks",
include_references=True,
include_reference_source_data=False,
always_query_source=True,
),
],
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
Referência: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
Use o mínimo de esforço de raciocínio
No exemplo seguinte, não existe LLM para planeamento inteligente de consultas ou síntese de respostas. A cadeia de consulta vai para o motor de recuperação agential para pesquisa por palavras-chave ou pesquisa híbrida.
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Intents.Add(
new KnowledgeRetrievalSemanticIntent("what is a brokerage")
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
Referência:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalSemanticIntent,
)
request = KnowledgeBaseRetrievalRequest(
intents=[
KnowledgeRetrievalSemanticIntent(
search="what is a brokerage",
)
]
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
Referência: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
Resolver problemas da ação Obter
Em 2026-08-01-preview, o estado da resposta indica se a recuperação foi bem-sucedida, parcialmente bem-sucedida ou falhou, e o que fazer a seguir. Use a tabela seguinte para mapear cada estado ao seu significado e depois consulte a secção correspondente para orientações de resolução de problemas.
| Situação | Meaning |
|---|---|
200 OK |
A recuperação foi bem-sucedida. Um documento pode ainda ser omitido se o seu conteúdo exceder o orçamento de produção. Para mais informações, veja Respostas vazias. |
400 Bad Request |
O pedido de recuperação falhou na validação antes do início da recuperação. |
206 Partial Content |
Pelo menos uma fonte teve sucesso, e nenhuma fonte falhada está marcada failOnError. A resposta contém resultados das fontes que tiveram sucesso. |
502 Bad Gateway |
Cada fonte selecionada falhou, ou uma fonte marcada failOnError: true como falhada. |
Para qualquer resposta que não seja 200, regista a versão da API, o carimbo temporal, o corpo do pedido sanitizado, os cabeçalhos da resposta e o ID do pedido ou de correlação. Estes detalhes ajudam-no a diagnosticar a falha e a partilhar o problema com o suporte, se necessário.
400 Bad Request
Utilize o erro de nível superior para identificar a propriedade inválida do pedido. As causas comuns incluem:
- Um(a)
knowledgeSourceNameemknowledgeSourceParamsnão está associado(a) à base de conhecimento, ou o(a) respetivo(a)kindnão corresponde à origem associada. - Um valor de pedido está fora do seu alcance suportado, ou uma opção requer outra opção que não está ativada. Por exemplo,
includeReferenceSourceDatarequerincludeReferences. -
retrievalReasoningEffort.kindéauto, mas o pedido utiliza uma versão da API anterior a2026-08-01-preview. - O pedido usa
auto,low, oumedium, mas a base de conhecimento não define um modelo. - Para a exclusão de fontes no momento do pedido (pré-visualização), a mesma entrada define
alwaysQuerySourceeneverQuerySourcecomotrue, ou são excluídas todas as fontes de conhecimento anexadas.
Antes de tentar novamente o pedido, corrija a propriedade identificada pelo erro de nível superior.
206 Partial Content
Inspecione cada entrada activity que contenha um error. Uma atividade de recuperação de fonte identifica a fonte de conhecimento falhada, e uma atividade de modelo identifica a fase de processamento falhada. O corpo de resposta ainda contém os resultados que tiveram sucesso.
Para erros de atividade de recuperação de fonte, as causas comuns incluem:
- Entrada inválida no momento da consulta, como uma expressão
filterAddOnmal formada. - Desvio na configuração da origem de conhecimento ou do índice, como um campo mudado de nome, a ausência de configuração semântica ou um vetorizador inválido.
- Autorização de dependência em falta ou inválida, ou permissões insuficientes para a identidade usada para consultar a fonte.
- Limitação de dependências, timeout ou falhas de disponibilidade transitória.
Para um erro de atividade do modelo, use a atividade type para identificar a fase de processamento falhada. Por exemplo, um modelWebSummarization erro indica que a sumarização dos resultados web falhou.
Se a sua candidatura permitir resultados parciais, processe os resultados bem-sucedidos e registre cada fonte falhada ou fase do modelo. Corrigir os erros de configuração, autorização e permissões antes de tentar novamente. Para falhas de throttling, timeout ou disponibilidade transitória, use retentativas limitadas com backoff.
Se os resultados forem inseguros sem uma fonte específica e o seu tipo de fonte suportar alwaysQuerySource, defina tanto alwaysQuerySource como failOnError. A primeira opção garante que a fonte é selecionada, e a segunda devolve um erro grave se a consulta falhar.
As fontes de conhecimento do servidor MCP (pré-visualização) não suportam alwaysQuerySource; para essas fontes, failOnError aplica-se apenas quando a fonte é selecionada.
failOnError Não se aplica a falhas de atividade do modelo.
502 Bad Gateway
O erro de topo descreve um de dois caminhos de falha pesada:
- Todas as fontes selecionadas falharam: Cada fonte selecionada devolveu um erro. Uma fonte que conclui com sucesso sem documentos correspondentes não é uma fonte falhada. Inspecionar cada falha de origem para verificar uma configuração partilhada, autorização, dependência ou problema de disponibilidade.
-
Uma
failOnErrorfonte falhou: Uma fonte necessária não pôde ser consultada. Outras fontes poderiam ter tido sucesso, mas o serviço não devolve um resultado parcial porque a fonte necessária falhou.
As falhas subjacentes na origem são geralmente dos mesmos tipos que os descritos para 206 Partial Content: entrada inválida específica da origem, desvio da configuração da origem ou do índice, autorização ou permissões de dependências, limitação da taxa, expiração do tempo limite ou indisponibilidade transitória de dependências.
Uma resposta rígida 502 pode omitir a matriz activity e fornecer o nome da origem e a falha subjacente apenas na mensagem de erro de nível superior. Corrigir os erros de configuração, autorização e permissões antes de tentar novamente. Use tentativas limitadas com backoff apenas para limitação, timeout ou falhas de disponibilidade transitória. Não interprete uma 502 Bad Gateway resposta como uma falha no Pesquisa de IA do Azure sem examinar a falha subjacente da fonte.
Respostas vazias
A etapa de pesquisa pode encontrar um documento, mas o serviço ainda pode omitir o documento da resposta final se o seu conteúdo fundamentado exceder o maxOutputSizeInTokens orçamento de saída (maxOutputSize em 2026-05-01-preview e posteriormente). Quando esta condição ocorre, a matriz de atividade mostra que foram encontradas correspondências, e o registo de atividade inclui um aviso de que o documento mais relevante excedeu o tamanho máximo permitido para a saída. O array de referências e o conteúdo da resposta fundamentada estão vazios para esse documento. Para reter mais conteúdo, aumente maxOutputSizeInTokens.
Para evitar este comportamento, indexe documentos fonte grandes em blocos menores com identificadores estáveis e metadados de origem. Isto aplica-se especialmente a manuais longos, políticas ou artigos de base de conhecimento.
Aceda ao endpoint MCP
Warning
As implementações de MCP são suscetíveis a riscos, como ataques, falhas em cascata e perda de supervisão humana. Pode mitigar estes riscos verificando os servidores MCP quanto à segurança e fiabilidade, seguindo as práticas recomendadas pela Microsoft e as melhores práticas indústria, e implementando mecanismos de aprovação e monitorizando comportamentos em cascata.
O MCP é um protocolo aberto que padroniza a forma como as aplicações de IA se ligam a fontes de dados e ferramentas externas.
Em Pesquisa de IA do Azure, cada base de conhecimento é um servidor MCP autónomo que expõe a ferramenta knowledge_base_retrieve. Qualquer cliente compatível com MCP, incluindo Foundry Agent Service, GitHub Copilot, Claude e Cursor, pode invocar esta ferramenta para consultar a base de conhecimento.
Autenticar no ponto final MCP
Cada base de conhecimento tem 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 que especificas determina o que a ligação devolve. Ao usar 2026-08-01-preview, a base de conhecimento retorna respostas sintetizadas quando a base de conhecimento subjacente está 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 devolve apenas dados de fundamentação.
A forma como se autentica neste endpoint depende do seu cliente MCP. Quando utiliza a API de Respostas do Azure OpenAI com a knowledge_base_retrieve ferramenta MCP, autentica tanto a chamada da API de Respostas para o Azure OpenAI como o pedido MCP para o Pesquisa de IA do Azure. Se o seu cliente MCP chamar diretamente a este endpoint, autentica-se apenas no Pesquisa de IA do Azure.
Para autenticação do Pesquisa de IA do Azure, utilize um dos seguintes métodos:
-
Passe um token de portador no
Authorizationcabeçalho (recomendado) -
Passe uma chave de administração no
api-keycabeçalho
Nota
Os clientes MCP configuram cabeçalhos personalizados de forma diferente. Por exemplo, o Foundry Agent Service injeta cabeçalhos através de ligações de projeto, enquanto clientes como o GitHub Copilot requerem cabeçalhos em JSON de servidor MCP.
Use um token portador para autenticação MCP
O método recomendado para autenticação MCP é um token portador, que evita armazenar chaves sensíveis em ficheiros de configuração. A identidade por trás do token tem de ter atribuída a função Search Index Data Reader no serviço de pesquisa. Para mais informações, consulte Ligue a sua aplicação à 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 OpenAI do 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 OpenAI do Azure
// This code snippet is currently unavailable.
Use uma chave de administrador para autenticação MCP
Uma chave de administrador concede acesso total de leitura e escrita ao serviço de pesquisa, por isso use-a apenas em ambientes de desenvolvimento ou quando um token portador não estiver disponível. Para mais informações, consulte Conectar ao Pesquisa de IA do Azure usando chaves da API.
Sugestão
O exemplo seguinte mostra apenas o cabeçalho que é diferente do exemplo de bearer token. Para a configuração completa, veja Usar um token 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 OpenAI do 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 OpenAI do Azure
// This code snippet is currently unavailable.
Revise a resposta do MCP
Quando um cliente MCP invoca knowledge_base_retrieve, recebe um resultado de ferramenta MCP em vez do invólucro de response, activity e references da ação retrieve. Muitos clientes MCP expõem esse resultado da ferramenta num objeto de nível superior result, pelo que a carga útil que deverá 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 codificada em JSON.Ao contrário da operação de obtenção, a resposta atual do MCP não devolve arrays separados
activityoureferences, nem preenche as entradasresourcecom o conteúdo devolvido.
Conteúdo relacionado
- Busca de agência no Pesquisa de IA do Azure
- Aplicação de ACL e RBAC em tempo de consulta (pré-visualização)
- Utilize um indexador de blobs ou uma origem de conhecimento para ingerir metadados de âmbitos do RBAC (pré-visualização)
- Agentic RAG: Constrói um motor de recuperação de raciocínio com Pesquisa de IA do Azure (vídeo do YouTube)
- Demo do Azure OpenAI com recuperação de agentes