Interroger une base de connaissances à l’aide de l’action de récupération ou du point de terminaison MCP

Note

Recherche Azure AI est disponible via le portail Azure, les API REST et les SDK Azure. Il sous-tend également Foundry IQ, la couche de connaissances managée qui transforme le contenu d’entreprise en bases de connaissances réutilisables et prenant en charge les autorisations pour les agents dans le portail Microsoft Foundry.

Important

Les fonctionnalités, capacités ou propriétés marquées (préversion) ne sont pas couvertes par un accord de niveau de service, ne sont pas recommandées pour les workloads de production et peuvent être modifiées ou faire l’objet de restrictions avant leur mise à disposition générale. Les Recherche Azure AI termes de la préversion s'appliquent à toutes les fonctionnalités d'aperçu, qu'il s'agisse d'une fonctionnalité autonome ou d'une partie d'une fonctionnalité généralement disponible.

Dans un pipeline de récupération agentique, l’action de récupération appelle le traitement des requêtes parallèles à partir d’une base de connaissances. Vous pouvez appeler l’action de récupération directement à l’aide des API REST du service de recherche ou d’un Kit de développement logiciel (SDK) Azure. Chaque base de connaissances expose également un point de terminaison MCP (Model Context Protocol) pour la consommation par les agents compatibles MCP.

Cet article explique comment appeler les deux méthodes de récupération avec application facultative des autorisations. Il couvre d’abord l’action de récupération et le point de terminaison MCP ultérieurement, car le résultat de l’outil MCP diffère actuellement de la forme de réponse REST et SDK.

Pour configurer un pipeline qui connecte Recherche Azure AI au service Foundry Agent via MCP, consultez Tutorial : Créer une solution de récupération agentique de bout en bout.

Assistance à l'utilisation

portail Azure portail Microsoft Foundry Kit de développement logiciel (SDK) .NET Kit de développement logiciel (SDK) Python sdk Java Kit de développement logiciel (SDK) JavaScript REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Conditions préalables

  • Si vous appelez le point de terminaison MCP via l’API réponses OpenAI Azure, vous avez besoin des éléments suivants :

    • Un LLM déployé et le rôle d’utilisateur OpenAI Cognitive Services (ou une clé API) sur la ressource Foundry. Vous pouvez réutiliser la LLM et la ressource spécifiées dans votre base de connaissances, le cas échéant.

    • Le Azure.AI.OpenAI paquet : dotnet add package Azure.AI.OpenAI

  • Package Azure.Search.Documents requis :

    • Pour les fonctionnalités 2026-08-01-preview, le dernier package de préversion : dotnet add package Azure.Search.Documents --prerelease

    • Pour les 2026-04-01 fonctionnalités, le dernier package stable : dotnet add package Azure.Search.Documents

  • Pour l’authentification sans clé, le Azure.Identity package : dotnet add package Azure.Identity

  • Si vous appelez le point de terminaison MCP via l’API réponses OpenAI Azure, vous avez besoin des éléments suivants :

    • Un LLM déployé et le rôle d’utilisateur OpenAI Cognitive Services (ou une clé API) sur la ressource Foundry. Vous pouvez réutiliser la LLM et la ressource spécifiées dans votre base de connaissances, le cas échéant.

    • Le openai paquet : pip install openai

  • Package azure-search-documents requis :

    • Pour les fonctionnalités 2026-08-01-preview, le dernier package de préversion : pip install --pre azure-search-documents

    • Pour les 2026-04-01 fonctionnalités, le dernier package stable : pip install azure-search-documents

  • Pour l’authentification sans clé, le azure-identity package : pip install azure-identity

  • Version de l’API REST du service de recherche obligatoire :

  • Pour l’authentification sans clé, incluez un jeton de Microsoft Entra ID dans l’en-tête Authorization de chaque requête HTTP.

Limitations

Pour les sources de connaissances de l’index de recherche, lorsque vous activez le reclassement, la récupération utilise la configuration sémantique de la source de connaissances. Il n’applique pas les profils de scoring de l’index sous-jacent, y compris defaultScoringProfile. Les réponses récupérées n’affichent pas non plus @search.rerankerBoostedScore.

Procéder à l’action de récupération

Vous spécifiez l’action de récupération sur une base de connaissances. Le corps de la requête inclut l’entrée de requête et une liste facultative de sources de connaissances à cibler.

La version de l’API 2026-04-01 ne prend en charge que l’entrée intents et la récupération extractive minimale. Les fonctionnalités uniquement disponibles en préversion, y compris l’entrée messages, la planification des requêtes, la synthèse des réponses et l’effort de raisonnement configurable, ne sont pas prises en charge. Utiliser 2026-08-01-preview pour des fonctionnalités complètes.

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

Référence :Récupération des connaissances - Récupérer

Fournir des images pour la réponse de synthèse (aperçu)

Pour les sources de connaissances blob, OneLake indexé et SharePoint indexé que vous configurez avec un magasin d’actifs, vous pouvez fournir au modèle de synthèse de réponses en aval des images intégrées aux documents, en plus du texte. Définissez enableImageServing sur l’entrée correspondante dans knowledgeSourceParams pour remplacer la valeur par défaut définie dans la définition de la base de connaissances. La réponse de récupération n’inclut pas de champs dédiés pour les chemins d’accès des images individuelles ni pour les octets d’image fournis au modèle.

L’affichage des images fonctionne uniquement lorsque outputMode est answerSynthesis, et n’est pas pris en charge pour les sources de connaissances qui configurent ingestionPermissionOptions. Pour obtenir les étapes de configuration, la table de priorité et savoir comment consulter les statistiques de diffusion des images, consultez Afficher les images intégrées au document dans la récupération agentique (version préliminaire).

Désactiver le reclassement pour une source de connaissances (version préliminaire)

À compter de la version de l’API 2026-08-01-preview , définissez "resultsProcessing": "none" sur une knowledgeSourceParams entrée pour contourner la reclassement d’une source de connaissances spécifique et conservez son ordre de résultat sous-jacent. Vous pouvez également stocker resultsProcessing sur la source de connaissances comme valeur par défaut. Tous les types de sources de connaissances prennent en charge cette propriété.

L’exemple suivant ignore le reclassement pour product-catalog-ks lors d’une requête de récupération.

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

Référence :Récupération des connaissances - Récupérer

