Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Azure KI-Suche ist über das Azure Portal, REST-APIs und Azure SDKs verfügbar. Es unterstützt auch Foundry IQ, die verwaltete Wissensschicht, die Unternehmensinhalte in wiederverwendbare, berechtigungsfähige Wissensbasen für Agenten im Microsoft Foundry-Portal transformiert.
Wichtig
Features, Funktionen oder Eigenschaften, die als (Vorschau) gekennzeichnet sind, werden von keiner Dienstebenenvereinbarung (SLA) abgedeckt, werden für Produktionsworkloads nicht empfohlen und können geändert oder eingeschränkt werden, bevor sie allgemein verfügbar sind. Die Azure KI-Suche Vorschaubedingungen gelten für alle Vorschaufunktionen, unabhängig davon, ob sie eigenständig oder Teil eines allgemein verfügbaren Features ist.
In einer agentischen Abrufpipeline ruft die Abrufaktion die parallele Abfrageverarbeitung aus einer Wissensbasis auf. Sie können die Abrufaktion direkt mithilfe der REST-APIs des Suchdiensts oder einer Azure SDK aufrufen. Jede Wissensdatenbank macht auch einen MCP-Endpunkt (Model Context Protocol) für die Nutzung durch MCP-kompatible Agents verfügbar.
In diesem Artikel wird erläutert, wie Sie beide Abrufmethoden mit optionaler Erzwingung von Berechtigungen aufrufen. Zuerst wird die Retrieve-Aktion und später der MCP-Endpunkt behandelt, da sich das Ergebnis des MCP-Tools derzeit von der Antwortstruktur von REST und SDK unterscheidet.
Informationen zum Einrichten einer Pipeline, die Azure KI-Suche über MCP mit dem Foundry Agent Service verbindet, finden Sie unter Tutorial: Erstellen einer End-to-End Agentic-Abruflösung.
Nutzungssupport
| Azure Portal | Microsoft Foundry Portal | .NET SDK | Python SDK | Java SDK | JavaScript SDK | REST-API |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Voraussetzungen
Ein Azure KI-Suche-Dienst mit knowledge base.
Informationen zum Zugriff auf gemeinsame Modelle und zum Einrichten von Clients finden Sie unter Voraussetzungen für die Erstellung einer Wissensbasis.
Berechtigung zum Abfragen von Wissensdatenbanken. Konfigurieren Sie die schlüssellose Authentifizierung mit der Rolle "Suchindexdatenleser ", die Ihrem Benutzerkonto zugewiesen ist (empfohlen), oder verwenden Sie einen Abfrage-API-Schlüssel.
Wenn Sie den MCP-Endpunkt über die Azure OpenAI-Antwort-API aufrufen, benötigen Sie Folgendes:
Ein bereitgestelltes LLM und die Rolle Cognitive Services OpenAI-Benutzer (oder ein API-Schlüssel) für die Foundry-Ressource. Sie können die in Ihrer Knowledge Base angegebenen LLM und Ressource ggf. wiederverwenden.
Das
Azure.AI.OpenAIPaket:dotnet add package Azure.AI.OpenAI
Erforderliches
Azure.Search.Documents-Paket:Für
2026-08-01-previewFunktionen das neueste Vorschaupaket:dotnet add package Azure.Search.Documents --prereleaseFür
2026-04-01Features das neueste stabile Paket:dotnet add package Azure.Search.Documents
Für die schlüssellose Authentifizierung das Paket
Azure.Identity:dotnet add package Azure.Identity
Wenn Sie den MCP-Endpunkt über die Azure OpenAI-Antwort-API aufrufen, benötigen Sie Folgendes:
Ein bereitgestelltes LLM und die Rolle Cognitive Services OpenAI-Benutzer (oder ein API-Schlüssel) für die Foundry-Ressource. Sie können die in Ihrer Knowledge Base angegebenen LLM und Ressource ggf. wiederverwenden.
Das
openaiPaket:pip install openai
Erforderliches
azure-search-documents-Paket:Für
2026-08-01-previewFunktionen das neueste Vorschaupaket:pip install --pre azure-search-documentsFür
2026-04-01Features das neueste stabile Paket:pip install azure-search-documents
Für die schlüssellose Authentifizierung das Paket
azure-identity:pip install azure-identity
Erforderliche REST-API-Version für den Suchdienst:
Für Vorschaufunktionen: 2026-08-01-preview
Für allgemein verfügbare Features: 2026-04-01
Fügen Sie für die schlüssellose Authentifizierung ein Microsoft Entra ID-Token in den
AuthorizationHeader jeder HTTP-Anforderung ein.
Einschränkungen
Bei Suchindex-Wissensquellen verwendet der Abruf, wenn Sie die Neubewertung aktivieren, die semantische Konfiguration der Wissensquelle. Sie wendet nicht die Bewertungsprofile des zugrunde liegenden Index an, einschließlich defaultScoringProfile. Die abgerufenen Antworten werden auch nicht angezeigt @search.rerankerBoostedScore.
Abrufaktion aufrufen
Sie geben den Abrufvorgang in einer Wissensdatenbank an. Der Anforderungstext enthält die Abfrageeingabe und eine optionale Liste der zu verwendenden Wissensquellen.
Die 2026-04-01 API-Version unterstützt nur die Eingabe über intents und minimale, extraktive Abfragen. Vorschau-Funktionen, einschließlich der Eingabe messages, der Abfrageplanung, der Antwortsynthese und des konfigurierbaren Schlussfolgerungsaufwands, werden nicht unterstützt. Verwenden Sie 2026-08-01-preview für den vollen Funktionsumfang.
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
);
Referenz: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)
Referenz: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"
}
]
}
Reference:Knowledge Retrieval - Abrufen
Bereitstellen von Bildern zur Antwortsynthese (Vorschau)
Bei blob-, indizierten OneLake- und indizierten SharePoint-Wissensquellen, für die Sie einen Ressourcenspeicher konfigurieren, können Sie in Dokumente eingebettete Bilder zusammen mit Text für das nachgeschaltete Modell zur Antwortsynthese bereitstellen. Setzen Sie enableImageServing für den entsprechenden Eintrag in knowledgeSourceParams, um den in der Definition der Wissensdatenbank festgelegten Standardwert zu überschreiben. Die Abrufantwort enthält keine dedizierten Felder für die einzelnen Bildpfade oder Bildbytes, die dem Modell bereitgestellt werden.
Die Bereitstellung von Bildern wird nur ausgeführt, wenn outputModeanswerSynthesis ist, und wird für Wissensquellen, die ingestionPermissionOptions konfigurieren, nicht unterstützt. Informationen zu den Einrichtungsschritten, zur Rangfolgentabelle und zum Überprüfen von Statistiken zur Bildbereitstellung finden Sie unter In Dokumente eingebettete Bilder im Agent-Abruf anzeigen (Vorschau).
Reranking für eine Wissensquelle deaktivieren (Vorschau)
Ab der API-Version "resultsProcessing": "none" setzen Sie 2026-08-01-preview für einen knowledgeSourceParams-Eintrag, um die Neusortierung für eine bestimmte Wissensquelle zu umgehen und ihre ursprüngliche Ergebnisreihenfolge beizubehalten. Sie können auch resultsProcessing in der Wissensquelle als Standard speichern. Alle Wissensquellentypen unterstützen diese Eigenschaft.
Das folgende Beispiel überspringt das Reranking für product-catalog-ks bei einer Abrufanforderung.
using System;
using System.Linq;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var client = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"product-catalog-kb",
new DefaultAzureCredential());
var request = new KnowledgeBaseRetrievalRequest
{
IncludeActivity = true
};
request.Intents.Add(
new KnowledgeRetrievalSemanticIntent(
"Find the power adapter for SKU 88421."));
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("product-catalog-ks")
{
AlwaysQuerySource = true,
IncludeReferences = true,
ResultsProcessing = KnowledgeSourceResultsProcessing.None
});
var result = await client.RetrieveAsync(request);
Console.WriteLine(
$"References with a reranker score: "
+ $"{result.Value.References.Count(x => x.RerankerScore.HasValue)}");
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalSemanticIntent,
SearchIndexKnowledgeSourceParams,
)
client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="product-catalog-kb",
credential=DefaultAzureCredential(),
)
request = KnowledgeBaseRetrievalRequest(
intents=[
KnowledgeRetrievalSemanticIntent(
search="Find the power adapter for SKU 88421."
)
],
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="product-catalog-ks",
always_query_source=True,
include_references=True,
results_processing="none",
)
],
)
result = client.retrieve(request)
reranked_count = sum(
reference.reranker_score is not None
for reference in result.references
)
print("References with a reranker score:", reranked_count)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
@knowledge-base-name = product-catalog-kb
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Find the power adapter for SKU 88421."
}
],
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "product-catalog-ks",
"kind": "searchIndex",
"alwaysQuerySource": true,
"includeReferences": true,
"resultsProcessing": "none"
}
]
}
Reference:Knowledge Retrieval - Abrufen
Legen Sie "resultsProcessing": "rerank" fest, oder lassen Sie es weg, wenn kein gespeicherter Standard vorhanden ist, um die Reranking-Pipeline zu verwenden. Azure KI-Suche löst den effektiven Wert für jede Quelle in dieser Reihenfolge auf:
-
resultsProcessinginknowledgeSourceParamsin der Abrufanforderung. -
resultsProcessingauf der Wissensquelle gespeichert. -
rerankwenn keine der beiden Eigenschaften vorhanden ist.
Für eine MCP-Server-Wissensquelle hat ein resultsProcessing Wert, der für ein einzelnes Tool festgelegt ist, Vorrang vor der Anforderung und gespeicherten Werten.
Tip
resultsProcessing ändert, wie Ergebnisse verarbeitet werden, nicht welche Quellen abgefragt werden. Setzen Sie alwaysQuerySource auf true, wenn die Wissensquelle abgefragt werden soll.
Wenn der effektive Wert lautet none:
- Referenzen aus der Wissensquelle lassen
rerankerScoreaus, und die Ergebnisse behalten ihre ursprüngliche Reihenfolge innerhalb des Abrufvorgangs der Quelle bei. - Wenn eine beliebige Quelle das Reranking umgeht, verteilt Azure KI-Suche die Endergebnisse in Round-Robin-Reihenfolge auf die Aktivitäten, entsprechend der Deklarationsreihenfolge der Wissensquellen. Neu bewertete Aktivitäten bleiben nach Bewertung sortiert.
- Deduplizierung und Grenzwerte pro Quelle, Dokument und Token gelten weiterhin, sodass nicht jedes abgerufene Ergebnis in der Antwort angezeigt wird.
Azure KI-Suche überprüft rerankerThreshold in dieser Reihenfolge:
- Die Suche ermittelt
resultsProcessingaus der Abrufanforderung und dem gespeicherten Wert der Wissensquelle. - Wenn der aufgelöste Wert ist
noneund die Anforderung enthältrerankerThreshold, gibt Search zurück400 Bad Request. - Für ein MCP-Servertool wendet Search nach der Validierung der Anfrage den Wert auf Tool-Ebene
resultsProcessingan.
Daher ändert eine Einstellung eines MCP-Tools nichts daran, ob die Anfrage die Validierung besteht. Ein Wert von none auf Werkzeugebene verursacht keinen Schwellenwertfehler, und ein Wert von rerank auf Werkzeugebene verhindert keinen Fehler, wenn die Anforderung oder der gespeicherte Wert zu none aufgelöst wird.
Um zu prüfen, welcher Modus ausgeführt wurde, überprüfen Sie, ob die Verweise der Wissensquelle rerankerScore enthalten. Verlassen Sie sich nicht auf semanticConfigurationName, da es null statt weggelassen werden kann.
Suchindexverhalten
Für Wissensquellen, die auf einen Suchindex abzielen, lautet semanticder implizierte Abfragetyp, und es gibt keinen Suchmodus. Bei Reranking-Durchläufen verwendet die Abfrageausführung semanticConfigurationName. Andere Quelleinstellungen, einschließlich searchFields und sourceDataFields, gelten in beiden Modi.
Agentic-Abruf akzeptiert scoringProfile oder scoringParameters eingaben nicht. Wenn Sie für indizierte Wissensquellen einen Aktualitätsbias benötigen, verwenden Sie die aktualitätsbasierte Abrufung (Vorschau) anstelle eines Indexbewertungsprofils.
Wenn der Index Vektorfelder enthält, benötigen Sie eine gültige Vektorizerdefinition, damit das agentische Abrufmodul Abfrageeingaben vektorisieren kann. Andernfalls werden Vektorfelder ignoriert.
Weitere Informationen finden Sie unter Erstellen eines Indexes für den agentischen Abruf.
Ergebnisse aus dem Stream abrufen (Vorschau)
Ab der 2026-08-01-preview API-Version können Sie Ergebnisse als Datenstrom von vom Server gesendeten Ereignissen (SSE) empfangen, anstatt auf eine einzelne JSON-Antwort zu warten. Mithilfe von Streaming kann Ihr Client die Abfrageplanung, Quellaktivität und synthetisierte Antwort oder extrahierte Antwort in dieser Reihenfolge anzeigen, sobald jeder Teil verfügbar wird.
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}");
}
Referenz: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}")
Referenz:KnowledgeBaseRetrievalClient
Um das Streaming zu aktivieren, schließen Sie den Accept: text/event-stream Header in eine Abrufanforderung ein. Ohne diesen Header gibt die Abrufen-Aktion die standardmäßige JSON-Antwort zurück.
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
}
]
}
Reference:Knowledge Retrieval - Abrufen
Lebenszyklus von Ereignissen
Anstatt eine einzelne Antwort zurückzugeben, hält der Dienst eine HTTP-Verbindung geöffnet (Inhaltstyp text/event-stream; charset=utf-8) und sendet eine Abfolge von Ereignissen, wenn Daten verfügbar werden. Jedes Ereignis weist eine event: Zeile auf, die den Ereignistyp, eine data: Zeile mit einem JSON-Wert und eine leere Zeile mit dem Ende des Ereignisses benennt.
Ein erfolgreicher Stream verwendet den folgenden Lebenszyklus:
| Event | Zeitpunkt der Übermittlung | Was es enthält |
|---|---|---|
retrieval.started |
Erstes Ereignis bei jeder gestreamten Anfrage. | Die Anforderungs-ID, der Wissensdatenbankname, der Ausgabemodus und der effektive Begründungsaufwand, nachdem der Dienst Anforderungs- und Wissensdatenbank-Standardwerte aufgelöst hat. Wenn die effektive kindauto ist, meldet das Ereignis auto; es sagt keine spätere Eskalation voraus. |
activity.started |
Wenn der Dienst eine Abfrageplanungs-, Quell- oder Modellaktivität beginnt. Mehrere Aktivitäten können beginnen, bevor eine frühere Aktivität abgeschlossen ist. | Der Name der Aktivität id, der typeStartzeit und der optionalen Wissensquelle. |
activity.completed |
Wenn diese Aktivität abgeschlossen ist. Ordnen Sie es seinem activity.started Ereignis zu, indem Sie id abgleichen. |
Der abgeschlossene Aktivitätseintrag. |
answer.completed |
Einmalig, nur wenn outputModeanswerSynthesis ist. |
messageIndex identifiziert die Position der Nachricht im endgültigen Antwortarray und message enthält die vollständige synthetisierte Antwort. Es gibt kein Token-für-Token-Delta-Ereignis. |
references.completed |
Nachdem alle Verweise aufgelöst wurden. | Die Ereignisdaten sind das vollständige references-Array, ohne einen Objekt-Wrapper. |
response.completed |
Das abschließende Ereignis für einen erfolgreichen oder teilweise erfolgreichen Stream. |
200 oder 206 Statuscode und der vollständige Antworttext des Abrufs, der dieselbe Struktur wie ein Nicht-Streaming-JSON-Aufruf aufweist. Informationen dazu, was jeder Statuscode bedeutet, finden Sie unter Problembehandlung für die Abrufen-Aktion. |
error |
Anstelle von references.completed und response.completed, wenn der Abruf fehlschlägt, nachdem der Stream geöffnet wurde. |
Der Fehler und alle Aktivitätsdatensätze, die vor dem Fehler abgeschlossen wurden. |
Ereignisse treffen in der Reihenfolge ein. Jedes activity.started-Ereignis geht dem activity.completed-Ereignis mit demselben id voraus, aber Aktivitäten können sich verschachteln. Abgeschlossene Aktivitätsdatensätze enthalten auch Zeitstempel für startedAt und completedAt. Während sich der Datenstrom im Leerlauf befindet, sendet der Server ungefähr alle 15 Sekunden einen : heartbeat Kommentar, um die Verbindung geöffnet zu halten. SSE-Clients können diese Kommentare ignorieren.
Das folgende Beispiel zeigt eine Streaming-Antwort, deren Payloads aus Gründen der Lesbarkeit gekürzt wurden.
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":{}}
Fehler, Abbruch und Fallback behandeln
Preflight-Fehler: Wenn die Anforderungsüberprüfung fehlschlägt, bevor der Datenstrom geöffnet wird, z. B. für einen falsch formatierten Anforderungstext, gibt die Abrufaktion eine standardmäßige JSON-Fehlerantwort zurück und öffnet nie den Datenstrom.
Fehler während des Streams: Wenn der Abruf fehlschlägt, nachdem der Stream geöffnet wurde, ist
errordas abschließende Ereignis anstelle vonreferences.completedundresponse.completed. Das Ereignis kann alle Aktivitätsdatensätze enthalten, die abgeschlossen wurden, bevor der Fehler auftrat. Der HTTP-Statuscode bleibt erhalten200, sobald der Datenstrom gestartet wird. Überprüfen Sie daher das Terminalereignis, nicht den HTTP-Statuscode, um den Erfolg zu ermitteln.Abbruch oder Trennen: Wenn Ihr Client die Anforderung abbricht oder die Verbindung trennt, bevor der Datenstrom abgeschlossen ist, bricht der Dienst den Abruf ab und beendet den Datenstrom ohne Terminalereignis. Behandeln Sie alle Ereignisse, die vor dem Abbruch oder der Trennung der Verbindung empfangen wurden, als unvollständig.
JSON-Fallback: Bei
2026-08-01-preview, einem fehlendenAccept-Header oder einem Wert wieapplication/json,*/*,text/*odertext/event-stream;q=0wird die Standard-JSON-Antwort zurückgegeben, wie unter Antwort überprüfen beschrieben. Das Anforderntext/event-streamvon einer früheren API-Version gibt zurück406 Not Acceptable.
Filtern von Suchindex-Wissensquellen zur Abfragezeit
Beim Abrufen aus einer Suchindex-Wissensquelle können Sie einen OData-Filter zur Abfragezeit anwenden, um die Ergebnisse auf bestimmte Dokumente oder Felder einzugrenzen. Der Filterausdruck verwendet OData-Syntax und wird über den filterAddOn Parameter übergeben.
Filtersyntax und Beispiele
Der filterAddOn Parameter akzeptiert OData-Filterausdrücke. Beispielmuster sind:
-
Metadatenfelder:
city eq 'Phoenix',status eq 'active' -
Datumsbereiche:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
Numerische Bereiche:
price ge 100 and price le 5000 -
Textabgleich:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
Logische Operatoren:
(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'"
}
]
}
Beispiel für mehrere Filter
Sie können mehrere Filter kombinieren, um die Ergebnisse weiter zu verfeinern.
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"
}
Gespeicherte Abfragehinweise bei der Abfrage außer Kraft setzen (Vorschau)
Ab der API-Version 2026-08-01-preview können Sie die in einer Wissensquelle eines Suchindex gespeicherten Abfragehinweise für eine einzelne Abrufanforderung überschreiben, indem Sie knowledgeSourceParams in ihrem queryHintOverrides-Eintrag festlegen.
Die Überschreibung ersetzt das gesamte gespeicherte Objekt queryHints, anstatt es Eintrag für Eintrag zusammenzuführen. Geben Sie daher jeden Hinweis an, den Sie anwenden möchten. Lassen Sie queryHintOverrides weg, um die gespeicherten Hinweise zu verwenden.
Wenn der Reasoning-Aufwand beim Abruf nicht minimal ist, hängt eine HTTP-400-Antwort von den gespeicherten Filterhinweisen ab, nicht von den Inhalten der Überschreibung oder dem Boost-Typ. Der Dienst validiert gespeicherte Filterhinweise gegen das Knowledge-Base-Modell, bevor queryHintOverrides angewendet wird. Daher lehnt ein Modell der GPT-4o- oder GPT-4.1-Familie die Anfrage ab, selbst wenn das Override leer ist oder nur Boosts enthält. Gespeicherte Boosts allein lösen diese Überprüfung nicht aus. Verwenden Sie ein kompatibles Modell, oder entfernen Sie zuerst die gespeicherten Filterhinweise.
Das folgende Beispiel ersetzt alle gespeicherten Hinweise durch einen fieldValue Boost für japanische Inhalte. Der Dienst wendet auf diese Anfrage keinen gespeicherten Filter oder eine andere gespeicherte Verstärkung an.
using System;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var endpoint = new Uri("<search-endpoint>");
var retrievalClient = new KnowledgeBaseRetrievalClient(
endpoint,
"product-kb",
new DefaultAzureCredential());
var languageBoost =
new SearchIndexKnowledgeSourceFieldValueBoost(
"language",
2.0);
languageBoost.FieldValues.Add("ja-JP");
var queryHintOverrides =
new SearchIndexKnowledgeSourceQueryHints();
queryHintOverrides.Boosts.Add(languageBoost);
var request = new KnowledgeBaseRetrievalRequest
{
RetrievalReasoningEffort =
new KnowledgeRetrievalLowReasoningEffort(),
IncludeActivity = true
};
request.Messages.Add(
new KnowledgeBaseMessage([
new KnowledgeBaseMessageTextContent(
"Find Japanese service guidance for Model-X200.")
])
{
Role = "user"
});
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"product-docs-ks")
{
QueryHintOverrides = queryHintOverrides
});
var result = await retrievalClient.RetrieveAsync(request);
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
SearchIndexKnowledgeSourceFieldValueBoost,
SearchIndexKnowledgeSourceQueryHints,
)
from azure.search.documents.knowledgebases import (
KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
KnowledgeBaseRetrievalRequest,
KnowledgeRetrievalLowReasoningEffort,
SearchIndexKnowledgeSourceParams,
)
retrieval_client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
credential=DefaultAzureCredential(),
knowledge_base_name="product-kb",
)
query_hint_overrides = SearchIndexKnowledgeSourceQueryHints(
boosts=[
SearchIndexKnowledgeSourceFieldValueBoost(
field="language",
field_values=["ja-JP"],
boost=2.0,
)
]
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[
KnowledgeBaseMessageTextContent(
text="Find Japanese service guidance for Model-X200."
)
],
)
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="product-docs-ks",
query_hint_overrides=query_hint_overrides,
)
],
retrieval_reasoning_effort=(
KnowledgeRetrievalLowReasoningEffort()
),
include_activity=True,
)
result = retrieval_client.retrieve(request)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases('product-kb')/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"messages": [{
"role": "user",
"content": [{
"type": "text",
"text": "Find Japanese service guidance for Model-X200."
}]
}],
"knowledgeSourceParams": [{
"knowledgeSourceName": "product-docs-ks",
"kind": "searchIndex",
"queryHintOverrides": {
"boosts": [{
"kind": "fieldValue",
"field": "language",
"fieldValues": ["ja-JP"],
"boost": 2.0
}]
}
}],
"retrievalReasoningEffort": {"kind": "low"},
"includeActivity": true
}
Reference:Knowledge Retrieval - Abrufen
Um zu bestätigen, dass der Dienst Ihre Überschreibung angewendet hat, setzen Sie includeActivity für die Anforderung und prüfen Sie die zurückgegebene searchIndex-Aktivität. Das queryHintProcessing Objekt meldet, was das Modell generiert hat. In diesem Beispiel enthält es ein generatedBoost für die Sprachverstärkung, aber kein generatedFilter, weil die Überschreibung den gespeicherten Filterhinweis ersetzt hat. Da Abfragehinweise am besten geeignet sind, behandeln Sie diese Aktivität als Bestätigung, anstatt nach einem exakten Ausdruck zu suchen.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Informationen zur gespeicherten Definition, unterstützten Hinweistypen und zur Komposition mit deterministischen Filtern finden Sie unter Konfigurieren von Abfragehinweisen (Vorschau).
Berechtigungen bei der Abfrage erzwingen (Vorschau)
Änderungen an Zugriffsberechtigungen, die Sie außerhalb von 2026-08-01-preview vornehmen, können einige Zeit brauchen, bis sie in den Abrufergebnissen von 2026-08-01-preview angezeigt werden.
Wenn Ihre Wissensquellen berechtigungsgeschützte Inhalte enthalten, übergeben Sie die Identität des Endbenutzers an die Abrufanforderung, damit jeder Benutzer nur Inhalte sieht, auf die er autorisiert ist. Bei indizierten Quellen verwendet das Abrufmodul diese Identität, um Ergebnisse zu filtern und nicht gefilterte Ergebnisse zurückgibt, wenn sie nicht angegeben wird. Remotequellen verwenden auch die Autorisierung aus der Abrufanforderung, erzwingen jedoch Berechtigungen an der Quelle und erfordern möglicherweise ein quellspezifisches Token und einen Header.
Die Durchsetzung von Berechtigungen umfasst zwei Teile:
Erfassungszeit: Nur für indizierte Wissensquellen wird festgelegt
ingestionPermissionOptions, dass Berechtigungsmetadaten zusammen mit Inhalten aufgenommen werden.Abfragezeit: Übergeben Sie die Autorisierung des Benutzers in der Kopfzeile, die von der Wissensquelle benötigt wird. Die meisten Quellen verwenden
x-ms-query-source-authorization. Die Ausnahme ist Work IQ, diex-ms-query-work-iq-source-authorizationverwendet .
Konfiguration der Erfassungszeit
In der folgenden Tabelle wird gezeigt, welche Wissensquellen eine Erfassungszeitkonfiguration erfordern und wie jede Quelle Berechtigungen erzwingt.
| Wissensquelle | Erfordert ingestionPermissionOptions |
Wie Berechtigungen erzwungen werden |
|---|---|---|
| Blob oder ADLS Gen2 | ✅ | Erfasste RBAC-Bereiche, ACLs oder Microsoft Purview, die mit der Benutzeridentität abgeglichen wurden. |
| OneLake | ✅ | Erfasstes Dokument, Microsoft Purview-Vertraulichkeitsbezeichnungen, die mit der Benutzeridentität abgeglichen wurden. |
| Indizierter SharePoint | ✅ | Erfasste SharePoint-ACLs oder Microsoft Purview-Vertraulichkeitsbezeichnungen, die mit der Benutzeridentität abgeglichen wurden. |
| Remote-SharePoint | ❌ | Copilot-Abruf-API fragt SharePoint direkt mithilfe des Benutzertokens ab. |
| Fabric-Daten-Agent | ❌ | Die Abruf-Engine tauscht das Token des Benutzers gegen ein auf Microsoft Fabric beschränktes Token aus und fragt den Daten-Agent im Namen des Benutzers ab. |
| Fabric Ontologie | ❌ | Die Abruf-Engine tauscht das Token des Benutzers gegen ein auf Microsoft Fabric beschränktes Token aus und fragt das Ontologieelement in seinem Namen ab. |
| Arbeits-IQ | ❌ | Die Abruf-Engine tauscht eine Benutzerassertion für die App-Zielgruppe von x-ms-query-work-iq-source-authorization gegen ein auf Work IQ beschränktes Token aus. |
Wenn Sie beim Erstellen der indizierten Wissensquelle nicht konfigurieren ingestionPermissionOptions , enthält der Index keine Berechtigungsmetadaten. Das System gibt die Ergebnisse unabhängig von der Kopfzeile ungefiltert zurück. Um dieses Problem zu beheben, erstellen Sie die Wissensquelle mit den entsprechenden ingestionPermissionOptions Werten neu.
Abfragezeitautorisierung
Für Wissensquellen, die nicht zu Work IQ gehören, übermitteln Sie die Identität des Endbenutzers, indem Sie bei der Abrufanfrage ein auf https://search.azure.com/.default beschränktes Zugriffstoken mitsenden. Dieses Token ist von den Dienstanmeldeinformationen getrennt, die für den Zugriff auf den Suchdienst verwendet werden. Er benötigt keine Suchdienstberechtigungen und stellt nur den Benutzer dar, dessen Inhaltszugriff ausgewertet wird. Weitere Informationen finden Sie unter Durchsetzung von Abfragezeit-ACLs und RBAC.
Für Arbeits-IQ-Wissensquellen gilt dieser Abschnitt nicht. Verwenden Sie den Work IQ-spezifischen User-Assertion-Flow, der in Berechtigungen zur Abfragezeit erzwingen beschrieben wird.
Übergeben Sie im .NET SDK das Token als parameter querySourceAuthorization für 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);
Referenz:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Übergeben Sie im Python SDK das Token als parameter query_source_authorization für 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)
Referenz:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Fügen Sie in der REST-API den x-ms-query-source-authorization Header mit dem Zugriffstoken des Benutzers ein:
@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?"
}
]
}
]
}
Reference:Knowledge Retrieval - Abrufen
Überprüfen der Antwort
Die Abrufaktion gibt drei Hauptkomponenten zurück:
- Extrahierte Antwort oder synthetisierte Antwort (Vorschau) ( abhängig vom Ausgabemodus)
- Aktivitätsarray
- Referenzarray
Extrahierte Antwort
Die extrahierte Antwort ist eine einzelne, einheitliche Zeichenfolge, die Sie normalerweise an ein LLM übergeben. Das LLM verwendet die Zeichenfolge als Grundlagendaten, um eine Antwort zu formulieren. Ihr API-Aufruf an das LLM umfasst die einheitliche Zeichenfolge sowie Anweisungen für das Modell, beispielsweise, ob die Grundlage ausschließlich oder gegebenenfalls als Ergänzung verwendet werden soll.
Der Textkörper der Antwort ist im Stil einer Chatnachricht strukturiert, und der Inhalt wird als JSON serialisiert.
"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>\"}]"
}
]
}
]
Wichtige Punkte:
content.typehat einen gültigen Wert:text.content.textist eine JSON-codierte Zeichenfolge, die die relevantesten Dokumente (oder Blöcke) enthält, die im Suchindex gefunden wurden, wenn die Abfrage- und Chatverlaufseingaben angegeben sind. Diese Zeichenfolge sind Ihre Grundlagendaten, die ein LLM nutzt, um die Frage des Benutzers zu beantworten.Dieser Teil der Antwort besteht aus 200 oder weniger Abschnitten, wobei alle Ergebnisse ausgeschlossen sind, die den Mindestschwellenwert von 2,5 Reranker-Score nicht erreichen.
Die Zeichenfolge beginnt mit der Referenz-ID des Abschnitts (verwendet für Zitatzwecke) und allen Feldern, die in der semantischen Konfiguration des Zielindexes angegeben sind. In diesem Beispiel wird davon ausgegangen, dass die semantische Konfiguration im Zielindex ein Feld "title", ein "terms"-Feld und ein "content"-Feld aufweist.
Abrufantworten enthalten
@search.rerankerBoostedScorenicht.Die
maxOutputSizeInTokensEigenschaft (maxOutputSizein2026-05-01-previewund höher) für die Abrufanforderung bestimmt die Länge der Zeichenfolge.- Ein Dokument, das das
maxOutputSizeInTokensAusgabebudget überschreitet, kann aus der Antwort weggelassen werden. Das Aktivitätsarray enthält eine Warnung, wenn das relevanteste Dokument die maximale Ausgabegröße überschreitet. Um mehr Inhalt zu erhalten, erhöhen SiemaxOutputSizeInTokens. Weitere Informationen finden Sie unter "Leere Antworten".
- Ein Dokument, das das
Aktivitätsarray
Das Aktivitätsarray gibt den Abfrageplan aus, der operative Transparenz für die Nachverfolgung von Vorgängen, Abrechnungsauswirkungen und Ressourcenaufrufen bietet. Sie enthält auch Unterabfragen, die an die Abrufpipeline gesendet werden. Bei einer 206 Partial Content Antwort enthält das Array Fehler für fehlerhafte Wissensquellen. Eine 502 Bad Gateway Antwort liefert möglicherweise Fehlerdetails nur im Fehler auf oberster Ebene.
Das Aktivitätsarray enthält die folgenden Komponenten:
| Abschnitt | Beschreibung |
|---|---|
| Quellspezifische Aktivität | Für jede in der Abfrage enthaltene Wissensquelle meldet dieser Abschnitt die verstrichene Zeit und welche Argumente in der Abfrage verwendet wurden, einschließlich semantischer Rangfolger. Zu den Wissensquelltypen gehören searchIndex, azureBlobund andere unterstützte Wissensquellen. |
agenticReasoning |
In diesem Abschnitt wird der Tokenverbrauch für agentisches Schlussfolgern beim Abruf ausgewiesen, der vom angegebenen Schlussfolgerungsaufwand für den Abruf (Vorschau) abhängt. |
modelQueryPlanning |
Für Wissensdatenbanken, die eine LLM für die Abfrageplanung verwenden, berichtet dieser Abschnitt über die Tokenanzahl, die für die Eingabe und die Tokenanzahl für die Unterabfragen verwendet wird. Es enthält ein model Feld mit einem modelName Feld, das den Öffentlichen Modellnamen und nicht den Bereitstellungsnamen des Modells enthält, das die Aktivität ausgeführt hat. |
modelAnswerSynthesis |
Für Wissensdatenbanken, die Die Antwortsynthese (Vorschau) verwenden, berichtet dieser Abschnitt über die Tokenanzahl zur Formulierung der Antwort und der Tokenanzahl der Antwortausgabe. Es enthält ein model Feld mit einem modelName Feld, das den Öffentlichen Modellnamen und nicht den Bereitstellungsnamen des Modells enthält, das die Aktivität ausgeführt hat. |
modelWebSummarization |
Für Wissensdatenbanken, die Webzusammenfassungen verwenden, berichtet dieser Abschnitt über den Tokenverbrauch zum Zusammenfassen von Webergebnissen. Es enthält ein model Feld mit einem modelName Feld, das den Öffentlichen Modellnamen und nicht den Bereitstellungsnamen des Modells enthält, das die Aktivität ausgeführt hat. |
model |
Bei modellgestützten Aktivitätsdatensätzen identifiziert dieser Abschnitt das Modell, das zum Ausführen der Aktivität verwendet wird. Dieser Abschnitt wird nur angezeigt, wenn Sie includeActivity auf true. |
imageServing |
Für Wissensquellen, für die Bildbereitstellung (Vorschau) aktiviert ist, werden in diesem Abschnitt imagesRetrieved, imagesSentToModel, totalImageSizeBytes sowie Angaben dazu aufgeführt, ob verbalizationUsed zum Zeitpunkt der Indexierung aktiviert war. Prüfen Sie verbalizationUsed und imagesSentToModel unabhängig voneinander. Eine Antwort kann verbalizationUsed als true melden und dennoch Bilder an das nachgeschaltete Modell senden. Um die Anzahl der verlorenen Bilder zu ermitteln, subtrahieren Sie imagesSentToModel von imagesRetrieved. |
Das folgende Beispiel zeigt das Array von Aktivitäten.
"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
}
]
Referenzenfeld
Das Referenzarray stammt direkt aus den zugrunde liegenden Grundlagendaten. Sie enthält das sourceData zur Generierung der Antwort und umfasst jedes Dokument, das die Agenten-Abruf-Engine findet und semantisch bewertet.
Das Referenzarray enthält die folgenden Komponenten:
| Feld | Beschreibung |
|---|---|
type |
Der Typ der Wissensquelle, aus der der Verweis stammt, z. B. searchIndex. |
id |
Die Referenz-ID für ein Element innerhalb einer Antwort. Es ist nicht der Dokumentschlüssel im Suchindex. Verwenden Sie sie, um Zitate bereitzustellen. |
activitySource |
Querverweise auf den id Aktivitätseintrag, der den Verweis erzeugt hat, was für Zitatverknüpfungen nützlich ist. |
docKey |
Bei einem indizierten Verweis: der Dokumentschlüssel im zugrunde liegenden Suchindex. |
sourceData |
Die Grundlagendaten, die zum Generieren der Antwort verwendet werden. Bei einem indizierten Verweis können Felder ein id und semantische Felder wie title, terms und content enthalten. Die Form variiert je nach Bezugstyp. |
citationUrl (Vorschau) |
Eine dienstgenerierte, schreibgeschützte URL, die auf das Dokument der Referenz im zugrunde liegenden Index verweist. Wird nur für indizierte Wissensquellen zurückgegeben. Zum Aufrufen der URL siehe Dokumente mit Zitations-URLs suchen (Vorschau). |
Das folgende Beispiel zeigt das Verweisarray.
"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
}
]
Nachschlagen von Dokumenten mit Zitat-URLs (Vorschau)
Ab 2026-08-01-preview API-Version kann ein Verweis auf eine indizierte Wissensquelle in der Retrieve-Antwort ein citationUrl enthalten. Verwenden Sie diese URL, um die indizierten Felder für diese Referenz abzurufen, z. B. title und content, damit Sie eine Zitatvorschau anzeigen können, die zeigt, woher eine Antwort stammt, ohne das ursprüngliche Quelldokument zu öffnen.
citationUrl ist eine authentifizierte Abfrage des zugrunde liegenden Index, getrennt von den docUrl- und blobUrl-Quellen.
Das folgende Beispiel zeigt eine sanitisierte Zitat-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"
Die ausgewählten Felder und deren Reihenfolge hängen von der indizierten Quell- und Abrufkonfiguration ab.
Wichtig
Folgen Sie der vollständigen URL aus der Antwort wörtlich und stellen Sie die zurückgegebenen JSON-Felder in Ihrer App dar. Erstellen, analysieren oder normalisieren Sie die URL nicht.
Bei einer Zitat-URL erhalten die folgenden Beispiele ein Zugriffstoken für den Suchdienst. Sie rufen die URL mit diesem Token im Authorization Header auf. Die angemeldete Identität benötigt die Rolle des Suchindexdatenlesers .
Azure KI-Suche SDK-Dokumentsuchemethoden erfordern den Endpunkt, den Indexnamen, den Dokumentschlüssel, die ausgewählten Felder und die API-Version als separate Eingaben. Sie akzeptieren keine absolute Zitat-URL. In diesen Beispielen wird eine authentifizierte HTTP-GET verwendet, um die vollständige vom Dienst generierte URL beizubehalten.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;
// citationUrl comes from a retrieve response
string citationUrl = "<citation-url>";
var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext(
new[] { "https://search.azure.com/.default" }));
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.Token);
string document = await httpClient.GetStringAsync(citationUrl);
Console.WriteLine(document);
Reference:DefaultAzureCredential
import json
from urllib.request import Request, urlopen
from azure.identity import DefaultAzureCredential
# citation_url comes from a retrieve response
citation_url = "<citation-url>"
credential = DefaultAzureCredential()
token = credential.get_token("https://search.azure.com/.default")
document_request = Request(
citation_url,
headers={"Authorization": f"Bearer {token.token}"},
)
with urlopen(document_request) as response:
document = json.load(response)
print(json.dumps(document, indent=2))
Reference:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Referenz:Dokumente – Abrufen
Die Dokumentsuche gibt die ausgewählten Indexfelder als JSON zurück:
{
"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"
}
Wenn Sie eine Zitat-URL verwenden, beachten Sie Folgendes:
Überprüfen Sie
citationUrl, bevor Sie ein Zitat darstellen. Es kann fehlen, wenn die Antwort keine Verweise enthält oder der Dienst den zugrunde liegenden Index oder den Dokumentschlüssel nicht auflösen kann.Wenn die Abrufanforderung für die Zugriffssteuerung auf Dokumentebene enthalten ist
x-ms-query-source-authorization, verwenden Sie dasselbe Benutzertoken, wenn Sie der URL folgen.Die URL bleibt nur gültig, während der Sicherungsindex und der Dokumentschlüssel unverändert bleiben.
Überprüfen der Metadaten der Vertraulichkeitsbezeichnung in der Antwort (Vorschau)
Dasselbe Zeitverhalten, das unter Berechtigungen zum Abfragezeitpunkt erzwingen beschrieben wird, gilt auch hier: Änderungen an Zugriffsberechtigungen, die Sie außerhalb von 2026-08-01-preview festlegen, können einige Zeit benötigen, bis sie in den Abrufantworten von 2026-08-01-preview angezeigt werden.
Wenn Sie eine Wissensdatenbank abfragen, die Microsoft Purview-Vertraulichkeitsbezeichnungen erfasst, enthält die Abrufantwort Metadaten zu den Bezeichnungen auf zwei Ebenen:
| Standort | Feld | Beschreibung |
|---|---|---|
| Pro Referenz | sensitivityLabelInfo |
Die Vertraulichkeitsbezeichnung, die auf jedes im references-Array zurückgegebene Dokument angewendet wird. |
| Antwort | metadata.responseSensitivityLabelInfo |
Eine Aggregatbezeichnung, die die Vertraulichkeitsbezeichnung mit der höchsten Priorität in allen referenzierten Dokumenten in der Antwort darstellt. Nützlich für clientseitige Anzeigebanner und die Durchsetzung von Richtlinien. |
Microsoft Graph berechnet die Antwort-Level-Bezeichnung aus den Referenz-Bezeichnungen unter Verwendung der Vererbungsregeln für Microsoft Purview-Bezeichnungen. In der Regel gewinnt die restriktivste Bezeichnung.
Das folgende Beispiel zeigt eine Abrufantwort mit zwei referenzierten Dokumenten (eines Confidential, eines Internal) und der daraus resultierenden Bezeichnung auf Antwortebene.
{
"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
}
}
}
Verweistypen, die Vertraulichkeitsbezeichnungen einblenden
Der Feldname und die Verfügbarkeit von Bezeichnungsmetadaten hängen vom Wissensquelltyp ab, der die einzelnen Verweise erstellt hat.
Verweis type |
Bezeichnungsfeld | Verfügbar, wenn... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
Die Blob-Wissensquelle enthält sensitivityLabel in ingestionPermissionOptions. |
indexedOneLake |
sensitivityLabelInfo |
Die OneLake-Wissensquelle umfasst sensitivityLabel in ingestionPermissionOptions. |
indexedSharePoint |
sensitivityLabelInfo |
Die SharePoint-indizierte Wissensquelle enthält sensitivityLabel in ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
Für den zugrunde liegende Index ist purviewEnabled auf true festgelegt und ein Feld ist mit sensitivityLabel: true gekennzeichnet. |
Anzeigen und Prüfen von Empfehlungen
Verwenden Sie
sensitivityLabelInfo.labelId, um über die Microsoft Graph-APIs für Vertraulichkeitsbezeichnungen die vollständige Definition der Bezeichnung nachzuschlagen, wenn Sie zusätzliche Eigenschaften wie Richtliniensteuerelemente oder Berechtigungen benötigen.Verwenden Sie
metadata.responseSensitivityLabelInfo, um ein Vertraulichkeitsbanner auf Antwortebene anzuzeigen oder Richtliniensteuerungen wie z. B. das Deaktivieren des Kopierens und Teilens für die gesamte Antwort anzuwenden.Wenn Ihre Wissensquelle auf einen in Blöcke unterteilten Index verweist, z. B. auf einen, der durch integrierte Vektorisierung oder eine benutzerdefinierte Fähigkeit zur Textaufteilung gefüllt wurde, stellen Sie sicher, dass das Skillset die Vertraulichkeitsbezeichnung auf jede Chunk-Zeile projiziert. Ohne diese Zuordnung werden Verweise auf Abschnittsebene zur Abfragezeit nicht ordnungsgemäß gefiltert.
Informationen zum überprüfbaren administrativen Zugriff auf bezeichnete Inhalte finden Sie unter "Erhöhte Leseberechtigung für administrative Untersuchungen".
MCP-Serververhalten
Der MCP-Endpunkt, der von jeder Knowledge Base verfügbar gemacht wird, zeigt die gleichen Vertraulichkeitsbezeichnungsfelder wie die REST-API an. Wenn ein MCP-kompatibler Client das Tool knowledge_base_retrieve aufruft, enthält das Toolergebnis den gleichen sensitivityLabelInfo pro Verweis und die Antwortebene metadata.responseSensitivityLabelInfo, die weiter oben in diesem Abschnitt dokumentiert sind. MCP-Clients erzwingen bezeichnungsbewusste Anzeige- und Richtliniensteuerelemente auf Grundlage dieser Felder.
Abrufen von Aktionsbeispielen (Vorschau)
Die folgenden Beispiele zeigen verschiedene Möglichkeiten zum Aufrufen der Abrufaktion mithilfe der 2026-08-01-preview API-Version. Diese Version unterstützt den vollen Funktionsumfang, einschließlich Antwortsynthese und eines konfigurierbaren Grads der Schlussfolgerungstiefe. Die 2026-04-01 Verwendung finden Sie in den vorherigen Abschnitten.
- Überprüfen von Modellnamen in Aktivitätsprotokollen
- Eine Wissensquelle für den Erfolg voraussetzen
- Ausschließen einer Wissensquelle aus einer Anforderung
- Optimieren von Kandidatendokumenten pro Wissensquelle
- Abschließende Begründungsdokumente begrenzen
- Standardwerte für den Abruf der Wissensdatenbank überprüfen
- Außerkraftsetzen des Standardverarbeitungsaufwands und Festlegen von Anfragelimits
- Lassen Sie den Dienst den Aufwand für die Schlussfolgerung wählen
- Festlegen von Verweisen für jede Wissensquelle
- Verwenden Sie minimalen Denkaufwand
Überprüfen von Modellnamen in Aktivitätsprotokollen
Setzen Sie includeActivity auf true, um Identitätsfelder des Modells in modellgestützten Aktivitätsdatensätzen zurückzugeben. Verwenden Sie diese Felder, um zu bestätigen, welches konfigurierte Modell die Abfrageplanung, Antwortsynthese oder Webzusammenfassung während einer Abrufanforderung behandelt. Im folgenden Beispiel wird die gespeicherte Ergebnisverarbeitung für die ausgewählte Quelle in der Anforderung außer Kraft gesetzt.
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}");
}
}
Referenz: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,
)
Referenz: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"
}
]
}
Reference:Knowledge Retrieval - Abrufen
Der folgende Antwortauszug zeigt die geschachtelte Modellidentität:
{
"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
}
]
}
Für den Erfolg ist eine Wissensquelle erforderlich
Legen Sie failOnError in knowledgeSourceParams fest, um eine Wissensquelle nach Bedarf zu markieren. Verwenden Sie diesen Parameter, wenn eine partielle Antwort irreführend oder nicht konform wäre, wenn diese Quelle nicht verfügbar ist. Die Anforderung gibt zurück, wenn eine erforderliche Quelle fehlschlägt 502 Bad Gateway , auch wenn eine andere Quelle erfolgreich ist. Hinweise zur Behebung finden Sie unter Problembehandlung bei der Abrufaktion.
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);
Referenz: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)
Referenz: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"
}
]
}
Reference:Knowledge Retrieval - Abrufen
Ausschließen einer Wissensquelle aus einer Anforderung
Legen Sie ab der 2026-08-01-preview API-Version für jede Wissensquelle fest neverQuerySourcetrue , die Sie von einer Abrufanforderung ausschließen möchten. Anforderungszeit neverQuerySource setzt einen gespeicherten alwaysQuerySource Wert für diese Anforderung außer Kraft, ohne den gespeicherten Wert zu ändern.
Das folgende Beispiel fragt eine Wissensdatenbank ab, die product-docs-ks und troubleshooting-ks enthält, wobei troubleshooting-ks von der Abfrage ausgeschlossen wird.
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);
Referenz: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)
Referenz: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
}
]
}
Reference:Knowledge Retrieval - Abrufen
Kandidatendokumente nach Wissensquelle optimieren
Legen Sie maxOutputDocuments in knowledgeSourceParams fest, um eine Obergrenze dafür festzulegen, wie viele Kandidatendokumente eine bestimmte Wissensquelle vor der endgültigen Ergebnisauswahl bereitstellt. Verwenden Sie diesen Parameter, wenn Sie die Eingabe einer Quelle an die Pipeline gebunden möchten, ohne dass sich dies auf andere auswirkt.
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);
Referenz: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)
Referenz: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
}
]
}
Reference:Knowledge Retrieval - Abrufen
Einschränken der endgültigen Erdungsdokumente
Der Parameter der obersten Ebene maxOutputDocuments legt fest, wie viele Grounding-Dokumente maximal in der finalen Retrieve-Antwort zurückgegeben werden. Verwenden Sie diesen Parameter, wenn Ihre Anwendung eine vorhersagbare Zitat- oder Referenzanzahl benötigt.
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);
Referenz: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)
Referenz: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
}
Reference:Knowledge Retrieval - Abrufen
Die folgende Tabelle zeigt, wie maxOutputDocuments und maxOutputSizeInTokens in allen vier Kombinationen interagieren.
maxOutputDocuments |
maxOutputSizeInTokens |
Behavior |
|---|---|---|
| Nicht angegeben. | Nicht angegeben. | Verwendet das Standardmäßige maxOutputSizeInTokens Verhalten des Antwortgrenzwerts. |
| Nicht angegeben. | Angegeben | Verwirft Dokumente, sobald der Grenzwert für die Nutzlastgröße erreicht ist. |
| Angegeben | Nicht angegeben. | Gibt bis zu der angegebenen Anzahl an Grounding-Dokumenten zurück und wendet keinen maxOutputSizeInTokens-Grenzwert an. |
| Angegeben | Angegeben | Gibt bis zu maxOutputDocuments Dokumente zurück oder so viele Dokumente, wie unter maxOutputSizeInTokens passen, je nachdem, welches Limit zuerst greift. |
Standardwerte für den Abruf der Wissensdatenbank überprüfen
Eine Wissensbasis kann anfrageweite Standardwerte in retrieveDefaults speichern. Senden Sie zwei Abrufanforderungen, um vererbung und anforderungsspezifische Außerkraftsetzungen zu überprüfen.
Bevor Sie beginnen, konfigurieren Sie die Standard-Abrufgrenzwerte (Vorschau). Die erste Anforderung lässt alle drei anforderungsweiten Grenzwerte weg, sodass die gespeicherten Werte von 45 Sekunden, acht Dokumenten und 12.000 Token gelten. Die zweite Anforderung überschreibt sie mit 20 Sekunden, einem Dokument und 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");
Referenz: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")
Referenz:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Senden Sie zunächst eine Anforderung, die die drei anforderungsweiten Begrenzungsfelder ausgelassen.
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."
}
]
}
Überschreiben Sie als Nächstes in einer Anfrage alle drei Werte.
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
}
Reference:Knowledge Retrieval - Abrufen
Die Referenzanzahl zeigt an, ob der gespeicherte Wert oder der Wert auf Anforderungsebene maxOutputDocuments gilt: Die erste Antwort enthält höchstens acht Verweise, und die zweite enthält höchstens einen. Eine Antwort kann weniger Verweise enthalten, wenn weniger Dokumente übereinstimmen. Die Antwort meldet nicht das effektive Laufzeit- oder Ausgabetokenbudget, aber diese Werte steuern weiterhin die Anforderungsverarbeitung. Anforderungsüberschreibungen ändern die gespeicherten Standardwerte nicht.
Überschreiben des Standardverarbeitungsaufwands und Festlegen von Limits für Anfragen
Das folgende Beispiel legt Antwortsynthese fest, daher muss der Reasoning-Aufwand für den Abruf medium oder low sein. Außerdem setzt es maxRuntimeInSeconds, um die Abruflaufzeit zu begrenzen, und maxOutputSizeInTokens, um die Größe der Antwortnutzlast zu begrenzen.
maxRuntimeInSeconds akzeptiert Werte von 10 bis 600 Sekunden und standardmäßig 90 Sekunden. Der Maximalwert von 600 Sekunden (10 Minuten) gilt nur für die Azure KI-Suche Abrufanforderung.
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
);
Referenz: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)
Referenz: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
}
Reference:Knowledge Retrieval - Abrufen
Lassen Sie den Dienst den Denkaufwand auswählen
Setzen Sie auto in einer Abrufanforderung auf retrievalReasoningEffort.kind, um den Standardwert der Wissensdatenbank außer Kraft zu setzen. Weitere Informationen zum automatischen logischen Schlussfolgern finden Sie unter Festlegen des Aufwands für das logische Schlussfolgern beim Abruf (Vorschau).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Reference:Knowledge Retrieval - Abrufen
Festlegen von Verweisen für jede Wissensquelle
Verwenden Sie includeReferences und includeReferenceSourceData in knowledgeSourceParams, um zu steuern, welche Quellen im Referenzarray angezeigt werden und wie viele Quelldaten jeder Eintrag enthält. Im folgenden Beispiel wird der Standardaufwand für die Begründung der Wissensbasis verwendet.
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
);
Referenz:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
from azure.search.documents.knowledgebases.models import SearchIndexKnowledgeSourceParams
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
)
],
include_activity=True,
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-financials-ks",
include_references=True,
include_reference_source_data=True,
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-communicationservices-ks",
include_references=False,
include_reference_source_data=False,
),
SearchIndexKnowledgeSourceParams(
knowledge_source_name="demo-healthcare-ks",
include_references=True,
include_reference_source_data=False,
always_query_source=True,
),
],
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams
POST {{search-endpoint}}/knowledgebases/kb-medium-example/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What companies are in the financial sector?" }
]
}
],
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "demo-financials-ks",
"kind": "searchIndex",
"includeReferences": true,
"includeReferenceSourceData": true
},
{
"knowledgeSourceName": "demo-communicationservices-ks",
"kind": "searchIndex",
"includeReferences": false,
"includeReferenceSourceData": false
},
{
"knowledgeSourceName": "demo-healthcare-ks",
"kind": "searchIndex",
"includeReferences": true,
"includeReferenceSourceData": false,
"alwaysQuerySource": true
}
]
}
Reference:Knowledge Retrieval - Abrufen
Verwenden Sie minimalen Denkaufwand
Im folgenden Beispiel gibt es keine LLM für intelligente Abfrageplanung oder Antwortsynthese. Die Abfragezeichenfolge wird an das agentische Abrufmodul für die Stichwortsuche oder hybride Suche übergeben.
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
);
Referenz: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)
Referenz: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"
}
]
}
Reference:Knowledge Retrieval - Abrufen
Beheben von Problemen bei der Abrufaktion
In 2026-08-01-preview, der Antwortstatus gibt an, ob der Abruf erfolgreich war, teilweise erfolgreich oder fehlgeschlagen ist und was als Nächstes zu tun ist. Verwenden Sie die folgende Tabelle, um jedem Status seine Bedeutung zuzuordnen, und lesen Sie dann den entsprechenden Abschnitt zur Problembehandlung.
| Status | Bedeutung |
|---|---|
200 OK |
Der Abruf war erfolgreich. Ein Dokument kann weiterhin weggelassen werden, wenn der Inhalt das Ausgabebudget überschreitet. Weitere Informationen finden Sie unter "Leere Antworten". |
400 Bad Request |
Fehler bei der Überprüfung der Abrufanforderung, bevor der Abruf gestartet wurde. |
206 Partial Content |
Mindestens eine Quelle war erfolgreich, und es wurde keine fehlgeschlagene Quelle markiert failOnError. Die Antwort enthält Ergebnisse aus den erfolgreichen Quellen. |
502 Bad Gateway |
Bei jeder ausgewählten Quelle ist ein Fehler aufgetreten, oder eine als Quelle markierte failOnError: true Quelle ist fehlgeschlagen. |
Notieren Sie bei jeder Nicht-200-Antwort die API-Version, den Zeitstempel, den bereinigten Anforderungstext, die Antwortheader und die Anforderungs- oder Korrelations-ID. Diese Details helfen Ihnen, den Fehler zu diagnostizieren und das Problem bei Bedarf mit dem Support zu teilen.
400 Bad Request
Verwenden Sie den Fehler der obersten Ebene, um die ungültige Anforderungseigenschaft zu identifizieren. Häufige Ursachen sind:
- Ein
knowledgeSourceNameInknowledgeSourceParamsist nicht mit der Wissensdatenbank verknüpft, oder eskindstimmt nicht mit der angefügten Quelle überein. - Ein Anforderungswert liegt außerhalb des unterstützten Bereichs, oder eine Option erfordert eine andere Option, die nicht aktiviert ist.
includeReferenceSourceDataerfordert beispielsweiseincludeReferences. -
retrievalReasoningEffort.kindistauto, aber die Anforderung verwendet eine API-Version früher als2026-08-01-preview. - Die Anforderung verwendet
auto,lowodermedium, aber die Wissensbasis definiert kein Modell. - Für Quellenausschluss zur Anforderungszeit (Vorschau) setzt derselbe Eintrag sowohl
alwaysQuerySourceals auchneverQuerySourceauftrue; andernfalls wird jede angefügte Wissensquelle ausgeschlossen.
Korrigieren Sie vor dem Wiederholen der Anforderung die durch den Fehler der obersten Ebene identifizierte Eigenschaft.
206 Partial Content
Überprüfen Sie jeden activity-Eintrag, der ein error enthält. Eine Quellabrufaktivität identifiziert die fehlgeschlagene Wissensquelle, und eine Modellaktivität identifiziert die fehlgeschlagene Verarbeitungsphase. Der Antworttext enthält weiterhin die Ergebnisse, die erfolgreich waren.
Für Fehler bei der Quellabrufaktivität sind häufig folgende Ursachen zu finden:
- Ungültige Abfragezeiteingabe, z. B. ein falsch formatierter
filterAddOnAusdruck. - Wissensquelle oder Indexkonfigurationsabweichung, z. B. umbenanntes Feld, fehlende semantische Konfiguration oder ungültiger Vektorizer.
- Fehlende oder ungültige Abhängigkeitsautorisierung oder unzureichende Berechtigungen für die Identität, die zum Abfragen der Quelle verwendet wird.
- Abhängigkeits-Drosselung, Zeitüberschreitung oder vorübergehende Verfügbarkeitsausfälle.
Verwenden Sie für einen Modellaktivitätsfehler die Aktivität type , um die fehlgeschlagene Verarbeitungsphase zu identifizieren. Ein Fehler gibt z. B. an, modelWebSummarization dass die Zusammenfassung des Webergebnisses fehlgeschlagen ist.
Wenn Ihre Anwendung Teilergebnisse zulässt, verarbeiten Sie die erfolgreichen Ergebnisse, und notieren Sie jede fehlgeschlagene Quelle oder Modellstufe. Korrigieren Von Konfigurations-, Autorisierungs- und Berechtigungsfehlern, bevor Sie den Vorgang wiederholen. Verwenden Sie bei Drosselung, Zeitüberschreitungen oder vorübergehenden Verfügbarkeitsausfällen begrenzte Wiederholungsversuche mit Backoff.
Wenn Ergebnisse ohne eine bestimmte Quelle unsicher sind und ihr Quelltyp alwaysQuerySource unterstützt, setzen Sie sowohl alwaysQuerySource als auch failOnError. Die erste Option stellt sicher, dass die Quelle ausgewählt ist, und die zweite gibt einen harten Fehler zurück, wenn die Abfrage fehlschlägt.
MCP-Server-Wissensquellen (Vorschau) unterstützen alwaysQuerySource nicht; für diese Quellen gilt failOnError nur, wenn die Quelle ausgewählt ist.
failOnError gilt nicht für Modellaktivitätsfehler.
502 Bad Gateway
Der Fehler auf oberster Ebene beschreibt einen von zwei Hard-Failure-Pfaden:
- Bei jeder ausgewählten Quelle ist ein Fehler aufgetreten: Jede ausgewählte Quelle hat einen Fehler zurückgegeben. Eine Quelle, die erfolgreich mit null passenden Dokumente abschließt, gilt nicht als fehlgeschlagene Quelle. Überprüfen Sie jeden Quellfehler auf ein gemeinsames Konfigurations-, Autorisierungs-, Abhängigkeits- oder Verfügbarkeitsproblem.
-
Fehler bei einer
failOnErrorQuelle: Eine erforderliche Quelle konnte nicht abgefragt werden. Andere Quellen sind möglicherweise erfolgreich, der Dienst gibt jedoch kein Teilergebnis zurück, da die erforderliche Quelle fehlgeschlagen ist.
Die zugrunde liegenden Quellfehler sind im Allgemeinen die gleichen Arten wie die für 206 Partial Content: ungültige quellspezifische Eingabe, Quell- oder Indexkonfigurationsabweichung, Abhängigkeitsautorisierung oder Berechtigungen, Drosselung, Timeouts oder vorübergehende Abhängigkeitsverfügbarkeit.
Eine harte 502 Antwort kann das activity Array weglassen und den Quellnamen und den zugrunde liegenden Fehler nur in der Fehlermeldung auf oberster Ebene bereitstellen. Korrigieren Von Konfigurations-, Autorisierungs- und Berechtigungsfehlern, bevor Sie den Vorgang wiederholen. Verwenden Sie begrenzte Wiederholungsversuche mit Backoff nur bei Drosselung, Zeitüberschreitungen oder vorübergehenden Verfügbarkeitsausfällen. Interpretieren Sie eine 502 Bad Gateway Antwort nicht als Azure KI-Suche Ausfall, ohne den zugrunde liegenden Quellfehler zu untersuchen.
Leere Antworten
Der Suchschritt kann ein Dokument finden, aber der Dienst kann es trotzdem aus der endgültigen Antwort weglassen, wenn der geerdete Inhalt das maxOutputSizeInTokens Ausgabebudget überschreitet (maxOutputSize in 2026-05-01-preview und höher). Wenn diese Bedingung auftritt, zeigt das Aktivitätsarray an, dass Übereinstimmungen gefunden wurden, und der Aktivitätseintrag enthält eine Warnung, dass das relevanteste Dokument die maximale Ausgabegröße überschritten hat. Das Referenz-Array und der quellenbasierte Antwortinhalt sind für dieses Dokument leer. Um mehr Inhalt zu erhalten, erhöhen Sie maxOutputSizeInTokens.
Um dieses Verhalten zu vermeiden, indizieren Sie große Quelldokumente als kleinere Abschnitte mit stabilen Bezeichnern und Quellmetadaten. Dies gilt insbesondere für lange Handbücher, Richtlinien oder Knowledge Base-Artikel.
Aufrufen des MCP-Endpunkts
Warning
MCP-Implementierungen sind anfällig für Risiken, z. B. Angriffe, Kaskadierende Fehler und Verlust der menschlichen Aufsicht. Sie können diese Risiken mindern, indem Sie MCP-Server auf Sicherheit und Zuverlässigkeit überprüfen, indem Sie die empfohlenen Methoden Microsoft und industry best practices ausführen und Genehmigungsmechanismen implementieren und kaskadierende Verhaltensweisen überwachen.
MCP ist ein offenes Protokoll, das standardisiert, wie KI-Anwendungen eine Verbindung mit externen Datenquellen und Tools herstellen.
In Azure KI-Suche ist jede Knowledge Base ein eigenständiger MCP-Server, der das tool knowledge_base_retrieve verfügbar macht. Jeder MCP-kompatible Client, einschließlich Foundry Agent Service, GitHub Copilot, Claude und Cursor, kann dieses Tool aufrufen, um die Wissensbasis abzufragen.
Authentifizieren beim MCP-Endpunkt
Jede Knowledge Base verfügt über einen MCP-Endpunkt unter der folgenden URL:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
Die angegebene API-Version bestimmt, was die Verbindung zurückgibt. Mithilfe von 2026-08-01-preview"Knowledge Base" werden synthetisierte Antworten zurückgegeben, wenn die zugrunde liegende Wissensbasis mit einem LLM und einem kompatiblen Grundgedanken konfiguriert ist. Durch die Verwendung von 2026-04-01 ist der Abruf stets minimal und extraktiv, und die Verbindung liefert nur Grounding-Daten zurück.
Wie Sie sich bei diesem Endpunkt authentifizieren, hängt von Ihrem MCP-Client ab. Wenn Sie die Azure OpenAI-Antwort-API mit dem knowledge_base_retrieve MCP-Tool verwenden, authentifizieren Sie sowohl den Antwort-API-Aufruf für Azure OpenAI als auch die MCP-Anforderung zum Azure KI-Suche. Wenn Ihr MCP-Client diesen Endpunkt direkt aufruft, authentifizieren Sie sich nur für Azure KI-Suche.
Verwenden Sie für Azure KI-Suche Authentifizierung eine der folgenden Methoden:
-
Übergeben Sie ein Bearer-Token im
AuthorizationHeader (empfohlen) -
Übergeben eines Administratorschlüssels in der
api-keyKopfzeile
Hinweis
MCP-Clients konfigurieren benutzerdefinierte Header unterschiedlich. Beispielsweise fügt der Foundry Agent Service Header über Projektverbindungen ein, während Clients wie GitHub Copilot Header in MCP-Server-JSON erfordern.
Verwenden eines Bearertokens für die MCP-Authentifizierung
Die empfohlene Methode für die MCP-Authentifizierung ist ein Bearertoken, das das Speichern vertraulicher Schlüssel in Konfigurationsdateien verhindert. Die Identität hinter dem Token muss die Rolle Suchindexdatenleser für den Suchdienst besitzen. Weitere Informationen finden Sie unter Connect your app to Azure KI-Suche using identities.
#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());
Reference:Use the 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)
Reference:Use the Azure OpenAI Responses API
// This code snippet is currently unavailable.
Verwenden eines Administratorschlüssels für die MCP-Authentifizierung
Ein Administratorschlüssel gewährt vollständigen Lese-/Schreibzugriff auf den Suchdienst. Verwenden Sie ihn also nur in Entwicklungsumgebungen oder wenn ein Bearertoken nicht verfügbar ist. Weitere Informationen finden Sie unter Connect to Azure KI-Suche using API keys.
Tip
Das folgende Beispiel zeigt nur die Kopfzeile, die sich vom Bearertokenbeispiel unterscheidet. Die vollständige Einrichtung finden Sie unter Verwenden eines Bearertokens für die MCP-Authentifizierung.
#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)
);
Reference:Use the 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",
}
]
Reference:Use the Azure OpenAI Responses API
// This code snippet is currently unavailable.
Überprüfen Sie die MCP-Antwort
Wenn ein MCP-Client knowledge_base_retrieve aufruft, erhält er ein MCP-Toolergebnis anstelle des response-, activity- und references-Envelopes der Retrieve-Aktion. Viele MCP-Clients stellen dieses Tool-Ergebnis unter einem Top-Level-Objekt result bereit, sodass die Nutzdaten, die Sie erwarten sollten, result.content[] sind.
{
"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>\"}]"
}
]
}
}
Wichtige Punkte:
result.content[]enthält die MCP-Toolausgabe, die von der Knowledge Base zurückgegeben wird.result.content[].typeisttext.result.content[].textenthält die abgerufenen Erdungsdaten als JSON-codierte Zeichenfolge.Im Gegensatz zur Abrufaktion gibt die aktuelle MCP-Antwort keine separaten
activityOderreferencesArrays zurück und füllt keineresourceEinträge für den zurückgegebenen Inhalt auf.
Verwandte Inhalte
- Agentisches Abrufen in Azure KI-Suche
- Abfragezeit-ACL- und RBAC-Erzwingung (Vorschau)
- Verwenden Sie einen Blob-Indexer oder eine Wissensquelle, um Metadaten zu RBAC-Bereichen zu erfassen (Vorschau)
- Agentic RAG: Erstellen Sie ein Begründungsabrufmodul mit Azure KI-Suche (YouTube-Video)
- Azure OpenAI-Demo mit agentengesteuerter Abfrage