Interrogare una base di conoscenza usando l'azione di recupero o l'endpoint MCP.

Nota

Azure AI Search è disponibile tramite il portale di Azure, le API REST e Azure SDK. È inoltre alla base di Foundry IQ, il livello di conoscenza gestito che trasforma il contenuto aziendale in knowledge base riutilizzabili e con riconoscimento delle autorizzazioni per gli agenti nel portale di Microsoft Foundry.

Importante

Le funzionalità, le funzionalità o le proprietà contrassegnate (anteprima) non sono coperte da un contratto di servizio, non sono consigliate per i carichi di lavoro di produzione e potrebbero cambiare o essere vincolate prima che diventino disponibili a livello generale. Le condizioni di anteprima Azure AI Search si applicano a tutte le funzionalità di anteprima, indipendente o parte di una funzionalità disponibile a livello generale.

In una pipeline di recupero agentico, l'azione di recupero richiama l'elaborazione parallela delle query da una Knowledge Base. È possibile chiamare l'azione di recupero direttamente usando le API REST del servizio di ricerca o un Azure SDK. Ogni Knowledge Base espone anche un endpoint MCP (Model Context Protocol) per l'utilizzo da parte di agenti compatibili con MCP.

Questo articolo spiega come chiamare entrambi i metodi di recupero con l'applicazione facoltativa delle autorizzazioni. Copre prima l'azione di recupero e l'endpoint MCP in un secondo momento perché il risultato dello strumento MCP è attualmente diverso dalla forma di risposta REST e SDK.

Per configurare una pipeline che connette Azure AI Search al servizio Agente Foundry tramite MCP, vedere Tutorial: Creare una soluzione di recupero agenti end-to-end.

Supporto per l'utilizzo

Portale di Azure Portale di Microsoft Foundry .NET SDK Python SDK JAVA SDK JavaScript SDK API REST
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Prerequisiti

  • Se si utilizza l'endpoint MCP tramite l'API Responses di Azure OpenAI, sono necessari:

    • Un modello LLM distribuito e il ruolo Utente OpenAI di Servizi cognitivi, oppure una chiave API, nella risorsa Foundry. È possibile riutilizzare l'LLM e la risorsa specificata nella Knowledge Base, se applicabile.

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

  • Pacchetto Azure.Search.Documents obbligatorio:

    • Per le funzionalità 2026-08-01-preview, il pacchetto di anteprima più recente: dotnet add package Azure.Search.Documents --prerelease

    • Per le funzionalità 2026-04-01, l’ultima versione stabile del pacchetto: dotnet add package Azure.Search.Documents

  • Per l'autenticazione senza chiave, il Azure.Identity pacchetto: dotnet add package Azure.Identity

  • Se si utilizza l'endpoint MCP tramite l'API Responses di Azure OpenAI, sono necessari:

    • Un modello LLM distribuito e il ruolo Utente OpenAI di Servizi cognitivi, oppure una chiave API, nella risorsa Foundry. È possibile riutilizzare l'LLM e la risorsa specificata nella Knowledge Base, se applicabile.

    • Pacchetto openai : pip install openai

  • Pacchetto azure-search-documents obbligatorio:

    • Per le funzionalità 2026-08-01-preview, il pacchetto di anteprima più recente: pip install --pre azure-search-documents

    • Per le funzionalità 2026-04-01, l’ultima versione stabile del pacchetto: pip install azure-search-documents

  • Per l'autenticazione senza chiave, il azure-identity pacchetto: pip install azure-identity

Limitations

Per le fonti delle informazioni dell'indice di ricerca, quando si abilita il reranking, il recupero usa la configurazione semantica della fonte delle informazioni. Non applica i profili di punteggio dell'indice sottostante, incluso defaultScoringProfile. Anche le risposte di recupero non mostrano @search.rerankerBoostedScore.

Chiamare l'azione di recupero

Specificare l'azione di recupero in una knowledge base. Il corpo della richiesta include l'input della query e un elenco facoltativo di fonti di conoscenza da destinare.

La versione 2026-04-01 dell'API supporta solo l'input intents e un recupero estrattivo minimo. Le capacità di sola anteprima, tra cui l'input messages, la pianificazione delle query, la sintesi delle risposte e il ragionamento configurabile, non sono supportate. Usare 2026-08-01-preview per la funzionalità completa.

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Riferimento:Recupero della Conoscenza - Recupero

Fornire immagini per rispondere alla sintesi (anteprima)

Per le origini di conoscenza blob, OneLake indicizzato e SharePoint indicizzato configurate con un archivio di asset, è possibile fornire al modello downstream per la sintesi delle risposte le immagini incorporate nei documenti insieme al testo. Impostare enableImageServing sulla voce corrispondente in knowledgeSourceParams per eseguire l'override dell'impostazione predefinita impostata nella definizione della Knowledge Base. La risposta di recupero non include campi dedicati per i singoli percorsi di immagine o byte di immagine forniti al modello.

La distribuzione delle immagini funziona solo quando outputMode è answerSynthesis e non è supportata per le fonti di conoscenza che configurano ingestionPermissionOptions. Per le istruzioni di configurazione, la tabella delle priorità e le modalità di consultazione delle statistiche relative alla distribuzione delle immagini, consultare Immagini incorporate nei documenti in Surface nel recupero agentico (anteprima).

Disattivare il reranking per una fonte delle informazioni (anteprima)

A partire dalla versione API 2026-08-01-preview, impostare "resultsProcessing": "none" su un oggetto knowledgeSourceParams per bypassare il reranking per una specifica fonte delle informazioni e preservare l'ordine dei risultati sottostante. Puoi anche salvare resultsProcessing come predefinito nell'origine dati. Tutti i tipi di origine delle informazioni supportano questa proprietà.

Nell'esempio seguente viene ignorato il reranking per product-catalog-ks in una richiesta di recupero.

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

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

Riferimento:Recupero della Conoscenza - Recupero

Impostare "resultsProcessing": "rerank"o ometterlo quando non esiste alcun valore predefinito archiviato, per usare la pipeline di reranking. Azure AI Search risolve il valore effettivo per ogni origine in questo ordine:

  1. resultsProcessing in knowledgeSourceParams nella richiesta di recupero.
  2. resultsProcessing archiviato nella fonte delle informazioni.
  3. rerank quando nessuna delle proprietà è presente.

