Dotazování ve znalostní bázi pomocí akce načítání nebo koncového bodu MCP

Poznámka

Azure AI Vyhledávač je k dispozici prostřednictvím portálu Azure, rozhraní REST API a Sady Azure SDK. Podporuje také Foundry IQ, spravovanou znalostní vrstvu, která transformuje podnikový obsah na opakovaně použitelné znalostní báze s podporou oprávnění pro agenty na portálu Microsoft Foundry.

Důležité

Na funkce, možnosti nebo vlastnosti označené jako (Preview) se nevztahuje smlouva o úrovni služeb, nejsou doporučené pro produkční úlohy a mohou se změnit nebo být omezeny dříve, než budou obecně k dispozici. Podmínky Azure AI Vyhledávač Preview platí pro všechny funkce ve verzi Preview, ať už jsou samostatné nebo součástí obecně dostupné funkce.

V systému pro agentní načítání akce načtení vyvolá paralelní zpracování dotazů ze znalostní báze. Akci načtení můžete použít přímo pomocí rozhraní REST API služby vyhledávání nebo Azure SDK. Každá znalostní báze také zveřejňuje koncový bod PROTOKOLU MCP (Model Context Protocol) pro použití agenty kompatibilními s MCP.

Tento článek vysvětluje, jak volat obě metody načítání s volitelným vynucením oprávnění. Popisuje nejprve akci načtení a koncový bod MCP později, protože výsledek nástroje MCP se v současné době liší od tvaru odpovědi REST a sady SDK.

Pokud chcete nastavit datový tok, který připojuje Azure AI Vyhledávač ke službě agenta Foundry přes MCP, přečtěte si téma Výukový program: Vytvoření komplexního agentického řešení pro vyhledávání.

Podpora využití

portál Azure Portál Microsoft Foundry .NET SDK Python SDK Java SDK JavaScript SDK REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Požadavky

  • Pokud koncový bod MCP voláte prostřednictvím rozhraní API pro odpovědi OpenAI Azure, potřebujete:

    • Nasazený model LLM a role uživatele OpenAI ve službě Cognitive Services (nebo klíč rozhraní API) pro prostředek Foundry. V případě potřeby můžete znovu použít LLM a prostředek zadaný ve znalostní bázi.

    • Balíček Azure.AI.OpenAI : dotnet add package Azure.AI.OpenAI

  • Požadovaný balíček Azure.Search.Documents:

    • Pro funkce 2026-08-01-preview je k dispozici nejnovější balíček Preview: dotnet add package Azure.Search.Documents --prerelease

    • Pro funkce 2026-04-01: nejnovější stabilní balíček: dotnet add package Azure.Search.Documents

  • Balíček Azure.Identity pro bezklíčové ověřování: dotnet add package Azure.Identity

  • Pokud koncový bod MCP voláte prostřednictvím rozhraní API pro odpovědi OpenAI Azure, potřebujete:

    • Nasazený model LLM a role uživatele OpenAI ve službě Cognitive Services (nebo klíč rozhraní API) pro prostředek Foundry. V případě potřeby můžete znovu použít LLM a prostředek zadaný ve znalostní bázi.

    • Balíček openai : pip install openai

  • Požadovaný balíček azure-search-documents:

    • Pro funkce 2026-08-01-preview je k dispozici nejnovější balíček Preview: pip install --pre azure-search-documents

    • Pro funkce 2026-04-01: nejnovější stabilní balíček: pip install azure-search-documents

  • Balíček azure-identity pro bezklíčové ověřování: pip install azure-identity

  • Požadovaná verze rozhraní REST API vyhledávací služby:

  • Pro bezklíčové ověřování uveďte v Authorization hlavičce každého požadavku HTTP token Microsoft Entra ID.

Limitations

U zdrojů znalostí pro vyhledávací index operace načítání při povolení změny pořadí výsledků používá sémantickou konfiguraci zdroje znalostí. Nepoužije profily vyhodnocování podkladového indexu, včetně defaultScoringProfile. Odpovědi na načtení také nezobrazují @search.rerankerBoostedScore.

Spustit akci načtení

Určíte akci načtení ve znalostní bázi. Text požadavku obsahuje vstup dotazu a volitelný seznam zdrojů znalostí, na které se má zaměřit.

Verze rozhraní API 2026-04-01 podporuje pouze vstup intents a minimální extraktivní vyhledávání. Funkce dostupné pouze ve verzi Preview, včetně vstupu dat messages, plánování dotazů, syntézy odpovědí a konfigurovatelného úsilí o odůvodnění, nejsou podporovány. Použijte 2026-08-01-preview pro plnou funkčnost.

using Azure.Identity;
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Create knowledge base retrieval client
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<search-endpoint>"),
    knowledgeBaseName: "<knowledge-base-name>",
    credential: new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You can answer questions about the Earth at night. "
                + "Sources have a JSON format with a ref_id that must be cited in the answer. "
                + "If you do not have the answer, respond with 'I do not know'."
            )
        }
    ) { Role = "assistant" }
);
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "Why is the Phoenix nighttime street grid so sharply visible from space, "
                + "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
            )
        }
    ) { Role = "user" }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

# Create knowledge base retrieval client
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You can answer questions about the Earth at night. "
                    "Sources have a JSON format with a ref_id that must be cited in the answer. "
                    "If you do not have the answer, respond with 'I do not know'."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Why is the Phoenix nighttime street grid so sharply visible from space, "
                    "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="earth-at-night-blob-ks",
        )
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

@search-endpoint = <search-endpoint> // Example: https://my-service.search.windows.net
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You can answer questions about the Earth at night. Sources have a JSON format with a ref_id that must be cited in the answer. If you do not have the answer, respond with 'I do not know'."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Why is the Phoenix nighttime street grid so sharply visible from space, whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "earth-at-night-blob-ks",
            "kind": "searchIndex"
        }
    ]
}

Reference:Získávání znalostí – Získávání

Poskytnutí obrázků pro syntézu odpovědí (náhled)

U zdrojů znalostí blob, indexovaný OneLake a indexovaný SharePoint, které nakonfigurujete s úložištěm prostředků, můžete navazujícímu modelu pro syntézu odpovědí předat obrázky vložené v dokumentech spolu s textem. Nastavte enableImageServing u odpovídající položky v knowledgeSourceParams, aby se přepsalo výchozí nastavení definované v definici znalostní báze. Odpověď na dotazování neobsahuje vyhrazená pole pro jednotlivé cesty k obrázkům ani bajtová data obrázků poskytnutá modelu.

Zobrazování obrázků funguje pouze tehdy, když je outputModeanswerSynthesis, a není podporováno pro zdroje znalostí, které mají nakonfigurováno ingestionPermissionOptions. Postup nastavení, tabulku priorit a informace o tom, jak zkontrolovat statistiky poskytování obrázků, najdete v článku Zobrazení obrázků vložených v dokumentech v agentic retrieval (Preview).

Zakázat přeřazování pro zdroj znalostí (verze Preview)

Od verze rozhraní API 2026-08-01-preview nastavte u položky knowledgeSourceParams parametr "resultsProcessing": "none", aby se pro konkrétní zdroj znalostí obešla změna pořadí a zachovalo se jeho původní pořadí výsledků. resultsProcessing můžete také uložit na zdroji znalostí jako výchozí hodnotu. Tuto vlastnost podporují všechny druhy zdrojů znalostí.

Následující příklad vynechává přeřazení pro product-catalog-ks u jednoho požadavku na načtení.

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:Získávání znalostí – Získávání

