取得アクションまたは MCP エンドポイントを使用してナレッジ ベースにクエリを実行する

メモ

Azure AI 検索は、Azure ポータル、REST API、およびAzure SDKから使用できます。 また、Foundry IQ は、エンタープライズ コンテンツを、Microsoft Foundry ポータルのエージェントの再利用可能なアクセス許可に対応したナレッジ ベースに変換するマネージド ナレッジ レイヤーです。

重要

機能、またはマークされたプロパティ (プレビュー) は、サービス レベル アグリーメントの対象ではなく、運用環境のワークロードには推奨されず、一般公開される前に変更または制約される可能性があります。 Azure AI 検索 プレビューの用語は、スタンドアロンでも一般公開されている機能の一部でも、すべてのプレビュー機能に適用されます。

エージェント検索パイプラインでは、 取得アクション によってナレッジ ベースから並列クエリ処理が呼び出されます。 Search Service REST API またはAzure SDKを使用して、取得アクションを直接呼び出すことができます。 また、各ナレッジ ベースでは、MCP と互換性のあるエージェントが使用するモデル コンテキスト プロトコル (MCP) エンドポイントも公開されています。

この記事では、オプションのアクセス許可の適用で両方の取得方法を呼び出す方法について説明します。 MCP ツールの結果は現在 REST と SDK の応答形状と異なるため、最初に取得アクションと後で MCP エンドポイントについて説明します。

MCP を介して foundry Agent Service にAzure AI 検索接続するパイプラインを設定するには、「Tutorial: エンドツーエンドのエージェント検索ソリューションの構築を参照してください。

使用サポート

Azure Portal Microsoft Foundry ポータル .NET SDK Python SDK Java SDK JavaScript SDK REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

前提 条件

  • ナレッジベースを持つAzure AI 検索 サービス。

  • 共有モデル アクセスとクライアントのセットアップについては、「 ナレッジ ベースを作成するための前提条件」を参照してください。

  • ナレッジ ベースのクエリを実行するアクセス許可。 ユーザー アカウントに割り当てられた検索インデックス データ閲覧者ロール (推奨) を使用してキーレス認証を構成するか、クエリ API キーを使用します。

  • Azure OpenAI Responses API を介して MCP エンドポイントを呼び出す場合は、次のものが必要です。

    • Foundry リソース上の、デプロイ済みの LLM と Cognitive Services OpenAI User ロール(または API キー)。 該当する場合は、ナレッジ ベースで指定された LLM とリソースを再利用できます。

    • Azure.AI.OpenAI パッケージ:dotnet add package Azure.AI.OpenAI

  • 必須Azure.Search.Documents パッケージ:

    • 2026-08-01-preview機能の場合、最新のプレビュー パッケージ:dotnet add package Azure.Search.Documents --prerelease

    • 2026-04-01機能の場合、最新の安定したパッケージ:dotnet add package Azure.Search.Documents

  • キーレス認証の場合、 Azure.Identity パッケージは次のようになります。 dotnet add package Azure.Identity

  • Azure OpenAI Responses API を介して MCP エンドポイントを呼び出す場合は、次のものが必要です。

    • Foundry リソース上の、デプロイ済みの LLM と Cognitive Services OpenAI User ロール(または API キー)。 該当する場合は、ナレッジ ベースで指定された LLM とリソースを再利用できます。

    • openai パッケージ:pip install openai

  • 必須azure-search-documents パッケージ:

    • 2026-08-01-preview機能の場合、最新のプレビュー パッケージ:pip install --pre azure-search-documents

    • 2026-04-01機能の場合、最新の安定したパッケージ:pip install azure-search-documents

  • キーレス認証の場合、 azure-identity パッケージは次のようになります。 pip install azure-identity

  • 必要な Search Service REST API のバージョン:

  • キーレス認証の場合は、各 HTTP 要求の Authorization ヘッダーにMicrosoft Entra ID トークンを含めます。

Limitations

検索インデックスのナレッジ ソースの場合、再ランク付けを有効にすると、取得ではナレッジ ソースのセマンティック構成が使用されます。 基になるインデックスの スコアリング プロファイル ( defaultScoringProfileを含む) は適用されません。 応答を取得しても、@search.rerankerBoostedScore は表示されません。

取得アクションを呼び出す

ナレッジ ベースに対して取得アクションを指定します。 要求本文には、クエリ入力と、ターゲットとするナレッジ ソースの省略可能なリストが含まれます。

2026-04-01 API バージョンでは、intents入力と最小限の抽出取得のみがサポートされます。 messages入力、クエリ計画、応答合成、構成可能な推論作業など、プレビューのみの機能はサポートされていません。 2026-08-01-previewを使用して、完全な機能を実現します。

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

リファレンス:ナレッジの取得 - 取得

合成に応答する画像を提供する (プレビュー)

資産ストアで構成する BLOB、インデックス付き OneLake、インデックス付きSharePointナレッジ ソースの場合は、ドキュメント埋め込みイメージをテキストと共にダウンストリームの回答合成モデルに提供できます。 ナレッジ ベース定義に設定されている既定値をオーバーライドするには、enableImageServingの一致するエントリにknowledgeSourceParamsを設定します。 取得応答には、モデルに指定された個々のイメージ パスまたはイメージ バイトの専用フィールドは含まれません。

イメージ サービスは、 outputMode が answerSynthesis され、 ingestionPermissionOptionsを構成するナレッジ ソースではサポートされていない場合にのみ実行されます。 セットアップ手順、優先順位テーブル、および画像配信の統計情報を確認する方法については、agentic retrieval でドキュメントに埋め込まれた画像を表示する (プレビュー) を参照してください。

ナレッジ ソースの再ランク付けを無効にする (プレビュー)

2026-08-01-preview API バージョン以降では、特定のナレッジ ソースの再ランク付けをバイパスし、基になる結果の順序を維持するために、knowledgeSourceParams エントリに"resultsProcessing": "none"を設定します。 ナレッジ ソースに resultsProcessing を既定として格納することもできます。 すべてのナレッジ ソースの種類でこのプロパティがサポートされます。