Per una knowledge source del server MCP, un valore resultsProcessing specificato per un singolo strumento ha la precedenza rispetto alla richiesta e ai valori archiviati.

Tip

resultsProcessing modifica il modo in cui vengono elaborati i risultati, non le fonti che vengono interrogate. Impostare alwaysQuerySource su true se è necessario interrogare la fonte di conoscenza.

Quando il valore effettivo è none:

  • I riferimenti dalla fonte di conoscenza omettono rerankerScore, e i risultati mantengono il loro ordine originario nell'attività di recupero della fonte.
  • Quando una qualsiasi origine bypassa il reranking, Azure AI Search distribuisce i risultati finali tra le attività in modalità round-robin, seguendo l'ordine di dichiarazione delle origini della conoscenza. Le attività riclassificate rimangono ordinate per punteggio.
  • I limiti di deduplicazione e per origine, documento e token sono ancora applicabili, quindi non tutti i risultati recuperati vengono visualizzati nella risposta.

Azure AI Search convalida rerankerThreshold in questo ordine:

  1. La ricerca risolve resultsProcessing dalla richiesta retrieve e dal valore memorizzato della fonte di conoscenza.
  2. Se il valore risolto è none e la richiesta include rerankerThreshold, la ricerca restituisce 400 Bad Request.
  3. Per uno strumento del server MCP, Search applica il valore resultsProcessing a livello di strumento dopo aver convalidato la richiesta.

Di conseguenza, un'impostazione dello strumento MCP non cambia se la richiesta supera la convalida. Un valore a livello none di strumento non causa un errore di soglia e un valore a livello rerank di strumento non impedisce un errore quando la richiesta o il valore archiviato viene risolto in none.

Per confermare quale modalità è stata eseguita, controlla se i riferimenti della fonte di conoscenza includono rerankerScore. Non fare affidamento su semanticConfigurationName, che può essere null anziché omesso.

Comportamento dell'indice di ricerca

Per le origini delle informazioni destinate a un indice di ricerca, il tipo di query implicito è semantice non esiste alcuna modalità di ricerca. Durante il riordinamento delle esecuzioni, l'esecuzione della query utilizza semanticConfigurationName. Altre impostazioni di origine, tra cui searchFields e sourceDataFields, si applicano in entrambe le modalità.

Il recupero agentico non accetta input scoringProfile o scoringParameters. Se hai bisogno di dare priorità alla recentezza per le fonti di conoscenza indicizzate, usa il recupero sensibile alla freschezza (anteprima) anziché un profilo di assegnazione dei punteggi dell'indice.

Se l'indice include campi vettoriali, è necessaria una definizione di vettore valida in modo che il motore di recupero agentico possa vettorizzare gli input di query. In caso contrario, i campi vettoriali vengono ignorati.

Per altre informazioni, vedere Creare un indice per il recupero agentico.

Risultati di recupero dello stream (anteprima)

A partire dalla versione dell'API 2026-08-01-preview , è possibile ricevere i risultati di recupero come flusso di eventi inviati dal server invece di attendere una singola risposta JSON. Usando lo streaming, il client può visualizzare la pianificazione delle query, l'attività di origine e la risposta sintetizzata o estratta in tale ordine man mano che ogni parte diventa disponibile.

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

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

Reference:KnowledgeBaseRetrievalClient

Per acconsentire esplicitamente allo streaming, includere l'intestazione Accept: text/event-stream in una richiesta di recupero. Senza questo header, l'azione di recupero restituisce la risposta JSON predefinita.

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

Riferimento:Recupero della Conoscenza - Recupero

Ciclo di vita dell'evento

Anziché restituire una singola risposta, il servizio mantiene aperta una connessione HTTP (tipo di text/event-stream; charset=utf-8contenuto ) e invia una sequenza di eventi man mano che i dati diventano disponibili. Ogni evento ha una event: riga che denomina il tipo di evento, una data: riga con un valore JSON e una riga vuota che contrassegna la fine dell'evento.

Un flusso riuscito usa il ciclo di vita seguente:

Event Quando viene inviato Che cosa contiene
retrieval.started Primo evento di ogni richiesta in streaming. L'ID della richiesta, il nome della knowledge base, la modalità di output e lo sforzo di ragionamento effettivo dopo che il servizio ha risolto i valori predefiniti della richiesta e della knowledge base. Se il valore effettivo kind è auto, l'evento segnala auto; non predice una successiva escalation.
activity.started Quando il servizio inizia un'attività di pianificazione delle query, relativa all'origine o al modello. È possibile avviare più attività prima del completamento di un'attività precedente. L'attività id, type, l'ora di inizio e il nome facoltativo della fonte di conoscenza.
activity.completed Quando tale attività termina. Correlalo al relativo evento id facendo corrispondere activity.started. Il record dell’attività completato.
answer.completed Una volta, solo quando outputMode è answerSynthesis. messageIndex identifica la posizione del messaggio nella matrice di risposta finale e message contiene la risposta sintetizzata completa. Non esiste alcun evento delta token per token.
references.completed Dopo la risoluzione di tutti i riferimenti. I dati dell'evento sono la matrice di riferimenti completi, senza un wrapper di oggetto.
response.completed L'evento terminale di un flusso completato con successo o parzialmente con successo. il codice di stato 200 o 206 e il corpo completo della risposta della richiesta di recupero, che ha la stessa struttura di una chiamata JSON senza streaming. Per informazioni sul significato di ogni codice di stato, vedere Risolvere i problemi relativi all'azione di recupero.
error Invece di references.completed e response.completed se il recupero non riesce dopo l'apertura del flusso. Errore ed eventuali record di attività completati prima dell'errore.

Gli eventi arrivano in ordine. Ogni evento activity.started precede l'evento activity.completed con lo stesso id, ma le attività possono intersecarsi. I record delle attività completate includono anche i timestamp startedAt e completedAt. Mentre il flusso è inattivo, il server invia un commento : heartbeat all'incirca ogni 15 secondi per mantenere aperta la connessione. I client SSE possono ignorare questi commenti.