Nastavte "resultsProcessing": "rerank", nebo jej vynechte, pokud neexistuje žádná uložená výchozí hodnota, aby se použila pipeline pro opětovné řazení. Azure AI Vyhledávač vyřeší efektivní hodnotu pro každý zdroj v tomto pořadí:

  1. resultsProcessing v knowledgeSourceParams v požadavku na načtení.
  2. resultsProcessing uložené ve zdroji znalostí.
  3. rerank když není přítomna ani jedna z vlastností.

Pro zdroj resultsProcessingznalostí serveru MCP má hodnota nastavená na jednotlivém nástroji přednost před požadavkem a uloženými hodnotami.

Tip

resultsProcessing mění způsob zpracování výsledků, nikoli to, na které zdroje se dotazuje. Nastavte alwaysQuerySource na true, je-li nutné dotázat se zdroje znalostí.

Pokud je noneefektivní hodnota:

  • Odkazy ze zdroje znalostí vynechávají rerankerScorea výsledky udržují jejich základní pořadí v rámci aktivity načítání zdroje.
  • Když některý zdroj obejde reranking, Azure AI Vyhledávač rozdělí konečné výsledky mezi aktivity metodou round-robin podle pořadí deklarace zdrojů znalostí. Přeřazené aktivity zůstávají seřazené podle skóre.
  • Deduplikace a omezení pro jednotlivé zdroje, dokumenty a tokeny stále platí, takže se v odpovědi neobjeví každý nalezený výsledek.

Azure AI Vyhledávač ověří rerankerThreshold v tomto pořadí:

  1. Vyhledávání určí resultsProcessing z požadavku na načtení a z uložené hodnoty zdroje znalostí.
  2. Pokud je výsledná hodnota none a požadavek obsahuje rerankerThreshold, Search vrátí 400 Bad Request.
  3. V případě nástroje serveru MCP použije Search po ověření požadavku hodnotu resultsProcessing na úrovni nástroje.

V důsledku toho se nastavení nástroje MCP nezmění, jestli požadavek projde ověřením. Hodnota none na úrovni nástroje nezpůsobí chybu prahové meze a hodnota rerank na úrovni nástroje nezabrání chybě, když se požadavek nebo uložená hodnota vyhodnotí na none.

Pokud chcete ověřit, který režim se spustil, zkontrolujte, jestli odkazy zdroje znalostí obsahují rerankerScore. Nespoléhejte na semanticConfigurationName, protože může být null místo toho, aby bylo vynecháno.

Chování indexu vyhledávání

Pro zdroje znalostí, které cílí na index vyhledávání, je semanticimplicitní typ dotazu a neexistuje žádný režim vyhledávání. Při rerankingu se ke spouštění dotazu používá semanticConfigurationName. Jiná nastavení zdroje, včetně searchFields a sourceDataFields, platí v obou režimech.

Agentní vyhledávání nepřijímá vstupy scoringProfile ani scoringParameters. Potřebujete-li u indexovaných zdrojů znalostí upřednostnit novější obsah, použijte místo profilu hodnocení indexu vyhledávání zohledňující aktuálnost (Preview).

Pokud index obsahuje vektorová pole, potřebujete platnou definici vektorizátoru, aby modul načítání agentů mohl vektorizovat vstupy dotazu. V opačném případě se pole vektoru ignorují.

Další informace viz Vytvoření indexu pro agentické vyhledávání.

Načtení výsledků streamu (Preview)

Od verze 2026-08-01-preview rozhraní API můžete výsledky přijímat jako proud událostí odesílaných serverem (SSE) namísto čekání na jednu odpověď ve formátu JSON. Pomocí streamování může váš klient zobrazit plánování dotazů, zdrojovou aktivitu a syntetizovanou odpověď nebo extrahovanou odpověď v daném pořadí, jakmile bude každá část dostupná.

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}");
}

Referenční informace: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}")

Referenční informace:KnowledgeBaseRetrievalClient

Pokud se chcete přihlásit ke streamování, zahrňte hlavičku Accept: text/event-stream do žádosti o načtení. Bez této hlavičky vrátí akce načtení standardní odpověď JSON.

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Accept: text/event-stream
Authorization: Bearer {{search-access-token}}

{
    "intents": [
        {
            "type": "semantic",
            "search": "What is the return policy?"
        }
    ],
    "outputMode": "extractiveData",
    "retrievalReasoningEffort": {
        "kind": "minimal"
    },
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "{{knowledge-source-name}}",
            "kind": "searchIndex",
            "resultsProcessing": "none",
            "includeReferences": true
        }
    ]
}

Reference:Získávání znalostí – Získávání

Životní cyklus události

Místo vrácení jedné odpovědi služba udržuje jedno připojení HTTP otevřené (typ text/event-stream; charset=utf-8obsahu) a odesílá posloupnost událostí, jakmile budou data k dispozici. Každá událost má event: řádek, který pojmenuje typ události, data: řádek s hodnotou JSON a prázdný řádek, který označuje konec události.

Úspěšný datový proud používá následující životní cyklus:

Událost Kdy se odešle Co obsahuje
retrieval.started První událost u každého streamovaného požadavku. ID požadavku, název znalostní báze, výstupní režim a skutečně použitá úroveň úsilí při odvozování poté, co služba určí výchozí hodnoty požadavku a znalostní báze. Pokud je účinný autokind, událost hlásí auto; nepředpovídá pozdější eskalaci.
activity.started Když služba zahájí plánování dotazů, zdrojovou nebo modelovou aktivitu. Než se dokončí předchozí aktivita, může začít více aktivit. Aktivita id, typečas zahájení a volitelný název zdroje znalostí.
activity.completed Po dokončení této aktivity. Přiřaďte ji k odpovídající události activity.started porovnáním id. Záznam dokončené aktivity.
answer.completed Jednou, pouze pokud outputMode je answerSynthesis. messageIndex identifikuje pozici zprávy v konečném poli odpovědi a message obsahuje úplnou syntetizovanou odpověď. Neexistuje žádná událost delta po jednotlivých tokenech.
references.completed Po vyřešení všech odkazů. Data události tvoří celé pole references bez obalujícího objektu.
response.completed Koncová událost pro úspěšný nebo částečně úspěšný proud. 200 nebo 206 stavový kód a celý text odpovědi načíst, který má stejný tvar jako volání JSON bez streamování. Informace o tom, co jednotlivé stavové kódy znamenají, najdete v tématu Řešení potíží s akcí načtení.
error Místo references.completed a response.completed, když se načítání po otevření datového proudu nezdaří. Chyba a všechny záznamy aktivit, které se dokončily před selháním.

Události přicházejí v pořadí. Každá událost activity.started předchází události activity.completed se stejným id, ale aktivity se mohou prolínat. Záznamy o dokončených aktivitách také zahrnují časová razítka startedAt a completedAt. Když je stream nečinný, server odesílá komentář : heartbeat přibližně každých 15 sekund, aby připojení zůstalo otevřené. Klienti SSE můžou tyto komentáře ignorovat.

Následující příklad ukazuje streamovanou odpověď s zkrácenými datovými částmi pro čitelnost.

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":{}}