次の例では、1 つの取得要求で product-catalog-ks の再ランク付けがバイパスされます。

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

リファレンス:ナレッジの取得 - 取得

再ランク付けパイプラインを使用するには、 "resultsProcessing": "rerank"を設定するか、格納されている既定値が存在しない場合は省略します。 Azure AI 検索は、各ソースの有効な値を次の順序で解決します。

  1. 取得要求における knowledgeSourceParams 内の resultsProcessing。
  2. resultsProcessing ナレッジ ソースに格納されます。
  3. rerank どちらのプロパティも存在しない場合。

MCP サーバーのナレッジ ソースの場合、個々のツールに設定されたresultsProcessing値が、要求と格納された値よりも優先されます。

Tip

resultsProcessing は、クエリを実行するソースではなく、結果の処理方法を変更します。 ナレッジ ソースを照会する必要がある場合は、 alwaysQuerySource を true に設定します。

有効な値が none場合:

  • ナレッジ ソースからの参照では rerankerScoreが省略され、結果は基になる順序をソースの取得アクティビティ内に保持します。
  • ソースが再ランク付けをバイパスすると、Azure AI 検索は、ナレッジ ソース宣言の順序に従って、ラウンド ロビン順にアクティビティ間で最終的な結果を分散します。 再ランク付けされたアクティビティはスコア順に並べ替えられます。
  • 重複除去とソースごと、ドキュメント、およびトークンの制限は引き続き適用されるため、取得されたすべての結果が応答に表示されるわけではありません。

Azure AI 検索は、次の順序でrerankerThresholdを検証します。

  1. 検索では、取得要求と格納されているナレッジ ソース値から resultsProcessing が解決されます。
  2. 解決された値が none され、要求に rerankerThresholdが含まれている場合、Search は 400 Bad Requestを返します。
  3. MCP サーバー ツールの場合、Search では、要求の検証後にツール レベルの resultsProcessing 値が適用されます。

その結果、MCP ツールの設定では、要求が検証に合格するかどうかは変更されません。 ツール レベルの none 値はしきい値エラーを引き起こしません。また、ツール レベルの rerank 値は、要求または格納された値が noneに解決されたときにエラーを防ぐことはありません。

実行されたモードを確認するには、ナレッジ ソースの参照に rerankerScoreが含まれているかどうかを確認します。 省略されるのではなくsemanticConfigurationNameになる可能性があるnullに依存しないでください。

検索インデックスの動作

検索インデックスを対象とするナレッジ ソースの場合、暗黙的なクエリの種類は semanticされ、検索モードはありません。 再ランク付け実行では、クエリ実行で semanticConfigurationNameが使用されます。 searchFieldsやsourceDataFieldsなど、その他のソース設定は両方のモードで適用されます。

エージェント検索では、 scoringProfile または scoringParameters 入力は受け入れられません。 インデックス付きナレッジ ソースに対して最新のバイアスが必要な場合は、インデックス スコアリング プロファイルではなく 、鮮度対応の取得 (プレビュー) を使用します。

インデックスにベクター フィールドが含まれている場合は、エージェント検索エンジンがクエリ入力をベクター化できるように、有効なベクター化定義が必要です。 それ以外の場合、ベクター フィールドは無視されます。

詳細については、「 エージェント検索用のインデックスを作成する」を参照してください。

ストリーム取得結果 (プレビュー)

2026-08-01-preview API バージョン以降では、単一の JSON 応答を待機する代わりに、サーバー送信イベント (SSE) のストリームとして取得結果を受け取ることができます。 ストリーミングを使用すると、クライアントは、各部分が使用可能になったときに、クエリの計画、ソース アクティビティ、合成された回答または抽出された応答をその順序で表示できます。

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

リファレンス: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}")

リファレンス:KnowledgeBaseRetrievalClient

ストリーミングをオプトインするには、 Accept: text/event-stream ヘッダーを取得要求に含めます。 このヘッダーがない場合、取得アクションは標準の JSON 応答を返します。

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

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

リファレンス:ナレッジの取得 - 取得

イベントのライフサイクル

1 つの応答を返す代わりに、サービスは 1 つの HTTP 接続を開いたまま (コンテンツ タイプ text/event-stream; charset=utf-8) し、データが使用可能になると一連のイベントを送信します。 各イベントには、イベントの種類を指定する event: 行、JSON 値を含む data: 行、およびイベントの終わりを示す空白行があります。

成功したストリームでは、次のライフサイクルが使用されます。

Event 送信された場合 内容は何か
retrieval.started 各ストリーミング リクエストで最初に発生するイベント。 要求 ID、ナレッジ ベース名、出力モード、サービスが要求とナレッジ ベースの既定値を解決した後の効果的な推論作業。 有効な kind が auto場合、イベントは auto報告します。後のエスカレーションは予測されません。
activity.started サービスがクエリ計画、ソース、またはモデルアクティビティを開始するとき。 以前のアクティビティが完了する前に、複数のアクティビティを開始できます。 アクティビティ id、 type、開始時刻、およびオプションのナレッジ ソース名。
activity.completed そのアクティビティが終了したとき。 activity.started を照合して、それを対応する id イベントに関連付けます。 完了済みのアクティビティ記録。
answer.completed 1 回限り、 outputMode が answerSynthesis場合のみ。 messageIndex は最終的な応答配列内のメッセージの位置を識別し、 message には合成された完全な回答が含まれます。 トークンごとのデルタ イベントはありません。
references.completed すべての参照が解決された後。 イベント データは、オブジェクト ラッパーを含まない完全な 参照配列です。
response.completed 成功した、または部分的に成功したストリームの終端イベント。 200 または 206 ステータス コードと、非ストリーミング JSON 呼び出しと同じ形式の retrieve レスポンス本文全体。 各状態コードの意味については、「 取得アクションのトラブルシューティング」を参照してください。
error ストリームが開いた後に取得が失敗したときに references.completed と response.completed の代わりに。 エラーと、エラーの前に完了したアクティビティ レコード。

