Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Observera
Azure AI-sökning är tillgängligt via Azure-portalen, REST-API:er och Azure-SDK:er. Den ligger också till grund för Foundry IQ, det hanterade kunskapsskiktet som omvandlar företagsinnehåll till återanvändbara, behörighetsmedvetna kunskapsbaser för agenter i Microsoft Foundry-portalen.
Viktigt
Funktioner, funktioner eller egenskaper som har markerats (förhandsversion) omfattas inte av ett serviceavtal, rekommenderas inte för produktionsarbetsbelastningar och kan ändras eller begränsas innan de blir allmänt tillgängliga. Villkoren för Azure AI-sökning förhandsgranskning gäller för alla förhandsgranskningsfunktioner, oavsett om de är fristående eller en del av en allmänt tillgänglig funktion.
I en agentisk hämtningspipeline anropar åtgärden hämta parallell frågebearbetning från en kunskapsbas. Du kan anropa åtgärden hämta direkt med hjälp av REST-API:er för söktjänsten eller en Azure SDKs. Varje kunskapsbas exponerar också en MCP-slutpunkt (Model Context Protocol) för förbrukning av MCP-kompatibla agenter.
Den här artikeln beskriver hur du anropar båda hämtningsmetoderna med valfri behörighetskontroll. Den täcker hämtningsåtgärden först och MCP-slutpunkten senare eftersom MCP-verktygets resultat för närvarande skiljer sig från REST- och SDK-svarsformen.
Information om hur du konfigurerar en pipeline som ansluter Azure AI-sökning till Foundry Agent Service via MCP finns i Tutorial: Skapa en lösning för agentisk hämtning från slutpunkt till slutpunkt.
Användningsstöd
| Azure Portal | Microsoft Foundry-portalen | .NET SDK | Python SDK | Java SDK | JavaScript SDK | REST API |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Förutsättningar
En Azure AI-sökning-tjänst med en kunskapsbas.
Information om delad modellåtkomst och klientkonfiguration finns i Förutsättningar för att skapa en kunskapsbas.
Behörighet att göra frågor mot kunskapsbaser. Konfigurera nyckellös autentisering med rollen Dataläsare för sökindex tilldelad till ditt användarkonto (rekommenderas) eller använd en fråge-API-nyckel.
Om du anropar MCP-slutpunkten via API:et Azure OpenAI-svar behöver du:
En distribuerad LLM och Cognitive Services OpenAI-användarrollen (eller en API-nyckel) på Foundry-resursen. Du kan återanvända den LLM och den resurs som anges i din kunskapsbas, om tillämpligt.
Paketet
Azure.AI.OpenAI:dotnet add package Azure.AI.OpenAI
Obligatoriskt
Azure.Search.Documentspaket:För
2026-08-01-previewfunktioner är det senaste förhandsversionspaketet:dotnet add package Azure.Search.Documents --prereleaseFör
2026-04-01funktioner är det senaste stabila paketet:dotnet add package Azure.Search.Documents
För nyckellös autentisering, paketet
Azure.Identity:dotnet add package Azure.Identity
Om du anropar MCP-slutpunkten via API:et Azure OpenAI-svar behöver du:
En distribuerad LLM och Cognitive Services OpenAI-användarrollen (eller en API-nyckel) på Foundry-resursen. Du kan återanvända den LLM och den resurs som anges i din kunskapsbas, om tillämpligt.
Paketet
openai:pip install openai
Obligatoriskt
azure-search-documentspaket:För
2026-08-01-previewfunktioner är det senaste förhandsversionspaketet:pip install --pre azure-search-documentsFör
2026-04-01funktioner är det senaste stabila paketet:pip install azure-search-documents
För nyckellös autentisering, paketet
azure-identity:pip install azure-identity
Nödvändig REST API-version för söktjänsten:
För förhandsversionsfunktioner: 2026-08-01-preview
För allmänt tillgängliga funktioner: 2026-04-01
För nyckellös autentisering inkluderar du en Microsoft Entra ID token i rubriken för
Authorizationvarje HTTP-begäran.
Limitations
För kunskapskällor för sökindex använder hämtning kunskapskällans semantiska konfiguration när du aktiverar omrankning. Det tillämpar inte det underliggande indexets bedömningsprofiler, inklusive defaultScoringProfile. Svar från hämtningsåtgärden visar inte heller @search.rerankerBoostedScore.
Anropa hämtningsfunktionen
Du anger åtgärden hämta på en kunskapsbas. Begärandetexten innehåller frågeindata och en valfri lista över kunskapskällor som ska riktas.
2026-04-01 API-versionen stöder intents endast indata och minimal, extraktiv hämtning. Funktioner för endast förhandsversioner, inklusive messages indata, frågeplanering, svarssyntes och konfigurerbar resonemangsansträngning, stöds inte. Använd 2026-08-01-preview för fullständig funktionalitet.
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
);
Referens: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)
Referens: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"
}
]
}
Referens:Kunskapshämtning – Hämta
Ange bilder för att svara på syntes (förhandsversion)
För blob, OneLake med index och SharePoint-kunskapskällor med index som du konfigurerar med ett tillgångsarkiv kan du tillhandahålla bilder som är inbäddade i dokument till den efterföljande modellen för svarssyntes tillsammans med text. Ange enableImageServing den matchande posten i knowledgeSourceParams för att åsidosätta standardvärdet som anges i kunskapsbasdefinitionen. Hämtningssvaret innehåller inte dedikerade fält för enskilda bildsökvägar eller bildbyte som tillhandahålls till modellen.
Bildservern körs endast när outputMode är answerSynthesis och stöds inte för kunskapskällor som konfigurerar ingestionPermissionOptions. Information om konfigurationssteg, prioritetstabellen och hur du inspekterar bildvisningsstatistik finns i Surface dokumentinbäddade bilder i agentisk hämtning (förhandsversion).
Inaktivera omrankning för en kunskapskälla (förhandsversion)
Från och med API-versionen 2026-08-01-preview anger du "resultsProcessing": "none" på en knowledgeSourceParams-post för att hoppa över omrankning för en specifik kunskapskälla och bevara den underliggande resultatordningen. Du kan också lagra resultsProcessing på kunskapskällan som standard. Alla typer av kunskapskällor stöder den här egenskapen.
Följande exempel förbigår omrankning för product-catalog-ks för en hämtningsbegäran.
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)}");
Referens: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)
Referens: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"
}
]
}
Referens:Kunskapshämtning – Hämta
Ange "resultsProcessing": "rerank", eller utelämna det om det inte finns något sparat standardvärde, om du vill använda omrankningspipelinen. Azure AI-sökning löser det effektiva värdet för varje källa i den här ordningen:
-
resultsProcessingiknowledgeSourceParamsi samband med hämtningsbegäran. -
resultsProcessinglagras på kunskapskällan. -
reranknär ingen av egenskaperna finns.
För en MCP-serverkunskapskälla har ett resultsProcessing värde som angetts för ett enskilt verktyg företräde framför begäran och lagrade värden.
Tip
resultsProcessing ändrar hur resultaten bearbetas, inte vilka källor som efterfrågas. Ange alwaysQuerySource till true om kunskapskällan måste frågas.
När det effektiva värdet är none:
- Referenser från kunskapskällan utelämnar
rerankerScoreoch resultaten håller sin underliggande ordning inom källans hämtningsaktivitet. - När någon källa kringgår omrangering distribuerar Azure AI-sökning slutresultaten mellan aktiviteter i round robin-ordning, enligt deklarationsordningen för kunskapskällorna. Omrankade aktiviteter förblir ordnade efter poäng.
- Gränser för deduplicering och per källa, dokument och token gäller fortfarande, så alla hämtade resultat visas inte i svaret.
Azure AI-sökning verifierar rerankerThreshold i den här ordningen:
- Sökningen avgör
resultsProcessingutifrån hämtningsförfrågan och värdet för den lagrade kunskapskällan. - Om det lösta värdet är
noneoch begäran innehållerrerankerThreshold, returnerar Search400 Bad Request. - För ett MCP-serververktyg tillämpar Search värdet på verktygsnivå
resultsProcessingnär begäran har verifierats.
Därför ändrar inte en MCP-verktygsinställning om begäran godkänns. Ett värde på verktygsnivå none orsakar inte ett tröskelvärde och ett värde på verktygsnivå rerank förhindrar inte ett fel när begäran eller det lagrade värdet matchas till none.
Kontrollera om kunskapskällans referenser innehåller rerankerScoreför att bekräfta vilket läge som kördes. Förlita dig inte på semanticConfigurationName, som kan vara null i stället för att utelämnas.
Beteende för sökindex
För kunskapskällor som riktar sig mot ett sökindex är semanticden underförstådda frågetypen , och det finns inget sökläge. Vid omrankningskörningar används semanticConfigurationName för frågekörning. Andra källinställningar, inklusive searchFields och sourceDataFields, gäller i båda lägena.
Agentbaserad hämtning accepterar inte scoringProfile- eller scoringParameters-indata. Om du behöver färskhetsviktning för indexerade kunskapskällor ska du använda freshness-aware retrieval (förhandsversion) i stället för en poängsättningsprofil för index.
Om indexet innehåller vektorfält behöver du en giltig vektoriserardefinition så att den agentiska hämtningsmotorn kan vektorisera frågeindata. Annars ignoreras vektorfält.
Mer information finns i Skapa ett index för agentisk hämtning.
Strömma hämta resultat (förhandsversion)
Från och med 2026-08-01-preview API-versionen kan du få hämta resultat som en ström av server-skickade händelser (SSE) i stället för att vänta på ett enda JSON-svar. Genom att använda direktuppspelning kan klienten visa frågeplanering, källaktivitet och syntetiserade svar eller extraherat svar i den ordningen när varje del blir tillgänglig.
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}");
}
Referens: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}")
Referens:KnowledgeBaseRetrievalClient
Om du vill aktivera strömning anger du huvudet Accept: text/event-stream i en hämtningsförfrågan. Utan den här rubriken returnerar hämtningsåtgärden sitt vanliga JSON-svar.
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
}
]
}
Referens:Kunskapshämtning – Hämta
Händelselivscykel
I stället för att returnera ett enda svar håller tjänsten en HTTP-anslutning öppen (innehållstyp text/event-stream; charset=utf-8) och skickar en sekvens med händelser när data blir tillgängliga. Varje händelse har en event: rad som namnger händelsetypen, en data: rad med ett JSON-värde och en tom rad som markerar slutet på händelsen.
En framgångsrik strömning har följande livscykel:
| Evenemang | När den skickas | Vad den innehåller |
|---|---|---|
retrieval.started |
Första händelsen på varje strömmad begäran. | Begärande-ID, kunskapsbasnamn, utdataläge och effektivt resonemang efter att tjänsten har löst standardinställningarna för begäran och kunskapsbas. Om den effektiva kind är auto rapporterar händelsen auto; den förutsäger inte senare eskalering. |
activity.started |
När tjänsten startar en aktivitet för frågeplanering, källaktivitet eller modellaktivitet. Flera aktiviteter kan starta innan en tidigare aktivitet slutförs. | Aktiviteten id, type, starttiden och det valfria kunskapskällans namn. |
activity.completed |
När aktiviteten är klar. Korrelera den till händelsen activity.started genom att matcha id. |
Den slutförda aktivitetsposten. |
answer.completed |
En gång, bara när outputMode är answerSynthesis. |
messageIndex identifierar meddelandets position i den slutliga svarsmatrisen och message innehåller det fullständiga syntetiserade svaret. Det finns ingen token-by-token delta-händelse. |
references.completed |
När alla referenser har lösts. | Händelsedata är den fullständiga referensmatrisen, utan en objektomslutning. |
response.completed |
Den avslutande händelsen för en framgångsrik eller delvis framgångsrik strömning. | statuskoden 200 eller 206 och den fullständiga svarstexten, som har samma struktur som ett icke-strömmande JSON-anrop. Information om vad varje statuskod innebär finns i Felsöka åtgärden för att hämta. |
error |
I stället för references.completed och response.completed när hämtning misslyckas efter att strömmen har öppnats. |
Felet och eventuella aktivitetsposter som slutfördes före avbrottet. |
Händelser kommer i rätt ordning. Varje activity.started-händelse föregår activity.completed-händelsen med samma id, men aktiviteter kan överlappa. Slutförda aktivitetsposter innehåller även tidsstämplar för startedAt och completedAt. När strömmen är inaktiv skickar servern en : heartbeat kommentar ungefär var 15:e sekund för att hålla anslutningen öppen. SSE-klienter kan ignorera dessa kommentarer.
Följande exempel visar ett strömmande svar, där data har kortats ned för läsbarhetens skull.
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":{}}
Hantera fel, annullering och återställning
Preflight-fel: Om valideringen av begäran misslyckas innan strömmen öppnas, till exempel för en felaktig begärandetext, returnerar åtgärden hämta ett JSON-standardfelsvar och öppnar aldrig strömmen.
Fel under pågående strömning: Om hämtningen misslyckas efter att strömmen har öppnats är den avslutande händelsen
errori stället förreferences.completedochresponse.completed. Händelsen kan innehålla alla aktivitetsposter som slutfördes innan felet inträffade. HTTP-statuskoden förblir200när dataströmmen har startat, så kontrollera sluthändelsen, inte HTTP-statuskoden, för att avgöra om det lyckades.Annullering eller frånkoppling: Om klienten avbryter begäran eller kopplar från innan strömmen har slutförts avbryter tjänsten hämtningen och avslutar strömmen utan en terminalhändelse. Behandla händelser som tas emot innan de avbryts eller kopplas från som ofullständiga.
JSON-reserv: Med
2026-08-01-previewreturneras det vanliga JSON-svaret som beskrivs i Granska svaret omAccept-headern saknas eller har ett värde somapplication/json,*/*,text/*ellertext/event-stream;q=0. Att begäratext/event-streamfrån en tidigare API-version returnerar406 Not Acceptable.
Filtrera kunskapskällor för sökindex vid frågetillfället
När du hämtar från en kunskapskälla för sökindex kan du använda ett OData-filter vid frågetillfället för att begränsa resultatet till specifika dokument eller fält. Filteruttrycket använder OData-syntax och skickas via parametern filterAddOn .
Filtrera syntax och exempel
Parametern filterAddOn accepterar OData-filteruttryck. Exempelmönster är:
-
Metadatafält:
city eq 'Phoenix',status eq 'active' -
Datumintervall:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
Numeriska intervall:
price ge 100 and price le 5000 -
Textjämförelse:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
Logiska operatorer:
(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'"
}
]
}
Exempel på flera filter
Du kan kombinera flera filter för att ytterligare förfina resultaten.
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"
}
Åsidosätta lagrade frågetips vid frågetid (förhandsversion)
Från och med API-version 2026-08-01-preview kan du åsidosätta de frågeledtrådar som lagras i en kunskapskälla för sökindex för en enskild hämtningsbegäran genom att ange queryHintOverrides på dess knowledgeSourceParams-post.
Åsidosättningen ersätter hela det lagrade queryHints-objektet i stället för att slå samman det post för post, så inkludera varje hint som du vill använda. Utelämna queryHintOverrides för att använda de lagrade ledtrådarna.
När resonemangsinsatsen för hämtning inte är minimal beror ett HTTP 400-svar på de lagrade filtertipsen, inte på åsidosättningsinnehållet eller boosttypen. Tjänsten validerar lagrade filtertips mot kunskapsbasmodellen innan du tillämpar queryHintOverrides. Därför avvisar en GPT-4o- eller GPT-4.1-familjemodell begäran även om åsidosättningen är tom eller endast innehåller ökningar. Lagrade ökningar utlöser inte den här valideringen. Använd en kompatibel modell eller ta bort de lagrade filtertipsen först.
I följande exempel ersätts alla lagrade tips med en fieldValue boost för japanskt innehåll. Tjänsten tillämpar inte något lagrat filter eller någon annan lagrad boost för den här begäran.
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);
Referens: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)
Referens: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
}
Referens:Kunskapshämtning – Hämta
För att bekräfta att tjänsten har tillämpat din åsidosättning anger du includeActivity i begäran och inspekterar den returnerade searchIndex-aktiviteten. Objektet queryHintProcessing rapporterar vad modellen genererade. I det här exemplet finns det en generatedBoost för språkförstärkningen, men inget generatedFilter eftersom åsidosättningen ersatte den lagrade filterhinten. Eftersom frågetips är bäst kan du behandla den här aktiviteten som en bekräftelse i stället för att söka efter ett exakt uttryck.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Lagrad definition, tipstyper som stöds och sammansättning med deterministiska filter finns i Konfigurera frågetips (förhandsversion).
Framtvinga behörigheter vid frågetillfället (förhandsversion)
Ändringar av åtkomstbehörigheter som du anger utanför 2026-08-01-preview kan ta tid att visas i 2026-08-01-preview hämtningsresultatet.
Om dina kunskapskällor innehåller behörighetsskyddat innehåll skickar du slutanvändarens identitet på hämtningsbegäran så att varje användare bara ser innehåll som de har behörighet att komma åt. För indexerade källor använder hämtningsmotorn den här identiteten för att filtrera resultat och returnerar ofiltrerade resultat om den utelämnas. Fjärrkällor använder också auktorisering från hämtningsbegäran men framtvingar behörigheter vid källan och kan kräva en källspecifik token och rubrik.
Behörighetsframtvingandet har två delar:
Inmatningstid: Endast för indexerade kunskapskällor anger du
ingestionPermissionOptionsför att mata in behörighetsmetadata tillsammans med innehåll.Vid frågetillfället: Skicka användarens behörighetsuppgifter i headern som krävs av kunskapskällan. De flesta källor använder
x-ms-query-source-authorization. Undantaget är Work IQ, som använderx-ms-query-work-iq-source-authorization.
Inmatningstidskonfiguration
I följande tabell visas vilka kunskapskällor som kräver inmatningstidskonfiguration och hur varje källa tillämpar behörigheter.
| Kunskapskälla | Kräver ingestionPermissionOptions |
Så här framtvingas behörigheter |
|---|---|---|
| Blob eller ADLS Gen2 | ✅ | Inmatade RBAC-omfång, ACL:er eller Microsoft Purview matchade mot användaridentitet. |
| OneLake | ✅ | Inläst dokument med Microsoft Purviews känslighetsetiketter matchade mot användaridentitet. |
| Indexerad SharePoint | ✅ | Inlästa SharePoint-ACL:er eller känslighetsetiketter i Microsoft Purview som matchas mot användarens identitet. |
| Fjärr-SharePoint | ❌ | Copilot API för hämtning anropar SharePoint direkt med användarens token. |
| Fabric Dataagent | ❌ | Hämtningsmotorn byter in användarens token mot en token begränsad till Microsoft Fabric och gör en fråga till dataagenten för användarens räkning. |
| Fabric Ontologi | ❌ | Hämtningsmotorn byter ut användarens token mot en Microsoft Fabric-begränsad token och frågar ontologiobjektet för deras räkning. |
| Arbets-IQ | ❌ | Hämtningsmotorn löser in ett användarintyg för appmålgrupp från x-ms-query-work-iq-source-authorization mot en token med Work IQ-omfattning. |
Om du inte konfigurerar ingestionPermissionOptions när du skapar den indexerade kunskapskällan innehåller indexet inte behörighetsmetadata. Systemet returnerar resultat som inte har filtrerats, oavsett rubrik. Åtgärda det här problemet genom att återskapa kunskapskällan med lämpliga ingestionPermissionOptions värden.
Frågetidsauktorisering
För icke-Work IQ-kunskapskällor skickar du slutanvändarens identitet genom att inkludera en åtkomsttoken som är begränsad till https://search.azure.com/.default i begäran om hämtning. Den här token är separat från tjänstautentiseringsuppgifterna som används för att komma åt söktjänsten. Den behöver inte behörigheter för söktjänsten och representerar bara den användare vars innehållsåtkomst utvärderas. Mer information finns i Frågetids-ACL och RBAC-tillämpning.
För Arbets-IQ-kunskapskällor gäller inte det här avsnittet. Använd det Work IQ-specifika försäkransflödet för användare som beskrivs i Tillämpa behörigheter vid frågetillfället.
I .NET SDK skickar du token som parametern querySourceAuthorization på 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);
Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
I Python SDK skickar du token som parametern query_source_authorization på 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)
Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Inom REST-API:t inkluderar du x-ms-query-source-authorization headern med användarens åtkomsttoken.
@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?"
}
]
}
]
}
Referens:Kunskapshämtning – Hämta
Granska svaret
Åtgärden hämta returnerar tre huvudkomponenter:
- Extraherat svar eller syntetiserat svar (förhandsversion) (beroende på utdataläge)
- Aktivitetsmatris
- Referensmatris
Extraherat svar
Det extraherade svaret är en enda, enhetlig sträng som du vanligtvis skickar till en LLM. LLM använder strängen som jordningsdata och använder den för att formulera ett svar. DITT API-anrop till LLM innehåller den enhetliga strängen och instruktionerna för modellen, till exempel om du vill använda grunderna uteslutande eller som ett tillägg.
Svarets brödtext är strukturerad i formatmallen för chattmeddelanden och innehållet är serialiserat JSON.
"response": [
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
}
]
}
]
Viktiga punkter:
content.typehar ett giltigt värde:text.content.textär en JSON-kodad sträng som innehåller de mest relevanta dokumenten (eller segmenten) som finns i sökindexet, med tanke på indata för fråge- och chatthistorik. Den här strängen är dina grunddata som en LLM använder för att formulera ett svar på användarens fråga.Den här delen av svaret består av 200 segment eller färre, exklusive resultat som inte uppfyller minimitröskelvärdet på 2,5 rerankerpoäng.
Strängen börjar med referens-ID för segmentet (används för källhänvisning) och alla fält som anges i målindexets semantiska konfiguration. I det här exemplet antar du att den semantiska konfigurationen i målindexet har ett "rubrikfält", ett "termfält" och ett "innehåll"-fält.
Hämta-svar inkluderar inte
@search.rerankerBoostedScore.Egenskapen
maxOutputSizeInTokens(maxOutputSizei2026-05-01-previewoch senare) i hämtningsbegäran bestämmer strängens längd.- Ett dokument som överskrider
maxOutputSizeInTokensutdatabudgeten kan utelämnas från svaret. Aktivitetsmatrisen innehåller en varning när det mest relevanta dokumentet överskrider den maximala utdatastorleken. Om du vill behålla mer innehåll ökar dumaxOutputSizeInTokens. Mer information finns i Tomma svar.
- Ett dokument som överskrider
Aktivitetsmatris
Aktivitetsmatrisen matar ut frågeplanen, vilket ger driftstransparens för spårningsåtgärder, faktureringskonsekvenser och resursanrop. Den innehåller även underfrågor som skickas till hämtningspipelinen. I ett 206 Partial Content-svar innehåller arrayen fel för de kunskapskällor som misslyckades. Ett 502 Bad Gateway-svar kan ge felinformation endast i felet på toppnivå.
Aktivitetsmatrisen innehåller följande komponenter:
| Avsnitt | Beskrivning |
|---|---|
| Källspecifik aktivitet | För varje kunskapskälla som ingår i frågan rapporterar det här avsnittet om förfluten tid och vilka argument som användes i frågan, inklusive semantisk ranker. Kunskapskällans typer omfattar searchIndex, azureBloboch andra kunskapskällor som stöds. |
agenticReasoning |
Det här avsnittet rapporterar om tokenförbrukning för agentiskt resonemang under hämtningen, vilket beror på det angivna hämtningsskälet (förhandsversion). |
modelQueryPlanning |
För kunskapsbaser som använder en LLM för frågeplanering rapporterar det här avsnittet om antalet token som används för indata och antalet token för underfrågorna. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten. |
modelAnswerSynthesis |
För kunskapsbaser som använder svarssyntes (förhandsversion) rapporterar det här avsnittet om antalet token för att formulera svaret och antalet token för svarsutdata. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten. |
modelWebSummarization |
För kunskapsbaser som använder webbsammanfattning rapporterar det här avsnittet om tokenförbrukning för att sammanfatta webbresultat. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten. |
model |
För modellbaserade aktivitetsposter identifierar det här avsnittet den modell som används för att utföra aktiviteten. Det här avsnittet visas bara när du anger includeActivity till true. |
imageServing |
För kunskapskällor som har bildvisning (förhandsversion) aktiverad rapporterar det här avsnittet imagesRetrieved, imagesSentToModel, totalImageSizeBytes och om verbalizationUsed var aktiverat vid indexering. Inspektera verbalizationUsed och imagesSentToModel oberoende av varandra. Ett svar kan rapportera verbalizationUsed som true och fortfarande skicka bilder till nedströmsmodellen. För att hitta antalet utelämnade bilder subtraherar du imagesSentToModel från imagesRetrieved. |
I följande exempel visas aktivitetsmatrisen.
"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
}
]
Referensmatris
Referensmatrisen kommer direkt från underliggande grunddata. Den innehåller det sourceData som används för att generera svaret och består av varje dokument som agentic retrieval engine hittar och semantiskt rangordnar.
Referensmatrisen innehåller följande komponenter:
| Fält | Beskrivning |
|---|---|
type |
Kunskapskällans typ som skapade referensen, till exempel searchIndex. |
id |
Referens-ID:t för ett objekt i ett svar. Det är inte dokumentnyckeln i sökindexet. Använd den för att ange citat. |
activitySource |
Korsrefererar till id för aktivitetsposten som skapade referensen, vilket är användbart för länkning av hänvisningar. |
docKey |
För en indexerad referens är dokumentnyckeln i det bakomliggande sökindexet. |
sourceData |
De grunddata som används för att generera svaret. För en indexerad referens kan fälten innehålla ett id och semantiska fält, till exempel title, termsoch content. Formen varierar beroende på referenstyp. |
citationUrl (förhandsversion) |
En tjänstgenererad, skrivskyddad URL som matchar referensens dokument i bakgrundsindexet. Returneras endast för indexerade kunskapskällor. Information om hur du följer URL:en finns i Söka efter dokument med källhänvisnings-URL:er (förhandsversion).) |
I följande exempel visas referensmatrisen.
"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
}
]
Slå upp dokument med källhänvisnings-URL:er (förhandsversion)
Från och med 2026-08-01-preview API-versionen kan en referens från en indexerad kunskapskälla innehålla en citationUrl i hämtningssvaret. Använd den här URL:en för att hämta de indexerade fälten för den referensen, till exempel title och content, så att du kan återge en källhänvisning som visar var ett svar kom ifrån utan att öppna det ursprungliga källdokumentet.
citationUrl är en autentiserad sökning i bakgrundsindexet, separat från källan docUrl och blobUrl.
I följande exempel visas en sanerad källhänvisnings-URL.
"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"
De markerade fälten och deras ordning beror på den indexerade käll- och hämtningskonfigurationen.
Viktigt
Följ den fullständiga URL:en från svaret ordagrant och rendera de returnerade JSON-fälten i din app. Skapa, parsa eller normalisera inte URL:en.
Med en källhänvisnings-URL får följande exempel en åtkomsttoken för söktjänsten. De anropar URL:en med tokenen i Authorization-headern. Den inloggade identiteten behöver rollen Dataläsare för sökindex.
Azure AI-sökning SDK-dokumentsökningsmetoder kräver slutpunkt, indexnamn, dokumentnyckel, valda fält och API-version som separata indata. De accepterar inte en absolut källhänvisnings-URL. I de här exemplen används en autentiserad HTTP GET för att bevara den fullständiga tjänstgenererade URL:en.
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);
Referens: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))
Referens:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Referens:Dokument – Hämta
Dokumentsökningen returnerar de valda indexfälten som 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"
}
Tänk på följande när du använder en källhänvisnings-URL:
Sök efter
citationUrlinnan du återger en källhänvisning. Det kan vara frånvarande om svaret utelämnar referenser eller om tjänsten inte kan matcha bakgrundsindexet eller dokumentnyckeln.Om hämtningsbegäran innehåller
x-ms-query-source-authorizationför åtkomstkontroll på dokumentnivå använder du samma användartoken när du följer URL:en.URL:en är endast giltig medan bakgrundsindexet och dokumentnyckeln förblir oförändrade.
Granska metadata för känslighetsetiketter i svaret (förhandsversion)
Samma tidsinställning som beskrivs i Framtvinga behörigheter vid frågetillfället gäller här: ändringar av 2026-08-01-preview åtkomstbehörigheter som du anger utanför kan ta tid att visas i 2026-08-01-preview hämta svar.
När du frågar en kunskapsbas som matar in Microsoft Purview känslighetsetiketter innehåller hämtningssvaret etikettmetadata på två nivåer:
| Plats | Fält | Beskrivning |
|---|---|---|
| Efter referens | sensitivityLabelInfo |
Känslighetsetiketten som tillämpas på varje dokument som returneras i matrisen references . |
| Svar | metadata.responseSensitivityLabelInfo |
En aggregeringsetikett som representerar känslighetsetiketten med högst prioritet i alla refererade dokument i svaret. Användbart för visningsbanners på klientsidan och tillämpning av policyer. |
Microsoft Graph beräknar etiketten på svarsnivån utifrån etiketterna för varje referens enligt Microsoft Purview-regler för etikettarv. Vanligtvis vinner den mest restriktiva etiketten.
I följande exempel visas ett hämtningssvar med två refererade dokument (ett Confidential, ett Internal) och den resulterande etiketten på svarsnivå.
{
"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
}
}
}
Referenstyper som visar känslighetsetiketter
Fältnamnet och tillgängligheten för etikettmetadata beror på vilken kunskapskälla som skapade varje referens.
Referens type |
Etikettfält | Tillgänglig när... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
Blob-kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions. |
indexedOneLake |
sensitivityLabelInfo |
OneLake-kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions. |
indexedSharePoint |
sensitivityLabelInfo |
Den SharePoint indexerade kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
Det underliggande indexet är inställt på purviewEnabled och har ett fält som är markerat med true. |
Visnings- och granskningsrekommendationer
Använd
sensitivityLabelInfo.labelIdför att leta upp den fullständiga etikettdefinitionen via API:erna för Microsoft Graph känslighetsetikett när du behöver ytterligare egenskaper, till exempel principkontroller eller behörigheter.Använd
metadata.responseSensitivityLabelInfoför att återge en känslighetsbanderoll på svarsnivå eller tillämpa principkontroller, till exempel inaktivera kopiering och delning, i hela svaret.Om din kunskapskälla pekar på ett segmenterat index, till exempel ett som fylls i via integrerad vektorisering eller en anpassad färdighet för textdelning, kontrollerar du att kunskapsuppsättningen projicerar känslighetsetiketten till varje segmentrad. Utan den här mappningen filtreras inte referenser på segmentnivå korrekt vid frågetillfället.
Mer information om granskningsbar administrativ åtkomst till etiketterat innehåll finns i Utökad läsning för administrativa undersökningar.
MCP-serverbeteende
MCP-slutpunkten som exponeras av varje kunskapsbas visar samma känslighetsetikettfält som REST-API:et. När en MCP-kompatibel klient anropar verktyget knowledge_base_retrieve innehåller verktygsresultatet samma referensvisa sensitivityLabelInfo och svarsnivå-metadata.responseSensitivityLabelInfo som dokumenterades tidigare i det här avsnittet. MCP-klienter tillämpar etikettmedvetna visnings- och principkontroller baserat på dessa fält.
Hämta åtgärdsexempel (förhandsversion)
I följande exempel visas olika sätt att anropa åtgärden hämta med hjälp av API-versionen 2026-08-01-preview . Den här versionen stöder den fullständiga funktionsuppsättningen, inklusive svarssyntes och ett konfigurerbart resonemang. Information om 2026-04-01 användning finns i föregående avsnitt.
- Granska modellnamn i aktivitetsloggar
- Kräv att en kunskapskälla lyckas
- Undanta en kunskapskälla från en begäran
- Finjustera dokumentkandidater för varje kunskapskälla
- Begränsa slutgiltiga grunddokument
- Verifiera att kunskapsbasen hämtar standardvärden
- Åsidosätt standardiserad resonemangsinsats och ange begränsningar för förfrågningar
- Låt tjänsten välja resonemangsinsatsen
- Ange referenser för varje kunskapskälla
- Använd minimalt resonemang
Granska modellnamn i aktivitetsloggar
Ange includeActivity till true för att returnera modellidentitetsfält i modellbaserade aktivitetsposter. Använd de här fälten för att bekräfta vilken konfigurerad modell som hanterade frågeplanering, svarssyntes eller webbsammanfattning under en hämtningsbegäran. I följande exempel åsidosätts den lagrade resultatbearbetningen för den valda källan på begäran.
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}");
}
}
Referens: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,
)
Referens: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"
}
]
}
Referens:Kunskapshämtning – Hämta
Följande svarsutdrag visar den kapslade modellidentiteten:
{
"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
}
]
}
Kräv att en kunskapskälla ska vara framgångsrik
Ange failOnError i knowledgeSourceParams för att markera en kunskapskälla som obligatorisk. Använd den här parametern när ett partiellt svar skulle vara vilseledande eller inkompatibelt om källan inte är tillgänglig. Begäran returnerar 502 Bad Gateway om en nödvändig källa misslyckas, även om en annan källa lyckas. Vägledning för hantering finns i Felsöka hämtningsåtgärden.
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);
Referens: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)
Referens: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"
}
]
}
Referens:Kunskapshämtning – Hämta
Undanta en kunskapskälla från en begäran
Från och med 2026-08-01-preview API-versionen anger du neverQuerySource till true för varje kunskapskälla som du vill undanta från en hämtningsbegäran. Begärandetid neverQuerySource åsidosätter ett lagrat alwaysQuerySource värde för den begäran utan att ändra det lagrade värdet.
I följande exempel efterfrågas en kunskapsbas som innehåller product-docs-ks och troubleshooting-ks, exklusive troubleshooting-ks från begäran.
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);
Referens: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)
Referens: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
}
]
}
Referens:Kunskapshämtning – Hämta
Justera kandidatsdokument för varje kunskapskälla
maxOutputDocuments Ange knowledgeSourceParams för att begränsa hur många kandidatdokument en specifik kunskapskälla bidrar med innan du väljer det slutliga resultatet. Använd den här parametern när du vill binda indata från en källa till pipelinen utan att påverka andra.
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);
Referens: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)
Referens: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
}
]
}
Referens:Kunskapshämtning – Hämta
Begränsa slutgiltiga grunddokument
Parametern på den översta nivån maxOutputDocuments begränsar hur många grunddokument som returneras i det slutliga hämtningssvaret. Använd den här parametern när programmet behöver en förutsägbar källhänvisning eller referensantal.
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);
Referens: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)
Referens: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
}
Referens:Kunskapshämtning – Hämta
I följande tabell visas hur maxOutputDocuments och maxOutputSizeInTokens interagerar mellan alla fyra kombinationerna.
maxOutputDocuments |
maxOutputSizeInTokens |
Behavior |
|---|---|---|
| Ospecificerad | Ospecificerad | Använder standardbeteendet maxOutputSizeInTokens för svarsgräns. |
| Ospecificerad | Angivet | Tar bort dokument när gränsen för nyttolaststorlek har nåtts. |
| Angivet | Ospecificerad | Returnerar upp till det angivna antalet grunddokument och tillämpar maxOutputSizeInTokens ingen gräns. |
| Angivet | Angivet | Returnerar upp till maxOutputDocuments dokument eller hur många dokument som får plats under maxOutputSizeInTokens, beroende på vilken gräns som gäller först. |
Verifiera att kunskapsbasen hämtar standardvärden
En kunskapsbas kan lagra standardinställningar för hela begäran i retrieveDefaults. Skicka två hämtningsförfrågningar för att verifiera ärvning och förfrågningsspecifika åsidosättningar.
Innan du börjar slutför du Konfigurera standardbegränsningar för hämtning (förhandsversion). Den första begäran utelämnar alla tre gränserna för hela begäran, så de lagrade värdena på 45 sekunder, åtta dokument och 12 000 token gäller. Den andra begäran åsidosätter dem med 20 sekunder, ett dokument och 5 000 token.
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");
Referens: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")
Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Skicka först en begäran som utelämnar de tre gränsfälten för hela begäran.
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."
}
]
}
Åsidosätt sedan alla tre värdena för en begäran.
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
}
Referens:Kunskapshämtning – Hämta
Referensantalet visar om värdet på den lagrade nivån eller begärandenivån maxOutputDocuments gäller: det första svaret innehåller högst åtta referenser och det andra innehåller högst en. Ett svar kan innehålla färre referenser när färre dokument matchar. Svaret redovisar inte den effektiva körtiden eller tokenbudgeten för utdata, men dessa värden styr fortfarande hur begäranden behandlas. Åsidosättningar i begäran ändrar inte de lagrade standardvärdena.
Åsidosätt standardinsats för resonemang och ange begränsningar för förfrågningar
I följande exempel anges svarssyntes, så hämtningsskälet måste vara low eller medium. Det anger också maxRuntimeInSeconds för att begränsa hämtningens körtid och maxOutputSizeInTokens för att begränsa storleken på svarsnyttolasten.
maxRuntimeInSeconds accepterar värden från 10 till 600 sekunder och är som standard 90 sekunder. Maxvärdet på 600 sekunder (10 minuter) gäller endast för Azure AI-sökning hämta begäran.
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
);
Referens: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)
Referens: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
}
Referens:Kunskapshämtning – Hämta
Låt tjänsten välja resonemangsinsatsen
Ange retrievalReasoningEffort.kind till auto i en hämtningsbegäran för att åsidosätta standardvärdet för kunskapsbasen. Mer information om automatiska resonemang finns i Ange hämtningsskäl (förhandsversion).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Referens:Kunskapshämtning – Hämta
Ange referenser för varje kunskapskälla
Använd includeReferences och includeReferenceSourceData i knowledgeSourceParams för att styra vilka källor som visas i referensmatrisen och hur mycket källdata varje post innehåller. I följande exempel används kunskapsbasens standardmässiga resonemang.
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
);
Referens: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)
Referens: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
}
]
}
Referens:Kunskapshämtning – Hämta
Använd minimalt resonemang
I följande exempel finns det ingen LLM för intelligent frågeplanering eller svarssyntes. Frågesträngen går till den agentiska hämtningsmotorn för nyckelordssökning eller hybridsökning.
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
);
Referens: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)
Referens: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"
}
]
}
Referens:Kunskapshämtning – Hämta
Felsöka hämtningsåtgärden
I 2026-08-01-preview anger svarsstatusen om hämtningen lyckades, lyckades delvis eller misslyckades, och vad du ska göra härnäst. Använd följande tabell för att mappa varje status till dess betydelse och se sedan motsvarande avsnitt för felsökningsvägledning.
| Status | Meaning |
|---|---|
200 OK |
Hämtningen lyckades. Ett dokument kan fortfarande utelämnas om dess innehåll överskrider utdatabudgeten. Mer information finns i Tomma svar. |
400 Bad Request |
Valideringen av hämtningsbegäran misslyckades innan hämtningen påbörjades. |
206 Partial Content |
Minst en källa lyckades och ingen misslyckad källa har markerats failOnError. Svaret innehåller resultat från de källor som lyckades. |
502 Bad Gateway |
Varje vald källa misslyckades eller så misslyckades en källa som markerats failOnError: true . |
För alla svar som inte är 200, registrera API-versionen, tidsstämpeln, den sanerade begärandetexten, svarshuvudena och begärande- eller korrelations-ID:t. Den här informationen hjälper dig att diagnostisera felet och dela problemet med support om det behövs.
400 Bad Request
Använd felet på den översta nivån för att identifiera den ogiltiga begärandeegenskapen. Vanliga orsaker är bland annat:
- En
knowledgeSourceNameiknowledgeSourceParamsär inte ansluten till kunskapsbasen, eller så stämmer desskindinte överens med den anslutna källan. - Ett begärandevärde ligger utanför det intervall som stöds, eller ett alternativ kräver ett annat alternativ som inte är aktiverat. Till exempel kräver
includeReferenceSourceDataincludeReferences. -
retrievalReasoningEffort.kindärauto, men begäran använder en TIDIGARE API-version än2026-08-01-preview. - Begäran använder
auto,low, ellermedium, men kunskapsbasen definierar inte en modell. - För källuteslutning vid begärandetillfället (förhandsversion) anger samma post både
alwaysQuerySourceochneverQuerySourcetilltrue, annars utesluts alla anslutna kunskapskällor.
Innan du försöker skicka begäran igen, korrigera egenskapen som identifieras av felet på högsta nivån.
206 Partial Content
Granska varje activity post som innehåller en error. En källhämtningsaktivitet identifierar den misslyckade kunskapskällan och en modellaktivitet identifierar den misslyckade bearbetningsfasen. Svarstexten innehåller fortfarande de resultat som lyckades.
Vanliga orsaker för fel vid källhämtningsaktivitet är:
- Ogiltiga frågetidsindata, till exempel ett felaktigt
filterAddOnuttryck. - Kunskapskällans eller indexkonfigurationens drift, till exempel ett omdöpt fält, semantisk konfiguration saknas eller ogiltig vektoriserare.
- Saknade eller ogiltiga beroendeauktoriseringar eller otillräckliga behörigheter för den identitet som används för att fråga källan.
- Beroendebegränsning, tidsgräns eller tillfälliga tillgänglighetsfel.
För ett modellaktivitetsfel använder du aktiviteten type för att identifiera den misslyckade bearbetningsfasen. Ett fel indikerar till exempel modelWebSummarization att sammanfattningen av webbresultat misslyckades.
Om programmet tillåter partiella resultat bearbetar du de lyckade resultaten och registrerar varje misslyckad källa eller modellfas. Korrigera konfigurations-, auktoriserings- och behörighetsfel innan du försöker igen. Vid strypning, tidsgränsöverskridanden eller tillfälliga tillgänglighetsproblem använder du begränsade återförsök med ökande väntetid.
Om resultatet är osäkert utan en specifik källa och dess källtyp stöder alwaysQuerySourceanger du både alwaysQuerySource och failOnError. Det första alternativet säkerställer att källan är markerad och det andra returnerar ett hårt fel om frågan misslyckas.
MCP-serverns kunskapskällor (förhandsversion) stöder alwaysQuerySourceinte . För dessa källor failOnError gäller endast när källan har valts.
failOnError gäller inte för modellaktivitetsfel.
502 Bad Gateway
Felet på högsta nivån beskriver ett av två allvarliga felutfall:
- Varje vald källa misslyckades: Varje vald källa returnerade ett fel. En källa som slutförs utan några matchande dokument är inte en källa som har misslyckats. Kontrollera varje källfel för ett problem med delad konfiguration, auktorisering, beroende eller tillgänglighet.
-
En
failOnErrorkälla misslyckades: Det gick inte att fråga en nödvändig källa. Andra källor kan ha lyckats, men tjänsten returnerar inte ett partiellt resultat eftersom den nödvändiga källan misslyckades.
De underliggande källfelen är vanligtvis samma typer som de som beskrivs för 206 Partial Content: ogiltig källspecifik indata, käll- eller indexkonfigurationsavvikelse, beroendeauktorisering eller behörigheter, begränsning, tidsgränser eller tillfällig beroendetillgänglighet.
Ett hårt 502 svar kan utelämna matrisen activity och ange källnamnet och det underliggande felet endast i felmeddelandet på den översta nivån. Korrigera konfigurations-, auktoriserings- och behörighetsfel innan du försöker igen. Använd ett begränsat antal återförsök med gradvis ökande väntetid endast vid strypning, tidsgränsöverskridanden eller tillfälliga tillgänglighetsfel. Tolka inte ett 502 Bad Gateway svar som ett Azure AI-sökning avbrott utan att undersöka det underliggande källfelet.
Tomma svar
Söksteget kan hitta ett dokument, men tjänsten kan fortfarande utelämna det från det slutliga svaret om dess grundade innehåll överskrider maxOutputSizeInTokens utdatabudgeten (maxOutputSize i 2026-05-01-preview och senare). När det här villkoret inträffar visar aktivitetsmatrisen att matchningar hittades och aktivitetsposten innehåller en varning om att det mest relevanta dokumentet överskred den maximala utdatastorleken. Referensmatrisen och det jordade svarsinnehållet är tomma för dokumentet. Om du vill behålla mer innehåll ökar du maxOutputSizeInTokens.
För att undvika det här beteendet indexeras stora källdokument som mindre segment med stabila identifierare och källmetadata. Detta gäller särskilt för långa handböcker, principer eller kunskapsbasartiklar.
Anropa MCP-slutpunkten
Varning
MCP-implementeringar är mottagliga för risker, till exempel attacker, sammanhängande fel och förlust av mänsklig tillsyn. Du kan minska dessa risker genom att granska MCP-servrar för säkerhet och tillförlitlighet, enligt bästa praxis för Microsoft och industry och implementera godkännandemekanismer och övervakning av sammanhängande beteenden.
MCP är ett öppet protokoll som standardiserar hur AI-program ansluter till externa datakällor och verktyg.
I Azure AI-sökning är varje kunskapsbas en fristående MCP-server som exponerar verktyget knowledge_base_retrieve. Alla MCP-kompatibla klienter, inklusive Foundry Agent Service, GitHub Copilot, Claude och Cursor, kan anropa det här verktyget för att köra frågor mot kunskapsbasen.
Autentisera till MCP-slutpunkten
Varje kunskapsbas har en MCP-slutpunkt på följande URL:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
Den API-version som du anger avgör vad anslutningen returnerar. Genom att använda 2026-08-01-preview returnerar kunskapsbasen syntetiserade svar när den underliggande kunskapsbasen är konfigurerad med en LLM och en kompatibel resonemangsnivå. Med hjälp av 2026-04-01är hämtning alltid minimalt och extraherande, och anslutningen returnerar endast jordningsdata.
Hur du autentiserar till den här slutpunkten beror på din MCP-klient. När du använder Azure OpenAI Responses API tillsammans med MCP-verktyget knowledge_base_retrieve autentiserar du både anropet till Azure OpenAI Responses API och MCP-begäran till Azure AI-sökning. Om MCP-klienten anropar den här slutpunkten direkt autentiserar du dig bara mot Azure AI-sökning.
Använd någon av följande metoder för Azure AI-sökning autentisering:
-
Skicka med en bearer-token i
Authorization-headern (rekommenderas) -
Ange en administratörsnyckel i
api-key-huvudet
Observera
MCP-klienter konfigurerar anpassade rubriker på olika sätt. Foundry Agent Service matar till exempel in huvuden via projektanslutningar, medan klienter som GitHub Copilot kräver rubriker i MCP-serverns JSON.
Använda en ägartoken för MCP-autentisering
Den rekommenderade metoden för MCP-autentisering är en ägartoken som undviker att lagra känsliga nycklar i konfigurationsfiler. Identiteten bakom token måste ha rollen Dataläsare för sökindex tilldelad i söktjänsten. Mer information finns i Anslut appen till Azure AI-sökning med hjälp av identiteter.
#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());
Referens:Använd Azure OpenAI Responses API
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)
Referens:Använd Azure OpenAI Responses API
// This code snippet is currently unavailable.
Använda en administratörsnyckel för MCP-autentisering
En administratörsnyckel ger fullständig läs- och skrivåtkomst till söktjänsten, så använd den bara i utvecklingsmiljöer eller när en ägartoken inte är tillgänglig. Mer information finns i Anslut till Azure AI-sökning med hjälp av API-nycklar.
Tip
I följande exempel visas endast rubriken som skiljer sig från exemplet med ägartoken. Fullständig konfiguration finns i Använda en ägartoken för MCP-autentisering.
#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)
);
Referens:Använd Azure OpenAI Responses API
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",
}
]
Referens:Använd Azure OpenAI Responses API
// This code snippet is currently unavailable.
Granska MCP-svaret
När en MCP-klient anropar knowledge_base_retrievefår den ett MCP-verktygsresultat i stället för hämtningsåtgärdens response, activityoch references kuvert. Många MCP-klienter visar verktygets resultat under ett objekt på den översta nivån result , så nyttolasten du bör förvänta dig är 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>\"}]"
}
]
}
}
Viktiga punkter:
result.content[]innehåller mcp-verktygets utdata som returneras av kunskapsbasen.result.content[].typeärtext.result.content[].textinnehåller hämtade jordningsdata som en JSON-kodad sträng.Till skillnad från hämtningsåtgärden returnerar det aktuella MCP-svaret inte separata matriserna
activityellerreferences, och det fyller inte i posterna iresourceför det returnerade innehållet.
Relaterat innehåll
- Agentic-hämtning i Azure AI-sökning
- Frågetids-ACL och RBAC-tillämpning (förhandsversion)
- Använda en blobindexerare eller kunskapskälla för att mata in METADATA för RBAC-omfång (förhandsversion)
- Agentic RAG: Skapa en hämtningsmotor för resonemang med Azure AI-sökning (YouTube-video)
- Azure OpenAI-demo med agentisk hämtning