Sök i en kunskapsbas med åtgärden "hämta" eller MCP-slutpunkten.

Observera

Azure AI-sökning är tillgängligt via Azure-portalen, REST-API:er och Azure-SDK:er. Den ligger också till grund för Foundry IQ, det hanterade kunskapsskiktet som omvandlar företagsinnehåll till återanvändbara, behörighetsmedvetna kunskapsbaser för agenter i Microsoft Foundry-portalen.

Viktigt

Funktioner, funktioner eller egenskaper som har markerats (förhandsversion) omfattas inte av ett serviceavtal, rekommenderas inte för produktionsarbetsbelastningar och kan ändras eller begränsas innan de blir allmänt tillgängliga. Villkoren för Azure AI-sökning förhandsgranskning gäller för alla förhandsgranskningsfunktioner, oavsett om de är fristående eller en del av en allmänt tillgänglig funktion.

I en agentisk hämtningspipeline anropar åtgärden hämta parallell frågebearbetning från en kunskapsbas. Du kan anropa åtgärden hämta direkt med hjälp av REST-API:er för söktjänsten eller en Azure SDKs. Varje kunskapsbas exponerar också en MCP-slutpunkt (Model Context Protocol) för förbrukning av MCP-kompatibla agenter.

Den här artikeln beskriver hur du anropar båda hämtningsmetoderna med valfri behörighetskontroll. Den täcker hämtningsåtgärden först och MCP-slutpunkten senare eftersom MCP-verktygets resultat för närvarande skiljer sig från REST- och SDK-svarsformen.

Information om hur du konfigurerar en pipeline som ansluter Azure AI-sökning till Foundry Agent Service via MCP finns i Tutorial: Skapa en lösning för agentisk hämtning från slutpunkt till slutpunkt.

Användningsstöd

Azure Portal Microsoft Foundry-portalen .NET SDK Python SDK Java SDK JavaScript SDK REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Förutsättningar

  • Om du anropar MCP-slutpunkten via API:et Azure OpenAI-svar behöver du:

    • En distribuerad LLM och Cognitive Services OpenAI-användarrollen (eller en API-nyckel) på Foundry-resursen. Du kan återanvända den LLM och den resurs som anges i din kunskapsbas, om tillämpligt.

    • Paketet Azure.AI.OpenAI : dotnet add package Azure.AI.OpenAI

  • Obligatoriskt Azure.Search.Documents paket:

    • För 2026-08-01-preview funktioner är det senaste förhandsversionspaketet: dotnet add package Azure.Search.Documents --prerelease

    • För 2026-04-01 funktioner är det senaste stabila paketet: dotnet add package Azure.Search.Documents

  • För nyckellös autentisering, paketet Azure.Identity: dotnet add package Azure.Identity

  • Om du anropar MCP-slutpunkten via API:et Azure OpenAI-svar behöver du:

    • En distribuerad LLM och Cognitive Services OpenAI-användarrollen (eller en API-nyckel) på Foundry-resursen. Du kan återanvända den LLM och den resurs som anges i din kunskapsbas, om tillämpligt.

    • Paketet openai : pip install openai

  • Obligatoriskt azure-search-documents paket:

    • För 2026-08-01-preview funktioner är det senaste förhandsversionspaketet: pip install --pre azure-search-documents

    • För 2026-04-01 funktioner är det senaste stabila paketet: pip install azure-search-documents

  • För nyckellös autentisering, paketet azure-identity: pip install azure-identity

  • Nödvändig REST API-version för söktjänsten:

  • För nyckellös autentisering inkluderar du en Microsoft Entra ID token i rubriken för Authorization varje HTTP-begäran.

Limitations

För kunskapskällor för sökindex använder hämtning kunskapskällans semantiska konfiguration när du aktiverar omrankning. Det tillämpar inte det underliggande indexets bedömningsprofiler, inklusive defaultScoringProfile. Svar från hämtningsåtgärden visar inte heller @search.rerankerBoostedScore.

Anropa hämtningsfunktionen

Du anger åtgärden hämta på en kunskapsbas. Begärandetexten innehåller frågeindata och en valfri lista över kunskapskällor som ska riktas.

2026-04-01 API-versionen stöder intents endast indata och minimal, extraktiv hämtning. Funktioner för endast förhandsversioner, inklusive messages indata, frågeplanering, svarssyntes och konfigurerbar resonemangsansträngning, stöds inte. Använd 2026-08-01-preview för fullständig funktionalitet.

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Referens:Kunskapshämtning – Hämta

Ange bilder för att svara på syntes (förhandsversion)

För blob, OneLake med index och SharePoint-kunskapskällor med index som du konfigurerar med ett tillgångsarkiv kan du tillhandahålla bilder som är inbäddade i dokument till den efterföljande modellen för svarssyntes tillsammans med text. Ange enableImageServing den matchande posten i knowledgeSourceParams för att åsidosätta standardvärdet som anges i kunskapsbasdefinitionen. Hämtningssvaret innehåller inte dedikerade fält för enskilda bildsökvägar eller bildbyte som tillhandahålls till modellen.

Bildservern körs endast när outputMode är answerSynthesis och stöds inte för kunskapskällor som konfigurerar ingestionPermissionOptions. Information om konfigurationssteg, prioritetstabellen och hur du inspekterar bildvisningsstatistik finns i Surface dokumentinbäddade bilder i agentisk hämtning (förhandsversion).

Inaktivera omrankning för en kunskapskälla (förhandsversion)

Från och med API-versionen 2026-08-01-preview anger du "resultsProcessing": "none" på en knowledgeSourceParams-post för att hoppa över omrankning för en specifik kunskapskälla och bevara den underliggande resultatordningen. Du kan också lagra resultsProcessing på kunskapskällan som standard. Alla typer av kunskapskällor stöder den här egenskapen.

Följande exempel förbigår omrankning för product-catalog-ks för en hämtningsbegäran.

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

var client = new KnowledgeBaseRetrievalClient(
    new Uri("<search-endpoint>"),
    "product-catalog-kb",
    new DefaultAzureCredential());

var request = new KnowledgeBaseRetrievalRequest
{
    IncludeActivity = true
};
request.Intents.Add(
    new KnowledgeRetrievalSemanticIntent(
        "Find the power adapter for SKU 88421."));
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("product-catalog-ks")
    {
        AlwaysQuerySource = true,
        IncludeReferences = true,
        ResultsProcessing = KnowledgeSourceResultsProcessing.None
    });

var result = await client.RetrieveAsync(request);
Console.WriteLine(
    $"References with a reranker score: "
    + $"{result.Value.References.Count(x => x.RerankerScore.HasValue)}");

Referens:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="product-catalog-kb",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="Find the power adapter for SKU 88421."
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-catalog-ks",
            always_query_source=True,
            include_references=True,
            results_processing="none",
        )
    ],
)

result = client.retrieve(request)
reranked_count = sum(
    reference.reranker_score is not None
    for reference in result.references
)
print("References with a reranker score:", reranked_count)

Referens:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
@knowledge-base-name = product-catalog-kb

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

{
  "intents": [
    {
      "type": "semantic",
      "search": "Find the power adapter for SKU 88421."
    }
  ],
  "includeActivity": true,
  "knowledgeSourceParams": [
    {
      "knowledgeSourceName": "product-catalog-ks",
      "kind": "searchIndex",
      "alwaysQuerySource": true,
      "includeReferences": true,
      "resultsProcessing": "none"
    }
  ]
}

Referens:Kunskapshämtning – Hämta

Ange "resultsProcessing": "rerank", eller utelämna det om det inte finns något sparat standardvärde, om du vill använda omrankningspipelinen. Azure AI-sökning löser det effektiva värdet för varje källa i den här ordningen:

  1. resultsProcessing i knowledgeSourceParams i samband med hämtningsbegäran.
  2. resultsProcessing lagras på kunskapskällan.
  3. rerank när ingen av egenskaperna finns.

För en MCP-serverkunskapskälla har ett resultsProcessing värde som angetts för ett enskilt verktyg företräde framför begäran och lagrade värden.

Tip