イベントは順番に到着します。 各activity.started イベントは、同じidを持つactivity.completed イベントの前にありますが、アクティビティはインターリーブできます。 完了したアクティビティ レコードには、 startedAt および completedAt タイムスタンプも含まれます。 ストリームがアイドル状態の間、サーバーは接続を開いたままにするため、約 15 秒ごとに : heartbeat コメントを送信します。 SSE クライアントは、これらのコメントを無視できます。

次の例は、読みやすくするためにペイロードが短縮されたストリーミング応答を示しています。

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

エラー、キャンセル、フォールバックの処理

  • プレフライト エラー: 形式が正しくない要求本文など、ストリームが開く前に要求の検証が失敗した場合、取得アクションは標準の JSON エラー応答を返し、ストリームを開くことはありません。

  • 中流エラー: ストリームが開いた後に取得に失敗した場合、ターミナル イベントはreferences.completedおよびresponse.completedではなくerrorされます。 イベントには、失敗前に完了したアクティビティ レコードを含めることができます。 HTTP 状態コードはストリームが開始されると 200 残ります。そのため、HTTP 状態コードではなくターミナル イベントを確認して成功を判断します。

  • キャンセルまたは切断: クライアントが要求をキャンセルするか、ストリームが終了する前に切断した場合、サービスは取得をキャンセルし、ターミナル イベントなしでストリームを終了します。 取り消し前または切断前に受信したイベントを不完全として扱います。

  • JSON フォールバック: 2026-08-01-preview を使用している場合、Accept ヘッダーがない場合、または application/json、*/*、text/*、text/event-stream;q=0 などの値の場合は、応答の確認 で説明されている標準の JSON レスポンスが返されます。 以前のバージョンの API から text/event-stream を要求すると、 406 Not Acceptableが返されます。

クエリ時に検索インデックスのナレッジ ソースをフィルター処理する

検索インデックスナレッジ ソースから取得する場合、クエリ時に OData フィルター を適用して、結果を特定のドキュメントまたはフィールドに絞り込むことができます。 フィルター式は OData 構文を使用し、 filterAddOn パラメーターを使用して渡されます。

フィルターの構文と例

filterAddOn パラメーターは OData フィルター式を受け入れます。 パターンの例を次に示します。

  • メタデータ フィールド: city eq 'Phoenix'、 status eq 'active'
  • 日付範囲: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • 数値範囲: price ge 100 and price le 5000
  • テキスト照合: substringof('climate', description)、 indexof(title, 'urgent') ge 0
  • 論理演算子: (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'"
        }
    ]
}

マルチフィルターの例

複数のフィルターを組み合わせて、結果をさらに絞り込むことができます。

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

クエリ時に保存されたクエリ ヒントをオーバーライドする (プレビュー)

2026-08-01-preview API バージョン以降では、knowledgeSourceParams エントリにqueryHintOverridesを設定することで、検索インデックスナレッジ ソースに格納されているクエリ ヒントを 1 回の取得要求に対してオーバーライドできます。

このオーバーライドは、エントリをエントリ別にマージするのではなく、格納されている queryHints オブジェクト全体を置き換えるので、適用するすべてのヒントを含めます。 格納されているヒントを使用するには、 queryHintOverrides を省略します。

取得の理由付け作業が minimalされていない場合、HTTP 400 応答は、オーバーライドの内容やブーストの種類ではなく、格納されているフィルター ヒントに依存します。 サービスは、 queryHintOverridesを適用する前に、ナレッジ ベース モデルに対して格納されているフィルター ヒントを検証します。 したがって、GPT-4o または GPT-4.1 ファミリ モデルは、オーバーライドが空であるか、ブーストのみが含まれている場合でも、要求を拒否します。 保存されているブーストだけでは、この検証はトリガーされません。 互換性のあるモデルを使用するか、格納されているフィルター ヒントを最初に削除します。

次の例では、格納されているすべてのヒントを、日本語コンテンツの 1 つの fieldValue ブーストに置き換えます。 このサービスでは、この要求に格納されているフィルターやその他の格納されたブーストは適用されません。

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
}

リファレンス:ナレッジの取得 - 取得

サービスがオーバーライドを適用したことを確認するには、要求に includeActivity を設定し、返された searchIndex アクティビティを調べます。 その queryHintProcessing オブジェクトは、モデルが生成した内容を報告します。 この例では、言語ブーストの generatedBoost が含まれていますが、オーバーライドによって格納されたフィルター ヒントが置き換えられたため、 generatedFilter はありません。 クエリ ヒントはベスト エフォートであるため、この処理は正確な式を確認するものではなく、あくまで確認として扱います。

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

格納されている定義、サポートされているヒントの種類、決定論的フィルターを使用したコンポジションについては、「 クエリ ヒントの構成 (プレビュー)」を参照してください。

クエリ時にアクセス許可を適用する (プレビュー)

2026-08-01-previewの外部で設定したアクセス許可に対する変更は、取得結果2026-08-01-preview表示されるまでに時間がかかる場合があります。

ナレッジ ソースにアクセス許可で保護されたコンテンツが含まれている場合は、取得要求でエンド ユーザーの ID を渡して、各ユーザーがアクセスを許可されているコンテンツのみを表示できるようにします。 インデックス付きソースの場合、取得エンジンはこの ID を使用して結果をフィルター処理し、省略された場合はフィルター処理されていない結果を返します。 リモート ソースでは、取得要求からの承認も使用されますが、ソースでアクセス許可が適用され、ソース固有のトークンとヘッダーが必要になる場合があります。

アクセス許可の適用には、次の 2 つの部分があります。

  • インジェスト時間: インデックス付きナレッジ ソースの場合のみ、コンテンツと共にアクセス許可メタデータを取り込む ingestionPermissionOptions を設定します。

  • クエリ時間: ナレッジ ソースに必要なヘッダーにユーザーの承認を渡します。 ほとんどのソースでは、 x-ms-query-source-authorizationが使用されます。 例外は、 x-ms-query-work-iq-source-authorizationを使用する Work IQ です。

インジェスト時間の構成

次の表は、インジェスト時の構成が必要なナレッジ ソースと、各ソースがアクセス許可を適用する方法を示しています。

ナレッジ ソース 必要 ingestionPermissionOptions アクセス許可の適用方法
BLOB または ADLS Gen2 ✅ 取り込まれた RBAC スコープ、ACL、または Microsoft Purview がユーザー ID と照合されます。
OneLake ✅ 取り込まれたドキュメントの Microsoft Purview 秘密度ラベルが、ユーザー ID に照合されました。
インデックス付き SharePoint ✅ 取り込まれたSharePoint ACL またはMicrosoft Purview秘密度ラベルがユーザー ID と一致しました。
リモート SharePoint ❌ Copilot取得APIは、ユーザーのトークンを使用してSharePointに直接クエリを実行します。
Fabric データ エージェント ❌ 取得エンジンは、ユーザーのトークンをMicrosoft Fabricスコープトークンと交換し、データ エージェントに代わってクエリを実行します。
Fabric オントロジー ❌ 取得エンジンは、ユーザーのトークンをMicrosoft Fabricスコープのトークンと交換し、オントロジ項目に代わってクエリを実行します。
ワークインテリジェンス ❌ 取得エンジンは、 x-ms-query-work-iq-source-authorization からアプリ対象ユーザー のユーザー アサーションを Work IQ スコープ トークンと交換します。

インデックス付きナレッジ ソースを作成するときに ingestionPermissionOptions を構成しない場合、インデックスにはアクセス許可メタデータが含まれません。 ヘッダーに関係なく、フィルター処理されていない結果が返されます。 この問題を解決するには、適切な ingestionPermissionOptions 値を使用してナレッジ ソースを再作成します。

クエリ時の認可

非 Work IQ ナレッジ ソースの場合は、取得要求で https://search.azure.com/.default をスコープとするアクセス トークンを含めることで、エンド ユーザーの ID を渡します。 このトークンは、検索サービスへのアクセスに使用されるサービス資格情報とは別です。 検索サービスのアクセス許可は必要ありません。コンテンツ アクセスが評価されるユーザーのみを表します。 詳細については、「 クエリ時間 ACL と RBAC の適用」を参照してください。

Work IQ ナレッジ ソースの場合、このセクションは適用されません。 「クエリ時にアクセス許可を適用する」で説明されている Work IQ 固有のユーザー アサーション フローを使用します。

.NET SDK で、トークンを querySourceAuthorization の 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

Python SDK で、トークンを query_source_authorization パラメーターとして 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

REST API には、ユーザーのアクセス トークンを含む x-ms-query-source-authorization ヘッダーを含めます。

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

リファレンス:ナレッジの取得 - 取得

応答を確認する

取得アクションは、次の 3 つの主要なコンポーネントを返します。

抽出された応答

抽出された応答は、通常は LLM に渡す単一の統合文字列です。 LLM は、この文字列をグラウンド データとして使用し、それを使用して応答を作成します。 LLM への API 呼び出しには、統合された文字列とモデルの命令が含まれます。たとえば、グラウンドのみを使用するか、補足として使用するかなどです。

応答の本文はチャット メッセージ スタイル形式で構成され、コンテンツは 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>\"}]"
            }
        ]
    }
]

重要なポイント:

  • content.type には 1 つの有効な値 ( text) があります。

  • content.text は、クエリとチャット履歴の入力を考慮して、検索インデックスで見つかった最も関連性の高いドキュメント (またはチャンク) を含む JSON エンコード文字列です。 この文字列は、LLM がユーザーの質問に対する回答を作成するために使用する接地データです。

    • 応答のこの部分は、2.5のリランキング スコアの最小しきい値を満たさない結果を除き、200 チャンク以下で構成されています。

    • 文字列は、チャンクの参照 ID (引用のために使用) と、ターゲット インデックスのセマンティック構成で指定されたフィールドで始まります。 この例では、ターゲット インデックスのセマンティック構成に "title" フィールド、"terms" フィールド、および "content" フィールドがあるとします。

  • 応答の取得には、 @search.rerankerBoostedScoreは含まれません。

  • 取得要求のmaxOutputSizeInTokensプロパティ (2026-05-01-preview 以降でmaxOutputSize) によって、文字列の長さが決まります。

    • maxOutputSizeInTokens出力予算を超えるドキュメントは、応答から省略できます。 アクティビティ配列には、最も関連性の高いドキュメントが最大出力サイズを超えた場合の警告が含まれます。 より多くのコンテンツを保持するには、 maxOutputSizeInTokensを増やします。 詳細については、「 空の応答」を参照してください。

アクティビティ配列

アクティビティ配列はクエリ プランを出力し、操作、課金への影響、およびリソース呼び出しを追跡するための操作の透明性を提供します。 また、取得パイプラインに送信されるサブクエリも含まれます。 206 Partial Content応答の場合、配列には失敗したナレッジ ソースのエラーが含まれます。 502 Bad Gateway応答では、最上位レベルのエラーでのみエラーの詳細が提供される場合があります。

アクティビティ配列には、次のコンポーネントが含まれています。

Section 説明
ソース固有のアクティビティ このセクションでは、クエリに含まれる各ナレッジ ソースについて、経過時間と、セマンティック ランカーを含むクエリで使用された引数について報告します。 ナレッジ ソースの種類には、 searchIndex、 azureBlob、サポートされているその他の ナレッジ ソースが含まれます。
agenticReasoning このセクションでは、取得中のエージェント推論のトークン消費量について説明します。これは、指定された 取得理由の取り組み (プレビュー) によって異なります。
modelQueryPlanning クエリ計画に LLM を使用するナレッジ ベースの場合、このセクションでは、入力に使用されるトークン数とサブクエリのトークン数について報告します。 これには、アクティビティを実行したモデルのデプロイ名ではなくパブリック モデル名を含むmodelフィールドを持つmodelNameフィールドが含まれます。
modelAnswerSynthesis 回答合成 (プレビュー) を使用するナレッジ ベースの場合、このセクションでは、回答を作成するためのトークン数と回答出力のトークン数について報告します。 これには、アクティビティを実行したモデルのデプロイ名ではなくパブリック モデル名を含むmodelフィールドを持つmodelNameフィールドが含まれます。
modelWebSummarization Web 要約を使用するナレッジ ベースの場合、このセクションでは、Web 結果を要約するためのトークン消費量について報告します。 これには、アクティビティを実行したモデルのデプロイ名ではなくパブリック モデル名を含むmodelフィールドを持つmodelNameフィールドが含まれます。
model モデルに基づくアクティビティ レコードの場合、このセクションでは、アクティビティの実行に使用されるモデルを識別します。 このセクションは、 includeActivity を true に設定した場合にのみ表示されます。
imageServing イメージ サービス (プレビュー) が有効になっているナレッジ ソースの場合、このセクションでは、imagesRetrieved、imagesSentToModel、totalImageSizeBytes、およびインデックス作成時のverbalizationUsedがオンであったかどうかを報告します。 verbalizationUsedとimagesSentToModelを個別に検査します。 応答では、 verbalizationUsed を true として報告し、ダウンストリーム モデルに画像を送信できます。 ドロップされたイメージの数を見つけるには、imagesSentToModelからimagesRetrievedを減算します。

次の例は、アクティビティ配列を示しています。

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

参照配列

参照配列は、基になる接地データから直接取得されます。 これには、応答の生成に使用される sourceData が含まれており、エージェント検索エンジンが検索し、意味的にランク付けするすべてのドキュメントで構成されます。

参照配列には、次のコンポーネントが含まれています。

フィールド 説明
type searchIndexなど、参照を生成したナレッジ ソースの種類。
id 応答内の項目の参照 ID。 検索インデックスのドキュメント キーではありません。 これを使用して引用文献を提供します。
activitySource 参照を生成したアクティビティ エントリの id を相互参照します。これは、引用リンクに役立ちます。
docKey インデックス参照の場合、基盤となる検索インデックスのドキュメントキー。
sourceData 応答の生成に使用される接地データ。 インデックス付き参照の場合、フィールドには、title、terms、contentなどのidフィールドとセマンティック フィールドを含めることができます。 図形は参照の種類によって異なります。
citationUrl (プレビュー) バッキング インデックス内の参照先のドキュメントを指す、サービスによって生成される読み取り専用 URL。 インデックス付きナレッジ ソースに対してのみ返されます。 URL をフォローするには、「 引用 URL を含むドキュメントを検索する (プレビュー)」を参照してください。

次の例は、参照配列を示しています。

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

引用 URL を含むドキュメントを検索する (プレビュー)

2026-08-01-preview API バージョン以降では、インデックス付きナレッジ ソースからの参照に、取得応答にcitationUrlを含めることができます。 この URL を使用して、 title や contentなど、その参照のインデックス付きフィールドをフェッチします。そのため、元のソース ドキュメントを開かずに、回答がどこから来たかを示す引用プレビューをレンダリングできます。 citationUrlは、ソース docUrlとblobUrlとは別に、バッキング インデックスへの認証された参照です。

次の例は、サニタイズされた引用 URL を示しています。

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

選択したフィールドとその順序は、インデックス付きソースと取得の構成によって異なります。

重要

応答の完全な URL に従って逐語的に実行し、返された JSON フィールドをアプリにレンダリングします。 URL を構築、解析、または正規化しないでください。

引用 URL を指定すると、次の例では検索サービスのアクセス トークンを取得します。 Authorization ヘッダーでそのトークンを使用して URL を呼び出します。 サインイン ID には、 検索インデックス データ閲覧者 ロールが必要です。

AZURE AI SEARCH SDK ドキュメント参照メソッドでは、エンドポイント、インデックス名、ドキュメント キー、選択したフィールド、および API バージョンが個別の入力として必要です。 絶対引用 URL は受け入れられません。 これらの例では、認証された HTTP GET を使用して、サービスによって生成された完全な URL を保持します。

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

リファレンス:ドキュメント - 取得

ドキュメント参照では、選択したインデックス フィールドが 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"
}

引用 URL を使用する場合は、次の点に注意してください。

  • 引用文献をレンダリングする前に、 citationUrl を確認します。 応答で参照が省略されている場合、またはサービスがバッキング インデックスまたはドキュメント キーを解決できない場合は、存在しない可能性があります。

  • 取得要求にドキュメント レベルのアクセス制御の x-ms-query-source-authorization が含まれている場合は、URL に従うときに同じユーザー トークンを使用します。

  • URL は、バッキング インデックスとドキュメント キーが変更されていない間のみ有効です。

応答に含まれる秘密度ラベルのメタデータを確認する (プレビュー)

クエリ時のアクセス許可の適用に関するページで説明されているのと同じタイミング動作がここで適用されます。2026-08-01-previewの外部で設定したアクセス許可の変更は、応答の取得2026-08-01-preview表示されるまでに時間がかかる場合があります。

Microsoft Purview秘密度ラベルを取り込むナレッジ ベースに対してクエリを実行すると、取得応答には次の 2 つのレベルのラベル メタデータが含まれます。

場所 フィールド 説明
参照ごと sensitivityLabelInfo references配列で返される各ドキュメントに適用される秘密度ラベル。
応答 metadata.responseSensitivityLabelInfo 応答で参照されるすべてのドキュメントに付けられた秘密度ラベルのうち、最高優先度のものを表す集約ラベル。 クライアント側の表示バナーとポリシーの適用に役立ちます。

Microsoft Graphは、Microsoft Purview ラベル継承規則を使用して、参照ごとのラベルから応答レベルのラベルを計算します。 通常、最も制限の厳しいラベルが優先されます。

次の例は、2 つの参照先ドキュメント (1 つの Confidential、1 つの Internal) と結果の応答レベルラベルを含む応答の取得を示しています。

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

秘密度ラベルを公開する参照型

ラベル メタデータのフィールド名と可用性は、各参照を生成したナレッジ ソースの種類によって異なります。

参照 type ラベル フィールド 利用可能な場合...
azureBlob sensitivityLabelInfo BLOB ナレッジ ソースには、sensitivityLabelにingestionPermissionOptionsが含まれています。
indexedOneLake sensitivityLabelInfo OneLake ナレッジ ソースには、sensitivityLabel に ingestionPermissionOptions が含まれています。
indexedSharePoint sensitivityLabelInfo SharePoint でインデックス化されたナレッジ ソースには、sensitivityLabel 内の ingestionPermissionOptions が含まれます。
searchIndex sensitivityLabelInfo 基になるインデックスはpurviewEnabledtrueに設定され、フィールドはsensitivityLabel: trueでマークされています。

推奨事項を表示して監査する

  • ポリシー制御やアクセス許可などの追加のプロパティが必要な場合は、sensitivityLabelInfo.labelId を使用して、Microsoft Graph の秘密度ラベル API を通じてラベルの完全な定義を参照します。

  • metadata.responseSensitivityLabelInfoを使用して、応答レベルの秘密度バナーをレンダリングするか、回答全体でコピーと共有を無効にするなどのポリシー制御を適用します。

  • ナレッジ ソースが、統合ベクター化やカスタムテキスト分割スキルによって設定されたインデックスなど、チャンクインデックスを指している場合は、スキルセットが 各チャンク行に秘密度ラベルを投影していることを確認します。 このマッピングがないと、チャンク レベルの参照はクエリ時に正しくフィルター処理されません。

  • ラベル付けされたコンテンツに対する監査可能な管理者アクセスについては、管理調査のための昇格された読み取りを参照してください。

MCP サーバーの動作

各ナレッジ ベースによって公開される MCP エンドポイントは、REST API と同じ秘密度ラベル フィールドを表示します。 MCP 互換クライアントが knowledge_base_retrieve ツールを呼び出すと、ツールの結果には、このセクションで前述したのと同じ参照ごとの sensitivityLabelInfo と応答レベル metadata.responseSensitivityLabelInfo が含まれます。 MCP クライアントは、これらのフィールドに基づいてラベル対応の表示とポリシー制御を適用します。

アクションの例を取得する (プレビュー)

次の例は、 2026-08-01-preview API バージョンを使用して取得アクションを呼び出すさまざまな方法を示しています。 このバージョンでは、応答合成や構成可能な推論作業など、完全な機能セットがサポートされています。 2026-04-01の使用方法については、前のセクションを参照してください。

アクティビティ ログでモデル名を検査する

includeActivityを true に設定して、モデルに基づくアクティビティ レコードのモデル ID フィールドを返します。 これらのフィールドを使用して、取得要求中にクエリの計画、応答合成、または Web 要約を処理した構成済みのモデルを確認します。 次の例では、要求で選択したソースの格納された結果処理をオーバーライドします。

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

リファレンス:ナレッジの取得 - 取得

次の応答の抜粋は、入れ子になったモデル ID を示しています。

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

成功にはナレッジ ソースが必須となる

ナレッジ ソースを必須としてマークするには、failOnErrorでknowledgeSourceParamsを設定します。 このパラメーターは、そのソースが使用できない場合に部分的な回答が誤解を招く場合や非準拠になる場合に使用します。 要求は、別のソースが成功した場合でも、必要なソースが失敗した場合に 502 Bad Gateway を返します。 ガイダンスの処理については、「 取得アクションのトラブルシューティング」を参照してください。

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

リファレンス: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)

リファレンス: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"
        }
    ]
}

リファレンス:ナレッジの取得 - 取得

要求からナレッジ ソースを除外する

2026-08-01-preview API バージョン以降では、取得要求から除外するナレッジ ソースごとにneverQuerySourceをtrueに設定します。 要求時 neverQuerySource は、格納された値を変更せずに、その要求の格納 alwaysQuerySource 値をオーバーライドします。

次の例では、要求からtroubleshooting-ksを除き、product-docs-ksとtroubleshooting-ksを含むナレッジ ベースに対してクエリを実行します。

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

var result = await kbClient.RetrieveAsync(retrievalRequest);

リファレンス: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)

リファレンス: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
        }
    ]
}

リファレンス:ナレッジの取得 - 取得

ナレッジソースごとに候補ドキュメントを調整

maxOutputDocumentsのknowledgeSourceParamsを設定して、最終結果の選択前に特定のナレッジ ソースが投稿する候補ドキュメントの数を制限します。 1 つのソースの入力を他のソースに影響を与えずにパイプラインにバインドする場合は、このパラメーターを使用します。

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

リファレンス: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)

リファレンス: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
        }
    ]
}

リファレンス:ナレッジの取得 - 取得

最終的な接地ドキュメントを制限する

最上位 maxOutputDocuments パラメーターは、最終的な取得応答で返されるグラウンド ドキュメントの数を上限とします。 アプリケーションで予測可能な引用数または参照カウントが必要な場合は、このパラメーターを使用します。

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

リファレンス: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)

リファレンス: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
}

リファレンス:ナレッジの取得 - 取得

次の表は、 maxOutputDocuments と maxOutputSizeInTokens が 4 つの組み合わせすべてに対してどのように相互作用するかを示しています。

maxOutputDocuments maxOutputSizeInTokens Behavior
指定されていません。 指定されていません。 既定の maxOutputSizeInTokens 応答制限動作を使用します。
指定されていません。 指定 ペイロード サイズの制限に達すると、ドキュメントを破棄します。
指定 指定されていません。 指定した数の固定ドキュメントを返し、 maxOutputSizeInTokens の制限は適用されません。
指定 指定 最大 maxOutputDocuments 件のドキュメント、または maxOutputSizeInTokens 件のドキュメントのうち収まる分までを返します。いずれか早い方の制限が適用されます。

ナレッジベース取得の既定値を確認する

ナレッジ ベースでは、要求全体の既定値を retrieveDefaultsに格納できます。 継承と要求固有のオーバーライドを確認するために、2 つの取得要求を送信します。

開始する前に、「 既定の取得制限の構成 (プレビュー)」を完了してください。 最初の要求では 3 つの要求全体の制限がすべて省略されるため、格納される値は 45 秒、8 個のドキュメント、12,000 個のトークンが適用されます。 2 番目の要求は、20 秒、1 つのドキュメント、5,000 個のトークンでオーバーライドされます。

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

最初に、3 つの要求全体の制限フィールドを省略する要求を送信します。

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

次に、1 つの要求に対して 3 つの値をすべてオーバーライドします。

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
}

リファレンス:ナレッジの取得 - 取得

参照カウントは、格納された値または要求レベルの maxOutputDocuments 値が適用されるかどうかを示します。最初の応答には最大 8 個の参照が含まれており、2 番目の応答には最大 1 つが含まれます。 一致するドキュメントが少ない場合、応答に含まれる参照が少なくなる場合があります。 応答では、有効なランタイムまたは出力トークンの予算は報告されませんが、これらの値は引き続き要求処理を制御します。 要求のオーバーライドでは、格納されている既定値は変更されません。

既定の推論作業をオーバーライドし、要求の制限を設定する

次の例では応答の合成を指定しているため、検索時の推論の労力はlowまたはmediumである必要があります。 また、取得ランタイムを制限する maxRuntimeInSeconds と、応答ペイロード のサイズを制限する maxOutputSizeInTokens も設定します。

maxRuntimeInSeconds は 10 ~ 600 秒の値を受け取り、既定値は 90 秒です。 最大 600 秒 (10 分) は、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
}

リファレンス:ナレッジの取得 - 取得

サービスが推論作業を選択できるようにする

retrievalReasoningEffort.kindを取得要求でautoに設定して、ナレッジ ベースの既定値をオーバーライドします。 自動推論の詳細については、「 取得理由の設定 (プレビュー)」を参照してください。

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

リファレンス:ナレッジの取得 - 取得

各ナレッジ ソースの参照を設定する

includeReferencesのincludeReferenceSourceDataとknowledgeSourceParamsを使用して、参照配列に表示されるソースと、各エントリに含まれるソース データの量を制御します。 次の例では、ナレッジ ベースの既定の推論作業を使用します。

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

リファレンス:ナレッジの取得 - 取得

最小限の推論作業を使用する

次の例では、インテリジェントなクエリ計画や応答合成のための LLM はありません。 クエリ文字列は、キーワード検索またはハイブリッド検索のためにエージェント検索エンジンに移動します。

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

リファレンス:ナレッジの取得 - 取得

取得アクションのトラブルシューティング

2026-08-01-previewでは、応答の状態は、取得が成功したか、部分的に成功したか、失敗したか、次に何を行うかを示します。 次の表を使用して、各状態をその意味にマップし、トラブルシューティングガイダンスの対応するセクションを参照してください。

地位 Meaning
200 OK 取得に成功しました。 ドキュメントの内容が出力予算を超えた場合でも、ドキュメントを省略できます。 詳細については、「 空の応答」を参照してください。
400 Bad Request 取得要求は、取得を開始する前に検証に失敗しました。
206 Partial Content 少なくとも 1 つのソースが成功し、失敗したソースは failOnErrorマークされません。 応答には、成功したソースからの結果が含まれます。
502 Bad Gateway 選択したすべてのソースが失敗したか、 failOnError: true マークされたソースが失敗しました。

200以外の応答の場合は、API のバージョン、タイムスタンプ、サニタイズされた要求本文、応答ヘッダー、および要求または関連付け ID を記録します。 これらの詳細は、障害を診断し、必要に応じて問題をサポートと共有するのに役立ちます。

400 Bad Request

最上位レベルのエラーを使用して、無効な要求プロパティを特定します。 一般的な原因には、次のようなものがあります。

  • knowledgeSourceName内のknowledgeSourceParamsがナレッジ ベースにアタッチされていないか、そのkindがアタッチされたソースと一致しません。
  • 要求値がサポートされている範囲外であるか、1 つのオプションで有効になっていない別のオプションが必要です。 たとえば、includeReferenceSourceData には includeReferences が必要です。
  • retrievalReasoningEffort.kind は autoですが、要求では 2026-08-01-previewより前の API バージョンが使用されます。
  • 要求では auto、 low、または mediumが使用されますが、ナレッジ ベースではモデルは定義されません。
  • 要求時ソースの除外 (プレビュー) の場合、同じエントリでalwaysQuerySourceとneverQuerySourceの両方がtrueに設定されるか、アタッチされているすべてのナレッジ ソースが除外されます。

要求を再試行する前に、最上位エラーで識別されるプロパティを修正します。

206 Partial Content

activityを含む各errorエントリを調べます。 ソース取得アクティビティは失敗したナレッジ ソースを識別し、モデル アクティビティは失敗した処理ステージを識別します。 応答本文には、成功した結果が引き続き含まれています。

ソース取得アクティビティ エラーの一般的な原因は次のとおりです。

  • 無効なクエリ時間入力 (形式が正しくない filterAddOn 式など)。
  • 名前が変更されたフィールド、 セマンティック構成がない、無効な ベクター化など、ナレッジ ソースまたはインデックス構成の誤差。
  • 依存関係の承認がないか無効であるか、ソースのクエリに使用される ID の アクセス許可 が不十分です。
  • 依存関係 の調整、タイムアウト、または一時的な可用性エラー。

モデル アクティビティ エラーの場合は、アクティビティ type を使用して、失敗した処理ステージを特定します。 たとえば、 modelWebSummarization エラーは、 Web 結果の要約 に失敗したことを示します。

アプリケーションで部分的な結果が許可されている場合は、成功した結果を処理し、失敗した各ソースまたはモデル ステージを記録します。 再試行する前に、構成、承認、およびアクセス許可のエラーを修正します。 スロットリング、タイムアウト、または一時的な可用性の障害が発生した場合は、バックオフを伴う回数を制限した再試行を使用します。

特定のソースがないと結果が安全ではなく、そのソースの種類が alwaysQuerySourceをサポートしている場合は、 alwaysQuerySource と failOnErrorの両方を設定します。 最初のオプションはソースが選択されていることを確認し、2 番目のオプションはクエリが失敗した場合にハード エラーを返します。 MCP サーバーのナレッジ ソース (プレビュー) では、 alwaysQuerySourceはサポートされていません。これらのソース failOnError は、ソースが選択されている場合にのみ適用されます。 failOnError は、モデル アクティビティの失敗には適用されません。

502 Bad Gateway

最上位レベルのエラーは、次の 2 つのハード障害パスのいずれかについて説明します。

  • 選択したすべてのソースが失敗しました: 選択したソースごとにエラーが返されました。 一致するドキュメントが 0 個で正常に完了したソースは、失敗したソースではありません。 共有構成、承認、依存関係、または可用性の問題について、すべてのソース エラーを検査します。
  • failOnError ソースが失敗しました:必要なソースを照会できませんでした。 他のソースは成功した可能性がありますが、必要なソースが失敗したため、サービスは部分的な結果を返しません。

基になるソースエラーは、一般に、 206 Partial Contentで説明されているものと同じ種類です。無効なソース固有の入力、ソースまたはインデックスの構成の誤差、依存関係の承認またはアクセス許可、調整、タイムアウト、一時的な依存関係の可用性などです。

ハード 502 応答では、 activity 配列が省略され、ソース名と基になるエラーが最上位のエラー メッセージでのみ提供される場合があります。 再試行する前に、構成、承認、およびアクセス許可のエラーを修正します。 バックオフを伴う制限付き再試行は、スロットリング、タイムアウト、または一時的な可用性障害の場合にのみ使用してください。 基になるソース障害を調べずに、502 Bad Gateway応答をAzure AI 検索停止として解釈しないでください。

空の応答

検索手順ではドキュメントが見つかる場合がありますが、固定されたコンテンツがmaxOutputSizeInTokensの出力予算 (2026-05-01-preview 以降でmaxOutputSize) を超えた場合でも、サービスは最終的な応答からドキュメントを省略できます。 この状態が発生すると、アクティビティ配列に一致が見つかったことが示され、アクティビティ レコードには、最も関連性の高いドキュメントが最大出力サイズを超えたという警告が含まれます。 参照配列とグラウンド応答の内容は、そのドキュメントに対して空です。 より多くのコンテンツを保持するには、 maxOutputSizeInTokensを増やします。

この動作を回避するには、大きなソース ドキュメントに、安定した識別子とソース メタデータを使用して小さいチャンクとしてインデックスを作成します。 これは、特に長いマニュアル、ポリシー、またはナレッジ ベースの記事に適用されます。

MCP エンドポイントを呼び出す

Warning

MCP の実装は、攻撃、連鎖的な障害、人間の監視の損失などのリスクの影響を受けやすくなります。 これらのリスクを軽減するには、Microsoftの推奨プラクティスとindustry のベスト プラクティスに従って、MCP サーバーのセキュリティと信頼性を確保し、承認メカニズムを実装し、カスケード動作を監視します。

MCP は、AI アプリケーションが外部のデータ ソースとツールに接続する方法を標準化するオープン プロトコルです。

Azure AI 検索では、各ナレッジ ベースは、knowledge_base_retrieve ツールを公開するスタンドアロン MCP サーバーです。 Foundry Agent Service、GitHub Copilot、Claude、Cursor など、MCP と互換性のあるクライアントは、このツールを呼び出してナレッジ ベースにクエリを実行できます。

MCP エンドポイントに対する認証

各ナレッジ ベースには、次の URL に MCP エンドポイントがあります。

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

指定した API バージョンによって、接続から返される内容が決まります。 2026-08-01-previewを使用すると、基になるナレッジ ベースが LLM と互換性のある推論作業で構成されている場合、ナレッジ ベースは合成された回答を返します。 2026-04-01を使用すると、取得は常に最小限かつ抽出可能であり、接続は接地データのみを返します。

このエンドポイントに対する認証方法は、MCP クライアントによって異なります。 knowledge_base_retrieve MCP ツールで Azure OpenAI 応答 API を使用する場合は、Azure OpenAI への Responses API 呼び出しと、Azure AI 検索する MCP 要求の両方を認証します。 MCP クライアントがこのエンドポイントを直接呼び出す場合は、Azure AI 検索に対してのみ認証されます。

Azure AI 検索認証には、次のいずれかの方法を使用します。

  • ヘッダーにAuthorization (推奨)
  • ヘッダーにapi-key

メモ

MCP クライアントでは、カスタム ヘッダーの構成方法が異なります。 たとえば、Foundry Agent Service はプロジェクト接続を介してヘッダーを挿入しますが、GitHub Copilotなどのクライアントでは MCP サーバー JSON のヘッダーが必要です。

MCP 認証にベアラー トークンを使用する

MCP 認証に推奨される方法はベアラー トークンであり、構成ファイルに機密キーを格納することを回避します。 トークンの背後にある ID には、検索サービスで Search Index Data Reader ロールが割り当てられている必要があります。 詳細については、「アプリを ID を使用してAzure AI 検索に接続するを参照してください。

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

リファレンス:Azure OpenAI Responses API を使用する

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

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

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

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

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

print(response.output_text)

リファレンス:Azure OpenAI Responses API を使用する

// This code snippet is currently unavailable.

MCP 認証に管理者キーを使用する

管理キーは、検索サービスへの完全な読み取り/書き込みアクセス権を付与するため、開発環境でのみ、またはベアラー トークンが使用できない場合にのみ使用します。 詳細については、「 API キーを使用してAzure AI 検索に接続するを参照してください。

Tip

次の例は、ベアラー トークンの例とは異なるヘッダーのみを示しています。 完全なセットアップについては、「 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)
);

リファレンス:Azure OpenAI Responses API を使用する

import os

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

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

リファレンス:Azure OpenAI Responses API を使用する

// This code snippet is currently unavailable.

MCP 応答を確認する

MCP クライアントは、 knowledge_base_retrieveを呼び出すと、取得アクションの response、 activity、および references エンベロープではなく、MCP ツールの結果を受け取ります。 多くの MCP クライアントは、そのツールの結果を最上位の result オブジェクトの下に表示するため、予想されるペイロードは 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>\"}]"
      }
    ]
  }
}

重要なポイント:

  • result.content[] には、ナレッジ ベースによって返される MCP ツールの出力が含まれています。

  • result.content[].type は textです。

  • result.content[].text には、JSON でエンコードされた文字列として取得されたグラウンド データが含まれています。

  • 取得アクションとは異なり、現在の MCP 応答は個別の activity または references 配列を返しません。また、返されたコンテンツの resource エントリも設定しません。