你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

使用检索操作或 MCP 端点来查询知识库

注意

Azure AI 搜索可通过Azure门户、REST API 和Azure SDK获取。 它还支撑着 Foundry IQ——这一托管知识层可将企业内容转化为可复用、具有权限感知能力的知识库,供 Microsoft Foundry 门户中的代理使用。

重要

标记为“预览”的特性、功能或属性不受服务级别协议 (SLA) 保障,不建议用于生产工作负载,并且在正式发布之前可能会更改或受到限制。 Azure AI 搜索预览条款适用于所有预览功能,无论是独立功能还是正式版功能的一部分。

在代理检索管道中, 检索操作 从知识库调用并行查询处理。 可以使用搜索服务 REST API 或Azure SDK直接调用检索操作。 每个知识库还公开一个模型上下文协议(MCP)终结点,供 MCP 兼容的代理使用。

本文介绍如何使用可选权限强制调用这两种检索方法。 它首先介绍检索操作,稍后会介绍 MCP 终结点,因为 MCP 工具结果当前不同于 REST 和 SDK 响应形状。

若要设置通过 MCP 将Azure AI 搜索连接到 Foundry 代理服务的管道,请参阅 Tutorial:生成端到端代理检索解决方案。

使用支持

Azure 门户 Microsoft Foundry 门户 .NET SDK Python SDK Java SDK JavaScript SDK REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

先决条件

  • 如果通过 Azure OpenAI 响应 API 调用 MCP 终结点,则需要:

    • 在 Foundry 资源上部署的 LLM 和认知服务 OpenAI 用户角色(或 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 响应 API 调用 MCP 终结点,则需要:

    • 在 Foundry 资源上部署的 LLM 和认知服务 OpenAI 用户角色(或 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

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

参考: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)

参考: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的知识源启用此服务。 有关设置步骤、优先级表以及如何检查图像提供统计信息,请参阅在智能体检索中显示文档嵌入的图像(预览版)。

禁用知识源的重新排序(预览版)

从 2026-08-01-preview API 版本开始,在 "resultsProcessing": "none" 条目上设置 knowledgeSourceParams,即可绕过针对特定知识源的重新排序,并保留其底层结果顺序。 您还可以将 resultsProcessing 作为默认值存储在知识源中。 所有知识源类型都支持此属性。

以下示例在一次检索请求中绕过了对 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)}");

参考: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)

参考: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 改变的是结果的处理方式,而不是查询哪些来源。 如果必须查询知识源,请将true设置为alwaysQuerySource。

有效值为 none:

  • 来自知识源的引用会省略 rerankerScore,结果在该源的检索活动中保留其原有顺序。
  • 当任何源绕过重新排序时,Azure AI 搜索 会遵循知识源的声明顺序,按轮循顺序将最终结果分配到各个活动中。 重新排序后的活动按分数顺序保持排列。
  • 重复数据删除和按源、文档和令牌限制仍然适用,因此并非每个检索到的结果都会出现在响应中。

Azure AI 搜索按以下顺序进行验证rerankerThreshold:

  1. 搜索会从检索请求和存储的知识源值中解析出 resultsProcessing。
  2. 如果解析的值是 none 且请求包含 rerankerThreshold,则搜索将 400 Bad Request返回。
  3. 对于 MCP 服务器工具,搜索在验证请求后应用工具级 resultsProcessing 值。

因此,MCP 工具设置不会更改请求是否通过验证。 工具级none值不会导致阈值错误,当请求或存储的值解析为none时,工具级rerank值不会阻止错误。

若要确认哪个模式已运行,请检查知识源的引用是否包括 rerankerScore。 不要依赖 semanticConfigurationName,因为它可能是 null,而不是被省略。

搜索索引行为

对于面向搜索索引的知识源,隐式查询类型为 semantic,并且没有搜索模式。 执行重新排序时,查询执行使用 semanticConfigurationName。 其他源设置(包括 searchFields 和 sourceDataFields)在两种模式下都适用。

代理检索不接受 scoringProfile 或 scoringParameters 输入。 如果您需要让已索引的知识源具有时效性偏向,请使用 时效性感知检索(预览),而不是索引评分配置。

如果索引包含矢量字段,则需要有效的向量器定义,以便代理检索引擎可以向量化查询输入。 否则,将忽略向量字段。

有关详细信息,请参阅 创建索引进行代理检索。

流检索结果(预览版)