resultsProcessing ändrar hur resultaten bearbetas, inte vilka källor som efterfrågas. Ange alwaysQuerySource till true om kunskapskällan måste frågas.

När det effektiva värdet är none:

  • Referenser från kunskapskällan utelämnar rerankerScoreoch resultaten håller sin underliggande ordning inom källans hämtningsaktivitet.
  • När någon källa kringgår omrangering distribuerar Azure AI-sökning slutresultaten mellan aktiviteter i round robin-ordning, enligt deklarationsordningen för kunskapskällorna. Omrankade aktiviteter förblir ordnade efter poäng.
  • Gränser för deduplicering och per källa, dokument och token gäller fortfarande, så alla hämtade resultat visas inte i svaret.

Azure AI-sökning verifierar rerankerThreshold i den här ordningen:

  1. Sökningen avgör resultsProcessing utifrån hämtningsförfrågan och värdet för den lagrade kunskapskällan.
  2. Om det lösta värdet är none och begäran innehåller rerankerThreshold, returnerar Search 400 Bad Request.
  3. För ett MCP-serververktyg tillämpar Search värdet på verktygsnivå resultsProcessing när begäran har verifierats.

Därför ändrar inte en MCP-verktygsinställning om begäran godkänns. Ett värde på verktygsnivå none orsakar inte ett tröskelvärde och ett värde på verktygsnivå rerank förhindrar inte ett fel när begäran eller det lagrade värdet matchas till none.

Kontrollera om kunskapskällans referenser innehåller rerankerScoreför att bekräfta vilket läge som kördes. Förlita dig inte på semanticConfigurationName, som kan vara null i stället för att utelämnas.

Beteende för sökindex

För kunskapskällor som riktar sig mot ett sökindex är semanticden underförstådda frågetypen , och det finns inget sökläge. Vid omrankningskörningar används semanticConfigurationName för frågekörning. Andra källinställningar, inklusive searchFields och sourceDataFields, gäller i båda lägena.

Agentbaserad hämtning accepterar inte scoringProfile- eller scoringParameters-indata. Om du behöver färskhetsviktning för indexerade kunskapskällor ska du använda freshness-aware retrieval (förhandsversion) i stället för en poängsättningsprofil för index.

Om indexet innehåller vektorfält behöver du en giltig vektoriserardefinition så att den agentiska hämtningsmotorn kan vektorisera frågeindata. Annars ignoreras vektorfält.

Mer information finns i Skapa ett index för agentisk hämtning.

Strömma hämta resultat (förhandsversion)

Från och med 2026-08-01-preview API-versionen kan du få hämta resultat som en ström av server-skickade händelser (SSE) i stället för att vänta på ett enda JSON-svar. Genom att använda direktuppspelning kan klienten visa frågeplanering, källaktivitet och syntetiserade svar eller extraherat svar i den ordningen när varje del blir tillgänglig.

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

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

var request = new KnowledgeBaseRetrievalRequest
{
    OutputMode = KnowledgeRetrievalOutputMode.ExtractiveData,
    RetrievalReasoningEffort =
        new KnowledgeRetrievalMinimalReasoningEffort(),
    IncludeActivity = true,
};
request.Intents.Add(
    new KnowledgeRetrievalSemanticIntent("What is the return policy?"));
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "<knowledge-source-name>")
    {
        ResultsProcessing = KnowledgeSourceResultsProcessing.None,
        IncludeReferences = true,
    });

var eventCounts = new Dictionary<string, int>();

await foreach (var item in client.RetrieveStreamAsync(request))
{
    eventCounts.TryGetValue(item.EventType, out var count);
    eventCounts[item.EventType] = count + 1;
}

foreach (var (eventType, count) in eventCounts)
{
    Console.WriteLine($"{eventType}: {count}");
}

Referens:KnowledgeBaseRetrievalClient

from collections import Counter

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
    KnowledgeSourceResultsProcessing,
)
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalMinimalReasoningEffort,
    KnowledgeRetrievalOutputMode,
    KnowledgeRetrievalSemanticIntent,
    SearchIndexKnowledgeSourceParams,
)


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

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="What is the return policy?"
        )
    ],
    output_mode=KnowledgeRetrievalOutputMode.EXTRACTIVE_DATA,
    retrieval_reasoning_effort=KnowledgeRetrievalMinimalReasoningEffort(),
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="<knowledge-source-name>",
            results_processing=KnowledgeSourceResultsProcessing.NONE,
            include_references=True,
        )
    ],
)

event_counts = Counter()

with client.retrieve_stream(request) as stream:
    for event in stream:
        event_counts[event.event_type] += 1

for event_type, count in event_counts.items():
    print(f"{event_type}: {count}")

Referens:KnowledgeBaseRetrievalClient

Om du vill aktivera strömning anger du huvudet Accept: text/event-stream i en hämtningsförfrågan. Utan den här rubriken returnerar hämtningsåtgärden sitt vanliga JSON-svar.

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

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

Referens:Kunskapshämtning – Hämta

Händelselivscykel

I stället för att returnera ett enda svar håller tjänsten en HTTP-anslutning öppen (innehållstyp text/event-stream; charset=utf-8) och skickar en sekvens med händelser när data blir tillgängliga. Varje händelse har en event: rad som namnger händelsetypen, en data: rad med ett JSON-värde och en tom rad som markerar slutet på händelsen.

En framgångsrik strömning har följande livscykel:

Evenemang När den skickas Vad den innehåller
retrieval.started Första händelsen på varje strömmad begäran. Begärande-ID, kunskapsbasnamn, utdataläge och effektivt resonemang efter att tjänsten har löst standardinställningarna för begäran och kunskapsbas. Om den effektiva kind är auto rapporterar händelsen auto; den förutsäger inte senare eskalering.
activity.started När tjänsten startar en aktivitet för frågeplanering, källaktivitet eller modellaktivitet. Flera aktiviteter kan starta innan en tidigare aktivitet slutförs. Aktiviteten id, type, starttiden och det valfria kunskapskällans namn.
activity.completed När aktiviteten är klar. Korrelera den till händelsen activity.started genom att matcha id. Den slutförda aktivitetsposten.
answer.completed En gång, bara när outputMode är answerSynthesis. messageIndex identifierar meddelandets position i den slutliga svarsmatrisen och message innehåller det fullständiga syntetiserade svaret. Det finns ingen token-by-token delta-händelse.
references.completed När alla referenser har lösts. Händelsedata är den fullständiga referensmatrisen, utan en objektomslutning.
response.completed Den avslutande händelsen för en framgångsrik eller delvis framgångsrik strömning. statuskoden 200 eller 206 och den fullständiga svarstexten, som har samma struktur som ett icke-strömmande JSON-anrop. Information om vad varje statuskod innebär finns i Felsöka åtgärden för att hämta.
error I stället för references.completed och response.completed när hämtning misslyckas efter att strömmen har öppnats. Felet och eventuella aktivitetsposter som slutfördes före avbrottet.

Händelser kommer i rätt ordning. Varje activity.started-händelse föregår activity.completed-händelsen med samma id, men aktiviteter kan överlappa. Slutförda aktivitetsposter innehåller även tidsstämplar för startedAt och completedAt. När strömmen är inaktiv skickar servern en : heartbeat kommentar ungefär var 15:e sekund för att hålla anslutningen öppen. SSE-klienter kan ignorera dessa kommentarer.

Följande exempel visar ett strömmande svar, där data har kortats ned för läsbarhetens skull.

event: retrieval.started
data: {"requestId":"<request-id>","outputMode":"answerSynthesis"}

event: activity.started
data: {"id":0,"type":"searchIndex","startedAt":"<timestamp>"}

: heartbeat

event: activity.completed
data: {"id":0,"startedAt":"<start>","completedAt":"<end>"}

event: answer.completed
data: {"messageIndex":0,"message":{"content":[{"type":"text","text":"..."}]}}

event: references.completed
data: [{"type":"searchIndex","id":"0","activitySource":0}]

event: response.completed
data: {"statusCode":200,"response":{}}