L'esempio seguente mostra una risposta trasmessa, con payload abbreviati per la leggibilità.

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

Gestire gli errori, l'annullamento e il fallback

  • Errori preliminari: se la convalida della richiesta ha esito negativo prima dell'apertura del flusso, ad esempio per un corpo di richiesta in formato non valido, l'azione di recupero restituisce una risposta di errore JSON standard e non apre mai il flusso.

  • Errori midstream: se il recupero ha esito negativo dopo l'apertura del flusso, l'evento del terminale è error invece di references.completed e response.completed. L'evento può includere tutti i record di attività completati prima dell'errore. Il codice di stato HTTP rimane 200 dopo l'avvio del flusso, quindi controllare l'evento del terminale, non il codice di stato HTTP, per determinare l'esito positivo.

  • Annullamento o disconnessione: se il client annulla la richiesta o si disconnette prima del completamento del flusso, il servizio annulla il recupero e termina il flusso senza un evento terminale. Considera incompleti tutti gli eventi ricevuti prima dell'annullamento o della disconnessione.

  • Fallback JSON: Con 2026-08-01-preview, un'intestazione Accept mancante o un valore come application/json, */*, text/* o text/event-stream;q=0 restituisce la risposta JSON standard descritta in Esaminare la risposta. La richiesta di text/event-stream da una versione precedente dell'API restituisce 406 Not Acceptable.

Filtrare le origini delle informazioni sugli indici di ricerca in fase di query

Quando si recupera da una fonte di conoscenze dell'indice di ricerca, è possibile applicare un filtro OData al momento della query per restringere i risultati a documenti o campi specifici. L'espressione di filtro usa la sintassi OData e viene passata tramite il filterAddOn parametro .

Sintassi di filtro ed esempi

Il filterAddOn parametro accetta espressioni di filtro OData. I modelli di esempio includono:

  • Campi dei metadati: city eq 'Phoenix', status eq 'active'
  • Intervalli di date: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Intervalli numerici: price ge 100 and price le 5000
  • Corrispondenza del testo: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Operatori logici: (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'"
        }
    ]
}

Esempio di filtro multiplo

È possibile combinare più filtri per perfezionare ulteriormente i risultati.

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

Sovrascrivere i suggerimenti di query archiviati in fase di esecuzione della query (anteprima)

A partire dalla versione dell'API 2026-08-01-preview, è possibile sovrascrivere i suggerimenti per la query archiviati in una fonte delle informazioni di un indice di ricerca per una singola richiesta di recupero impostando queryHintOverrides nella relativa voce knowledgeSourceParams.

La sovrascrittura sostituisce l'intero oggetto queryHints archiviato, anziché unirne le singole voci, quindi includere tutti i suggerimenti che si desidera applicare. Omettere queryHintOverrides per usare i hint memorizzati.

Quando il livello di effort del ragionamento per il recupero non è minimal, una risposta HTTP 400 dipende dagli hint di filtro memorizzati, non dal contenuto dell'override o dal tipo di boost. Il servizio convalida gli hint di filtro archiviati rispetto al modello di Knowledge Base prima di applicare queryHintOverrides. Pertanto, un modello della famiglia GPT-4o o GPT-4.1 rifiuta la richiesta anche quando l'override è vuoto o contiene solo incrementi. I boost memorizzati da soli non attivano questa validazione. Usare un modello compatibile o rimuovere prima gli hint di filtro archiviati.

L'esempio seguente sostituisce tutti gli hint memorizzati con un unico boost fieldValue per i contenuti in giapponese. Il servizio non applica alcun filtro archiviato o un altro boost archiviato a questa richiesta.

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

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

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

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

var result = await retrievalClient.RetrieveAsync(request);

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

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

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

result = retrieval_client.retrieve(request)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

Riferimento:Recupero della Conoscenza - Recupero

Per confermare che il servizio abbia applicato l'override, imposta includeActivity nella richiesta ed esamina l'attività searchIndex restituita. L'oggetto queryHintProcessing segnala ciò che il modello ha generato. In questo esempio, contiene un generatedBoost per il potenziamento della lingua, ma non generatedFilter perché la sostituzione ha rimpiazzato il suggerimento di filtro memorizzato. Poiché gli hint per la query sono ottimali, considerare questa attività come conferma anziché verificare la presenza di un'espressione esatta.

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

Per la definizione archiviata, i tipi di hint supportati e la composizione con filtri deterministici, vedere Configurare hint per la query (anteprima).

Applicazione delle autorizzazioni al momento della query (anteprima)

Le modifiche ai permessi di accesso impostati al di fuori di 2026-08-01-preview possono richiedere del tempo prima di comparire nei risultati di recupero di 2026-08-01-preview.

Se le fonti di conoscenza contengono contenuti protetti da autorizzazioni, inoltrate l'identità dell'utente finale nella richiesta di recupero in modo che ogni utente veda solo i contenuti a cui è autorizzato ad accedere. Per le fonti indicizzate, il motore di recupero usa questo identificatore per filtrare i risultati e, se questo viene omesso, restituisce risultati non filtrati. Le origini remote usano anche l'autorizzazione della richiesta di recupero, ma applicano i permessi a livello di origine e potrebbero richiedere un token e un'intestazione specifici per l'origine.

L'applicazione delle autorizzazioni ha due parti:

  • Tempo di inserimento: Solo per le origini della conoscenza indicizzate, impostare ingestionPermissionOptions per ingerire i metadati delle autorizzazioni insieme al contenuto.

  • Tempo della query: Trasmettere l'autorizzazione dell'utente nell'header richiesto dalla fonte di conoscenza. La maggior parte delle fonti usa x-ms-query-source-authorization. L'eccezione è Work IQ, che usa x-ms-query-work-iq-source-authorization.

Configurazione al momento dell'ingestione

La tabella seguente illustra le origini delle informazioni che richiedono la configurazione in fase di inserimento e il modo in cui ogni origine applica le autorizzazioni.