从 2026-08-01-preview API 版本开始,可以将检索结果作为服务器发送的事件流(SSE)接收,而不是等待单个 JSON 响应。 通过流式传输,客户端可以在查询规划、源活动信息以及合成答案或提取的响应内容各部分一旦可用时,按该顺序依次显示。

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

参考:知识检索 - 检索

事件生命周期

服务不返回单个响应,而是使一个 HTTP 连接保持打开状态(内容类型 text/event-stream; charset=utf-8),并在数据可用时发送一系列事件。 每个事件都有一 event: 行,用于命名事件类型、一 data: 行包含 JSON 值,以及一个用于标记事件末尾的空白行。

一个成功的流遵循以下生命周期:

Event 发送时间 它包含的内容
retrieval.started 每个流式处理请求的第一个事件。 服务解析请求和知识库的默认值后得到的请求 ID、知识库名称、输出模式以及实际生效的推理工作量。 如果生效的kind是auto,则该事件报告为auto;它不会预测后续升级。
activity.started 当服务开始进行查询规划活动、源活动或模型活动时。 在早期活动完成之前,可以启动多个活动。 活动 id、 type开始时间和可选知识源名称。
activity.completed 当该活动结束时。 通过匹配activity.started,将其与对应的id事件关联起来。 已完成的活动记录。
answer.completed 仅一次,且仅当answerSynthesis为outputMode时。 messageIndex 标识消息在最终响应数组中的位置,并 message 包含完整的合成答案。 没有逐个令牌的增量事件。
references.completed 在所有引用都解析完成后。 事件数据是完整的references 数组,没有对象包装器。
response.completed 成功或部分成功流的终止事件。 200 或 206 状态代码和完整的检索响应正文,其形状与非流 JSON 调用相同。 有关每个状态代码的含义的信息,请参阅 “检索操作疑难解答”。
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,而是errorresponse.completed。 该事件可以包含在失败之前完成的任何活动记录。 当流启动时,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,为单个检索请求覆盖存储在搜索索引知识源上的查询提示。

覆盖会替换整个已存储的 queryHints 对象,而不是按条目逐一合并,因此请包含你想要应用的每一项提示。 省略 queryHintOverrides 即可使用已存储的提示。

当检索推理工作量不为 minimal 时,HTTP 400 响应取决于存储的筛选提示,而不是覆盖内容或提升类型。 在应用 queryHintOverrides之前,服务会根据知识库模型验证存储的筛选器提示。 因此,即使覆盖项为空或仅包含增强项,GPT-4o 或 GPT-4.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);

参考: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)

参考: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 的检索结果中。

如果知识源包含受权限保护的内容,请在检索请求中传递最终用户的标识,以便每个用户仅看到他们有权访问的内容。 对于索引源,检索引擎使用此标识筛选结果,并在省略结果时返回未筛选的结果。 远程源还使用来自检索请求的授权,但在源中强制实施权限,并且可能需要特定于源的令牌和标头。

权限控制的实施有两个部分:

  • 引入时间:仅对于索引知识源,您可以将ingestionPermissionOptions设置为与内容一起导入权限元数据。

  • 查询时:在知识源要求的请求头中传递用户的授权信息。 大多数源都使用 x-ms-query-source-authorization。 例外的是 Work IQ,它使用 x-ms-query-work-iq-source-authorization。

引入时间配置

下表显示了哪些知识源需要引入时间配置以及每个源如何强制实施权限。

知识源 需要 ingestionPermissionOptions 如何执行权限
Blob 或 ADLS Gen2 ✅ 根据用户标识匹配的 RBAC 作用域、ACL 或 Microsoft Purview。
OneLake ✅ 已引入的文档 Microsoft Purview 敏感度标签与用户标识匹配。
已索引的 SharePoint ✅ 已引入的、与用户标识匹配的 SharePoint ACL 或 Microsoft Purview 敏感度标签。
远程 SharePoint ❌ Copilot检索API使用用户的令牌直接查询SharePoint。
Fabric数据代理 ❌ 检索引擎将用户的令牌交换为 Microsoft Fabric 作用域令牌,并代表用户向数据智能体发出查询。
Fabric Ontology ❌ 检索引擎将用户的令牌交换为 Microsoft Fabric 作用域令牌,并代表用户向本体项发出查询。
工作 IQ ❌ 检索引擎使用从 x-ms-query-work-iq-source-authorization 获得的面向应用受众的用户断言来换取 Work IQ 作用域令牌。

如果在创建索引知识源时未配置 ingestionPermissionOptions ,则索引不包含权限元数据。 无论标头如何,系统都会返回未筛选的结果。 若要解决此问题,请使用适当的 ingestionPermissionOptions 值重新创建知识源。

