Eine Wissensdatenbank mithilfe der Abrufaktion oder des MCP-Endpunkts abfragen

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

  • 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.OpenAI Paket: dotnet add package Azure.AI.OpenAI

  • Erforderliches Azure.Search.Documents-Paket:

    • Für 2026-08-01-preview Funktionen das neueste Vorschaupaket: dotnet add package Azure.Search.Documents --prerelease

    • Für 2026-04-01 Features 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 openai Paket: pip install openai

  • Erforderliches azure-search-documents-Paket:

    • Für 2026-08-01-preview Funktionen das neueste Vorschaupaket: pip install --pre azure-search-documents

    • Für 2026-04-01 Features 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ügen Sie für die schlüssellose Authentifizierung ein Microsoft Entra ID-Token in den Authorization Header 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:

  1. resultsProcessing in knowledgeSourceParams in der Abrufanforderung.
  2. resultsProcessing auf der Wissensquelle gespeichert.
  3. rerank wenn 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 rerankerScore aus, 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:

  1. Die Suche ermittelt resultsProcessing aus der Abrufanforderung und dem gespeicherten Wert der Wissensquelle.
  2. Wenn der aufgelöste Wert ist none und die Anforderung enthält rerankerThreshold, gibt Search zurück 400 Bad Request.
  3. Für ein MCP-Servertool wendet Search nach der Validierung der Anfrage den Wert auf Tool-Ebene resultsProcessing an.

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 error das abschließende Ereignis anstelle von references.completed und response.completed. Das Ereignis kann alle Aktivitätsdatensätze enthalten, die abgeschlossen wurden, bevor der Fehler auftrat. Der HTTP-Statuscode bleibt erhalten 200 , 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 fehlenden Accept-Header oder einem Wert wie application/json, */*, text/* oder text/event-stream;q=0 wird die Standard-JSON-Antwort zurückgegeben, wie unter Antwort überprüfen beschrieben. Das Anfordern text/event-stream von einer früheren API-Version gibt zurück 406 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, die x-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

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.type hat einen gültigen Wert: text.

  • content.text ist 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.rerankerBoostedScore nicht.

  • Die maxOutputSizeInTokens Eigenschaft (maxOutputSize in 2026-05-01-preview und höher) für die Abrufanforderung bestimmt die Länge der Zeichenfolge.

    • Ein Dokument, das das maxOutputSizeInTokens Ausgabebudget ü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 Sie maxOutputSizeInTokens. Weitere Informationen finden Sie unter "Leere Antworten".

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

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 knowledgeSourceName In knowledgeSourceParams ist nicht mit der Wissensdatenbank verknüpft, oder es kind stimmt 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. includeReferenceSourceData erfordert beispielsweise includeReferences.
  • retrievalReasoningEffort.kind ist auto, aber die Anforderung verwendet eine API-Version früher als 2026-08-01-preview.
  • Die Anforderung verwendet auto, lowoder medium, aber die Wissensbasis definiert kein Modell.
  • Für Quellenausschluss zur Anforderungszeit (Vorschau) setzt derselbe Eintrag sowohl alwaysQuerySource als auch neverQuerySource auf true; 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 filterAddOn Ausdruck.
  • 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 failOnError Quelle: 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:

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[].type ist text.

  • result.content[].text enthält die abgerufenen Erdungsdaten als JSON-codierte Zeichenfolge.

  • Im Gegensatz zur Abrufaktion gibt die aktuelle MCP-Antwort keine separaten activity Oder references Arrays zurück und füllt keine resource Einträge für den zurückgegebenen Inhalt auf.