Définissez "resultsProcessing": "rerank"ou omettez-le lorsqu’aucune valeur par défaut stockée n’existe, pour utiliser le pipeline de reclassement. Recherche Azure AI résout la valeur effective de chaque source dans cet ordre :

  1. resultsProcessing dans knowledgeSourceParams dans la requête de récupération.
  2. resultsProcessing stocké dans la base de connaissances.
  3. rerank quand aucune propriété n’est présente.

Pour une source de connaissances du serveur MCP, une resultsProcessing valeur définie sur un outil individuel est prioritaire sur la requête et les valeurs stockées.

Tip

resultsProcessing modifie la façon dont les résultats sont traités, et non les sources interrogées. Définissez alwaysQuerySource sur true si la source de connaissances doit être interrogée.

Lorsque la valeur effective est none:

  • Les références de la source de connaissances omettent rerankerScoreet les résultats conservent leur ordre sous-jacent dans l’activité de récupération de la source.
  • Lorsqu’une source contourne le reclassement, Recherche Azure AI distribue les résultats finaux entre les activités selon un mécanisme de tourniquet, en suivant l’ordre de déclaration des sources de connaissances. Les activités reclassées restent classées par score.
  • La déduplication et les limites par source, document et jeton s’appliquent toujours. Par conséquent, tous les résultats récupérés ne s’affichent pas dans la réponse.

Recherche Azure AI valide rerankerThreshold dans cet ordre :

  1. La recherche résout resultsProcessing à partir de la requête de récupération et de la valeur stockée de la source de connaissances.
  2. Si la valeur résolue est none et que la requête inclut rerankerThreshold, la recherche retourne 400 Bad Request.
  3. Pour un outil de serveur MCP, Search applique la valeur resultsProcessing définie au niveau de l’outil après avoir validé la requête.

Par conséquent, un paramètre d’outil MCP ne change pas si la demande réussit la validation. Une valeur au niveau none de l’outil n’entraîne pas d’erreur de seuil et une valeur au niveau rerank de l’outil n’empêche pas une erreur lorsque la demande ou la valeur stockée est résolue en none.

Pour confirmer quel mode a été exécuté, vérifiez si les références de la source de connaissances comportent rerankerScore. Ne vous fiez pas à semanticConfigurationName, qui peut être défini sur null au lieu d'être omis.

Comportement de l’index de recherche

Pour les sources de connaissances qui ciblent un index de recherche, le type de requête implicite est semantic, et il n’existe aucun mode de recherche. Lors du reranking, l’exécution de la requête utilise semanticConfigurationName. D’autres paramètres sources, y compris searchFields et sourceDataFields, s’appliquent dans les deux modes.

La récupération agentique n’accepte pas les entrées scoringProfile ou scoringParameters. Si vous avez besoin de privilégier les contenus récents dans les sources de connaissances indexées, utilisez plutôt la récupération tenant compte de la fraîcheur (préversion) qu’un profil de score d’index.

Si l’index inclut des champs vectoriels, vous avez besoin d’une définition de vectoriseur valide afin que le moteur de récupération agentique puisse vectoriser les entrées de requête. Sinon, les champs vectoriels sont ignorés.

Pour plus d’informations, consultez Créer un index pour la récupération agentique.

Récupérer les résultats en continu (version préliminaire)

À compter de la version de l’API 2026-08-01-preview , vous pouvez recevoir des résultats en tant que flux d’événements envoyés par le serveur (SSE) au lieu d’attendre une seule réponse JSON. En utilisant la diffusion en continu, votre client peut afficher la planification des requêtes, l’activité source et la réponse synthétisée ou la réponse extraite dans cet ordre à mesure que chaque partie devient disponible.

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

Pour choisir de diffuser en continu, incluez l’en-tête Accept: text/event-stream dans une demande de récupération. Sans cet en-tête, l’action de récupération retourne sa réponse JSON standard.

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

Référence :Récupération des connaissances - Récupérer

Cycle de vie des événements

Au lieu de retourner une seule réponse, le service conserve une connexion HTTP ouverte (type text/event-stream; charset=utf-8de contenu) et envoie une séquence d’événements à mesure que les données sont disponibles. Chaque événement a une ligne qui nomme le type d’événement event: , une data: ligne avec une valeur JSON et une ligne vide qui marque la fin de l’événement.

Un flux réussi utilise le cycle de vie suivant :

Event Quand il est envoyé Qu’est-ce qu’il contient ?
retrieval.started Le premier événement pour chaque requête en streaming. L’ID de requête, le nom de la base de connaissances, le mode de sortie et l’effort de raisonnement efficace une fois que le service résout les valeurs par défaut de la demande et de la base de connaissances. Si l’effet kind est auto, l’événement signale auto; il ne prédit pas l’escalade ultérieure.
activity.started Lorsque le service commence une activité de planification de requête, une activité source ou une activité de modèle. Plusieurs activités peuvent commencer avant la fin d’une activité antérieure. L’activité id, l’heure typede début et le nom facultatif de la source de connaissances.
activity.completed Une fois cette activité terminée. Corrélez-le à son événement activity.started en faisant correspondre id. Enregistrement d’activité terminé.
answer.completed Une seule fois, uniquement lorsque outputMode est answerSynthesis. messageIndex identifie la position du message dans le tableau de réponses final et message contient la réponse synthétisée complète. Il n’y a pas d’événement de type delta jeton par jeton.
references.completed Une fois que toutes les références ont été résolues. Les données d’événement sont le tableau de références complètes, sans wrapper d’objet.
response.completed Événement terminal pour un flux réussi ou partiellement réussi. le code d’état 200 ou 206 et l’intégralité du corps de la réponse de récupération, qui a la même forme qu’un appel JSON sans streaming. Pour plus d’informations sur ce que signifie chaque code d’état, consultez Résoudre les problèmes liés à l’action de récupération.
error Au lieu de response.completed et references.completed lorsque la récupération échoue après l’ouverture du flux. L’erreur et tous les enregistrements d’activité qui se sont terminés avant l’échec.

Les événements arrivent dans l’ordre. Chaque événement activity.started précède l’événement activity.completed portant le même id, mais les activités peuvent être entrelacées. Les enregistrements d’activité terminés incluent également les horodatages startedAt et completedAt. Pendant que le flux est inactif, le serveur envoie un : heartbeat commentaire environ toutes les 15 secondes pour maintenir la connexion ouverte. Les clients SSE peuvent ignorer ces commentaires.