查询时授权

对于非 Work IQ 知识源,请在检索请求中包含一个作用域限定为 https://search.azure.com/.default 的访问令牌,以传递最终用户身份。 此令牌与用于访问搜索服务的服务凭据分开。 它不需要搜索服务的权限,并仅表示内容访问权限正在接受评估的用户。 有关详细信息,请参阅 ACL 和 RBAC 在查询时的执行。

对于工作 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);

参考: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)

参考: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?"
                }
            ]
        }
    ]
}

参考:知识检索 - 检索

查看响应

检索操作返回三个主要组件:

提取的响应

提取的响应是单个统一字符串,通常传递给 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 具有一个有效值: text.

  • content.text 是一个 JSON 编码的字符串,其中包含在搜索索引中找到的最相关的文档(或区块),给定查询和聊天历史记录输入。 此字符串是 LLM 用于制定用户问题响应的基础数据。

    • 响应的这一部分包含不超过 200 个区块,不包括未能满足 2.5 重排序得分最低阈值的任何结果。

    • 该字符串以区块的引用 ID(用于引文目的)和目标索引的语义配置中指定的任何字段开头。 在此示例中,假定目标索引中的语义配置具有“title”字段、“terms”字段和“content”字段。

  • 检索响应中未包含 @search.rerankerBoostedScore。

  • 检索请求上的 maxOutputSizeInTokens 属性(在 2026-05-01-preview 及更高版本中为 maxOutputSize)用于确定字符串的长度。

    • 可以从响应中省略超出 maxOutputSizeInTokens 输出预算的文档。 当最相关的文档超过最大输出大小时,活动数组会发出一条警告。 若要保留更多内容,请增加 maxOutputSizeInTokens。 有关详细信息,请参阅 空响应。

活动数组

活动数组输出查询计划,该计划为跟踪操作、计费影响和资源调用提供操作透明度。 它还包括发送至检索管道的子查询。 对于 206 Partial Content 响应,数组中会包含失败知识来源的错误信息。 响应 502 Bad Gateway 可能仅在顶级错误中提供失败详细信息。

活动数组包括以下组件:

章节 描述
特定于源的活动 对于查询中包含的每个知识源,本节将报告已用的时间以及查询中使用的参数,包括语义排名器。 知识源类型包括 searchIndex、 azureBlob支持的其他 知识源。
agenticReasoning 本部分报告检索期间代理推理的令牌消耗情况,具体取决于指定的检索推理工作(预览版)。
modelQueryPlanning 对于使用 LLM 进行查询规划的知识库,本节报告输入所用的令牌数以及子查询的令牌数。 它包含一个 model 字段,其中有一个 modelName 字段,包含运行该活动的模型的公开模型名称,而不是其部署名称。
modelAnswerSynthesis 对于使用 答案合成(预览)的知识库,本部分报告用于制定答案的令牌计数和答案输出的令牌计数。 它包含一个 model 字段,其中有一个 modelName 字段,包含运行该活动的模型的公开模型名称,而不是其部署名称。
modelWebSummarization 对于使用 Web 摘要的知识库,本部分报告用于汇总 Web 结果的令牌消耗情况。 它包含一个 model 字段,其中有一个 modelName 字段,包含运行该活动的模型的公开模型名称,而不是其部署名称。
model 对于模型支持的活动记录,本部分标识用于执行活动的模型。 仅当您将 includeActivity 设置为 true 时,才会显示本节。
imageServing 对于启用了图像服务(预览版)的知识源,本部分显示imagesRetrieved、imagesSentToModel、totalImageSizeBytes以及索引时verbalizationUsed是否已启用。 分别检查imagesSentToModel和verbalizationUsed。 响应可以将 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 用于生成响应的依据数据。 对于已编制索引的引用,字段可以包括一个 id 字段以及语义字段,例如 title、terms 和 content。 形状因引用类型而异。
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。 登录标识需要 搜索索引数据读取者 角色。

Azure AI 搜索 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之外设置的访问权限所做的更改,可能需要一些时间才会显示在2026-08-01-preview检索响应中。

查询引入Microsoft Purview敏感度标签的知识库时,检索响应包含两个级别的标签元数据:

位置 领域 描述
根据参考 sensitivityLabelInfo 应用于 references 数组中返回的每个文档的敏感度标签。
响应 metadata.responseSensitivityLabelInfo 一种聚合标签,表示响应中所有被引用文档的最高优先级敏感性标签。 适用于客户端横幅显示和策略执行。