Origine delle conoscenze Richiede ingestionPermissionOptions Modalità di applicazione delle autorizzazioni
BLOB o ADLS Gen2 ✅ Ambiti RBAC, ACL o Microsoft Purview importati e confrontati con l'identità dell'utente.
OneLake ✅ I livelli di riservatezza di Microsoft Purview associati al documento importato sono stati confrontati con l'identità dell'utente.
SharePoint indicizzato ✅ ACL di SharePoint o etichette di riservatezza di Microsoft Purview importate e confrontate con l'identità dell'utente.
SharePoint remoto ❌ L'API di recupero di Copilot interroga direttamente SharePoint usando il token dell'utente.
Agente dati di Fabric ❌ Il motore di recupero sostituisce il token dell'utente con un token valido per Microsoft Fabric ed esegue le interrogazioni all'agente dati per conto dell'utente.
Ontologia del fabric ❌ Il motore di recupero sostituisce il token dell'utente con un token limitato a Microsoft Fabric e interroga l'elemento dell'ontologia per conto dell'utente.
IQ lavoro ❌ Il motore di recupero scambia un'asserzione utente del gruppo di destinatari dell'app da x-ms-query-work-iq-source-authorization per un token con ambito Work IQ.

Se non si configura ingestionPermissionOptions quando si crea l'origine knowledge indicizzata, l'indice non contiene metadati di autorizzazione. Il sistema restituisce i risultati non filtrati, indipendentemente dall'intestazione. Per risolvere questo problema, ricreare l'origine dati con i valori appropriati ingestionPermissionOptions.

Autorizzazione in fase di query

Per le fonti di conoscenza diverse da Work IQ, trasmettere l'identità dell'utente finale includendo nella richiesta di recupero un token di accesso con ambito limitato a https://search.azure.com/.default. Questo token è separato dalle credenziali del servizio usate per accedere al servizio di ricerca. Non sono necessarie autorizzazioni del servizio di ricerca e rappresenta solo l'utente il cui accesso al contenuto viene valutato. Per ulteriori informazioni, consultare l'applicazione di ACL e RBAC durante la fase di interrogazione.

Per le origini delle informazioni di IQ di lavoro, questa sezione non si applica. Utilizzare il flusso di asserzione dell'utente specifico di Work IQ descritto in Applicare le autorizzazioni al momento della query.

Nell'SDK di .NET passare il token come parametro querySourceAuthorization in RetrieveAsync:

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

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

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

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Nell'SDK di Python passare il token come parametro query_source_authorization in retrieve:

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

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

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

Nell'API REST includere l'intestazione x-ms-query-source-authorization con il token di accesso dell'utente:

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

Riferimento:Recupero della Conoscenza - Recupero

Esaminare la risposta

L'azione di recupero restituisce tre componenti principali:

Risposta estratta

La risposta estratta è una singola stringa unificata che in genere viene passata a un LLM. LLM utilizza la stringa come dati di base e la usa per formulare una risposta. La chiamata API al modello linguistico di grandi dimensioni include la stringa unificata e le istruzioni per il modello, ad esempio se utilizzare il grounding in modo esclusivo o come integrazione.

Il corpo della risposta è strutturato nel formato dello stile del messaggio della chat e il contenuto viene serializzato IN FORMATO 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>\"}]"
            }
        ]
    }
]

Punti chiave:

  • content.type ha un valore valido: text.

  • content.text è una stringa con codifica JSON contenente i documenti più rilevanti (o blocchi) trovati nell'indice di ricerca, in base agli input della query e della cronologia delle chat. Questa stringa è i dati di base usati da un LLM per formulare una risposta alla domanda dell'utente.

    • Questa parte della risposta è costituita da 200 blocchi o meno, escludendo eventuali risultati che non soddisfano la soglia minima di un punteggio di 2,5 reranker.

    • La stringa inizia con l'ID di riferimento del blocco (usato per scopi di citazione) ed eventuali campi specificati nella configurazione semantica dell'indice di destinazione. In questo esempio si supponga che la configurazione semantica nell'indice di destinazione abbia un campo "title", un campo "terms" e un campo "content".

  • Recupera le risposte che non includono @search.rerankerBoostedScore.

  • La maxOutputSizeInTokens proprietà (maxOutputSize in 2026-05-01-preview e versioni successive) nella richiesta di recupero determina la lunghezza della stringa.

    • Un documento che supera il maxOutputSizeInTokens budget di output può essere omesso dalla risposta. La matrice di attività include un avviso quando il documento più rilevante supera le dimensioni massime di output. Per conservare più contenuto, aumentare maxOutputSizeInTokens. Per altre informazioni, vedere Risposte vuote.

Matrice di attività

La matrice di attività restituisce il piano di query, che fornisce trasparenza operativa per tenere traccia delle operazioni, delle implicazioni di fatturazione e delle chiamate alle risorse. Include anche le sottoquery inviate alla pipeline di recupero. Per una risposta 206 Partial Content, l'array include errori relativi alle fonti di conoscenza non riuscite. Una 502 Bad Gateway risposta potrebbe fornire dettagli sull'errore solo nell'errore di primo livello.

La matrice di attività include i componenti seguenti:

Sezione Descrizione
Attività specifica della sorgente Per ogni fonte di conoscenza inclusa nella query, in questa sezione viene riportato il tempo trascorso e gli argomenti usati nella query, incluso il ranker semantico. I tipi di origine delle informazioni includono searchIndex, azureBlobe altre origini di conoscenza supportate.
agenticReasoning Questa sezione riporta il consumo di token per il ragionamento agentico durante il recupero, che dipende dal livello di impegno del ragionamento nel recupero specificato (anteprima).
modelQueryPlanning Per le knowledge base che usano un LLM per la pianificazione delle query, questa sezione riporta il numero di token usato per l'input e il numero di token per le sottoquery. Comprende un campo model con un campo modelName contenente il nome pubblico del modello, non il nome della distribuzione, del modello che ha eseguito l'attività.
modelAnswerSynthesis Per le knowledge base che usano la sintesi delle risposte (anteprima), questa sezione riporta il numero di token per simulare la risposta e il numero di token dell'output della risposta. Comprende un campo model con un campo modelName contenente il nome pubblico del modello, non il nome della distribuzione, del modello che ha eseguito l'attività.
modelWebSummarization Per le knowledge base che usano il riepilogo Web, in questa sezione viene riportato l'utilizzo di token per riepilogare i risultati Web. Comprende un campo model con un campo modelName contenente il nome pubblico del modello, non il nome della distribuzione, del modello che ha eseguito l'attività.
model Per i record di attività basati su modello, questa sezione identifica il modello usato per eseguire l'attività. Questa sezione viene visualizzata solo quando si imposta includeActivity su true.
imageServing Per le origini dati di conoscenza per cui è abilitata la distribuzione di immagini (anteprima), questa sezione indica imagesRetrieved, imagesSentToModel, totalImageSizeBytes e se verbalizationUsed in fase di indicizzazione era attivo. Ispezionare verbalizationUsed e imagesSentToModel indipendentemente. Una risposta può segnalare verbalizationUsed come true e inviare ancora immagini al modello downstream. Per trovare il numero di immagini eliminate, sottrarre imagesSentToModel da imagesRetrieved.