L’exemple suivant montre une réponse diffusée en continu, avec des charges utiles raccourcies pour la lisibilité.

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

Gérer les erreurs, l’annulation et la solution de repli

  • Échecs de préversion : si la validation de la demande échoue avant l’ouverture du flux, par exemple pour un corps de requête mal formé, l’action de récupération retourne une réponse d’erreur JSON standard et n’ouvre jamais le flux.

  • Échecs intermédiaires : en cas d’échec de la récupération après l’ouverture du flux, l’événement de terminal est error au lieu de references.completed et response.completed. L’événement peut inclure des enregistrements d’activité achevés avant l’échec. Le code d’état HTTP reste 200 une fois le flux démarré. Vérifiez donc l’événement de terminal, et non le code d’état HTTP, pour déterminer la réussite.

  • Annulation ou déconnexion : si votre client annule la demande ou se déconnecte avant la fin du flux, le service annule la récupération et met fin au flux sans événement terminal. Traitez les événements reçus avant l’annulation ou la déconnexion comme étant incomplets.

  • Secours JSON : Avec 2026-08-01-preview, un en-tête manquant Accept ou une valeur tel que application/json, */*, text/*ou text/event-stream;q=0 retourne la réponse JSON standard décrite dans Examiner la réponse. La demande text/event-stream d’une version antérieure de l’API retourne 406 Not Acceptable.

Filtrer les sources de connaissances de l’index de recherche au moment de la requête

Lors de la récupération à partir d’une source de connaissances d’index de recherche, vous pouvez appliquer un filtre OData au moment de la requête pour limiter les résultats à des documents ou champs spécifiques. L’expression de filtre utilise la syntaxe OData et est transmise via le filterAddOn paramètre.

Syntaxe de filtre et exemples

Le filterAddOn paramètre accepte les expressions de filtre OData. Voici quelques exemples de modèles :

  • Champs de métadonnées : city eq 'Phoenix', status eq 'active'
  • Plages de dates : publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Plages numériques : price ge 100 and price le 5000
  • Correspondance de texte : substringof('climate', description), indexof(title, 'urgent') ge 0
  • Opérateurs logiques : (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'"
        }
    ]
}

Exemple de filtre multiple

Vous pouvez combiner plusieurs filtres pour affiner davantage les résultats.

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

Remplacer les indicateurs de requête stockés au moment de la requête (version préliminaire)

À compter de la version de l’API 2026-08-01-preview , vous pouvez remplacer les indicateurs de requête stockés sur une source de connaissances d’index de recherche pour une requête de récupération unique en définissant queryHintOverrides sur son knowledgeSourceParams entrée.

La substitution remplace l’ensemble de l’objet stocké queryHints plutôt que de fusionner l’entrée par entrée. Incluez donc chaque indicateur que vous souhaitez appliquer. Omettez queryHintOverrides pour utiliser les indications enregistrées.

Lorsque l’effort de raisonnement de récupération n’est pas minimal, une réponse HTTP 400 dépend des indicateurs de filtre stockés, et non du contenu de remplacement ou du type de boost. Le service valide les indicateurs de filtre stockés par rapport au modèle de base de connaissances avant d’appliquer queryHintOverrides. Par conséquent, un modèle de la famille GPT-4o ou GPT-4.1 rejette la requête même lorsque la substitution est vide ou ne contient que des renforcements. Les améliorations stockées à elles seules ne déclenchent pas cette validation. Utilisez d’abord un modèle compatible ou supprimez les indicateurs de filtre stockés.

L’exemple suivant remplace tous les indices stockés par un renforcement fieldValue pour le contenu en japonais. Le service n’applique à cette requête aucun filtre enregistré ni aucune autre pondération enregistrée.

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
}

Référence :Récupération des connaissances - Récupérer

Pour vérifier que le service a appliqué votre substitution, définissez includeActivity dans la requête et inspectez l’activité searchIndex renvoyée. Son queryHintProcessing objet signale ce que le modèle a généré. Pour cet exemple, il contient un generatedBoost pour l’amélioration du langage, mais non generatedFilter , car la substitution a remplacé l’indicateur de filtre stocké. Étant donné que les indicateurs de requête sont les meilleurs efforts, traitez cette activité comme une confirmation plutôt que de vérifier une expression exacte.

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

Pour la définition stockée, les types d’indicateurs pris en charge et la composition avec des filtres déterministes, consultez Configurer les indicateurs de requête (préversion) .

Appliquer des autorisations lors de l’exécution de la requête (version préliminaire)

Les modifications apportées aux autorisations d’accès que vous définissez en dehors de 2026-08-01-preview peuvent prendre du temps avant d’apparaître dans les résultats de récupération de 2026-08-01-preview.

Si vos sources de connaissances contiennent du contenu protégé par l’autorisation, transmettez l’identité de l’utilisateur final à la demande de récupération afin que chaque utilisateur voit uniquement le contenu auquel il est autorisé à accéder. Pour les sources indexées, le moteur de recherche utilise cette identité pour filtrer les résultats et, si elle est omise, renvoie des résultats non filtrés. Les sources distantes utilisent également l’autorisation de la demande de récupération, mais appliquent des autorisations à la source et peuvent nécessiter un jeton et un en-tête spécifiques à la source.

L’application des autorisations comporte deux parties :

  • Temps d’ingestion : pour les sources de connaissances indexées uniquement, définissez-les ingestionPermissionOptions pour ingérer les métadonnées d’autorisation en même temps que le contenu.

  • Au moment de la requête : transmettez les informations d’autorisation de l’utilisateur dans l’en-tête requis par la source de connaissances. La plupart des sources utilisent x-ms-query-source-authorization. L’exception est Work IQ, qui utilise x-ms-query-work-iq-source-authorization.

Configuration au moment de l’ingestion

Le tableau suivant montre quelles sources de connaissances nécessitent une configuration au moment de l’ingestion et comment chaque source applique des autorisations.

Source de connaissances Exige ingestionPermissionOptions Comment les autorisations sont appliquées
Objet blob ou ADLS Gen2 ✅ Étendues RBAC ingérées, ACL ou Microsoft Purview mises en correspondance avec l’identité de l’utilisateur.
OneLake ✅ Document importé avec étiquettes de confidentialité Microsoft Purview correspondant à l’identité de l’utilisateur.
SharePoint indexé ✅ Listes de contrôle d’accès (ACL) SharePoint importées ou étiquettes de confidentialité Microsoft Purview mises en correspondance avec l’identité de l’utilisateur.
SharePoint à distance ❌ L'API de récupération de Copilot interroge directement SharePoint en utilisant le jeton de l'utilisateur.
Fabric Data Agent ❌ Le moteur de récupération échange le jeton de l’utilisateur contre un jeton limité à Microsoft Fabric et interroge l’agent de données en son nom.
Fabric Ontology ❌ Le moteur de récupération échange le jeton de l’utilisateur contre un jeton limité à Microsoft Fabric et interroge l’élément d'ontologie en son nom.
IQ de travail ❌ Le moteur de récupération échange auprès de x-ms-query-work-iq-source-authorization une assertion utilisateur pour l’audience de l’application contre un jeton limité à Work IQ.

Si vous ne configurez ingestionPermissionOptions pas lorsque vous créez la source de connaissances indexée, l’index ne contient pas de métadonnées d’autorisation. Le système retourne les résultats non filtrés, quel que soit l’en-tête. Pour résoudre ce problème, recréez la source de connaissances avec les valeurs appropriées ingestionPermissionOptions .

Autorisation au moment de la requête

Pour les sources de connaissances autres que Work IQ, transmettez l’identité de l’utilisateur final en incluant, dans la requête de récupération, un jeton d’accès dont la portée est limitée à https://search.azure.com/.default. Ce jeton est distinct des informations d’identification du service utilisées pour accéder au service de recherche. Il n’a pas besoin d’autorisations de service de recherche et représente uniquement l’utilisateur dont l’accès au contenu est évalué. Pour plus d’informations, consultez l'application des ACL au moment des requêtes et la mise en œuvre du RBAC.

Pour les sources de connaissances Work IQ, cette section ne s’applique pas. Utilisez le flux d’assertion utilisateur spécifique à Work IQ décrit dans Appliquer les autorisations au moment de la requête.

Dans le sdk .NET, transmettez le jeton en tant que paramètre querySourceAuthorization sur 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

Dans le sdk Python, transmettez le jeton en tant que paramètre query_source_authorization sur 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

Dans l’API REST, incluez l’en-tête x-ms-query-source-authorization avec le jeton d’accès de l’utilisateur :

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

Référence :Récupération des connaissances - Récupérer

Passer en revue la réponse

L’action de récupération renvoie trois composants principaux :

Réponse extraite

La réponse extraite est une chaîne unifiée unique que vous transmettez généralement à un LLM. Le LLM consomme la chaîne en tant que données d'ancrage et l’utilise pour formuler une réponse. Votre appel d'API au LLM inclut la chaîne unifiée et les instructions pour le modèle, comme par exemple si l'ancrage doit être utilisé exclusivement ou comme complément.

Le corps de la réponse est structuré dans le format de style de message de conversation, et le contenu est sérialisé 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>\"}]"
            }
        ]
    }
]

Points clés :

  • content.type a une valeur valide : text.

  • content.text est une chaîne encodée JSON contenant les documents les plus pertinents (ou segments) trouvés dans l’index de recherche, en fonction des entrées de l’historique des requêtes et des conversations. Cette chaîne est vos données de base qu’un LLM utilise pour formuler une réponse à la question de l’utilisateur.

    • Cette partie de la réponse se compose de 200 blocs ou moins, en excluant les résultats n'atteignant pas le score minimal de 2,5 dans le reranker.

    • La chaîne commence par l’ID de référence du bloc (utilisé à des fins de citation) et tous les champs spécifiés dans la configuration sémantique de l’index cible. Dans cet exemple, supposons que la configuration sémantique dans l’index cible a un champ « title », un champ « terms » et un champ « content ».

  • Les réponses de récupération n’incluent pas @search.rerankerBoostedScore.

  • La maxOutputSizeInTokens propriété (maxOutputSize dans 2026-05-01-preview et ultérieure) sur la demande de récupération détermine la longueur de la chaîne.

    • Un document qui dépasse le budget de maxOutputSizeInTokens sortie peut être omis de la réponse. Le tableau d’activités inclut un avertissement lorsque le document le plus pertinent dépasse la taille de sortie maximale. Pour conserver davantage de contenu, augmentez maxOutputSizeInTokens. Pour plus d’informations, consultez Réponses vides.

Tableau d’activités

Le tableau d’activités génère le plan de requête, qui fournit une transparence opérationnelle pour le suivi des opérations, les implications de facturation et les appels de ressources. Cela inclut également les sous-requêtes envoyées au pipeline de récupération. Pour une réponse 206 Partial Content, le tableau contient des erreurs relatives aux sources de connaissances en échec. Une réponse 502 Bad Gateway peut fournir les détails de l’échec uniquement dans l’erreur de niveau supérieur.

Le tableau d’activités comprend les composants suivants :

Chapitre Description
Activité spécifique à la source Pour chaque source de connaissances incluse dans la requête, cette section signale le temps écoulé et les arguments utilisés dans la requête, y compris le ranker sémantique. Les types de sources de connaissances incluent searchIndex, azureBlobet d’autres sources de connaissances prises en charge.
agenticReasoning Cette section indique la consommation de jetons pour le raisonnement agentique pendant la récupération, qui dépend de l’effort de raisonnement pour la récupération (version préliminaire) spécifié.
modelQueryPlanning Pour les bases de connaissances qui utilisent un LLM pour la planification des requêtes, cette section indique le nombre de jetons utilisé pour l’entrée et le nombre de jetons pour les sous-requêtes. Il inclut un champ model avec un champ modelName contenant le nom public du modèle, et non le nom du déploiement, du modèle ayant exécuté l’activité.
modelAnswerSynthesis Pour les bases de connaissances qui utilisent la synthèse des réponses (préversion), cette section indique le nombre de jetons pour la formulation de la réponse et le nombre de jetons de la sortie de réponse. Il inclut un champ model avec un champ modelName contenant le nom public du modèle, et non le nom du déploiement, du modèle ayant exécuté l’activité.
modelWebSummarization Pour les bases de connaissances qui utilisent le résumé web, cette section signale la consommation de jetons pour résumer les résultats web. Il inclut un champ model avec un champ modelName contenant le nom public du modèle, et non le nom du déploiement, du modèle ayant exécuté l’activité.
model Pour les enregistrements d’activité soutenus par modèle, cette section identifie le modèle utilisé pour effectuer l’activité. Cette section s’affiche uniquement lorsque vous définissez includeActivity sur true.
imageServing Pour les sources de connaissances pour lesquelles l’affichage d’images (préversion) est activé, cette section indique imagesRetrieved, imagesSentToModel, totalImageSizeBytes et si verbalizationUsed était activé au moment de l’indexation. Inspectez imagesSentToModel et verbalizationUsed indépendamment. Une réponse peut indiquer verbalizationUsed comme true tout en envoyant quand même des images au modèle en aval. Pour rechercher le nombre d’images supprimées, soustraire imagesSentToModel de imagesRetrieved.

L’exemple suivant montre le tableau d’activités.

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

Tableau de références

Le tableau de références provient directement des données de base sous-jacentes. Il inclut le sourceData utilisé pour générer la réponse et se compose de chaque document que le moteur de recherche agentique trouve et classe sémantiquement.

Le tableau de références inclut les composants suivants :

Champ Description
type Le type de source de connaissances qui a produit la référence, tel que searchIndex.
id ID de référence d’un élément dans une réponse. Il ne s’agit pas de la clé de document dans l’index de recherche. Utilisez-le pour fournir des citations.
activitySource Fait référence au id de l’entrée de l’activité qui a produit la référence, ce qui est utile pour la liaison des citations.
docKey Pour une référence indexée, la clé du document dans l’index de recherche sous-jacent.
sourceData Données de base utilisées pour générer la réponse. Pour une référence indexée, les champs peuvent inclure des id champs sémantiques, tels que title, termset content. La forme varie selon le type de référence.
citationUrl (préversion) Une URL en lecture seule générée par le service pointant vers le document de la référence dans l’index sous-jacent. Retourné uniquement pour les sources de connaissances indexées. Pour suivre l’URL, consultez Rechercher des documents avec des URL de citation (version préliminaire).

L’exemple suivant montre le tableau de références.

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

Rechercher des documents avec des URL de citation (version préliminaire)

À compter de la version de l’API 2026-08-01-preview , une référence d’une source de connaissances indexée peut inclure une citationUrl dans la réponse de récupération. Utilisez cette URL pour récupérer les champs indexés de cette référence, tels que content et title, afin d’afficher un aperçu de citation indiquant d’où provient une réponse sans ouvrir le document source. Le citationUrl est une recherche authentifiée dans l’index sous-jacent, distincte de la source docUrl et de blobUrl.

L’exemple suivant montre une URL de citation nettoyée.

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

Les champs sélectionnés et leur ordre dépendent de la configuration de la source indexée et de la récupération.

Important

Suivez l’URL complète de la réponse détaillée et affichez les champs JSON retournés dans votre application. Ne construisez pas, analysez ou normalisez l’URL.

Étant donné une URL de citation, les exemples suivants obtiennent un jeton d’accès pour le service de recherche. Ils appellent l’URL avec ce jeton dans l’en-tête Authorization . L’identité connectée a besoin du rôle Lecteur de données de l’index de recherche .

Recherche Azure AI méthodes de recherche de documents du Kit de développement logiciel (SDK) nécessitent le point de terminaison, le nom d’index, la clé de document, les champs sélectionnés et la version de l’API en tant qu’entrées distinctes. Ils n’acceptent pas d’URL de citation absolue. Ces exemples utilisent un GET HTTP authentifié pour conserver l’URL générée par le service complet.

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

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

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

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

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

Reference :DefaultAzureCredential

import json
from urllib.request import Request, urlopen

from azure.identity import DefaultAzureCredential

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

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

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

Reference :DefaultAzureCredential

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

Référence :Documents - Obtenir

La recherche de document retourne les champs d’index sélectionnés au format 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"
}

Lorsque vous utilisez une URL de citation, gardez à l’esprit ce qui suit :

  • Vérifiez la présence de citationUrl avant d’afficher une citation. Il peut être absent si la réponse omet des références ou si le service ne peut pas résoudre l’index de stockage ou la clé de document.

  • Si la demande de récupération inclut x-ms-query-source-authorization pour le contrôle d’accès au niveau du document, utilisez le même jeton d’utilisateur lorsque vous suivez l’URL.

  • L’URL reste valide uniquement pendant que l’index de stockage et la clé de document restent inchangés.

Examiner les métadonnées de l’étiquette de confidentialité dans la réponse (version préliminaire)

Le même comportement temporel décrit dans Appliquer les autorisations au moment de la requête s’applique ici : les modifications apportées aux autorisations d’accès que vous définissez en dehors de 2026-08-01-preview peuvent mettre du temps à apparaître dans les réponses renvoyées par 2026-08-01-preview retrieve.

Lorsque vous interrogez une base de connaissances qui incorpore des étiquettes de confidentialité Microsoft Purview, la réponse de récupération inclut des métadonnées des étiquettes à deux niveaux :

Lieu Champ Description
Par référence sensitivityLabelInfo L’étiquette de confidentialité appliquée à chaque document retourné dans le tableau references.
Response metadata.responseSensitivityLabelInfo Une étiquette d’agrégation qui représente l’étiquette de confidentialité de priorité la plus élevée parmi tous les documents référencés dans la réponse. Utile pour les bannières d’affichage côté client et l’application des stratégies.

Microsoft Graph calcule l’étiquette du niveau de réponse à partir des étiquettes de chaque référence en appliquant les règles d’héritage des étiquettes Microsoft Purview. En règle générale, l’étiquette la plus restrictive gagne.

L’exemple suivant montre une réponse de récupération avec deux documents référencés (l’un Confidential, l’autre Internal) et l’étiquette résultante au niveau de la réponse.

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

Types de référence qui affichent des étiquettes de sensibilité

Le nom du champ et la disponibilité des métadonnées d’étiquette dépendent du type de source de connaissances qui a produit chaque référence.

Référence type Champ d’étiquette Disponible quand...
azureBlob sensitivityLabelInfo La source de connaissances Blob comprend sensitivityLabel dans ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo La source de connaissances OneLake inclut sensitivityLabel dans ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo La source de connaissances indexée SharePoint inclut sensitivityLabel dans ingestionPermissionOptions.
searchIndex sensitivityLabelInfo L’index sous-jacent a purviewEnabled défini sur true et un champ marqué par sensitivityLabel: true.

Afficher et auditer les recommandations

  • Utilisez sensitivityLabelInfo.labelId pour rechercher la définition complète de l’étiquette via les API d’étiquette de confidentialité Microsoft Graph lorsque vous avez besoin de propriétés supplémentaires, telles que des contrôles de stratégie ou des autorisations.

  • Utilisez metadata.responseSensitivityLabelInfo pour afficher une bannière de confidentialité au niveau de la réponse ou appliquer des contrôles de stratégie, tels que la désactivation de la copie et du partage, pour l’ensemble de la réponse.

  • Si votre source de connaissances pointe vers un index segmenté, tel qu’un index rempli via une vectorisation intégrée ou une compétence de fractionnement de texte personnalisé, assurez-vous que l’ensemble de compétences projette l’étiquette de confidentialité sur chaque ligne de bloc. Sans ce mappage, les références au niveau du bloc ne sont pas filtrées correctement au moment de la requête.

  • Pour un accès administratif vérifiable au contenu étiqueté, consultez Accès en lecture élevé pour les enquêtes administratives.

Comportement du serveur MCP

Le point de terminaison MCP exposé par chaque base de connaissances présente les mêmes champs d’étiquette de confidentialité que l’API REST. Lorsqu’un client compatible MCP invoque l’outil knowledge_base_retrieve, le résultat de l’outil contient les mêmes sensitivityLabelInfo pour chaque référence et les mêmes metadata.responseSensitivityLabelInfo au niveau de la réponse, décrits précédemment dans cette section. Les clients MCP appliquent des contrôles d’affichage sensibles aux étiquettes et des contrôles de politique basés sur ces champs.

Récupérer des exemples d’action (version préliminaire)

Les exemples suivants montrent différentes façons d’appeler l’action de récupération à l’aide de la version de l’API 2026-08-01-preview . Cette version prend en charge l’ensemble de fonctionnalités complet, y compris la synthèse des réponses et un effort de raisonnement configurable. Pour utiliser 2026-04-01, consultez les sections précédentes.

Inspecter les noms de modèles dans les journaux d’activité

Définissez includeActivity sur true pour renvoyer les champs d’identité du modèle dans les enregistrements d’activité basés sur un modèle. Utilisez ces champs pour confirmer le modèle configuré qui a géré la planification des requêtes, la synthèse des réponses ou la synthèse web lors d’une demande de récupération. L’exemple suivant remplace le traitement des résultats stockés pour la source sélectionnée sur la demande.

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

Référence :Récupération des connaissances - Récupérer

L’extrait de réponse suivant montre l’identité du modèle imbriqué :

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

Exiger une source de connaissances pour réussir

Définissez failOnError dans knowledgeSourceParams pour marquer une source de connaissances comme obligatoire. Utilisez ce paramètre lorsqu’une réponse partielle serait trompeuse ou non conforme si cette source n’est pas disponible. La requête retourne 502 Bad Gateway si une source requise échoue, même si une autre source réussit. Pour obtenir des conseils de gestion, consultez Résoudre les problèmes liés à l’action de récupération.

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

var result = await kbClient.RetrieveAsync(retrievalRequest);

Reference :SearchIndexKnowledgeSourceParams

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

result = kb_client.retrieve(request)

Reference :SearchIndexKnowledgeSourceParams

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

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

Référence :Récupération des connaissances - Récupérer

Exclure une source de connaissances d’une requête

À compter de la version de l’API 2026-08-01-preview, définissez neverQuerySource sur true pour chaque source de connaissances que vous souhaitez exclure d’une demande de récupération. Au moment de la requête, neverQuerySource remplace la valeur stockée alwaysQuerySource pour cette requête, sans modifier la valeur stockée.

L’exemple suivant interroge une base de connaissances qui contient product-docs-ks et troubleshooting-ks, à l’exclusion troubleshooting-ks de la requête.

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

var result = await kbClient.RetrieveAsync(retrievalRequest);

Reference :SearchIndexKnowledgeSourceParams

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

result = kb_client.retrieve(request)

Reference :SearchIndexKnowledgeSourceParams

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

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

Référence :Récupération des connaissances - Récupérer

Ajuster les documents candidats par source de connaissances

Définissez maxOutputDocuments dans knowledgeSourceParams pour limiter le nombre de documents candidats qu’une source de connaissances spécifique fournit avant la sélection finale des résultats. Utilisez ce paramètre lorsque vous souhaitez lier l’entrée d’une source au pipeline sans affecter d’autres personnes.

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

var result = await kbClient.RetrieveAsync(retrievalRequest);

Reference :SearchIndexKnowledgeSourceParams

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

result = kb_client.retrieve(request)

Reference :SearchIndexKnowledgeSourceParams

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

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

Référence :Récupération des connaissances - Récupérer

Limiter les documents de base finals

Le paramètre de niveau maxOutputDocuments supérieur limite le nombre de documents de base retournés dans la réponse de récupération finale. Utilisez ce paramètre lorsque votre application a besoin d’une citation ou d’un nombre de références prévisibles.

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
}

Référence :Récupération des connaissances - Récupérer

Le tableau suivant montre comment maxOutputDocuments et maxOutputSizeInTokens interagir entre les quatre combinaisons.

maxOutputDocuments maxOutputSizeInTokens Comportement
Non spécifié Non spécifié Utilise le comportement de limite de réponse par défaut maxOutputSizeInTokens .
Non spécifié Spécifié Ignore les documents une fois la limite de taille de charge utile atteinte.
Spécifié Non spécifié Retourne jusqu’au nombre spécifié de documents d’ancrage et n’applique pas de limite maxOutputSizeInTokens.
Spécifié Spécifié Renvoie jusqu’à maxOutputDocuments documents, ou le nombre de documents pouvant tenir dans maxOutputSizeInTokens, selon la première limite atteinte.

Vérifier que la base de connaissances récupère les valeurs par défaut

Une base de connaissances peut stocker les valeurs par défaut à l’échelle de la requête dans retrieveDefaults. Envoyez deux requêtes de récupération pour vérifier l’héritage et les remplacements spécifiques à la requête.

Avant de commencer, terminez Configurer les limites de récupération par défaut (préversion) . La première requête omet les trois limites à l’échelle de la requête, de sorte que les valeurs stockées de 45 secondes, huit documents et 12 000 jetons s’appliquent. La deuxième demande les remplace par 20 secondes, un document et 5 000 jetons.

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

Tout d’abord, envoyez une requête qui omet les trois champs de limite à l’échelle de la requête.

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

Ensuite, remplacez les trois valeurs d’une requête.

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
}

Référence :Récupération des connaissances - Récupérer

Le nombre de références indique si la valeur stockée ou au niveau maxOutputDocuments de la requête s’applique : la première réponse contient au maximum huit références, et la seconde contient au plus un. Une réponse peut contenir moins de références lorsque moins de documents correspondent. La réponse ne signale pas le budget effectif du runtime ou du jeton de sortie, mais ces valeurs régissent toujours le traitement des demandes. Les substitutions de requête ne modifient pas les valeurs par défaut enregistrées.

Remplacer l’effort de raisonnement par défaut et définir des limites de requête

L’exemple suivant spécifie la synthèse des réponses, de sorte que l’effort de raisonnement de récupération doit être low ou medium. Il définit maxRuntimeInSeconds également pour limiter le runtime de récupération et maxOutputSizeInTokens limiter la taille de la charge utile de réponse.

maxRuntimeInSeconds accepte les valeurs comprises entre 10 et 600 secondes et la valeur par défaut est de 90 secondes. La valeur maximale de 600 secondes (10 minutes) s’applique uniquement à la demande de récupération Recherche Azure AI.

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
}

Référence :Récupération des connaissances - Récupérer

Laisser le service choisir l’effort de raisonnement

Définissez auto sur retrievalReasoningEffort.kind dans une requête de récupération pour remplacer la valeur par défaut de la base de connaissances. Pour plus d’informations sur le raisonnement automatique, consultez Définir le niveau d’effort du raisonnement de récupération (version préliminaire).

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

Référence :Récupération des connaissances - Récupérer

Définir des références pour chaque source de connaissances

Utilisez includeReferences et includeReferenceSourceData dans knowledgeSourceParams pour contrôler les sources qui apparaissent dans le tableau references et le volume de données de source inclus dans chaque entrée. L’exemple suivant utilise l’effort de raisonnement par défaut de la base de connaissances.

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

Référence :Récupération des connaissances - Récupérer

Utiliser un effort de raisonnement minimal

Dans l’exemple suivant, il n’existe pas de LLM pour la planification intelligente des requêtes ou la synthèse des réponses. La chaîne de requête accède au moteur de récupération agentique pour la recherche de mots clés ou la recherche hybride.

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

Référence :Récupération des connaissances - Récupérer

Résoudre les problèmes liés à l’action de récupération

Dans 2026-08-01-preview, l’état de la réponse indique si la récupération a réussi, en partie réussi ou échoué, et ce qu’il faut faire ensuite. Utilisez le tableau suivant pour mapper chaque état à sa signification, puis consultez la section correspondante pour obtenir des conseils de dépannage.

Status Meaning
200 OK Récupération réussie. Un document peut toujours être omis si son contenu dépasse le budget de sortie. Pour plus d’informations, consultez Réponses vides.
400 Bad Request La validation de la demande de récupération a échoué avant le début de la récupération.
206 Partial Content Au moins une source a réussi et aucune source ayant échoué n’est marquée failOnError. La réponse contient les résultats des sources qui ont réussi.
502 Bad Gateway Chaque source sélectionnée a échoué ou une source marquée failOnError: true comme ayant échoué.

Pour toute réponse autre que 200, enregistrez la version de l’API, l’horodatage, le corps de requête nettoyé, les en-têtes de réponse et l’ID de requête ou de corrélation. Ces détails vous aident à diagnostiquer l’échec et à partager le problème avec le support, si nécessaire.

400 Bad Request

Utilisez l’erreur de niveau supérieur pour identifier la propriété de requête non valide. Les causes courantes sont les suivantes :

  • Une entrée knowledgeSourceName dans knowledgeSourceParams n’est pas liée à la base de connaissances, ou son kind ne correspond pas à la source liée.
  • Une valeur de requête est en dehors de sa plage prise en charge, ou une option nécessite une autre option qui n’est pas activée. Par exemple, includeReferenceSourceData nécessite includeReferences.
  • retrievalReasoningEffort.kind est auto, mais la requête utilise une version d’API antérieure à 2026-08-01-preview.
  • La requête utilise auto, lowou , mais mediumla base de connaissances ne définit pas de modèle.
  • Pour l’exclusion de source à l’exécution de la requête (version préliminaire), la même entrée définit à la fois alwaysQuerySource et neverQuerySource sur true, sinon chaque source de connaissances attachée est exclue.

Avant de réessayer la requête, corrigez la propriété identifiée par l’erreur de niveau supérieur.

206 Partial Content

Inspectez chaque activity entrée qui contient un error. Une activité de récupération de source identifie la source de connaissances ayant échoué et une activité de modèle identifie l’étape de traitement ayant échoué. Le corps de la réponse contient toujours les résultats qui ont abouti.

Pour les erreurs d’activité de récupération de source, les causes courantes sont les suivantes :

Pour une erreur d’activité de modèle, utilisez l’activité type pour identifier l’étape de traitement ayant échoué. Par exemple, une modelWebSummarization erreur indique que la synthèse des résultats web a échoué.

Si votre application autorise les résultats partiels, traitez les résultats réussis et enregistrez chaque étape source ou modèle ayant échoué. Corrigez les erreurs de configuration, d’autorisation et d’autorisation avant de réessayer. En cas de limitation de débit, d’expiration de délai ou d’indisponibilité temporaire, utilisez des tentatives limitées avec une backoff.

Si les résultats ne sont pas sécurisés sans source spécifique et que son type de source prend en charge alwaysQuerySource, définissez alwaysQuerySource et failOnError. La première option garantit que la source est sélectionnée et que la seconde retourne une erreur difficile en cas d’échec de l’interrogation. Les sources de connaissances du serveur MCP (préversion) ne prennent pas en charge alwaysQuerySource; pour ces sources, failOnError s’applique uniquement lorsque la source est sélectionnée. failOnError ne s’applique pas aux échecs d’activité du modèle.

502 Bad Gateway

L’erreur de premier niveau décrit l’un des deux scénarios de défaillance fatale :

  • Chaque source sélectionnée a échoué : Chaque source sélectionnée a retourné une erreur. Une source qui s’exécute correctement sans aucun document correspondant n’est pas une source en échec. Inspectez chaque défaillance source pour un problème de configuration, d’autorisation, de dépendance ou de disponibilité partagé.
  • Échec d’une failOnError source : une source requise n’a pas pu être interrogée. D’autres sources peuvent avoir réussi, mais le service ne retourne pas de résultat partiel, car la source requise a échoué.

Les défaillances sous-jacentes de la source sont généralement du même type que celles décrites pour 206 Partial Content : entrée spécifique à la source non valide, dérive de configuration de la source ou de l’index, problèmes d’autorisation ou de permissions liés aux dépendances, limitation de débit, délais d’attente ou indisponibilité temporaire d’une dépendance.

Une réponse stricte 502 peut omettre le tableau activity et fournir uniquement le nom de la source ainsi que la cause sous-jacente de l’échec dans le message d’erreur de niveau supérieur. Corrigez les erreurs de configuration, d’autorisation et d’autorisation avant de réessayer. Utilisez des tentatives limitées avec backoff uniquement pour les problèmes de limitation de débit, d’expiration de délai ou d’indisponibilité temporaire. N'interprétez pas une 502 Bad Gateway réponse comme une panne Recherche Azure AI sans examiner l'échec source sous-jacent.

Réponses vides

L’étape de recherche peut trouver un document, mais le service peut toujours l’omettre de la réponse finale si son contenu ancré dépasse le maxOutputSizeInTokens budget de sortie (maxOutputSize dans 2026-05-01-preview et versions ultérieures). Lorsque cette condition se produit, le tableau d’activités indique que les correspondances ont été trouvées, et l’enregistrement d’activité inclut un avertissement indiquant que le document le plus pertinent a dépassé la taille de sortie maximale. Le tableau de références et le contenu de la réponse étayée sont vides pour ce document. Pour conserver davantage de contenu, augmentez maxOutputSizeInTokens.

Pour éviter ce comportement, indexez les documents sources volumineux sous forme de blocs plus petits avec des identificateurs stables et des métadonnées sources. Cela s’applique particulièrement aux longs manuels, stratégies ou articles de la base de connaissances.

Appeler le point de terminaison MCP

Avertissement

Les implémentations mcP sont vulnérables aux risques, tels que les attaques, les défaillances en cascade et la perte de surveillance humaine. Vous pouvez atténuer ces risques en effectuant une vérification des serveurs MCP pour la sécurité et la fiabilité, en suivant les pratiques recommandées par Microsoft et meilleures pratiques en matière d'industrie et en implémentant les mécanismes d'approbation et la surveillance des comportements en cascade.

MCP est un protocole ouvert qui standardise la façon dont les applications IA se connectent à des sources et outils de données externes.

Dans Recherche Azure AI, chaque base de connaissances est un serveur MCP autonome qui expose l’outil knowledge_base_retrieve. Tout client compatible MCP, y compris Foundry Agent Service, GitHub Copilot, Claude et Cursor, peut utiliser cet outil pour interroger la base de connaissances.

S’authentifier auprès du point de terminaison MCP

Chaque base de connaissances a un point de terminaison MCP à l’URL suivante :

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

La version de l’API que vous spécifiez détermine ce que la connexion retourne. En utilisant 2026-08-01-preview, la base de connaissances retourne des réponses synthétisées lorsque la base de connaissances sous-jacente est configurée avec un LLM et un effort de raisonnement compatible. En utilisant 2026-04-01, la récupération est toujours minimale et extractive, et la connexion renvoie uniquement des données d’ancrage.

La façon dont vous vous authentifiez auprès de ce point de terminaison dépend de votre client MCP. Lorsque vous utilisez l’API Azure Réponses OpenAI avec l’outil knowledge_base_retrieve MCP, vous authentifiez à la fois l’appel de l’API Réponses pour Azure OpenAI et la demande MCP pour Recherche Azure AI. Si votre client MCP appelle ce point de terminaison directement, vous vous authentifiez uniquement auprès de Recherche Azure AI.

Pour l’authentification Recherche Azure AI, utilisez l’une des méthodes suivantes :

Note

Les clients MCP configurent des en-têtes personnalisés différemment. Par exemple, Foundry Agent Service injecte des en-têtes via des connexions de projet, tandis que des clients tels que GitHub Copilot nécessitent des en-têtes dans le JSON du serveur MCP.

Utiliser un jeton de porteur pour l’authentification MCP

La méthode recommandée pour l’authentification MCP est un jeton du porteur, qui évite de stocker des clés sensibles dans les fichiers de configuration. L’identité derrière le jeton doit avoir le rôle Lecteur de données d’index de recherche attribué au service de recherche. Pour plus d’informations, consultez Connectez votre application pour Recherche Azure AI à l’aide d’identités.

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

Référence :Utiliser l’API réponses 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)

Référence :Utiliser l’API réponses OpenAI Azure

// This code snippet is currently unavailable.

Utiliser une clé d’administration pour l’authentification MCP

Une clé d’administration accorde un accès en lecture-écriture complet au service de recherche. Utilisez-la uniquement dans les environnements de développement ou lorsqu’un jeton du porteur n’est pas disponible. Pour plus d’informations, consultez Connect to Recherche Azure AI using API keys.

Tip

L’exemple suivant affiche uniquement l’en-tête qui diffère par rapport à l’exemple de jeton Porteur. Pour obtenir la configuration complète, consultez Utiliser un jeton du porteur pour l’authentification 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)
);

Référence :Utiliser l’API réponses 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",
    }
]

Référence :Utiliser l’API réponses OpenAI Azure

// This code snippet is currently unavailable.

Passer en revue la réponse MCP

Lorsqu’un client MCP invoque knowledge_base_retrieve, il reçoit un résultat d’outil MCP au lieu de l’enveloppe response, activity et references de l’action retrieve. De nombreux clients MCP affichent le résultat de cet outil sous un objet de niveau result supérieur, de sorte que la charge utile que vous devez attendre est 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>\"}]"
      }
    ]
  }
}

Points clés :

  • result.content[] contient la sortie de l’outil MCP retournée par la base de connaissances.

  • result.content[].type a la valeur text.

  • result.content[].text contient les données de base récupérées sous la forme d’une chaîne encodée JSON.

  • Contrairement à l’action de récupération, la réponse MCP actuelle ne renvoie pas de tableaux activity ou references distincts et ne renseigne pas les entrées resource avec le contenu renvoyé.