Microsoft Graph使用 Microsoft Purview 标签继承规则从每个引用标签计算响应级别标签。 通常,最严格的标签会获胜。

以下示例显示了一个检索响应,其中包含两个引用的文档(一个 Confidential、一个 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 基础索引已 purviewEnabled 设置为 true ,并且具有标记 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 用法,请参阅前面的部分。

查看活动日志中的模型名称

将 true 设置为 includeActivity,以返回基于模型的活动记录中的模型标识字段。 使用这些字段可以确认在检索请求期间哪个配置的模型处理了查询规划、答案合成或 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}");
    }
}

参考: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,
        )

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

参考:知识检索 - 检索

以下响应摘录显示了嵌套模型标识:

{
  "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 值,而不会更改已存储的值。

以下示例查询一个包含 product-docs-ks 和 troubleshooting-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,以限定特定知识源在最终结果选择之前可贡献的候选文档数量。 如果要将一个源的输入绑定到管道,而不会影响其他源,请使用此参数。

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 在全部四种组合中的交互方式。

maxOutputDocuments maxOutputSizeInTokens Behavior
未指定 未指定 使用默认 maxOutputSizeInTokens 响应限制行为。
未指定 指定 一旦达到有效负载大小限制,就会丢弃文档。
指定 未指定 最多返回指定数量的基础文档,并且不受 maxOutputSizeInTokens 限制。
指定 指定 最多返回 maxOutputDocuments 个文档,或者返回在 maxOutputSizeInTokens 限制内可容纳的文档数量,以先达到的限制为准。

验证知识库检索的默认设置

知识库可以存储请求范围默认值。retrieveDefaults 发送两个检索请求来验证继承和特定于请求的覆盖。

在开始之前,请完成配置默认检索限制(预览版)。 第一个请求省略所有三个请求范围限制,因此存储的值为 45 秒、8 个文档和 12,000 个令牌。 第二个请求使用 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");

参考: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")

参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest

首先,发送省略三个请求范围限制字段的请求。

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

接下来,针对一次请求覆盖这三个值。

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 个引用,第二个引用最多包含一个引用。 当文档匹配较少时,响应可以包含更少的引用。 响应不会报告有效的运行时或输出令牌预算,但这些值仍控制请求处理。 请求替代不会更改存储的默认值。

替代默认推理工作并设置请求限制

下面的示例指定 答案合成,因此检索推理工作必须是 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
);

参考: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)

参考: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
}

参考:知识检索 - 检索

让服务选择推理强度

auto设置为retrievalReasoningEffort.kind在检索请求中以替代知识库默认值。 有关自动推理的详细信息,请参阅设置检索推理工作(预览版)。

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

参考:知识检索 - 检索

为每个知识源设置引用

在 includeReferences 中使用 includeReferenceSourceData 和 knowledgeSourceParams,以控制哪些来源会显示在 references 数组中,以及每个条目包含多少源数据。 以下示例使用知识库的默认推理工作。

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

参考: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)

参考: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
);

参考: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)

参考: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 至少有一个源已成功,且没有失败的源被标记为 failOnError。 响应包含来自成功来源的结果。
502 Bad Gateway 所有选定的源均失败了,或者标记为 failOnError: true 的某个源失败了。

对于任何非200 响应,请记录 API 版本、时间戳、清理请求正文、响应标头以及请求或关联 ID。 这些详细信息可帮助你诊断失败,并在必要时与支持人员共享问题。

400 Bad Request

使用顶级错误标识无效的请求属性。 常见原因包括:

  • knowledgeSourceName中的knowledgeSourceParams未关联到知识库,或者其kind与已关联的源不匹配。
  • 请求值超出其支持的范围,或者一个选项需要另一个未启用的选项。 例如,includeReferenceSourceData 要求 includeReferences。
  • retrievalReasoningEffort.kind 是 auto,但请求使用早于 2026-08-01-preview的 API 版本。
  • 请求使用 auto、 low或 medium知识库不定义模型。
  • 对于请求时源排除(预览版),同一条目会将alwaysQuerySource和neverQuerySource都设置为true,或者排除所有附加的知识源。

在重试该请求之前,请先更正顶层错误指出的属性。

206 Partial Content

检查每个包含 activity 的error条目。 源检索活动标识失败的知识源,模型活动标识失败的处理阶段。 响应正文仍包含已成功的结果。

对于源检索活动错误,常见原因包括:

  • 查询时输入无效,例如格式不正确的 filterAddOn 表达式。
  • 知识源或索引配置偏移,例如重命名的字段、缺少 语义配置或无效 的向量器。
  • 缺少或无效的依赖项授权,或用于查询源的标识没有足够的权限。
  • 依赖项限制、超时或暂时的可用性故障。