Hantera fel, annullering och återställning

  • Preflight-fel: Om valideringen av begäran misslyckas innan strömmen öppnas, till exempel för en felaktig begärandetext, returnerar åtgärden hämta ett JSON-standardfelsvar och öppnar aldrig strömmen.

  • Fel under pågående strömning: Om hämtningen misslyckas efter att strömmen har öppnats är den avslutande händelsen error i stället för references.completed och response.completed. Händelsen kan innehålla alla aktivitetsposter som slutfördes innan felet inträffade. HTTP-statuskoden förblir 200 när dataströmmen har startat, så kontrollera sluthändelsen, inte HTTP-statuskoden, för att avgöra om det lyckades.

  • Annullering eller frånkoppling: Om klienten avbryter begäran eller kopplar från innan strömmen har slutförts avbryter tjänsten hämtningen och avslutar strömmen utan en terminalhändelse. Behandla händelser som tas emot innan de avbryts eller kopplas från som ofullständiga.

  • JSON-reserv: Med 2026-08-01-preview returneras det vanliga JSON-svaret som beskrivs i Granska svaret om Accept-headern saknas eller har ett värde som application/json, */*, text/* eller text/event-stream;q=0. Att begära text/event-stream från en tidigare API-version returnerar 406 Not Acceptable.

Filtrera kunskapskällor för sökindex vid frågetillfället

När du hämtar från en kunskapskälla för sökindex kan du använda ett OData-filter vid frågetillfället för att begränsa resultatet till specifika dokument eller fält. Filteruttrycket använder OData-syntax och skickas via parametern filterAddOn .

Filtrera syntax och exempel

Parametern filterAddOn accepterar OData-filteruttryck. Exempelmönster är:

  • Metadatafält: city eq 'Phoenix', status eq 'active'
  • Datumintervall: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Numeriska intervall: price ge 100 and price le 5000
  • Textjämförelse: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Logiska operatorer: (category eq 'News' or category eq 'Analysis') and status eq 'published'
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

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

var retrievalRequest = new KnowledgeBaseRetrievalRequest();

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You are a support agent. Answer questions based on published documentation. "
                + "If you don't know the answer, say so."
            )
        }
    ) { Role = "assistant" }
);

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What is the process for submitting an expense report?"
            )
        }
    ) { Role = "user" }
);

// Apply a filter to search only published documents
var searchIndexParams = new SearchIndexKnowledgeSourceParams(
    knowledgeSourceName: "internal-documentation-ks"
);
searchIndexParams.FilterAddOn = "status eq 'published'";

retrievalRequest.KnowledgeSourceParams.Add(searchIndexParams);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

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

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You are a support agent. Answer questions based on published documentation. "
                    "If you don't know the answer, say so."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="What is the process for submitting an expense report?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="internal-documentation-ks",
            # Apply a filter to search only published documents
            filter_add_on="status eq 'published'",
        )
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You are a support agent. Answer questions based on published documentation. If you don't know the answer, say so."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What is the process for submitting an expense report?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "internal-documentation-ks",
            "kind": "searchIndex",
            "filterAddOn": "status eq 'published'"
        }
    ]
}

Exempel på flera filter

Du kan kombinera flera filter för att ytterligare förfina resultaten.

searchIndexParams.FilterAddOn = "(status eq 'published' or status eq 'internal') and created ge 2025-01-01";
filter_add_on="(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
{
    "knowledgeSourceName": "internal-documentation-ks",
    "kind": "searchIndex",
    "filterAddOn": "(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
}

Åsidosätta lagrade frågetips vid frågetid (förhandsversion)

Från och med API-version 2026-08-01-preview kan du åsidosätta de frågeledtrådar som lagras i en kunskapskälla för sökindex för en enskild hämtningsbegäran genom att ange queryHintOverrides på dess knowledgeSourceParams-post.

Åsidosättningen ersätter hela det lagrade queryHints-objektet i stället för att slå samman det post för post, så inkludera varje hint som du vill använda. Utelämna queryHintOverrides för att använda de lagrade ledtrådarna.

När resonemangsinsatsen för hämtning inte är minimal beror ett HTTP 400-svar på de lagrade filtertipsen, inte på åsidosättningsinnehållet eller boosttypen. Tjänsten validerar lagrade filtertips mot kunskapsbasmodellen innan du tillämpar queryHintOverrides. Därför avvisar en GPT-4o- eller GPT-4.1-familjemodell begäran även om åsidosättningen är tom eller endast innehåller ökningar. Lagrade ökningar utlöser inte den här valideringen. Använd en kompatibel modell eller ta bort de lagrade filtertipsen först.

I följande exempel ersätts alla lagrade tips med en fieldValue boost för japanskt innehåll. Tjänsten tillämpar inte något lagrat filter eller någon annan lagrad boost för den här begäran.

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

var endpoint = new Uri("<search-endpoint>");
var retrievalClient = new KnowledgeBaseRetrievalClient(
    endpoint,
    "product-kb",
    new DefaultAzureCredential());

var languageBoost =
    new SearchIndexKnowledgeSourceFieldValueBoost(
        "language",
        2.0);
languageBoost.FieldValues.Add("ja-JP");
var queryHintOverrides =
    new SearchIndexKnowledgeSourceQueryHints();
queryHintOverrides.Boosts.Add(languageBoost);

var request = new KnowledgeBaseRetrievalRequest
{
    RetrievalReasoningEffort =
        new KnowledgeRetrievalLowReasoningEffort(),
    IncludeActivity = true
};
request.Messages.Add(
    new KnowledgeBaseMessage([
        new KnowledgeBaseMessageTextContent(
            "Find Japanese service guidance for Model-X200.")
    ])
    {
        Role = "user"
    });
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "product-docs-ks")
    {
        QueryHintOverrides = queryHintOverrides
    });

var result = await retrievalClient.RetrieveAsync(request);

Referens:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

retrieval_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    credential=DefaultAzureCredential(),
    knowledge_base_name="product-kb",
)

query_hint_overrides = SearchIndexKnowledgeSourceQueryHints(
    boosts=[
        SearchIndexKnowledgeSourceFieldValueBoost(
            field="language",
            field_values=["ja-JP"],
            boost=2.0,
        )
    ]
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Find Japanese service guidance for Model-X200."
                )
            ],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-docs-ks",
            query_hint_overrides=query_hint_overrides,
        )
    ],
    retrieval_reasoning_effort=(
        KnowledgeRetrievalLowReasoningEffort()
    ),
    include_activity=True,
)

result = retrieval_client.retrieve(request)

Referens:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

{
  "messages": [{
    "role": "user",
    "content": [{
      "type": "text",
      "text": "Find Japanese service guidance for Model-X200."
    }]
  }],
  "knowledgeSourceParams": [{
    "knowledgeSourceName": "product-docs-ks",
    "kind": "searchIndex",
    "queryHintOverrides": {
      "boosts": [{
        "kind": "fieldValue",
        "field": "language",
        "fieldValues": ["ja-JP"],
        "boost": 2.0
      }]
    }
  }],
  "retrievalReasoningEffort": {"kind": "low"},
  "includeActivity": true
}

Referens:Kunskapshämtning – Hämta

För att bekräfta att tjänsten har tillämpat din åsidosättning anger du includeActivity i begäran och inspekterar den returnerade searchIndex-aktiviteten. Objektet queryHintProcessing rapporterar vad modellen genererade. I det här exemplet finns det en generatedBoost för språkförstärkningen, men inget generatedFilter eftersom åsidosättningen ersatte den lagrade filterhinten. Eftersom frågetips är bäst kan du behandla den här aktiviteten som en bekräftelse i stället för att söka efter ett exakt uttryck.

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

Lagrad definition, tipstyper som stöds och sammansättning med deterministiska filter finns i Konfigurera frågetips (förhandsversion).

Framtvinga behörigheter vid frågetillfället (förhandsversion)

Ändringar av åtkomstbehörigheter som du anger utanför 2026-08-01-preview kan ta tid att visas i 2026-08-01-preview hämtningsresultatet.

Om dina kunskapskällor innehåller behörighetsskyddat innehåll skickar du slutanvändarens identitet på hämtningsbegäran så att varje användare bara ser innehåll som de har behörighet att komma åt. För indexerade källor använder hämtningsmotorn den här identiteten för att filtrera resultat och returnerar ofiltrerade resultat om den utelämnas. Fjärrkällor använder också auktorisering från hämtningsbegäran men framtvingar behörigheter vid källan och kan kräva en källspecifik token och rubrik.

Behörighetsframtvingandet har två delar:

  • Inmatningstid: Endast för indexerade kunskapskällor anger du ingestionPermissionOptions för att mata in behörighetsmetadata tillsammans med innehåll.

  • Vid frågetillfället: Skicka användarens behörighetsuppgifter i headern som krävs av kunskapskällan. De flesta källor använder x-ms-query-source-authorization. Undantaget är Work IQ, som använder x-ms-query-work-iq-source-authorization.

Inmatningstidskonfiguration

I följande tabell visas vilka kunskapskällor som kräver inmatningstidskonfiguration och hur varje källa tillämpar behörigheter.

Kunskapskälla Kräver ingestionPermissionOptions Så här framtvingas behörigheter
Blob eller ADLS Gen2 ✅ Inmatade RBAC-omfång, ACL:er eller Microsoft Purview matchade mot användaridentitet.
OneLake ✅ Inläst dokument med Microsoft Purviews känslighetsetiketter matchade mot användaridentitet.
Indexerad SharePoint ✅ Inlästa SharePoint-ACL:er eller känslighetsetiketter i Microsoft Purview som matchas mot användarens identitet.
Fjärr-SharePoint ❌ Copilot API för hämtning anropar SharePoint direkt med användarens token.
Fabric Dataagent ❌ Hämtningsmotorn byter in användarens token mot en token begränsad till Microsoft Fabric och gör en fråga till dataagenten för användarens räkning.
Fabric Ontologi ❌ Hämtningsmotorn byter ut användarens token mot en Microsoft Fabric-begränsad token och frågar ontologiobjektet för deras räkning.
Arbets-IQ ❌ Hämtningsmotorn löser in ett användarintyg för appmålgrupp från x-ms-query-work-iq-source-authorization mot en token med Work IQ-omfattning.

Om du inte konfigurerar ingestionPermissionOptions när du skapar den indexerade kunskapskällan innehåller indexet inte behörighetsmetadata. Systemet returnerar resultat som inte har filtrerats, oavsett rubrik. Åtgärda det här problemet genom att återskapa kunskapskällan med lämpliga ingestionPermissionOptions värden.

Frågetidsauktorisering

För icke-Work IQ-kunskapskällor skickar du slutanvändarens identitet genom att inkludera en åtkomsttoken som är begränsad till https://search.azure.com/.default i begäran om hämtning. Den här token är separat från tjänstautentiseringsuppgifterna som används för att komma åt söktjänsten. Den behöver inte behörigheter för söktjänsten och representerar bara den användare vars innehållsåtkomst utvärderas. Mer information finns i Frågetids-ACL och RBAC-tillämpning.

För Arbets-IQ-kunskapskällor gäller inte det här avsnittet. Använd det Work IQ-specifika försäkransflödet för användare som beskrivs i Tillämpa behörigheter vid frågetillfället.

I .NET SDK skickar du token som parametern querySourceAuthorization på RetrieveAsync:

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

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

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

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

I Python SDK skickar du token som parametern query_source_authorization på retrieve:

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

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

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Inom REST-API:t inkluderar du x-ms-query-source-authorization headern med användarens åtkomsttoken.

@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Service credential
@user-access-token = <user-access-token> // User identity token

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

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What companies are in the financial sector?"
                }
            ]
        }
    ]
}

Referens:Kunskapshämtning – Hämta

Granska svaret

Åtgärden hämta returnerar tre huvudkomponenter:

Extraherat svar

Det extraherade svaret är en enda, enhetlig sträng som du vanligtvis skickar till en LLM. LLM använder strängen som jordningsdata och använder den för att formulera ett svar. DITT API-anrop till LLM innehåller den enhetliga strängen och instruktionerna för modellen, till exempel om du vill använda grunderna uteslutande eller som ett tillägg.

Svarets brödtext är strukturerad i formatmallen för chattmeddelanden och innehållet är serialiserat JSON.

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

Viktiga punkter:

  • content.type har ett giltigt värde: text.

  • content.text är en JSON-kodad sträng som innehåller de mest relevanta dokumenten (eller segmenten) som finns i sökindexet, med tanke på indata för fråge- och chatthistorik. Den här strängen är dina grunddata som en LLM använder för att formulera ett svar på användarens fråga.

    • Den här delen av svaret består av 200 segment eller färre, exklusive resultat som inte uppfyller minimitröskelvärdet på 2,5 rerankerpoäng.

    • Strängen börjar med referens-ID för segmentet (används för källhänvisning) och alla fält som anges i målindexets semantiska konfiguration. I det här exemplet antar du att den semantiska konfigurationen i målindexet har ett "rubrikfält", ett "termfält" och ett "innehåll"-fält.

  • Hämta-svar inkluderar inte @search.rerankerBoostedScore.

  • Egenskapen maxOutputSizeInTokens (maxOutputSize i 2026-05-01-preview och senare) i hämtningsbegäran bestämmer strängens längd.

    • Ett dokument som överskrider maxOutputSizeInTokens utdatabudgeten kan utelämnas från svaret. Aktivitetsmatrisen innehåller en varning när det mest relevanta dokumentet överskrider den maximala utdatastorleken. Om du vill behålla mer innehåll ökar du maxOutputSizeInTokens. Mer information finns i Tomma svar.

Aktivitetsmatris

Aktivitetsmatrisen matar ut frågeplanen, vilket ger driftstransparens för spårningsåtgärder, faktureringskonsekvenser och resursanrop. Den innehåller även underfrågor som skickas till hämtningspipelinen. I ett 206 Partial Content-svar innehåller arrayen fel för de kunskapskällor som misslyckades. Ett 502 Bad Gateway-svar kan ge felinformation endast i felet på toppnivå.

Aktivitetsmatrisen innehåller följande komponenter:

Avsnitt Beskrivning
Källspecifik aktivitet För varje kunskapskälla som ingår i frågan rapporterar det här avsnittet om förfluten tid och vilka argument som användes i frågan, inklusive semantisk ranker. Kunskapskällans typer omfattar searchIndex, azureBloboch andra kunskapskällor som stöds.
agenticReasoning Det här avsnittet rapporterar om tokenförbrukning för agentiskt resonemang under hämtningen, vilket beror på det angivna hämtningsskälet (förhandsversion).
modelQueryPlanning För kunskapsbaser som använder en LLM för frågeplanering rapporterar det här avsnittet om antalet token som används för indata och antalet token för underfrågorna. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten.
modelAnswerSynthesis För kunskapsbaser som använder svarssyntes (förhandsversion) rapporterar det här avsnittet om antalet token för att formulera svaret och antalet token för svarsutdata. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten.
modelWebSummarization För kunskapsbaser som använder webbsammanfattning rapporterar det här avsnittet om tokenförbrukning för att sammanfatta webbresultat. Det innehåller ett model fält med ett modelName fält som innehåller namnet på den offentliga modellen, inte distributionsnamnet, för modellen som körde aktiviteten.
model För modellbaserade aktivitetsposter identifierar det här avsnittet den modell som används för att utföra aktiviteten. Det här avsnittet visas bara när du anger includeActivity till true.
imageServing För kunskapskällor som har bildvisning (förhandsversion) aktiverad rapporterar det här avsnittet imagesRetrieved, imagesSentToModel, totalImageSizeBytes och om verbalizationUsed var aktiverat vid indexering. Inspektera verbalizationUsed och imagesSentToModel oberoende av varandra. Ett svar kan rapportera verbalizationUsed som true och fortfarande skicka bilder till nedströmsmodellen. För att hitta antalet utelämnade bilder subtraherar du imagesSentToModel från imagesRetrieved.

I följande exempel visas aktivitetsmatrisen.

  "activity": [
    {
      "type": "modelQueryPlanning",
      "id": 0,
      "inputTokens": 2302,
      "outputTokens": 109,
      "elapsedMs": 2396
    },
    {
      "type": "searchIndex",
      "id": 1,
      "knowledgeSourceName": "demo-financials-ks",
      "queryTime": "2025-11-04T19:25:23.683Z",
      "count": 26,
      "elapsedMs": 1137,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "searchIndex",
      "id": 2,
      "knowledgeSourceName": "demo-healthcare-ks",
      "queryTime": "2025-11-04T19:25:24.186Z",
      "count": 17,
      "elapsedMs": 494,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "agenticReasoning",
      "id": 3,
      "retrievalReasoningEffort": {
        "kind": "low"
      },
      "reasoningTokens": 103368
    },
    {
      "type": "modelAnswerSynthesis",
      "id": 4,
      "inputTokens": 5821,
      "outputTokens": 344,
      "elapsedMs": 3837
    }
  ]

Referensmatris

Referensmatrisen kommer direkt från underliggande grunddata. Den innehåller det sourceData som används för att generera svaret och består av varje dokument som agentic retrieval engine hittar och semantiskt rangordnar.

Referensmatrisen innehåller följande komponenter:

Fält Beskrivning
type Kunskapskällans typ som skapade referensen, till exempel searchIndex.
id Referens-ID:t för ett objekt i ett svar. Det är inte dokumentnyckeln i sökindexet. Använd den för att ange citat.
activitySource Korsrefererar till id för aktivitetsposten som skapade referensen, vilket är användbart för länkning av hänvisningar.
docKey För en indexerad referens är dokumentnyckeln i det bakomliggande sökindexet.
sourceData De grunddata som används för att generera svaret. För en indexerad referens kan fälten innehålla ett id och semantiska fält, till exempel title, termsoch content. Formen varierar beroende på referenstyp.
citationUrl (förhandsversion) En tjänstgenererad, skrivskyddad URL som matchar referensens dokument i bakgrundsindexet. Returneras endast för indexerade kunskapskällor. Information om hur du följer URL:en finns i Söka efter dokument med källhänvisnings-URL:er (förhandsversion).)

I följande exempel visas referensmatrisen.

  "references": [
    {
      "type": "searchIndex",
      "id": "0",
      "activitySource": 2,
      "docKey": "policy=aug-2026",
      "citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
      "sourceData": null
    },
    {
      "type": "searchIndex",
      "id": "1",
      "activitySource": 2,
      "docKey": "2",
      "citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/2?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
      "sourceData": null
    }
  ]

Slå upp dokument med källhänvisnings-URL:er (förhandsversion)

Från och med 2026-08-01-preview API-versionen kan en referens från en indexerad kunskapskälla innehålla en citationUrl i hämtningssvaret. Använd den här URL:en för att hämta de indexerade fälten för den referensen, till exempel title och content, så att du kan återge en källhänvisning som visar var ett svar kom ifrån utan att öppna det ursprungliga källdokumentet. citationUrl är en autentiserad sökning i bakgrundsindexet, separat från källan docUrl och blobUrl.

I följande exempel visas en sanerad källhänvisnings-URL.

"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview"

De markerade fälten och deras ordning beror på den indexerade käll- och hämtningskonfigurationen.

Viktigt

Följ den fullständiga URL:en från svaret ordagrant och rendera de returnerade JSON-fälten i din app. Skapa, parsa eller normalisera inte URL:en.

Med en källhänvisnings-URL får följande exempel en åtkomsttoken för söktjänsten. De anropar URL:en med tokenen i Authorization-headern. Den inloggade identiteten behöver rollen Dataläsare för sökindex.

Azure AI-sökning SDK-dokumentsökningsmetoder kräver slutpunkt, indexnamn, dokumentnyckel, valda fält och API-version som separata indata. De accepterar inte en absolut källhänvisnings-URL. I de här exemplen används en autentiserad HTTP GET för att bevara den fullständiga tjänstgenererade URL:en.

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;

// citationUrl comes from a retrieve response
string citationUrl = "<citation-url>";

var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
    new TokenRequestContext(
        new[] { "https://search.azure.com/.default" }));

using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", token.Token);

string document = await httpClient.GetStringAsync(citationUrl);
Console.WriteLine(document);

Referens:DefaultAzureCredential

import json
from urllib.request import Request, urlopen

from azure.identity import DefaultAzureCredential

# citation_url comes from a retrieve response
citation_url = "<citation-url>"

credential = DefaultAzureCredential()
token = credential.get_token("https://search.azure.com/.default")
document_request = Request(
    citation_url,
    headers={"Authorization": f"Bearer {token.token}"},
)
with urlopen(document_request) as response:
    document = json.load(response)

print(json.dumps(document, indent=2))

Referens:DefaultAzureCredential

GET {{citation-url}}
Authorization: Bearer {{search-access-token}}

Referens:Dokument – Hämta

Dokumentsökningen returnerar de valda indexfälten som JSON:

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

Tänk på följande när du använder en källhänvisnings-URL:

  • Sök efter citationUrl innan du återger en källhänvisning. Det kan vara frånvarande om svaret utelämnar referenser eller om tjänsten inte kan matcha bakgrundsindexet eller dokumentnyckeln.

  • Om hämtningsbegäran innehåller x-ms-query-source-authorization för åtkomstkontroll på dokumentnivå använder du samma användartoken när du följer URL:en.

  • URL:en är endast giltig medan bakgrundsindexet och dokumentnyckeln förblir oförändrade.

Granska metadata för känslighetsetiketter i svaret (förhandsversion)

Samma tidsinställning som beskrivs i Framtvinga behörigheter vid frågetillfället gäller här: ändringar av 2026-08-01-preview åtkomstbehörigheter som du anger utanför kan ta tid att visas i 2026-08-01-preview hämta svar.

När du frågar en kunskapsbas som matar in Microsoft Purview känslighetsetiketter innehåller hämtningssvaret etikettmetadata på två nivåer:

Plats Fält Beskrivning
Efter referens sensitivityLabelInfo Känslighetsetiketten som tillämpas på varje dokument som returneras i matrisen references .
Svar metadata.responseSensitivityLabelInfo En aggregeringsetikett som representerar känslighetsetiketten med högst prioritet i alla refererade dokument i svaret. Användbart för visningsbanners på klientsidan och tillämpning av policyer.

Microsoft Graph beräknar etiketten på svarsnivån utifrån etiketterna för varje referens enligt Microsoft Purview-regler för etikettarv. Vanligtvis vinner den mest restriktiva etiketten.

I följande exempel visas ett hämtningssvar med två refererade dokument (ett Confidential, ett Internal) och den resulterande etiketten på svarsnivå.

{
  "response": [
    {
      "role": "assistant",
      "content": [
        { "type": "text", "text": "[ ... grounding data ... ]" }
      ]
    }
  ],
  "references": [
    {
      "type": "azureBlob",
      "id": "0",
      "activitySource": 1,
      "docKey": "contract-2026.pdf",
      "sensitivityLabelInfo": {
        "labelId": "<label-guid>",
        "labelName": "Confidential",
        "color": "#FF0000",
        "tooltip": "Confidential — Recipients can read but not forward.",
        "isEncrypted": true,
        "priority": 3
      },
      "sourceData": null
    },
    {
      "type": "azureBlob",
      "id": "1",
      "activitySource": 1,
      "docKey": "policy-overview.pdf",
      "sensitivityLabelInfo": {
        "labelId": "<label-guid>",
        "labelName": "Internal",
        "color": "#FFA500",
        "tooltip": "For internal use only.",
        "isEncrypted": false,
        "priority": 1
      },
      "sourceData": null
    }
  ],
  "metadata": {
    "responseSensitivityLabelInfo": {
      "labelId": "<label-guid>",
      "labelName": "Confidential",
      "color": "#FF0000",
      "tooltip": "Confidential — Recipients can read but not forward.",
      "isEncrypted": true,
      "priority": 3
    }
  }
}

Referenstyper som visar känslighetsetiketter

Fältnamnet och tillgängligheten för etikettmetadata beror på vilken kunskapskälla som skapade varje referens.

Referens type Etikettfält Tillgänglig när...
azureBlob sensitivityLabelInfo Blob-kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo OneLake-kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo Den SharePoint indexerade kunskapskällan innehåller sensitivityLabel i ingestionPermissionOptions.
searchIndex sensitivityLabelInfo Det underliggande indexet är inställt på purviewEnabled och har ett fält som är markerat med true.

Visnings- och granskningsrekommendationer

  • Använd sensitivityLabelInfo.labelId för att leta upp den fullständiga etikettdefinitionen via API:erna för Microsoft Graph känslighetsetikett när du behöver ytterligare egenskaper, till exempel principkontroller eller behörigheter.

  • Använd metadata.responseSensitivityLabelInfo för att återge en känslighetsbanderoll på svarsnivå eller tillämpa principkontroller, till exempel inaktivera kopiering och delning, i hela svaret.

  • Om din kunskapskälla pekar på ett segmenterat index, till exempel ett som fylls i via integrerad vektorisering eller en anpassad färdighet för textdelning, kontrollerar du att kunskapsuppsättningen projicerar känslighetsetiketten till varje segmentrad. Utan den här mappningen filtreras inte referenser på segmentnivå korrekt vid frågetillfället.

  • Mer information om granskningsbar administrativ åtkomst till etiketterat innehåll finns i Utökad läsning för administrativa undersökningar.

MCP-serverbeteende

MCP-slutpunkten som exponeras av varje kunskapsbas visar samma känslighetsetikettfält som REST-API:et. När en MCP-kompatibel klient anropar verktyget knowledge_base_retrieve innehåller verktygsresultatet samma referensvisa sensitivityLabelInfo och svarsnivå-metadata.responseSensitivityLabelInfo som dokumenterades tidigare i det här avsnittet. MCP-klienter tillämpar etikettmedvetna visnings- och principkontroller baserat på dessa fält.

Hämta åtgärdsexempel (förhandsversion)

I följande exempel visas olika sätt att anropa åtgärden hämta med hjälp av API-versionen 2026-08-01-preview . Den här versionen stöder den fullständiga funktionsuppsättningen, inklusive svarssyntes och ett konfigurerbart resonemang. Information om 2026-04-01 användning finns i föregående avsnitt.

Granska modellnamn i aktivitetsloggar

Ange includeActivity till true för att returnera modellidentitetsfält i modellbaserade aktivitetsposter. Använd de här fälten för att bekräfta vilken konfigurerad modell som hanterade frågeplanering, svarssyntes eller webbsammanfattning under en hämtningsbegäran. I följande exempel åsidosätts den lagrade resultatbearbetningen för den valda källan på begäran.

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

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

model_activity_types = (
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
)

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Referens:Kunskapshämtning – Hämta

Följande svarsutdrag visar den kapslade modellidentiteten:

{
  "activity": [
    {
      "type": "modelQueryPlanning",
      "id": 0,
      "model": {
        "modelName": "gpt-5-mini",
        "deploymentId": "gpt-5-mini-deployment"
      },
      "inputTokens": 1842,
      "outputTokens": 87,
      "elapsedMs": 1923
    },
    {
      "type": "searchIndex",
      "id": 1,
      "knowledgeSourceName": "operations-ks",
      "count": 12,
      "elapsedMs": 234
    },
    {
      "type": "modelAnswerSynthesis",
      "id": 2,
      "model": {
        "modelName": "gpt-5-mini",
        "deploymentId": "gpt-5-mini-deployment"
      },
      "inputTokens": 2418,
      "outputTokens": 179,
      "elapsedMs": 931
    }
  ]
}

Kräv att en kunskapskälla ska vara framgångsrik

Ange failOnError i knowledgeSourceParams för att markera en kunskapskälla som obligatorisk. Använd den här parametern när ett partiellt svar skulle vara vilseledande eller inkompatibelt om källan inte är tillgänglig. Begäran returnerar 502 Bad Gateway om en nödvändig källa misslyckas, även om en annan källa lyckas. Vägledning för hantering finns i Felsöka hämtningsåtgärden.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("Which HR policy applies?")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("hr-policy-ks")
    {
        FailOnError = true,
        AlwaysQuerySource = true
    }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("hr-faq-ks")
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referens:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="Which HR policy applies?")],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="hr-policy-ks",
            fail_on_error=True,
            always_query_source=True,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="hr-faq-ks",
        ),
    ],
)

result = kb_client.retrieve(request)

Referens:SearchIndexKnowledgeSourceParams

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

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "Which HR policy applies?" }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "hr-policy-ks",
            "kind": "searchIndex",
            "failOnError": true,
            "alwaysQuerySource": true
        },
        {
            "knowledgeSourceName": "hr-faq-ks",
            "kind": "searchIndex"
        }
    ]
}

Referens:Kunskapshämtning – Hämta

Undanta en kunskapskälla från en begäran

Från och med 2026-08-01-preview API-versionen anger du neverQuerySource till true för varje kunskapskälla som du vill undanta från en hämtningsbegäran. Begärandetid neverQuerySource åsidosätter ett lagrat alwaysQuerySource värde för den begäran utan att ändra det lagrade värdet.

I följande exempel efterfrågas en kunskapsbas som innehåller product-docs-ks och troubleshooting-ks, exklusive troubleshooting-ks från begäran.

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

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referens:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Explain the official SSO provisioning steps."
                )
            ],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-docs-ks",
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="troubleshooting-ks",
            never_query_source=True,
        ),
    ],
)

result = kb_client.retrieve(request)

Referens:SearchIndexKnowledgeSourceParams

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

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Explain the official SSO provisioning steps."
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "product-docs-ks",
            "kind": "searchIndex"
        },
        {
            "knowledgeSourceName": "troubleshooting-ks",
            "kind": "searchIndex",
            "neverQuerySource": true
        }
    ]
}

Referens:Kunskapshämtning – Hämta

Justera kandidatsdokument för varje kunskapskälla

maxOutputDocuments Ange knowledgeSourceParams för att begränsa hur många kandidatdokument en specifik kunskapskälla bidrar med innan du väljer det slutliga resultatet. Använd den här parametern när du vill binda indata från en källa till pipelinen utan att påverka andra.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What safety procedures apply?")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("operations-ks")
    {
        MaxOutputDocuments = 50
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referens:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What safety procedures apply?")],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="operations-ks",
            max_output_documents=50,
        ),
    ],
)

result = kb_client.retrieve(request)

Referens:SearchIndexKnowledgeSourceParams

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

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What safety procedures apply?" }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "operations-ks",
            "kind": "searchIndex",
            "maxOutputDocuments": 50
        }
    ]
}

Referens:Kunskapshämtning – Hämta

Begränsa slutgiltiga grunddokument

Parametern på den översta nivån maxOutputDocuments begränsar hur många grunddokument som returneras i det slutliga hämtningssvaret. Använd den här parametern när programmet behöver en förutsägbar källhänvisning eller referensantal.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What is the return policy?")
        }
    ) { Role = "user" }
);
retrievalRequest.OutputMode = "extractedData";
retrievalRequest.MaxOutputDocuments = 3;
retrievalRequest.MaxOutputSizeInTokens = 6000;

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referens:KnowledgeBaseRetrievalRequest

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What is the return policy?")],
        )
    ],
    output_mode="extractedData",
    max_output_documents=3,
    max_output_size_in_tokens=6000,
)

result = kb_client.retrieve(request)

Referens:KnowledgeBaseRetrievalRequest

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

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What is the return policy?" }
            ]
        }
    ],
    "outputMode": "extractedData",
    "maxOutputDocuments": 3,
    "maxOutputSizeInTokens": 6000
}

Referens:Kunskapshämtning – Hämta

I följande tabell visas hur maxOutputDocuments och maxOutputSizeInTokens interagerar mellan alla fyra kombinationerna.

maxOutputDocuments maxOutputSizeInTokens Behavior
Ospecificerad Ospecificerad Använder standardbeteendet maxOutputSizeInTokens för svarsgräns.
Ospecificerad Angivet Tar bort dokument när gränsen för nyttolaststorlek har nåtts.
Angivet Ospecificerad Returnerar upp till det angivna antalet grunddokument och tillämpar maxOutputSizeInTokens ingen gräns.
Angivet Angivet Returnerar upp till maxOutputDocuments dokument eller hur många dokument som får plats under maxOutputSizeInTokens, beroende på vilken gräns som gäller först.

Verifiera att kunskapsbasen hämtar standardvärden

En kunskapsbas kan lagra standardinställningar för hela begäran i retrieveDefaults. Skicka två hämtningsförfrågningar för att verifiera ärvning och förfrågningsspecifika åsidosättningar.

Innan du börjar slutför du Konfigurera standardbegränsningar för hämtning (förhandsversion). Den första begäran utelämnar alla tre gränserna för hela begäran, så de lagrade värdena på 45 sekunder, åtta dokument och 12 000 token gäller. Den andra begäran åsidosätter dem med 20 sekunder, ett dokument och 5 000 token.

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

string searchEndpoint = "<search-endpoint>";

var options = new SearchClientOptions(
    SearchClientOptions.ServiceVersion.V2026_08_01_Preview);
var kbClient = new KnowledgeBaseRetrievalClient(
    new Uri(searchEndpoint),
    "your-knowledge-base",
    new DefaultAzureCredential(),
    options);

KnowledgeBaseRetrievalRequest CreateRequest()
{
    var request = new KnowledgeBaseRetrievalRequest();
    request.Intents.Add(new KnowledgeRetrievalSemanticIntent(
        "Summarize the latest support guidance."));
    return request;
}

var inherited = await kbClient.RetrieveAsync(CreateRequest());
Console.WriteLine(
    $"Stored defaults: {inherited.Value.References.Count} references");

KnowledgeBaseRetrievalRequest overriddenRequest = CreateRequest();
overriddenRequest.MaxRuntimeInSeconds = 20;
overriddenRequest.MaxOutputDocuments = 1;
overriddenRequest.MaxOutputSize = 5000;

var overridden = await kbClient.RetrieveAsync(overriddenRequest);
Console.WriteLine(
    $"Request overrides: {overridden.Value.References.Count} references");

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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


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


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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Skicka först en begäran som utelämnar de tre gränsfälten för hela begäran.

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

{
  "intents": [
    {
      "type": "semantic",
      "search": "Summarize the latest support guidance."
    }
  ]
}

Åsidosätt sedan alla tre värdena för en begäran.

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

{
  "intents": [
    {
      "type": "semantic",
      "search": "Summarize the latest support guidance."
    }
  ],
  "maxRuntimeInSeconds": 20,
  "maxOutputDocuments": 1,
  "maxOutputSize": 5000
}

Referens:Kunskapshämtning – Hämta

Referensantalet visar om värdet på den lagrade nivån eller begärandenivån maxOutputDocuments gäller: det första svaret innehåller högst åtta referenser och det andra innehåller högst en. Ett svar kan innehålla färre referenser när färre dokument matchar. Svaret redovisar inte den effektiva körtiden eller tokenbudgeten för utdata, men dessa värden styr fortfarande hur begäranden behandlas. Åsidosättningar i begäran ändrar inte de lagrade standardvärdena.

Åsidosätt standardinsats för resonemang och ange begränsningar för förfrågningar

I följande exempel anges svarssyntes, så hämtningsskälet måste vara low eller medium. Det anger också maxRuntimeInSeconds för att begränsa hämtningens körtid och maxOutputSizeInTokens för att begränsa storleken på svarsnyttolasten.

maxRuntimeInSeconds accepterar värden från 10 till 600 sekunder och är som standard 90 sekunder. Maxvärdet på 600 sekunder (10 minuter) gäller endast för Azure AI-sökning hämta begäran.

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Referens:Kunskapshämtning – Hämta

Låt tjänsten välja resonemangsinsatsen

Ange retrievalReasoningEffort.kind till auto i en hämtningsbegäran för att åsidosätta standardvärdet för kunskapsbasen. Mer information om automatiska resonemang finns i Ange hämtningsskäl (förhandsversion).

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

Referens:Kunskapshämtning – Hämta

Ange referenser för varje kunskapskälla

Använd includeReferences och includeReferenceSourceData i knowledgeSourceParams för att styra vilka källor som visas i referensmatrisen och hur mycket källdata varje post innehåller. I följande exempel används kunskapsbasens standardmässiga resonemang.

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

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Referens:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

Referens:Kunskapshämtning – Hämta

Använd minimalt resonemang

I följande exempel finns det ingen LLM för intelligent frågeplanering eller svarssyntes. Frågesträngen går till den agentiska hämtningsmotorn för nyckelordssökning eller hybridsökning.

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Referens:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Referens:Kunskapshämtning – Hämta

Felsöka hämtningsåtgärden

I 2026-08-01-preview anger svarsstatusen om hämtningen lyckades, lyckades delvis eller misslyckades, och vad du ska göra härnäst. Använd följande tabell för att mappa varje status till dess betydelse och se sedan motsvarande avsnitt för felsökningsvägledning.

Status Meaning
200 OK Hämtningen lyckades. Ett dokument kan fortfarande utelämnas om dess innehåll överskrider utdatabudgeten. Mer information finns i Tomma svar.
400 Bad Request Valideringen av hämtningsbegäran misslyckades innan hämtningen påbörjades.
206 Partial Content Minst en källa lyckades och ingen misslyckad källa har markerats failOnError. Svaret innehåller resultat från de källor som lyckades.
502 Bad Gateway Varje vald källa misslyckades eller så misslyckades en källa som markerats failOnError: true .

För alla svar som inte är 200, registrera API-versionen, tidsstämpeln, den sanerade begärandetexten, svarshuvudena och begärande- eller korrelations-ID:t. Den här informationen hjälper dig att diagnostisera felet och dela problemet med support om det behövs.

400 Bad Request

Använd felet på den översta nivån för att identifiera den ogiltiga begärandeegenskapen. Vanliga orsaker är bland annat:

  • En knowledgeSourceName i knowledgeSourceParams är inte ansluten till kunskapsbasen, eller så stämmer dess kind inte överens med den anslutna källan.
  • Ett begärandevärde ligger utanför det intervall som stöds, eller ett alternativ kräver ett annat alternativ som inte är aktiverat. Till exempel kräver includeReferenceSourceDataincludeReferences.
  • retrievalReasoningEffort.kind är auto, men begäran använder en TIDIGARE API-version än 2026-08-01-preview.
  • Begäran använder auto, low, eller medium, men kunskapsbasen definierar inte en modell.
  • För källuteslutning vid begärandetillfället (förhandsversion) anger samma post både alwaysQuerySource och neverQuerySource till true, annars utesluts alla anslutna kunskapskällor.

Innan du försöker skicka begäran igen, korrigera egenskapen som identifieras av felet på högsta nivån.

206 Partial Content

Granska varje activity post som innehåller en error. En källhämtningsaktivitet identifierar den misslyckade kunskapskällan och en modellaktivitet identifierar den misslyckade bearbetningsfasen. Svarstexten innehåller fortfarande de resultat som lyckades.

Vanliga orsaker för fel vid källhämtningsaktivitet är:

  • Ogiltiga frågetidsindata, till exempel ett felaktigt filterAddOn uttryck.
  • Kunskapskällans eller indexkonfigurationens drift, till exempel ett omdöpt fält, semantisk konfiguration saknas eller ogiltig vektoriserare.
  • Saknade eller ogiltiga beroendeauktoriseringar eller otillräckliga behörigheter för den identitet som används för att fråga källan.
  • Beroendebegränsning, tidsgräns eller tillfälliga tillgänglighetsfel.

För ett modellaktivitetsfel använder du aktiviteten type för att identifiera den misslyckade bearbetningsfasen. Ett fel indikerar till exempel modelWebSummarization att sammanfattningen av webbresultat misslyckades.

Om programmet tillåter partiella resultat bearbetar du de lyckade resultaten och registrerar varje misslyckad källa eller modellfas. Korrigera konfigurations-, auktoriserings- och behörighetsfel innan du försöker igen. Vid strypning, tidsgränsöverskridanden eller tillfälliga tillgänglighetsproblem använder du begränsade återförsök med ökande väntetid.

Om resultatet är osäkert utan en specifik källa och dess källtyp stöder alwaysQuerySourceanger du både alwaysQuerySource och failOnError. Det första alternativet säkerställer att källan är markerad och det andra returnerar ett hårt fel om frågan misslyckas. MCP-serverns kunskapskällor (förhandsversion) stöder alwaysQuerySourceinte . För dessa källor failOnError gäller endast när källan har valts. failOnError gäller inte för modellaktivitetsfel.

502 Bad Gateway

Felet på högsta nivån beskriver ett av två allvarliga felutfall:

  • Varje vald källa misslyckades: Varje vald källa returnerade ett fel. En källa som slutförs utan några matchande dokument är inte en källa som har misslyckats. Kontrollera varje källfel för ett problem med delad konfiguration, auktorisering, beroende eller tillgänglighet.
  • En failOnError källa misslyckades: Det gick inte att fråga en nödvändig källa. Andra källor kan ha lyckats, men tjänsten returnerar inte ett partiellt resultat eftersom den nödvändiga källan misslyckades.

De underliggande källfelen är vanligtvis samma typer som de som beskrivs för 206 Partial Content: ogiltig källspecifik indata, käll- eller indexkonfigurationsavvikelse, beroendeauktorisering eller behörigheter, begränsning, tidsgränser eller tillfällig beroendetillgänglighet.

Ett hårt 502 svar kan utelämna matrisen activity och ange källnamnet och det underliggande felet endast i felmeddelandet på den översta nivån. Korrigera konfigurations-, auktoriserings- och behörighetsfel innan du försöker igen. Använd ett begränsat antal återförsök med gradvis ökande väntetid endast vid strypning, tidsgränsöverskridanden eller tillfälliga tillgänglighetsfel. Tolka inte ett 502 Bad Gateway svar som ett Azure AI-sökning avbrott utan att undersöka det underliggande källfelet.

Tomma svar

Söksteget kan hitta ett dokument, men tjänsten kan fortfarande utelämna det från det slutliga svaret om dess grundade innehåll överskrider maxOutputSizeInTokens utdatabudgeten (maxOutputSize i 2026-05-01-preview och senare). När det här villkoret inträffar visar aktivitetsmatrisen att matchningar hittades och aktivitetsposten innehåller en varning om att det mest relevanta dokumentet överskred den maximala utdatastorleken. Referensmatrisen och det jordade svarsinnehållet är tomma för dokumentet. Om du vill behålla mer innehåll ökar du maxOutputSizeInTokens.

För att undvika det här beteendet indexeras stora källdokument som mindre segment med stabila identifierare och källmetadata. Detta gäller särskilt för långa handböcker, principer eller kunskapsbasartiklar.

Anropa MCP-slutpunkten

Varning

MCP-implementeringar är mottagliga för risker, till exempel attacker, sammanhängande fel och förlust av mänsklig tillsyn. Du kan minska dessa risker genom att granska MCP-servrar för säkerhet och tillförlitlighet, enligt bästa praxis för Microsoft och industry och implementera godkännandemekanismer och övervakning av sammanhängande beteenden.

MCP är ett öppet protokoll som standardiserar hur AI-program ansluter till externa datakällor och verktyg.

I Azure AI-sökning är varje kunskapsbas en fristående MCP-server som exponerar verktyget knowledge_base_retrieve. Alla MCP-kompatibla klienter, inklusive Foundry Agent Service, GitHub Copilot, Claude och Cursor, kan anropa det här verktyget för att köra frågor mot kunskapsbasen.

Autentisera till MCP-slutpunkten

Varje kunskapsbas har en MCP-slutpunkt på följande URL:

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

Den API-version som du anger avgör vad anslutningen returnerar. Genom att använda 2026-08-01-preview returnerar kunskapsbasen syntetiserade svar när den underliggande kunskapsbasen är konfigurerad med en LLM och en kompatibel resonemangsnivå. Med hjälp av 2026-04-01är hämtning alltid minimalt och extraherande, och anslutningen returnerar endast jordningsdata.

Hur du autentiserar till den här slutpunkten beror på din MCP-klient. När du använder Azure OpenAI Responses API tillsammans med MCP-verktyget knowledge_base_retrieve autentiserar du både anropet till Azure OpenAI Responses API och MCP-begäran till Azure AI-sökning. Om MCP-klienten anropar den här slutpunkten direkt autentiserar du dig bara mot Azure AI-sökning.

Använd någon av följande metoder för Azure AI-sökning autentisering:

Observera

MCP-klienter konfigurerar anpassade rubriker på olika sätt. Foundry Agent Service matar till exempel in huvuden via projektanslutningar, medan klienter som GitHub Copilot kräver rubriker i MCP-serverns JSON.

Använda en ägartoken för MCP-autentisering

Den rekommenderade metoden för MCP-autentisering är en ägartoken som undviker att lagra känsliga nycklar i konfigurationsfiler. Identiteten bakom token måste ha rollen Dataläsare för sökindex tilldelad i söktjänsten. Mer information finns i Anslut appen till Azure AI-sökning med hjälp av identiteter.

#pragma warning disable OPENAI001

using Azure.AI.OpenAI;
using Azure.Core;
using Azure.Identity;
using OpenAI.Responses;
using System;
using System.Collections.Generic;

string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!; // Example: https://<resource-name>.openai.azure.com
string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
DefaultAzureCredential credential = new();

// Create the Azure OpenAI Responses client
AzureOpenAIClient azureClient = new(new Uri(openAiEndpoint), credential);
ResponsesClient openAIClient = azureClient.GetResponsesClient();

// Get a bearer token for Azure AI Search
string searchToken = credential.GetToken(
    new TokenRequestContext(new[] { "https://search.azure.com/.default" })
).Token;

// Configure the MCP tool for knowledge base retrieval
McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "search_kb",
    serverUri: new Uri(mcpServerUrl),
    headers: new Dictionary<string, string>
    {
        ["Authorization"] = $"Bearer {searchToken}",
    },
    allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);

// Build the response request with the MCP tool attached
CreateResponseOptions options = new()
{
    Model = "MODEL_NAME",
    InputItems =
    {
        ResponseItem.CreateUserMessageItem(
            "What causes the strongest nighttime brightness patterns in this dataset?")
    },
    Tools = { mcpTool }
};

ResponseResult response = await openAIClient.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText());

Referens:Använd Azure OpenAI Responses API

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

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

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

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

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

print(response.output_text)

Referens:Använd Azure OpenAI Responses API

// This code snippet is currently unavailable.

Använda en administratörsnyckel för MCP-autentisering

En administratörsnyckel ger fullständig läs- och skrivåtkomst till söktjänsten, så använd den bara i utvecklingsmiljöer eller när en ägartoken inte är tillgänglig. Mer information finns i Anslut till Azure AI-sökning med hjälp av API-nycklar.

Tip

I följande exempel visas endast rubriken som skiljer sig från exemplet med ägartoken. Fullständig konfiguration finns i Använda en ägartoken för MCP-autentisering.

#pragma warning disable OPENAI001

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

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

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

Referens:Använd Azure OpenAI Responses API

import os

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

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

Referens:Använd Azure OpenAI Responses API

// This code snippet is currently unavailable.

Granska MCP-svaret

När en MCP-klient anropar knowledge_base_retrievefår den ett MCP-verktygsresultat i stället för hämtningsåtgärdens response, activityoch references kuvert. Många MCP-klienter visar verktygets resultat under ett objekt på den översta nivån result , så nyttolasten du bör förvänta dig är result.content[].

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

Viktiga punkter:

  • result.content[] innehåller mcp-verktygets utdata som returneras av kunskapsbasen.

  • result.content[].type är text.

  • result.content[].text innehåller hämtade jordningsdata som en JSON-kodad sträng.

  • Till skillnad från hämtningsåtgärden returnerar det aktuella MCP-svaret inte separata matriserna activity eller references, och det fyller inte i posterna i resource för det returnerade innehållet.