Nell'esempio seguente viene illustrata la matrice di attività.

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

Array di riferimenti

La matrice di riferimenti proviene direttamente dai dati di terra sottostanti. Include l'oggetto sourceData usato per generare la risposta ed è costituito da ogni documento che il motore di recupero agentica trova e classifica semanticamente.

La matrice di riferimenti include i componenti seguenti:

Campo Descrizione
type Tipo di origine della knowledge base che ha prodotto il riferimento, ad esempio searchIndex.
id ID di riferimento per un elemento all'interno di una risposta. Non è la chiave del documento nell'indice di ricerca. Usarlo per fornire citazioni.
activitySource Esegue un riferimento incrociato al id della voce di attività che ha prodotto il riferimento, utile per collegare le citazioni.
docKey Per un riferimento indicizzato, la chiave del documento nell'indice di ricerca sottostante.
sourceData Dati di base usati per generare la risposta. Per un riferimento indicizzato, i campi possono includere un id e campi semantici, ad esempio title, terms e content. La forma varia in base al tipo di riferimento.
citationUrl (anteprima) Un URL di sola lettura generato dal servizio che punta al documento di riferimento nell'indice sottostante. Restituito solo per le fonti di conoscenza indicizzate. Per seguire l'URL, vedere Cercare documenti con URL di citazione (anteprima).

Nell'esempio seguente viene illustrata la matrice di riferimenti.

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

Cercare documenti con URL di citazione (anteprima)

A partire dalla versione 2026-08-01-preview dell'API, un riferimento proveniente da una fonte di conoscenza indicizzata può includere un citationUrl nella risposta di recupero. Usare questo URL per recuperare i campi indicizzati per tale riferimento, ad esempio title e content, in modo da poter eseguire il rendering di un'anteprima di citazione che mostra la provenienza di una risposta senza aprire il documento di origine originale. citationUrl è una ricerca autenticata nell'indice sottostante, separata dalla sorgente docUrl e blobUrl.

L'esempio seguente mostra un URL di citazione sanificato.

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

I campi selezionati e il relativo ordine dipendono dalla configurazione dell'origine indicizzata e del recupero.

Importante

Seguire l'URL completo del verbatim della risposta ed eseguire il rendering dei campi JSON restituiti nell'app. Non costruire, analizzare o normalizzare l'URL.

Dato un URL di citazione, gli esempi seguenti ottengono un token di accesso per il servizio di ricerca. Chiamano l'URL con tale token nell'intestazione Authorization . L'identità connessa richiede il ruolo Search Index Data Reader.

Azure AI Search metodi di ricerca del documento SDK richiedono l'endpoint, il nome dell'indice, la chiave del documento, i campi selezionati e la versione dell'API come input separati. Non accettano un URL di citazione assoluto. Questi esempi usano un HTTP GET autenticato per mantenere l'URL completo generato dal servizio.

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

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

Riferimento:DefaultAzureCredential

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

Riferimento:Documenti - Ottieni

La ricerca del documento restituisce i campi di indice selezionati come 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"
}

Quando utilizzi l'URL di una citazione, tieni presente quanto segue:

  • Verifica la presenza di citationUrl prima di eseguire il rendering di una citazione. Può essere assente se la risposta omette riferimenti o il servizio non riesce a risolvere l'indice di backup o la chiave del documento.

  • Se la richiesta di recupero include x-ms-query-source-authorization per il controllo di accesso a livello di documento, usare lo stesso token utente quando si segue l'URL.

  • L'URL rimane valido solo se l'indice di backup e la chiave del documento rimangono invariati.

Controlla i metadati dell'etichetta di riservatezza nella risposta (anteprima)

Lo stesso comportamento di temporizzazione descritto in Applicare le autorizzazioni in fase di query si applica qui: le modifiche alle autorizzazioni di accesso impostate all'esterno 2026-08-01-preview possono richiedere tempo per essere visualizzate nelle 2026-08-01-preview risposte di recupero.

Quando si esegue una query su una knowledge base che acquisisce etichette di riservatezza di Microsoft Purview, la risposta di recupero include i metadati delle etichette a due livelli:

Posizione Campo Descrizione
Per riferimento sensitivityLabelInfo L'etichetta di riservatezza applicata a ogni documento restituito nell'array references.
Risposta metadata.responseSensitivityLabelInfo Etichetta di aggregazione che rappresenta l'etichetta di riservatezza con priorità più alta in tutti i documenti a cui si fa riferimento nella risposta. Utile per banner visualizzati lato client e per l'applicazione delle policy.

Microsoft Graph calcola l'etichetta a livello della risposta dalle etichette relative a ciascun riferimento in base alle regole di ereditarietà delle etichette di Microsoft Purview. In genere, l'etichetta più restrittiva vince.

L'esempio seguente mostra una risposta di recupero con due documenti di riferimento (uno Confidential, uno Internal) e l'etichetta a livello di risposta risultante.

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

Tipi di riferimento che espongono etichette di sensibilità

Il nome del campo e la disponibilità dei metadati dell'etichetta dipendono dal tipo di origine della knowledge base che ha prodotto ogni riferimento.

Riferimento type Campo Etichetta Disponibile quando...
azureBlob sensitivityLabelInfo La fonte di conoscenza "blob" include sensitivityLabel all'interno di ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo La fonte di conoscenza OneLake include sensitivityLabel in ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo La fonte di conoscenza indicizzata da SharePoint include sensitivityLabel all'interno di ingestionPermissionOptions.
searchIndex sensitivityLabelInfo L'indice sottostante è purviewEnabled impostato su true e un campo contrassegnato con sensitivityLabel: true.