Zpracování chyb, zrušení a záložních řešení

  • Předletová selhání: Pokud ověření požadavku selže před otevřením datového proudu, například pro poškozený text požadavku, vrátí akce načtení standardní chybovou odpověď JSON a stream se nikdy neotevře.

  • Selhání během streamování: Pokud načítání selže po otevření datového proudu, ukončovací událostí je error namísto references.completed a response.completed. Událost může obsahovat všechny záznamy aktivit, které se dokončily před selháním. Stavový kód HTTP zůstane 200 po spuštění datového proudu, takže zkontrolujte událost terminálu, nikoli stavový kód HTTP, a zjistěte úspěch.

  • Zrušení nebo odpojení: Pokud klient zruší požadavek nebo se odpojí před dokončením datového proudu, služba zruší načtení a ukončí stream bez události terminálu. Události přijaté před zrušením nebo odpojením považujte za neúplné.

  • Záložní formát JSON: Při použití 2026-08-01-preview se při chybějící hlavičce Accept nebo při hodnotě, jako je application/json, */*, text/* nebo text/event-stream;q=0, vrátí standardní odpověď JSON popsaná v části Kontrola odpovědi. Požadavek text/event-stream ze starší verze rozhraní API vrátí 406 Not Acceptable.

Filtrování zdrojů znalostí indexu vyhledávání v době dotazu

Při načítání ze zdroje znalostí indexu vyhledávání můžete použít filtr OData v době dotazu, abyste výsledky zúžili na konkrétní dokumenty nebo pole. Výraz filtru používá syntaxi OData a předává se prostřednictvím parametru filterAddOn .

Syntaxe filtru a příklady

Parametr filterAddOn přijímá výrazy filtru OData. Mezi příklady vzorů patří:

  • Pole metadat: city eq 'Phoenix', status eq 'active'
  • Rozsahy dat: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Číselné rozsahy: price ge 100 and price le 5000
  • Porovnávání textu: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Logické operátory: (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'"
        }
    ]
}

Příklad s více filtry

Pokud chcete výsledky dále upřesnit, můžete zkombinovat více filtrů.

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"
}

Přepsat uložené nápovědy dotazu při spuštění dotazu (verze Preview)

Počínaje verzí rozhraní API 2026-08-01-preview můžete pro jednotlivý požadavek na načtení přepsat parametry dotazu uložené ve zdroji znalostí vyhledávacího indexu nastavením queryHintOverrides u jeho položky knowledgeSourceParams.

Přepsání nahrazuje celý uložený queryHints objekt místo sloučení položky po položce, proto zahrňte všechny rady, které chcete použít. Vynechte queryHintOverrides, chcete-li použít uložené nápovědy.

Pokud míra uvažování při načítání není minimal, odpověď HTTP 400 závisí na uložených nápovědách filtru, nikoli na obsahu přepsání ani na typu posílení. Služba před použitím queryHintOverrides ověří uložené nápovědy filtru podle modelu znalostní báze. Proto model rodiny GPT-4o nebo GPT-4.1 požadavek odmítne, i když je přepsání prázdné nebo obsahuje pouze zvýšení. Samotné uložené zvýšení neaktivují toto ověření. Použijte kompatibilní model nebo nejprve odeberte uložené parametry filtru.

Následující příklad nahradí všechny uložené nápovědy jedním navýšením fieldValue pro japonský obsah. Služba na tuto žádost nepoužije žádný uložený filtr ani jiné uložené zvýšení.

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:Získávání znalostí – Získávání

Pokud chcete potvrdit, že služba použila vámi zadané přepsání, nastavte includeActivity v požadavku a zkontrolujte vrácenou aktivitu searchIndex. Jeho queryHintProcessing objekt hlásí, co model vygeneroval. Tento příklad obsahuje generatedBoost pro jazykové navýšení, ale ne generatedFilter, protože přepsání nahradilo uloženou nápovědu k filtru. Vzhledem k tomu, že nápovědy k dotazům jsou co nejlepší, zacházejte s touto aktivitou jako s potvrzením a nekontrolujte přesný výraz.

{
  "type": "searchIndex",
  "queryHintProcessing": {
    "generatedBoost": "language:(ja\\-JP)^2"
  },
  "searchIndexArguments": {
    "queryType": "full"
  }
}

Informace o uložené definici, podporovaných typech nápovědy a složení s deterministickými filtry najdete v tématu Konfigurace tipů pro dotazy (Preview).

Vynucení oprávnění v době dotazu (Preview)

Změny přístupových oprávnění, které nastavíte mimo 2026-08-01-preview, se mohou ve výsledcích načítání v 2026-08-01-preview projevit až po určité době.

Pokud zdroje znalostí obsahují obsah chráněný oprávněním, předejte identitu koncového uživatele v žádosti o načtení, aby každý uživatel viděl pouze obsah, ke kterému má oprávnění k přístupu. U indexovaných zdrojů modul pro načítání používá tuto identitu k filtrování výsledků a vrací nefiltrované výsledky, pokud je vynechána. Vzdálené zdroje také používají autorizaci z požadavku na načtení, ale oprávnění vynucují na straně zdroje a mohou vyžadovat token a hlavičku specifické pro daný zdroj.

Vynucení oprávnění má dvě části:

  • Čas příjmu: Pouze pro indexované zdroje znalostí nastavte ingestionPermissionOptions pro příjem metadat oprávnění společně s obsahem.

  • Čas dotazu: Předejte autorizaci uživatele v hlavičce vyžadované zdrojem znalostí. Většina zdrojů používá x-ms-query-source-authorization. Výjimkou je Work IQ, který používá x-ms-query-work-iq-source-authorization.

Konfigurace okamžiku načítání

Následující tabulka ukazuje, které zdroje znalostí vyžadují konfiguraci času příjmu dat a jak každý zdroj vynucuje oprávnění.

Zdroj znalostí Vyžaduje ingestionPermissionOptions Jak se vynucují oprávnění
Blob nebo ADLS Gen2 ✅ Načtené rozsahy oprávnění RBAC, seznamy ACL nebo Microsoft Purview porovnané s identitou uživatele.
OneLake ✅ Načtený dokument: popisky citlivosti Microsoft Purview porovnány s identitou uživatele.
Indexovaný SharePoint ✅ Importované seznamy ACL služby SharePoint nebo popisky citlivosti Microsoft Purview porovnané s identitou uživatele.
Vzdálený SharePoint ❌ Copilot dotazy rozhraní API pro načítání SharePoint přímo pomocí tokenu uživatele.
datový agent Fabric ❌ Modul pro načítání vymění token uživatele za token s rozsahem pro Microsoft Fabric a jeho jménem dotazuje datového agenta.
Fabric Ontologie ❌ Modul pro vyhledávání vymění token uživatele za token s rozsahem pro Microsoft Fabric a jménem uživatele odešle dotaz na položku ontologie.
IQ práce ❌ Modul pro načítání vymění z x-ms-query-work-iq-source-authorization uživatelské tvrzení pro publikum aplikace za token s rozsahem Work IQ.

Pokud při vytváření indexovaného zdroje znalostí nenakonfigurujete ingestionPermissionOptions , index neobsahuje metadata oprávnění. Systém vrátí nefiltrované výsledky bez ohledu na záhlaví. Chcete-li tento problém vyřešit, vytvořte znovu zdroj znalostí s příslušnými ingestionPermissionOptions hodnotami.

Autorizace při zpracování dotazu

U zdrojů znalostí, které nejsou Work IQ, předejte identitu koncového uživatele tak, že do požadavku na načtení zahrnete přístupový token s rozsahem pro https://search.azure.com/.default. Tento token je oddělený od přihlašovacích údajů služby používaných pro přístup k vyhledávací službě. Nepotřebuje oprávnění vyhledávací služby a představuje pouze uživatele, jehož přístup k obsahu se vyhodnocuje. Další informace najdete v tématu ACL během dotazu a vynucení RBAC.

V případě zdrojů znalostí IQ pro práci se tato část nevztahuje. Použijte tok deklarace uživatele specifický pro Work IQ popsaný v části Vynucení oprávnění při dotazu.

V .NET SDK předejte token jako parametr querySourceAuthorization pro RetrieveAsync:

using Azure;
using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Service credential: Authenticates to the search service
var serviceCredential = new DefaultAzureCredential();

// User identity token: Represents the end user for document-level permissions filtering
var userTokenContext = new Azure.Core.TokenRequestContext(
    new[] { "https://search.azure.com/.default" }
);
string userToken = (await serviceCredential.GetTokenAsync(userTokenContext)).Token;

// Create the retrieval client with the service credential
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<search-endpoint>"),
    knowledgeBaseName: "<knowledge-base-name>",
    credential: serviceCredential
);

var request = new KnowledgeBaseRetrievalRequest();
request.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What companies are in the financial sector?")
        }
    ) { Role = "user" }
);

// Pass the user identity token for permissions filtering
var result = await kbClient.RetrieveAsync(
    request, querySourceAuthorization: userToken);

var text = (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text;
Console.WriteLine(text);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

V Python SDK předejte token jako parametr query_source_authorization v retrieve:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage, KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
)

# Service credential: Authenticates to the search service
service_credential = DefaultAzureCredential()

# User identity token: Represents the end user for document-level permissions filtering
user_token_provider = get_bearer_token_provider(
    service_credential, "https://search.azure.com/.default")
user_token = user_token_provider()

# Create the retrieval client with the service credential
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=service_credential,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(
                text="What companies are in the financial sector?")],
        )
    ]
)

# Pass the user identity token for permissions filtering
result = kb_client.retrieve(
    retrieval_request=request, query_source_authorization=user_token)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

V rozhraní REST API zahrňte hlavičku x-ms-query-source-authorization s přístupovým tokenem uživatele:

@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:Získávání znalostí – Získávání

Kontrola odpovědi

Akce načtení vrátí tři hlavní komponenty:

Extrahovaná odpověď

Extrahovaná odpověď je jeden sjednocený řetězec, který obvykle předáváte do LLM. LLM využívá řetězec jako základní data a používá ho k formulování odpovědi. Vaše volání na rozhraní API pro LLM zahrnuje jednotný řetězec a pokyny pro model, jako je například použití základních informací výhradně nebo jako doplněk.

Text odpovědi je strukturovaný ve formátu stylu zprávy chatu a obsah se serializuje ve formátu JSON.

"response": [
    {
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
            }
        ]
    }
]

Klíčové body:

  • content.type má jednu platnou hodnotu: text.

  • content.text je řetězec kódovaný ve formátu JSON obsahující nejrelevavantnější dokumenty (nebo bloky dat) nalezené v indexu vyhledávání s ohledem na vstupy historie dotazů a chatu. Tento řetězec představuje základní data, která LLM používá k formulování odpovědi na otázku uživatele.

    • Tato část odpovědi se skládá z 200 bloků dat nebo menšího počtu, s výjimkou výsledků, které nesplňují minimální prahovou hodnotu skóre rerankeru 2,5.

    • Řetězec začíná referenčním ID bloku (používá se pro účely citace) a všechna pole zadaná v sémantické konfiguraci cílového indexu. V tomto příkladu předpokládejme, že sémantická konfigurace v cílovém indexu má pole "title", pole "terms" a pole "content".

  • Odpovědi při načtení neobsahují @search.rerankerBoostedScore.

  • Vlastnost maxOutputSizeInTokens (maxOutputSize v 2026-05-01-preview a novějších verzích) v žádosti o načtení určuje délku řetězce.

    • Dokument, který překračuje rozpočet výstupu maxOutputSizeInTokens , lze z odpovědi vynechat. Pole aktivit obsahuje upozornění, když nejrelevavantnější dokument překročí maximální velikost výstupu. Chcete-li zachovat více obsahu, zvyšte maxOutputSizeInTokens. Další informace najdete v tématu Prázdné odpovědi.

Seznam aktivit

Pole aktivit vypíše plán dotazu, který poskytuje provozní transparentnost pro sledování operací, fakturačních dopadů a vyvolání prostředků. To také zahrnuje vnořené dotazy odeslané do procesu načítání. 206 Partial Content Pro odpověď pole obsahuje chyby pro neúspěšné zdroje znalostí. Odpověď 502 Bad Gateway může obsahovat podrobnosti o selhání pouze v chybě nejvyšší úrovně.

Pole aktivit zahrnuje následující komponenty:

Oddíl Popis
Aktivita specifická pro zdroj Pro každý zdroj znalostí zahrnutý v dotazu tato část hlásí uplynulý čas a argumenty, které byly použity v dotazu, včetně sémantického rankeru. Mezi typy zdrojů znalostí patří searchIndex, azureBloba další podporované zdroje znalostí.
agenticReasoning Tato část uvádí spotřebu tokenů pro agentické uvažování během vyhledávání, která závisí na zadané míře uvažování při vyhledávání (Preview).
modelQueryPlanning Pro znalostní báze, které k plánování dotazů používají LLM, tato část hlásí počet tokenů používaných pro vstup a počet tokenů pro poddotazy. Zahrnuje pole model s polem modelName, které obsahuje veřejný název modelu, nikoli název nasazení modelu, který aktivitu provedl.
modelAnswerSynthesis V případě znalostních bází, které používají syntézu odpovědí (Preview), tato část hlásí počet tokenů pro formulaci odpovědi a počet tokenů výstupu odpovědi. Zahrnuje pole model s polem modelName, které obsahuje veřejný název modelu, nikoli název nasazení modelu, který aktivitu provedl.
modelWebSummarization V případě znalostních bází, které používají sumarizaci webu, tato část hlásí spotřebu tokenů pro sumarizaci webových výsledků. Zahrnuje pole model s polem modelName, které obsahuje veřejný název modelu, nikoli název nasazení modelu, který aktivitu provedl.
model V případě záznamů aktivit založených na modelu tato část identifikuje model použitý k provedení aktivity. Tato část se zobrazí pouze tehdy, když nastavíte includeActivity na true.
imageServing Pro zdroje znalostí, které mají povolené zobrazování obrázků (Preview), tato část uvádí imagesRetrieved, totalImageSizeBytes, imagesSentToModel a to, zda byla při indexování zapnutá možnost verbalizationUsed. Kontrolovat verbalizationUsed a imagesSentToModel nezávisle na sobě. Odpověď může uvádět verbalizationUsed jako true a přesto odesílat obrázky do následného modelu. Pokud chcete zjistit počet vynechaných obrázků, odečtěte imagesSentToModel od imagesRetrieved.

Následující příklad ukazuje pole aktivity.

  "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
    }
  ]

Pole odkazů

Pole odkazů pochází přímo ze základních podkladových dat. Zahrnuje sourceData používanou k generování odpovědi a skládá se z každého dokumentu, který agentický vyhledávací modul najde a sémanticky řadí.

Pole odkazů obsahuje následující komponenty:

Pole Popis
type Typ zdroje znalostí, který vytvořil odkaz, například searchIndex.
id Referenční ID položky v rámci odpovědi. Není to klíč dokumentu v indexu vyhledávání. Slouží k poskytování citací.
activitySource Odkazuje na položku aktivity id, která tento odkaz vytvořila, což je užitečné pro propojování citací.
docKey Pro indexovanou referenci klíč dokumentu v podkladovém vyhledávacím indexu.
sourceData Podkladová data používaná k vygenerování odpovědi. U indexovaného odkazu můžou pole obsahovat id sémantická pole, například title, termsa content. Tvar se liší podle typu odkazu.
citationUrl (náhled) Adresa URL generovaná službou a určená jen pro čtení, která odkazuje na dokument reference v podkladovém indexu. Vráceno pouze pro indexované zdroje znalostí. Pokud chcete postupovat podle adresy URL, přečtěte si téma Vyhledání dokumentů s adresami URL citace (Preview).

Následující příklad ukazuje pole odkazů.

  "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
    }
  ]

Vyhledejte dokumenty pomocí adres URL citací (verze Preview)

Od verze rozhraní API 2026-08-01-preview může odkaz z indexovaného zdroje znalostí v odpovědi na načtení obsahovat citationUrl. Pomocí této adresy URL můžete načíst indexovaná pole pro tento odkaz, například title a content, abyste mohli vykreslit náhled citace zobrazující, odkud pochází odpověď bez otevření původního zdrojového dokumentu. citationUrl je autentizované vyhledávání v podkladovém indexu, oddělené od zdrojových docUrl a blobUrl.

Následující příklad ukazuje sanitizovanou adresu URL citace.

"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"

Vybraná pole a jejich pořadí závisí na indexovaném zdroji a konfiguraci načítání.

Důležité

Použijte úplnou adresu URL z odpovědi beze změny a zobrazte vrácená pole JSON ve své aplikaci. Nevykonstruujte, parsujte ani normalizujte adresu URL.

Po zadání adresy URL citace získají následující příklady přístupový token pro vyhledávací službu. Volají adresu URL s tímto tokenem v hlavičce Authorization . Přihlášená identita musí mít roli Čtenář dat indexu vyhledávání.

Azure AI Vyhledávač metody vyhledávání dokumentů sady SDK vyžadují koncový bod, název indexu, klíč dokumentu, vybraná pole a verzi rozhraní API jako samostatné vstupy. Nepřijímají absolutní adresu URL citace. Tyto příklady používají ověřenou adresu HTTP GET k zachování úplné adresy URL generované službou.

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}}

Reference:Dokumenty – získání

Vyhledávání dokumentu vrátí vybraná pole indexu ve formátu JSON:

{
  "id": "policy=aug-2026",
  "title": "Escaped citation key",
  "content": "Citation interoperability uses an escaped document key for the August preview.",
  "category": "release",
  "language": "en-US"
}

Při používání adresy URL citace mějte na paměti následující skutečnosti:

  • Než vykreslíte citaci, zkontrolujte přítomnost citationUrl. Může chybět, pokud odpověď neobsahuje odkazy nebo služba nedokáže určit podkladový index či klíč dokumentu.

  • Pokud požadavek na načtení obsahuje x-ms-query-source-authorization pro řízení přístupu na úrovni dokumentu, použijte při otevření dané adresy URL stejný uživatelský token.

  • Adresa URL zůstane platná jenom v době, kdy záložní index a klíč dokumentu zůstanou beze změny.

Zkontrolovat metadata štítků citlivosti v odpovědi (Preview)

Stejné časové chování popsané v Vynucení oprávnění při dotazu platí i zde: změny přístupových oprávnění, které nastavíte mimo 2026-08-01-preview, se mohou v odpovědích na načtení v 2026-08-01-preview projevit až po určité době.

Při dotazování na znalostní bázi, která zpracovává popisky citlivosti Microsoft Purview, obsahuje odpověď při načtení metadata popisků na dvou úrovních:

Umístění Pole Popis
Viz odkaz sensitivityLabelInfo Popisek citlivosti použitý u každého dokumentu vráceného v poli references.
Response metadata.responseSensitivityLabelInfo Souhrnný popisek, který představuje popisek citlivosti s nejvyšší prioritou napříč všemi dokumenty odkazovanými v odpovědi. Užitečné pro bannery zobrazované na straně klienta a vynucování zásad.

Microsoft Graph vypočítá popisek na úrovni odpovědi z popisků jednotlivých odkazů pomocí pravidel dědičnosti popisků Microsoft Purview. Obvykle platí nejpřísnější štítek.

Následující příklad ukazuje odpověď na operaci retrieve se dvěma odkazovanými dokumenty (jeden Confidential, jeden Internal) a výsledný štítek na úrovni odpovědi.

{
  "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
    }
  }
}

Referenční typy, které zobrazují štítky citlivosti

Název pole a dostupnost metadat popisků závisí na typu zdroje znalostí, který vytvořil každý odkaz.

Odkaz type Pole pro popisek K dispozici, když...
azureBlob sensitivityLabelInfo Zdroj znalostí blobu zahrnuje sensitivityLabel v ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo Zdroj znalostí OneLake obsahuje sensitivityLabel v ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo Zdroj znalostí indexovaný v SharePointu zahrnuje sensitivityLabel v rámci ingestionPermissionOptions.
searchIndex sensitivityLabelInfo Podkladový index má purviewEnabled nastaveno na true a pole označené sensitivityLabel: true.

Zobrazení a auditování doporučení

  • Pomocí sensitivityLabelInfo.labelId vyhledejte úplnou definici popisku prostřednictvím rozhraní API popisků citlivosti Microsoft Graph, pokud potřebujete další vlastnosti, jako jsou například ovládací prvky zásad nebo oprávnění.

  • Pomocí metadata.responseSensitivityLabelInfo můžete zobrazit banner citlivosti pro celou odpověď nebo uplatnit zásady, například zakázat kopírování a sdílení, v celé odpovědi.

  • Pokud váš zdroj znalostí odkazuje na index rozdělený na bloky, například index naplněný pomocí integrované vektorizace nebo vlastní dovednosti Text Split, ujistěte se, že sada dovedností promítne popisek citlivosti do každého řádku bloku. Bez tohoto mapování se odkazy na úrovni bloků dat v době dotazu nefiltrují správně.

  • Auditovatelný přístup správců k označenému obsahu najdete v článku Rozšířené oprávnění ke čtení pro správní šetření.

Chování serveru MCP

Koncový bod MCP vystavený jednotlivými znalostními bázemi zobrazí stejná pole popisků citlivosti jako rozhraní REST API. Když klient kompatibilní s MCP vyvolá nástroj knowledge_base_retrieve, výsledek nástroje obsahuje stejné položky sensitivityLabelInfo pro jednotlivé odkazy a položky metadata.responseSensitivityLabelInfo na úrovni odpovědi, které jsou popsány výše v této části. Klienti MCP vynucují řízení zobrazení a zásad s ohledem na štítky na základě těchto polí.

Načtení příkladů akcí (Preview)

Následující příklady ukazují různé způsoby volání akce načtení pomocí 2026-08-01-preview verze rozhraní API. Tato verze podporuje úplnou sadu funkcí, včetně syntézy odpovědí a konfigurovatelného úsilí o odůvodnění. Použití 2026-04-01 viz v předchozích částech.

Kontrola názvů modelů v protokolech aktivit

Nastavte includeActivity na true, aby se v záznamech aktivit založených na modelu vracela pole identity modelu. Pomocí těchto polí můžete ověřit, který nakonfigurovaný model zpracovával plánování dotazů, syntézu odpovědí nebo shrnutí webu během žádosti o načtení. Následující příklad přepíše uložené zpracování výsledků pro vybraný zdroj na požadavku.

using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var kbClient = new KnowledgeBaseRetrievalClient(
    new Uri("<search-endpoint>"),
    "<knowledge-base-name>",
    new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[]
        {
            new KnowledgeBaseMessageTextContent(
                "Which policy applies to returns?"
            )
        }
    ) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "<knowledge-source-name>"
    )
    {
        ResultsProcessing = KnowledgeSourceResultsProcessing.None
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
foreach (var activity in result.Value.Activity)
{
    KnowledgeBaseActivityRecordModel? model = activity switch
    {
        KnowledgeBaseModelQueryPlanningActivityRecord queryPlanning =>
            queryPlanning.Model,
        KnowledgeBaseModelAnswerSynthesisActivityRecord answerSynthesis =>
            answerSynthesis.Model,
        KnowledgeBaseModelWebSummarizationActivityRecord webSummarization =>
            webSummarization.Model,
        _ => null
    };

    if (model is not null)
    {
        Console.WriteLine(
            $"modelName={model.ModelName}, deploymentId={model.DeploymentId}");
    }
}

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

kb_client = KnowledgeBaseRetrievalClient(
    "<search-endpoint>",
    DefaultAzureCredential(),
    knowledge_base_name="<knowledge-base-name>",
)

model_activity_types = (
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Which policy applies to returns?"
                )
            ],
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="<knowledge-source-name>",
            results_processing="none",
        )
    ],
)

result = kb_client.retrieve(request)
for entry in result.activity or []:
    if isinstance(entry, model_activity_types) and entry.model:
        print(
            "modelName=", entry.model.model_name,
            "deploymentId=", entry.model.deployment_id,
        )

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "Which policy applies to returns?" }
            ]
        }
    ],
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "{{knowledge-source-name}}",
            "kind": "searchIndex",
            "resultsProcessing": "none"
        }
    ]
}

Reference:Získávání znalostí – Získávání

Následující výňatek odpovědi ukazuje identitu vnořeného modelu:

{
  "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
    }
  ]
}

Vyžadovat zdroj znalostí pro úspěšné dokončení

Nastavte failOnError v knowledgeSourceParams, aby byl znalostní zdroj označen jako povinný. Tento parametr použijte, pokud by částečná odpověď byla zavádějící nebo nedodržující předpisy, pokud tento zdroj není k dispozici. Požadavek se vrátí 502 Bad Gateway , pokud požadovaný zdroj selže, i když bude úspěšný jiný zdroj. Pokyny k manipulaci najdete v tématu Řešení potíží s akcí načtení.

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);

Reference: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)

Reference: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:Získávání znalostí – Získávání

Vyloučení zdroje znalostí z požadavku

Počínaje verzí rozhraní API 2026-08-01-preview nastavte neverQuerySource na true pro každý zdroj znalostí, který chcete vyloučit z požadavku na načtení. neverQuerySource v době požadavku má pro daný požadavek přednost před uloženou hodnotou alwaysQuerySource, aniž by se uložená hodnota změnila.

Následující příklad se dotazuje na znalostní bázi, která obsahuje product-docs-ks a troubleshooting-ks, přičemž z požadavku vylučuje troubleshooting-ks.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "Explain the official SSO provisioning steps.")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("product-docs-ks")
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("troubleshooting-ks")
    {
        NeverQuerySource = true
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Reference: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)

Reference: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:Získávání znalostí – Získávání

Ladění kandidátských dokumentů na zdroj znalostí

V maxOutputDocuments nastavte knowledgeSourceParams tak, aby omezovalo počet kandidátních dokumentů, které konkrétní zdroj znalostí dodá před konečným výběrem výsledků. Tento parametr použijte, pokud chcete svázat vstup jednoho zdroje do kanálu, aniž by to ovlivnilo ostatní.

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);

Reference: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)

Reference: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:Získávání znalostí – Získávání

Omezení konečných podkladových dokumentů

Parametr nejvyšší úrovně maxOutputDocuments určuje, kolik podkladových dokumentů se vrátí v konečné odpovědi na načtení. Tento parametr použijte, když vaše aplikace potřebuje předvídatelný počet citací nebo odkazů.

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);

Referenční informace: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)

Referenční informace: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:Získávání znalostí – Získávání

Následující tabulka ukazuje, jak maxOutputDocuments a maxOutputSizeInTokens interagujte ve všech čtyřech kombinacích.

maxOutputDocuments maxOutputSizeInTokens Chování
Nespecifikovaný Nespecifikovaný Používá výchozí chování limitu odpovědi maxOutputSizeInTokens.
Nespecifikovaný Určeno Jakmile je dosaženo limitu velikosti datového obsahu, dokumenty se zahazují.
Určeno Nespecifikovaný Vrátí až zadaný počet podkladových dokumentů a nepoužije maxOutputSizeInTokens limit.
Určeno Určeno Vrátí až maxOutputDocuments dokumentů nebo tolik dokumentů, kolik se jich vejde do maxOutputSizeInTokens, podle toho, který limit nastane dříve.

Ověřit výchozí nastavení načítání znalostní báze

Znalostní báze může ukládat výchozí hodnoty v rámci požadavků .retrieveDefaults Odešlete dva požadavky na načtení pro ověření dědičnosti a přepsání na úrovni konkrétního požadavku.

Než začnete, dokončete konfiguraci výchozích limitů načítání (Preview). První požadavek vynechá všechny tři limity pro celou žádost, takže se použijí uložené hodnoty 45 sekund, osm dokumentů a 12 000 tokenů. Druhý požadavek je přepíše hodnotami 20 sekund, jednoho dokumentu a 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");

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
)

kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="your-knowledge-base",
    credential=DefaultAzureCredential(),
    api_version="2026-08-01-preview",
)


def create_request(**limits):
    return KnowledgeBaseRetrievalRequest(
        intents=[
            KnowledgeRetrievalSemanticIntent(
                search="Summarize the latest support guidance.",
            )
        ],
        **limits,
    )


inherited = kb_client.retrieve(create_request())
print(f"Stored defaults: {len(inherited.references or [])} references")

overridden = kb_client.retrieve(
    create_request(
        max_runtime_in_seconds=20,
        max_output_documents=1,
        max_output_size=5000,
    )
)
print(f"Request overrides: {len(overridden.references or [])} references")

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Nejprve odešlete požadavek, který vynechá tři pole limitu pro celý požadavek.

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."
    }
  ]
}

Dále přepište všechny tři hodnoty v rámci jednoho požadavku.

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:Získávání znalostí – Získávání

Počet odkazů ukazuje, jestli se použije uložená hodnota nebo hodnota na úrovni maxOutputDocuments požadavku: první odpověď obsahuje maximálně osm odkazů a druhá obsahuje maximálně jednu. Odpověď může obsahovat méně odkazů, když se shoduje méně dokumentů. Odpověď nehlásí efektivní rozpočet modulu runtime nebo výstupního tokenu, ale tyto hodnoty stále řídí zpracování požadavků. Přepsání požadavků nemění uložená výchozí nastavení.

Přepsání výchozího úsilí o odůvodnění a nastavení limitů požadavků

Následující příklad určuje syntézu odpovědí, takže úsilí o načtení odůvodnění musí být low nebo medium. Také nastavuje maxRuntimeInSeconds k omezení doby načítání a maxOutputSizeInTokens k omezení velikosti dat odpovědi.

maxRuntimeInSeconds přijímá hodnoty od 10 do 600 sekund a výchozí hodnota je 90 sekund. Maximální hodnota 600 sekund (10 minut) se vztahuje pouze na Azure AI Vyhledávač požadavek na načtení.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort();
retrievalRequest.OutputMode = "answerSynthesis";
retrievalRequest.MaxRuntimeInSeconds = 30;
retrievalRequest.MaxOutputSizeInTokens = 6000;

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import (
    KnowledgeRetrievalLowReasoningEffort,
    KnowledgeRetrievalOutputMode,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    retrieval_reasoning_effort=KnowledgeRetrievalLowReasoningEffort(),
    output_mode=KnowledgeRetrievalOutputMode.ANSWER_SYNTHESIS,
    max_runtime_in_seconds=30,
    max_output_size_in_tokens=6000,
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/kb-override/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "retrievalReasoningEffort": { "kind": "low" },
    "outputMode": "answerSynthesis",
    "maxRuntimeInSeconds": 30,
    "maxOutputSizeInTokens": 6000
}

Reference:Získávání znalostí – Získávání

Nechte službu zvolit míru uvažování.

Nastavte retrievalReasoningEffort.kind na auto v požadavku na načtení, aby se přepsalo výchozí nastavení znalostní báze. Další informace o automatickém uvažování viz Nastavení úrovně úsilí při uvažování pro načítání (Preview).

{
  "retrievalReasoningEffort": {
    "kind": "auto"
  }
}

Reference:Získávání znalostí – Získávání

Nastavení odkazů pro každý zdroj znalostí

Použijte includeReferences a includeReferenceSourceData v knowledgeSourceParams k určení, které zdroje se zobrazí v poli references a kolik dat o zdroji jednotlivé položky obsahují. Následující příklad používá výchozí úsilí o odůvodnění znalostní báze.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-financials-ks")
    {
        IncludeReferences = true,
        IncludeReferenceSourceData = true
    }
);

retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-communicationservices-ks")
    {
        IncludeReferences = false,
        IncludeReferenceSourceData = false
    }
);

retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-healthcare-ks")
    {
        IncludeReferences = true,
        IncludeReferenceSourceData = false,
        AlwaysQuerySource = true
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-financials-ks",
            include_references=True,
            include_reference_source_data=True,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-communicationservices-ks",
            include_references=False,
            include_reference_source_data=False,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-healthcare-ks",
            include_references=True,
            include_reference_source_data=False,
            always_query_source=True,
        ),
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases/kb-medium-example/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "demo-financials-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": true
        },
        {
            "knowledgeSourceName": "demo-communicationservices-ks",
            "kind": "searchIndex",
            "includeReferences": false,
            "includeReferenceSourceData": false
        },
        {
            "knowledgeSourceName": "demo-healthcare-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": false,
            "alwaysQuerySource": true
        }
    ]
}

Reference:Získávání znalostí – Získávání

Používejte minimální úsilí o odůvodnění.

V následujícím příkladu neexistuje žádný LLM pro inteligentní plánování dotazů ani syntézu odpovědí. Řetězec dotazu se odesílá do agentického vyhledávacího enginu pro vyhledávání klíčových slov nebo hybridní vyhledávání.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Intents.Add(
    new KnowledgeRetrievalSemanticIntent("what is a brokerage")
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="what is a brokerage",
        )
    ]
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/kb-minimal/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "intents": [
        {
            "type": "semantic",
            "search": "what is a brokerage"
        }
    ]
}

Reference:Získávání znalostí – Získávání

Řešení potíží s akcí načtení

Stav 2026-08-01-previewodpovědi indikuje, jestli bylo načtení úspěšné, částečně úspěšné nebo neúspěšné a co dělat dál. Následující tabulka slouží k namapování jednotlivých stavů na jejich význam a následným zobrazením odpovídající části s pokyny k řešení potíží.

Stav Význam
200 OK Načtení proběhlo úspěšně. Dokument může být i nadále vynechán, pokud jeho obsah překročí rozpočet výstupu. Další informace najdete v tématu Prázdné odpovědi.
400 Bad Request Požadavek na načtení neprošel ověřením ještě před zahájením načítání.
206 Partial Content Alespoň jeden zdroj byl úspěšný a nebyl označen failOnErroržádný neúspěšný zdroj . Odpověď obsahuje výsledky ze zdrojů, které byly úspěšné.
502 Bad Gateway Každý vybraný zdroj selhal nebo selhal zdroj označený značkou failOnError: true.

U jakékoli odpovědi jiné než 200 zaznamenejte verzi rozhraní API, časové razítko, očištěné tělo požadavku, hlavičky odpovědi a ID požadavku nebo korelační ID. Tyto podrobnosti vám pomůžou diagnostikovat selhání a v případě potřeby sdílet problém s podporou.

400 Bad Request

Pomocí chyby nejvyšší úrovně identifikujte neplatnou vlastnost požadavku. Mezi běžné příčiny patří:

  • Objekt knowledgeSourceName in knowledgeSourceParams není připojený ke znalostní bázi nebo kind neodpovídá připojenému zdroji.
  • Hodnota požadavku je mimo její podporovaný rozsah nebo jedna možnost vyžaduje jinou možnost, která není povolená. Například includeReferenceSourceData vyžaduje includeReferences.
  • retrievalReasoningEffort.kind je auto, ale požadavek používá verzi rozhraní API starší než 2026-08-01-preview.
  • Požadavek používá auto, lownebo medium, ale znalostní báze nedefinuje model.
  • Pro vyloučení zdroje v době požadavku (Preview) stejná položka nastaví jak alwaysQuerySource, tak neverQuerySource na true, jinak se vyloučí všechny připojené zdroje znalostí.

Před opakováním požadavku opravte vlastnost identifikovanou chybou nejvyšší úrovně.

206 Partial Content

Zkontrolujte každou položku activity, která obsahuje error. Aktivita načítání zdroje identifikuje neúspěšný zdroj znalostí a aktivita modelu identifikuje neúspěšnou fázi zpracování. Text odpovědi stále obsahuje výsledky, které byly úspěšné.

Mezi běžné příčiny chyb aktivity načítání zdroje patří:

  • Neplatný vstup při zpracování dotazu, například chybně vytvořený výraz filterAddOn.
  • Posun konfigurace zdroje znalostí nebo indexu, například přejmenované pole, chybějící sémantická konfigurace nebo neplatný vektorizátor.
  • Chybějící nebo neplatné oprávnění pro závislosti nebo nedostatečná oprávnění pro identitu používanou k dotazování na zdroj.
  • Omezování závislostí, vypršení časového limitu nebo přechodné selhání dostupnosti

V případě chyby aktivity modelu použijte aktivitu type k identifikaci neúspěšné fáze zpracování. Například modelWebSummarization chyba značí, že souhrn výsledků webu selhal.

Pokud vaše aplikace povolí částečné výsledky, zpracujte úspěšné výsledky a poznamenejte si každou neúspěšnou fázi zdroje nebo modelu. Před opakováním opravte konfiguraci, autorizaci a chyby oprávnění. V případě omezování, vypršení časového limitu nebo přechodných selhání dostupnosti použijte omezené opakování s backoffem.

Pokud jsou výsledky nebezpečné bez konkrétního zdroje a jeho typ zdroje podporuje alwaysQuerySource, nastavte oba alwaysQuerySource a failOnError. První možnost zajistí, že je zdroj vybrán, a druhá vrátí těžkou chybu, pokud dotazování selže. Zdroje znalostí serveru MCP (Preview) nepodporují alwaysQuerySource; pro tyto zdroje se failOnError použije pouze tehdy, když je zdroj vybraný. failOnError se nevztahuje na selhání aktivit modelu.

502 Bad Gateway

Chyba nejvyšší úrovně popisuje jednu ze dvou cest pevného selhání:

  • U každého vybraného zdroje došlo k chybě: Každý vybraný zdroj vrátil chybu. Zdroj, který se úspěšně dokončí bez odpovídajících dokumentů, není neúspěšný. Zkontrolujte všechny chyby zdroje pro problém se sdílenou konfigurací, autorizací, závislostí nebo dostupností.
  • Zdroj failOnError se nezdařil: Požadovaný zdroj nelze dotazovat. Jiné zdroje mohly být úspěšné, ale služba nevrací částečný výsledek, protože požadovaný zdroj selhal.

Selhání základního zdroje jsou obecně stejného typu jako ta popsaná pro 206 Partial Content: neplatný vstup specifický pro zdroj, odchylky konfigurace zdroje nebo indexu, autorizace závislostí nebo oprávnění k přístupu, omezení rychlosti, vypršení časových limitů nebo dočasná nedostupnost závislostí.

Striktní 502 odpověď může vynechat pole activity a uvádět název zdroje a příčinu selhání pouze v chybové zprávě na nejvyšší úrovni. Před opakováním opravte konfiguraci, autorizaci a chyby oprávnění. Použijte opakované pokusy s omezeným počtem opakování a s prodlevou mezi pokusy pouze při omezení rychlosti, vypršení časového limitu nebo dočasných výpadcích dostupnosti. Nepovažujte odpověď 502 Bad Gateway za výpadek služby Azure AI Vyhledávač, aniž byste prozkoumali selhání podkladového zdroje.

Prázdné odpovědi

Krok hledání může najít dokument, ale služba ho stále může vynechat z konečné odpovědi, pokud jeho podkladový obsah překročí rozpočet výstupu maxOutputSizeInTokens (maxOutputSize v 2026-05-01-preview a později). Když dojde k této podmínce, pole aktivity ukazuje, že byly nalezeny shody, a záznam aktivity obsahuje upozornění, že nejrelevantní dokument překročil maximální velikost výstupu. Pole odkazů a obsah podložené odpovědi jsou pro tento dokument prázdné. Chcete-li zachovat více obsahu, zvyšte maxOutputSizeInTokens.

Abyste se tomuto chování vyhnuli, indexujte velké zdrojové dokumenty jako menší bloky dat se stabilními identifikátory a zdrojovými metadaty. To platí zejména pro dlouhé příručky, zásady nebo články znalostní báze.

Zavolejte koncový bod MCP

Warning

Implementace MCP jsou náchylné k rizikům, jako jsou útoky, kaskádové selhání a ztráta lidského dohledu. Tato rizika můžete zmírnit prověřováním serverů MCP z hlediska zabezpečení a spolehlivosti, dodržováním doporučených postupů společnosti Microsoft a osvědčených postupů v oboru a zavedením schvalovacích mechanismů a monitorování kaskádového chování.

MCP je otevřený protokol, který standardizuje, jak se aplikace umělé inteligence připojují k externím zdrojům dat a nástrojům.

V Azure AI Vyhledávač je každá znalostní báze samostatným serverem MCP, který zveřejňuje nástroj knowledge_base_retrieve. Jakýkoli klient kompatibilní s MCP, včetně služby Foundry Agent Service, GitHub Copilot, Claude a Cursor, může tento nástroj vyvolat pro dotazování do znalostní báze.

Ověřit se na endpoint MCP

Každá znalostní báze má koncový bod MCP na následující adrese URL:

https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>

Zadaná verze rozhraní API určuje, co připojení vrací. Při použití 2026-08-01-previewvrátí znalostní báze syntetizované odpovědi, když je základní znalostní báze nakonfigurována s LLM a kompatibilním úsilím o odůvodnění. Při použití 2026-04-01 je vyhledávání vždy minimální a extraktivní a připojení vrací pouze podkladová data.

Způsob ověřování u tohoto koncového bodu závisí na klientovi MCP. Když používáte rozhraní Responses API služby Azure OpenAI s nástrojem knowledge_base_retrieve MCP, ověřujete jak volání rozhraní Responses API vůči službě Azure OpenAI, tak požadavek MCP vůči službě Azure AI Vyhledávač. Pokud váš klient MCP volá tento koncový bod přímo, ověříte se pouze pro Azure AI Vyhledávač.

Pro Azure AI Vyhledávač ověřování použijte jednu z následujících metod:

Poznámka

Klienti MCP konfigurují vlastní hlavičky odlišně. Služba Foundry Agent například vloží hlavičky prostřednictvím připojení projektu, zatímco klienti, jako je GitHub Copilot, vyžadují hlavičky ve formátu JSON serveru MCP.

Použijte token Bearer pro autentizaci MCP

Doporučená metoda ověřování MCP je nosný token, který zabraňuje ukládání citlivých klíčů do konfiguračních souborů. Identita za tokenem musí mít přiřazenou roli Čtenář dat indexu vyhledávání ve vyhledávací službě. Další informace najdete v tématu Pojení aplikace k Azure AI Vyhledávač pomocí identit.

#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());

Referenční informace:Použití rozhraní API pro odpovědi OpenAI Azure

import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI

openai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"] # Example: https://<resource-name>.openai.azure.com
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
credential = DefaultAzureCredential()

# Create token providers for Azure OpenAI and Azure AI Search
openai_token_provider = get_bearer_token_provider(
    credential, "https://cognitiveservices.azure.com/.default"
)
search_token_provider = get_bearer_token_provider(
    credential, "https://search.azure.com/.default"
)

# Create the Azure OpenAI client
client = AzureOpenAI(
    azure_endpoint=openai_endpoint,
    azure_ad_token_provider=openai_token_provider,
    api_version=os.environ["OPENAI_API_VERSION"], # Example: 2025-04-01-preview
)

# Create a response using the MCP tool configuration
response = client.responses.create(
    model="MODEL_NAME",
    input="What causes the strongest nighttime brightness patterns in this dataset?",
    tools=[
        {
            "type": "mcp",
            "server_label": "search_kb",
            "server_url": mcp_server_url,
            "allowed_tools": ["knowledge_base_retrieve"],
            "headers": {
                "Authorization": f"Bearer {search_token_provider()}"
            },
            "require_approval": "never",
        }
    ],
)

print(response.output_text)

Referenční informace:Použití rozhraní API pro odpovědi OpenAI Azure

// This code snippet is currently unavailable.

Použití klíče správce pro ověřování MCP

Klíč správce uděluje vyhledávací službě úplný přístup pro čtení i zápis, takže ho používejte jenom ve vývojových prostředích nebo v případě, že nosný token není k dispozici. Další informace najdete v tématu Pojení k Azure AI Vyhledávač pomocí klíčů rozhraní API.

Tip

Následující příklad ukazuje pouze hlavičku, která se liší od příkladu s tokenem Bearer. Kompletní nastavení naleznete v tématu Použití tokenu typu bearer pro ověřování MCP.

#pragma warning disable OPENAI001

using OpenAI.Responses;
using System;
using System.Collections.Generic;

string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
string searchAdminKey = Environment.GetEnvironmentVariable("AZURE_SEARCH_ADMIN_KEY")!; // Example: <search-api-key>

McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "search_kb",
    serverUri: new Uri(mcpServerUrl),
    headers: new Dictionary<string, string> { ["api-key"] = searchAdminKey },
    allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);

Referenční informace:Použití rozhraní API pro odpovědi OpenAI Azure

import os

mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
search_admin_key = os.environ["AZURE_SEARCH_ADMIN_KEY"] # Example: <search-api-key>

tools = [
    {
        "type": "mcp",
        "server_label": "search_kb",
        "server_url": mcp_server_url,
        "allowed_tools": ["knowledge_base_retrieve"],
        "headers": {"api-key": search_admin_key},
        "require_approval": "never",
    }
]

Referenční informace:Použití rozhraní API pro odpovědi OpenAI Azure

// This code snippet is currently unavailable.

Kontrola odpovědi MCP

Když klient MCP volá knowledge_base_retrieve, obdrží výsledek nástroje MCP místo obálky akce načtení tvořené prvky response, activity a references. Mnoho klientů MCP zobrazí výsledek nástroje pod objektem nejvyšší úrovně result , takže datová část, kterou byste měli očekávat, je result.content[].

{
  "result": {
    "content": [
      {
        "type": "text",
        "text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
      }
    ]
  }
}

Klíčové body:

  • result.content[] obsahuje výstup nástroje MCP vrácený znalostní bázi.

  • result.content[].type je text.

  • result.content[].text obsahuje načtená podkladová data jako řetězec kódovaný v JSON.

  • Na rozdíl od akce retrieve aktuální odpověď MCP nevrací samostatná pole activity ani references a nevyplňuje položky resource pro vrácený obsah.