对于模型活动错误,请使用活动 type 标识失败的处理阶段。 例如,错误 modelWebSummarization 指示 Web 结果汇总 失败。

如果应用程序允许部分结果,请处理成功的结果并记录每个失败的源或模型阶段。 在重试之前更正配置、授权和权限错误。 对于限制、超时或暂时的可用性故障,使用带退避机制的有界重试。

如果结果在没有特定来源时是不安全的,并且该来源类型支持 alwaysQuerySource,请同时设置 alwaysQuerySource 和 failOnError。 第一个选项可确保选择源,如果查询源失败,第二个选项将返回硬错误。 MCP 服务器知识源(预览版) 不支持 alwaysQuerySource;对于这些源, failOnError 仅当选择源时才适用。 failOnError 不适用于模型活动故障。

502 Bad Gateway

顶层错误描述了两种硬失败路径中的一种:

  • 每个所选源都失败: 每个选定的源都返回了错误。 使用零匹配文档成功完成的源不是失败的源。 检查每个源故障,查看是否存在共同的配置、授权、依赖项或可用性问题。
  • failOnError源失败:无法查询所需的源。 其他源可能已成功,但服务不会返回部分结果,因为所需的源失败。

底层源故障通常与针对 206 Partial Content 所述的故障类型大体相同:特定于源的无效输入、源或索引配置偏差、依赖项授权或权限问题、限流、超时或依赖项暂时不可用。

硬性502响应可能会省略activity数组,并且仅在顶层错误消息中提供源名称和底层故障信息。 在重试之前更正配置、授权和权限错误。 对于限制、超时或暂时的可用性故障,仅使用带退避机制的有界重试。 在未检查底层源故障之前,不要将 502 Bad Gateway 响应解读为 Azure AI 搜索 中断。

空白响应

搜索步骤可能会找到一个文档,但如果其基于的内容超出 maxOutputSizeInTokens 输出预算(maxOutputSize 在 2026-05-01-preview 以后),服务仍可以从最终响应中省略该文档。 出现此情况时,活动数组显示找到匹配项,活动记录包含一条警告,指出最相关的文档超过了最大输出大小。 该文档的引用数组和地面响应内容为空。 若要保留更多内容,请增加 maxOutputSizeInTokens。

为了避免此行为,请使用稳定标识符和源元数据将大型源文档作为较小的区块编制索引。 这尤其适用于较长的手册、策略或知识库文章。

调用 MCP 终结点

Warning

MCP 实现容易受到攻击、级联失败和人员监督损失等风险的影响。 你可以通过对 MCP 服务器的安全性和可靠性进行审查,遵循Microsoft 建议的做法和行业最佳实践,并实施审批机制以及监控级联行为,来降低这些风险。

MCP 是一种开放协议,用于标准化 AI 应用程序如何连接到外部数据源和工具。

在Azure AI 搜索中,每个知识库都是一个独立的 MCP 服务器,用于公开 knowledge_base_retrieve 工具。 任何与 MCP 兼容的客户端(包括 Foundry Agent Service、GitHub Copilot、Claude 和 Cursor)都可以调用此工具来查询知识库。

向 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 客户端。 当你将 Azure OpenAI Responses API 与 knowledge_base_retrieve MCP 工具配合使用时,你需要同时对发往 Azure OpenAI 的 Responses API 调用以及发往 Azure AI 搜索 的 MCP 请求进行身份验证。 如果 MCP 客户端直接调用此终结点,则仅对Azure AI 搜索进行身份验证。

若要Azure AI 搜索身份验证,请使用以下方法之一:

注意

MCP 客户端以不同的方式配置自定义标头。 例如,Foundry 代理服务通过项目连接注入标头,而客户端(如GitHub Copilot)需要 MCP 服务器 JSON 中的标头。

使用持有者令牌进行 MCP 身份验证

MCP 身份验证的建议方法是持有者令牌,可避免将敏感密钥存储在配置文件中。 令牌背后的标识必须在搜索服务上分配搜索索引数据读取者角色。 有关详细信息,请参阅 使用标识将应用连接到 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 响应 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 响应 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 响应 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 响应 API

// This code snippet is currently unavailable.

查看 MCP 响应

当 MCP 客户端调用 knowledge_base_retrieve 时,它收到的是 MCP 工具结果,而不是 retrieve 操作的 response、activity 和 references 封装。 许多 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 返回内容的条目。