Visualizzare e controllare le raccomandazioni

Comportamento del server MCP

L'endpoint MCP esposto da ogni Knowledge Base espone gli stessi campi di etichetta di riservatezza dell'API REST. Quando un client compatibile con MCP richiama lo strumento knowledge_base_retrieve, il risultato dello strumento contiene gli stessi elementi sensitivityLabelInfo per riferimento e metadata.responseSensitivityLabelInfo a livello di risposta documentati in precedenza in questa sezione. I client MCP applicano controlli di visualizzazione e di policy basati su questi campi.

Recuperare esempi di azioni (anteprima)

Gli esempi seguenti illustrano diversi modi per chiamare l'azione di recupero usando la versione dell'API 2026-08-01-preview . Questa versione supporta il set di funzionalità completo, inclusa la sintesi delle risposte e un tentativo di ragionamento configurabile. Per informazioni sull'utilizzo di 2026-04-01, vedere le sezioni precedenti.

Esamina i nomi dei modelli nei registri attività

Impostare includeActivity su true per restituire i campi di identità del modello nei record di attività basati su modello. Usare questi campi per verificare quale modello configurato gestisce la pianificazione delle query, la sintesi delle risposte o il riepilogo Web durante una richiesta di recupero. Nell'esempio seguente viene eseguita l'override dell'elaborazione dei risultati archiviata per l'origine selezionata nella richiesta.

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

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

model_activity_types = (
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
)

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Riferimento:Recupero della Conoscenza - Recupero

L'estratto di risposta seguente mostra l'identità del modello annidata:

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

Per avere successo è necessario disporre di una fonte di conoscenza

Impostare failOnError in knowledgeSourceParams per contrassegnare una fonte di conoscenza come obbligatoria. Usare questo parametro quando una risposta parziale potrebbe essere fuorviante o non conforme se tale origine non è disponibile. La richiesta restituisce 502 Bad Gateway se un'origine richiesta ha esito negativo, anche se un'altra origine ha esito positivo. Per indicazioni sulla gestione, vedere Risolvere i problemi relativi all'azione di recupero.

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

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

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

Riferimento:Recupero della Conoscenza - Recupero

Escludere una fonte di conoscenza da una richiesta

A partire dalla versione dell'API 2026-08-01-preview, imposta neverQuerySource su true per ogni origine di conoscenza che vuoi escludere da una richiesta di recupero. In fase di richiesta, neverQuerySource sovrascrive un valore alwaysQuerySource archiviato per tale richiesta senza modificare il valore archiviato.

Nell'esempio seguente viene eseguita una query su una knowledge base contenente product-docs-ks e troubleshooting-ks, esclusa troubleshooting-ks dalla richiesta.

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

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

Riferimento: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
        }
    ]
}

Riferimento:Recupero della Conoscenza - Recupero

Ottimizza i documenti candidati per ciascuna fonte di conoscenza

Impostare maxOutputDocuments in knowledgeSourceParams per limitare il numero di documenti candidati che una specifica fonte di conoscenza può fornire prima della selezione del risultato finale. Usare questo parametro quando si vuole associare l'input di un'origine alla pipeline senza influire sugli altri.

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

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

Riferimento: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
        }
    ]
}

Riferimento:Recupero della Conoscenza - Recupero

Limitare i documenti di base finali

Il parametro di primo livello maxOutputDocuments delimita il numero di documenti di base restituiti nella risposta di recupero finale. Usare questo parametro quando l'applicazione richiede una citazione o un conteggio dei riferimenti prevedibili.

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

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

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

Riferimento:Recupero della Conoscenza - Recupero

Nella tabella seguente viene illustrato come maxOutputDocuments e maxOutputSizeInTokens interagire tra tutte e quattro le combinazioni.

maxOutputDocuments maxOutputSizeInTokens Behavior
Non specificato Non specificato Usa il comportamento predefinito maxOutputSizeInTokens del limite di risposta.
Non specificato Specificato Rimuove i documenti dopo il raggiungimento del limite di dimensioni del payload.
Specificato Non specificato Restituisce fino al numero specificato di documenti di messa a terra e non applica il limite maxOutputSizeInTokens.
Specificato Specificato Restituisce fino a maxOutputDocuments documenti o comunque tutti i documenti che rientrano entro maxOutputSizeInTokens, a seconda di quale limite venga raggiunto per primo.

Verificare che la knowledge base recuperi i valori predefiniti

Una Knowledge Base può archiviare le impostazioni predefinite a livello di richiesta in retrieveDefaults. Inviare due richieste di recupero per verificare l'ereditarietà e le sostituzioni specifiche della richiesta.

Prima di iniziare, completare Configurare i limiti predefiniti per il recupero (anteprima). La prima richiesta omette tutti e tre i limiti a livello di richiesta, quindi si applicano i valori archiviati di 45 secondi, otto documenti e 12.000 token. La seconda richiesta li sostituisce con 20 secondi, un documento e 5.000 token.

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

string searchEndpoint = "<search-endpoint>";

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

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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


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


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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

In primo luogo, inviare una richiesta che omette i tre campi limite a livello di richiesta.

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

Eseguire quindi l'override di tutti e tre i valori per una richiesta.

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
}

Riferimento:Recupero della Conoscenza - Recupero

Il conteggio dei riferimenti indica se il valore archiviato o a livello maxOutputDocuments di richiesta si applica: la prima risposta contiene al massimo otto riferimenti e la seconda contiene al massimo uno. Una risposta può contenere un minor numero di riferimenti quando un numero minore di documenti corrisponde. La risposta non segnala il budget effettivo del runtime o del token di output, ma questi valori regolano comunque l'elaborazione delle richieste. Le sostituzioni delle richieste non modificano le impostazioni predefinite archiviate.

Eseguire l'override del ragionamento predefinito e impostare i limiti delle richieste

Nell'esempio seguente viene specificata la sintesi delle risposte, pertanto il recupero del ragionamento deve essere low o medium. Imposta anche maxRuntimeInSeconds per limitare il tempo di esecuzione del recupero e maxOutputSizeInTokens per limitare le dimensioni del payload della risposta.

maxRuntimeInSeconds accetta valori compresi tra 10 e 600 secondi e il valore predefinito è 90 secondi. Il valore massimo di 600 secondi (10 minuti) si applica solo alla richiesta di recupero Azure AI Search.

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Riferimento:Recupero della Conoscenza - Recupero

Consenti al servizio di scegliere lo sforzo di ragionamento

Impostare retrievalReasoningEffort.kind su auto in una richiesta di recupero per sovrascrivere l'impostazione predefinita della base di conoscenza. Per altre informazioni sul ragionamento automatico, vedi Impostare il livello di elaborazione del ragionamento per il recupero dati (anteprima).

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

Riferimento:Recupero della Conoscenza - Recupero

Impostare i riferimenti per ogni origine delle informazioni

Usare includeReferences e includeReferenceSourceData in knowledgeSourceParams per controllare quali origini vengono visualizzate nella matrice dei riferimenti e la quantità di dati di origine inclusi in ogni voce. Nell'esempio seguente viene utilizzato il ragionamento predefinito della Knowledge Base.

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

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

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

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

Riferimento:Recupero della Conoscenza - Recupero

Usare uno sforzo minimo di ragionamento

Nell'esempio seguente non esiste alcun LLM per la pianificazione intelligente delle query o la sintesi delle risposte. La stringa di query passa al motore di recupero agentico per la ricerca di parole chiave o la ricerca ibrida.

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

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

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

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

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

Riferimento:Recupero della Conoscenza - Recupero

Risolvere i problemi relativi all'azione di recupero

In 2026-08-01-previewlo stato della risposta indica se il recupero è riuscito, in parte riuscito o non riuscito e cosa fare successivamente. Usare la tabella seguente per eseguire il mapping di ogni stato al suo significato e quindi vedere la sezione corrispondente per indicazioni sulla risoluzione dei problemi.

Condizione Meaning
200 OK Recupero riuscito. Un documento può comunque essere omesso se il relativo contenuto supera il budget di output. Per altre informazioni, vedere Risposte vuote.
400 Bad Request La convalida della richiesta di recupero non è riuscita prima dell'inizio del recupero.
206 Partial Content Almeno un'origine ha avuto esito positivo e non è stata contrassegnata failOnErroralcuna origine non riuscita. La risposta contiene i risultati provenienti dalle fonti che hanno avuto esito positivo.
502 Bad Gateway Ogni origine selezionata non è riuscita o un'origine contrassegnata come failOnError: true non riuscita.

Per qualsiasi risposta diversa da 200, registrare la versione dell'API, il timestamp, il corpo della richiesta ripulito, le intestazioni della risposta e l'ID della richiesta o di correlazione. Questi dettagli consentono di diagnosticare l'errore e condividere il problema con il supporto, se necessario.

400 Bad Request

Usare l'errore di primo livello per identificare la proprietà della richiesta non valida. Le cause più comuni includono:

  • Un elemento knowledgeSourceName in knowledgeSourceParams non è associato alla base di conoscenza oppure il relativo kind non corrisponde alla fonte associata.
  • Un valore della richiesta non è compreso nell'intervallo supportato oppure un'opzione richiede un'altra opzione non abilitata. Ad esempio, includeReferenceSourceData richiede includeReferences.
  • retrievalReasoningEffort.kind è auto, ma la richiesta usa una versione dell'API precedente a 2026-08-01-preview.
  • La richiesta usa auto, lowo medium, ma la Knowledge Base non definisce un modello.
  • Per l'esclusione della fonte in fase di richiesta (anteprima), la stessa voce imposta sia alwaysQuerySource sia neverQuerySource su true, oppure viene esclusa ogni fonte di conoscenza collegata.

Prima di ripetere la richiesta, correggere la proprietà identificata dall'errore di primo livello.

206 Partial Content

Esamina ogni elemento activity che contiene un error. Un'attività di recupero della fonte identifica la fonte di conoscenza che ha avuto esito negativo e un'attività del modello identifica la fase di elaborazione che ha avuto esito negativo. Il corpo della risposta contiene ancora i risultati che hanno avuto esito positivo.

Per gli errori di attività di recupero di origine, le cause comuni includono:

  • Input non valido in fase di esecuzione della query, ad esempio un'espressione filterAddOn non valida.
  • Deviazione della configurazione dell'origine dati o dell'indice, ad esempio un campo rinominato, una configurazione semantica mancante o un vettorizzatore non valido.
  • Autorizzazione dipendenza mancante o non valida o autorizzazioni insufficienti per l'identità usata per eseguire la query dell'origine.
  • Errori di limitazione, timeout o disponibilità temporanea delle dipendenze.

Per un errore di attività del modello, usare l'attività type per identificare la fase di elaborazione non riuscita. Ad esempio, un modelWebSummarization errore indica che il riepilogo dei risultati Web non è riuscito.

Se l'applicazione consente risultati parziali, elaborare i risultati riusciti e registrare ogni fase di origine o modello non riuscita. Correggi gli errori di configurazione, autorizzazione e permessi prima di riprovare. In caso di errori di limitazione, timeout o disponibilità temporanea, usare un numero limitato di tentativi con backoff.

Se i risultati non sono sicuri senza un'origine specifica e il tipo di origine supporta alwaysQuerySource, impostare sia alwaysQuerySource che failOnError. La prima opzione garantisce che l'origine sia selezionata e la seconda restituisce un errore rigido se l'esecuzione di query ha esito negativo. Le origini delle informazioni del server MCP (anteprima) non supportano alwaysQuerySource. Per tali origini, failOnError si applica solo quando l'origine è selezionata. failOnError non si applica agli errori dell'attività del modello.

502 Bad Gateway

L'errore di livello superiore descrive uno dei due percorsi di guasto irreversibile:

  • Ogni origine selezionata non è riuscita: Ogni origine selezionata ha restituito un errore. Un'origine che viene completata correttamente con zero documenti corrispondenti non è un'origine non riuscita. Esaminare ogni errore di origine per individuare una configurazione condivisa, un'autorizzazione, una dipendenza o un problema di disponibilità.
  • Una fonte failOnError non è riuscita: non è stato possibile interrogare una fonte necessaria. È possibile che altre origini abbiano avuto esito positivo, ma il servizio non restituisce un risultato parziale perché l'origine richiesta non è riuscita.

Gli errori di origine sottostanti sono in genere dello stesso tipo di quelli descritti per 206 Partial Content: input specifico dell'origine non valido, deriva della configurazione dell'origine o dell'indice, autorizzazione delle dipendenze o autorizzazioni, limitazione, timeout o disponibilità delle dipendenze temporanea.

Una risposta 502 rigida potrebbe omettere l'array activity e specificare il nome dell'origine e l'errore sottostante solo nel messaggio di errore di primo livello. Correggi gli errori di configurazione, autorizzazione e permessi prima di riprovare. Usare un numero limitato di tentativi con backoff solamente per limitazione o errori di disponibilità temporanea. Non considerare una risposta 502 Bad Gateway come un'interruzione di Azure AI Search senza prima esaminare la causa primaria dell'errore.

Risposte vuote

La fase di ricerca potrebbe trovare un documento, ma il servizio può comunque ometterlo dalla risposta finale se il suo contenuto basato sui dati di grounding supera il limite di output maxOutputSizeInTokens (maxOutputSize in 2026-05-01-preview e successive). Quando si verifica questa condizione, la matrice di attività mostra che sono state trovate corrispondenze e il record attività include un avviso che indica che il documento più rilevante ha superato le dimensioni massime di output. L'array di riferimenti e il contenuto della risposta basata sui dati forniti sono vuoti per quel documento. Per conservare più contenuto, aumentare maxOutputSizeInTokens.

Per evitare questo comportamento, indicizzare documenti di origine di grandi dimensioni come blocchi più piccoli con identificatori stabili e metadati di origine. Questo vale soprattutto per i manuali lunghi, i criteri o gli articoli della Knowledge Base.

Chiamare l'endpoint MCP

Avvertimento

Le implementazioni MCP sono soggette a rischi, ad esempio attacchi, errori a catena e perdita di supervisione umana. È possibile attenuare questi rischi controllando i server MCP per la sicurezza e l'affidabilità, seguendo le procedure consigliate di Microsoft e industry e implementando meccanismi di approvazione e monitoraggio dei comportamenti a catena.

MCP è un protocollo aperto che standardizza il modo in cui le applicazioni di intelligenza artificiale si connettono a origini dati e strumenti esterni.

In Azure AI Search ogni Knowledge Base è un server MCP autonomo che espone lo strumento knowledge_base_retrieve. Qualsiasi client compatibile con MCP, incluso Foundry Agent Service, GitHub Copilot, Claude e Cursor, può richiamare questo strumento per eseguire query sulla Knowledge Base.

Eseguire l'autenticazione all'endpoint MCP

Ogni Knowledge Base ha un endpoint MCP all'URL seguente:

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

La versione dell'API specificata determina il risultato della connessione. Usando 2026-08-01-preview, la Knowledge Base restituisce risposte sintetizzate quando la Knowledge Base sottostante è configurata con un LLM e un'operazione di ragionamento compatibile. Utilizzando 2026-04-01, il recupero è sempre minimo e di tipo estrattivo, e la connessione restituisce solo dati di grounding.

La modalità di autenticazione a questo endpoint dipende dal client MCP. Quando si usa l'API Responses di Azure OpenAI con lo strumento knowledge_base_retrieve MCP, si autenticano sia la chiamata all'API Responses verso Azure OpenAI sia la richiesta MCP ad Azure AI Search. Se il client MCP chiama direttamente questo endpoint, si esegue l'autenticazione solo per Azure AI Search.

Per l'autenticazione di Azure AI Search, usa uno dei metodi seguenti:

Nota

I client MCP configurano le intestazioni personalizzate in modo diverso. Ad esempio, foundry Agent Service inserisce le intestazioni tramite connessioni di progetto, mentre i client come GitHub Copilot richiedono intestazioni in JSON del server MCP.

Usare un bearer token per l'autenticazione MCP

Il metodo consigliato per l'autenticazione MCP è un token di connessione, che evita di archiviare chiavi sensibili nei file di configurazione. L'identità dietro il token deve avere il ruolo Lettore dati indice di ricerca assegnato sul servizio di ricerca. Per altre informazioni, vedere Connettere l'app a Azure AI Search usando identità.

#pragma warning disable OPENAI001

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

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

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

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

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

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

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

Riferimento:Usare l'API Risposte OpenAI Azure

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

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

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

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

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

print(response.output_text)

Riferimento:Usare l'API Risposte OpenAI Azure

// This code snippet is currently unavailable.

Usare una chiave di amministrazione per l'autenticazione MCP

Una chiave di amministratore consente l'accesso completo in lettura e scrittura al servizio di ricerca, quindi usala solo negli ambienti di sviluppo o quando non è disponibile un token bearer. Per ulteriori informazioni, vedere Connettiti ad Azure AI Search utilizzando le chiavi API.

Tip

L'esempio seguente mostra solo l'intestazione che differisce dall'esempio con token di connessione. Per la configurazione completa, vedere Usare un token Bearer per l'autenticazione MCP.

#pragma warning disable OPENAI001

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

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

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

Riferimento:Usare l'API Risposte OpenAI Azure

import os

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

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

Riferimento:Usare l'API Risposte OpenAI Azure

// This code snippet is currently unavailable.

Esaminare la risposta MCP

Quando un client MCP richiama knowledge_base_retrieve, riceve un risultato di uno strumento MCP anziché l'involucro response, activity e references dell'azione retrieve. Molti client MCP esecuno il risultato dello strumento in un oggetto di primo livello result , quindi il payload che si dovrebbe prevedere è 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>\"}]"
      }
    ]
  }
}

Punti chiave:

  • result.content[] contiene l'output dello strumento MCP restituito dalla Knowledge Base.

  • result.content[].type è text.

  • result.content[].text contiene i dati recuperati come stringa codificata in JSON.

  • A differenza dell'azione di recupero, l'attuale risposta MCP non restituisce array activity o references separati e non popola le voci resource per il contenuto restituito.