注释
此智能检索功能在 2026-04-01 REST API 版本中通过编程接口普遍可用。 Azure门户继续提供对所有代理检索功能的仅限预览的访问权限。
如果选择使用预览版 REST API 版本,则可以访问尚未正式发布此功能的功能。 预览版功能在没有服务级别协议的情况下提供,不建议用于生产工作负荷。
Important
这些特性和功能是 2026-05-01 预览版 REST API 的一部分。 2026-05-01-preview 作为Azure订阅的一部分获得许可,并受Microsoft产品条款、Microsoft产品和服务数据保护附录(“DPA”)和Azure预览版补充使用条款的约束。
2026-05-01-preview 支持连接到其他 Microsoft 服务和第三方服务。 使用这些服务受其各自的条款的约束,可能会导致数据处理或存储超出Azure符合性边界,以及流入Azure符合性边界的数据。
您有责任管理您的数据是否会流出您组织的合规和地理边界之外及其任何相关影响,并确保已配置适当的权限、边界和审批。
你负责仔细查看和测试在特定用例上下文中生成的应用程序,并做出所有适当的决策和自定义。 这包括实施自己的负责任的 AI 缓解措施,例如元系统、内容筛选器或其他安全系统,并确保应用程序满足适当的质量、可靠性、安全性和可信度标准。
在代理检索管道中,检索操作从知识库调用并行查询处理。 可以直接使用搜索服务的 REST API 或 Azure SDK 调用检索操作。 每个知识库还公开一个模型上下文协议(MCP)终结点,供MCP兼容的代理使用。
本文介绍如何调用检索方法并解释三管齐下响应。
先决条件
具有知识库的 Azure 人工智能搜索服务。
如果知识库指定了 LLM,则搜索服务必须具有一个托管标识,并对 Azure AI 服务资源具有认知服务用户权限。
所需
Azure.Search.Documents软件包:对于 2026-05-01-preview 功能,最新的预览包为:
dotnet add package Azure.Search.Documents --prerelease关于2026-04-01的功能,最新的稳定包是:
dotnet add package Azure.Search.Documents
所需
azure-search-documents软件包:对于 2026-05-01-preview 功能,最新的预览包为:
pip install --pre azure-search-documents关于2026-04-01的功能,最新的稳定包是:
pip install azure-search-documents
所需的 REST API 版本:
一般可用的功能: 搜索服务 2026-04-01
调用检索操作
在知识库上指定检索操作。 请求正文包括查询输入和要面向的知识源的可选列表。
Important
2026-04-01 API 版本仅支持 intents 输入和最低限度的提取式检索。 不支持仅预览功能,包括 messages 输入、查询规划、答案合成和可配置推理工作。 要使用全部功能,请使用 2026-05-01-preview。
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("<YOUR SEARCH SERVICE URL>"),
knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
tokenCredential: 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="<YOUR SEARCH SERVICE URL>",
knowledge_base_name="<YOUR 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-url = <YOUR SEARCH SERVICE URL> // Example: https://my-service.search.azure.cn
@accessToken = <YOUR ACCESS TOKEN> // Run: az account get-access-token --scope https://search.azure.cn/.default --query accessToken -o tsv
POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-05-01-preview
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"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"
}
]
}
参考:知识检索 - 检索
请求参数
传递以下参数以调用检索操作。
| Name | Description | 类型 | 可编辑 | 必选 |
|---|---|---|---|---|
messages |
包含发送到代理检索管道的聊天对话历史记录。 LLM 从会话历史记录中确定查询。 消息格式类似于Azure API。 仅当 检索推理工作 为低或中等时,才受支持。 | 物体 | 是的 | 否 |
messages.role |
定义消息来自何处,例如 assistant 或 user。 使用的模型确定哪些角色有效。 |
String | 是的 | 否 |
messages.content |
发送到 LLM 的消息或提示符。 必须是文本。 | Array | 是的 | 否 |
includeActivity |
当 true,响应包含一个 activity 数组,用于描述管道运行的步骤,例如查询规划、搜索索引调用和应答合成。 默认值为 false. 有关使用示例,请参阅 检查活动日志中的模型名称。 |
布尔 | 是的 | 否 |
maxOutputDocuments |
限定检索调用返回的依据文档数量上限。 在按来源进行候选项选择后生效。 如果 maxOutputSize 也被设置了,则这两项约束都会生效,并且先达到哪个限制,就以哪个为准。 如果经过排序、阈值筛选或去重后保留下来的结果较少,则服务返回的文档数可能少于此参数指定的值。 有关用法示例和设置组合表格,请参阅 限制最终依据文档。 |
Integer | 是的 | 否 |
maxOutputSize |
限制地面响应有效负载的大小(以令牌为单位)。 不符合限制的文档将从响应中省略。 如果 maxOutputDocuments 也被设置了,则这两项约束都会生效,并且先达到哪个限制,就以哪个为准。 有关用法示例和设置组合表格,请参阅 限制最终依据文档。 |
Integer | 是的 | 否 |
retrievalReasoningEffort |
设置请求的检索推理工作并替代知识库默认值。 有关有效值和权衡,请参阅设置检索推理工作(预览版)。 | 物体 | 是的 | 否 |
knowledgeSourceParams |
覆盖每个知识源的默认检索设置。 可用于在查询时自定义查询或响应。 | 物体 | 是的 | 否 |
knowledgeSourceParams.knowledgeSourceName |
条目适用的知识源的名称。 知识源必须已经关联到知识库。 | String | 是的 | 是的 |
knowledgeSourceParams.kind |
知识源类型的鉴别器,例如searchIndex,web或azureBlobsharepoint。 必须与基础知识源类型匹配。 |
String | 是的 | 是的 |
knowledgeSourceParams.alwaysQuerySource |
当 true,管道始终查询此知识源,而不是依赖规划器来决定。 当源必须始终参与响应时非常有用。 此参数独立于 failOnError. 若要要求源始终运行,并在请求出错时失败,请将这两个源都设置为 true。 |
布尔 | 是的 | 否 |
knowledgeSourceParams.failOnError |
当 true 时,检索请求会失败,并返回 502 Bad Gateway 以及一条错误消息,该消息会指出无法查询的知识源,而不是返回其余来源的部分响应。 默认为 false,这意味着该管道优先保证可用性,并在某个源失败时返回来自其他源的结果。 独立于 alwaysQuerySource(它控制是否尝试该源);failOnError 控制的是当该尝试失败时会发生什么。 有关使用示例,请参阅 “需要知识源才能成功”。 |
布尔 | 是的 | 否 |
knowledgeSourceParams.maxOutputDocuments |
限制此知识源在最终结果选择之前贡献的候选文档数。 请使用 50 以实现跨区域兼容,因为某些预览区域将此每源参数的上限设为 50。 不会控制最终返回给调用方的 grounding 文档数量。 当可用匹配项较少或内部限制适用时,服务可以返回较少的文档。 有关使用示例,请参阅 按知识源优化候选文档。 |
Integer | 是的 | 否 |
knowledgeSourceParams.includeReferences |
当 true,响应包含一个 references 数组,该数组标识为此源的答案贡献的文档。 有关使用示例,请参阅 设置每个知识源的引用。 |
布尔 | 是的 | 否 |
knowledgeSourceParams.includeReferenceSourceData |
当 true 时,引用内容包括在知识源上配置的源数据字段。 有关使用示例,请参阅 设置每个知识源的引用。 |
布尔 | 是的 | 否 |
knowledgeSourceParams.rerankerThreshold |
候选文档要包含在对此源的结果集中所必须达到的最低重排器分数。 | 编号 | 是的 | 否 |
knowledgeSourceParams.filterAddOn |
追加到持久化 baseFilter (如果有)的 OData 筛选器,用于搜索索引知识源,在请求时缩小源查询范围。 有关筛选器语法和示例,请参阅 在查询时筛选搜索索引知识源。 |
String | 是的 | 否 |
搜索索引行为
对于面向搜索索引的知识源,所有 searchable 字段都在查询执行范围内。 隐式查询类型为 semantic,没有搜索模式。
如果索引包含矢量字段,则需要有效的向量器定义,以便代理检索引擎可以向量化查询输入。 否则,将忽略向量字段。
有关详细信息,请参阅 创建索引进行代理检索。
调用 MCP 端点
Important
MCP 实现容易受到攻击、级联失败和人员监督损失等风险的影响。 你可以通过对 MCP 服务器的安全性和可靠性进行审查,遵循Microsoft 建议的做法和行业最佳实践,并实施审批机制以及监控级联行为,来降低这些风险。
MCP 是一种开放协议,用于标准化 AI 应用程序如何连接到外部数据源和工具。
在 Azure AI 搜索 中,每个知识库都是一个独立的 MCP 服务器,用于公开knowledge_base_retrieve 工具。
MCP 终结点格式
每个知识库都有一个位于以下 URL 的 MCP 终结点。
https://<your-service-name>.search.azure.cn/knowledgebases/<your-knowledge-base-name>/mcp?api-version=<api-version>
指定的 API 版本确定连接返回的内容。 借助 2026-05-01-preview,当底层知识库配置了 LLM 和兼容的推理能力时,知识库可以返回合成答案。 使用 2026-04-01时,检索始终是最小化和提取型的,并且连接仅返回基础数据。
在 MCP 终端进行身份验证
MCP 终结点需要通过自定义标头进行身份验证。 可以使用两个选项:
(推荐) 在
Authorization标头中传递持有者令牌。 令牌背后的标识必须在搜索服务上分配Search Index Data Reader角色。 此方法可避免将密钥存储在配置文件中。 有关详细信息,请参阅 使用标识将应用程序连接到Azure AI 搜索。在
api-key标头中传递管理密钥。 管理密钥提供对搜索服务的完整读写访问权限,因此请谨慎使用。 有关更多信息,请参阅 使用 API 密钥连接到 Azure AI 搜索。
在查询时筛选搜索索引知识源
从搜索索引知识源检索时,可以在查询时应用 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("<YOUR SEARCH SERVICE URL>"),
knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
tokenCredential: 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="<YOUR SEARCH SERVICE URL>",
knowledge_base_name="<YOUR 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 https://<YOUR SEARCH SERVICE>.search.azure.cn/knowledgebases/<YOUR KNOWLEDGE BASE NAME>/retrieve?api-version=2026-05-01-preview
Content-Type: application/json
Authorization: Bearer <YOUR 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"
}
在查询时强制实施权限(预览版)
Important
2026-05-01-preview 无法修改在 2026-05-01-preview 之外设置的访问权限。 如果您使用 2026-05-01-preview 处理受访问限制或权限限制的内容,则在 2026-05-01-preview 识别到这些访问或权限限制的更改之前,会存在一段时间延迟。
如果知识源包含受权限保护的内容,检索引擎可以筛选结果,以便每个用户只看到他们有权访问的文档。 通过在检索请求上传递最终用户的标识来启用此筛选。 如果没有身份令牌,来自启用权限的知识源的结果会无过滤地返回。
权限执行有两个部分:
引入时间:仅适用于被索引的知识源,将
ingestionPermissionOptions设置为与内容一起引入权限元数据。查询时间:在
x-ms-query-source-authorization标头中传递用户的访问令牌。
引入时间配置
下表显示了哪些知识源需要引入时间配置以及每个源如何强制实施权限。
| 知识来源 | 需要 ingestionPermissionOptions |
如何执行权限 |
|---|---|---|
| Blob 或 ADLS Gen2 | ✅ | 导入的 RBAC 范围或 ACL 与用户标识匹配。 |
Important
如果在 ingestionPermissionOptions 创建索引知识源时未配置,则索引中不存在任何权限元数据。 无论标头如何,结果均未筛选返回。 若要解决此问题,请使用适当的 ingestionPermissionOptions 值重新创建知识源。
查询时授权
若要传递最终用户的标识,请在检索请求中包含一个访问令牌,该令牌限定于https://search.azure.cn/.default。 此令牌与用于访问搜索服务的服务凭据分开。 它不需要搜索服务权限,只代表被评估内容访问权限的用户。 有关详细信息,请参阅 ACL 和 RBAC 在查询时的执行。
在 .NET SDK 中,将令牌作为 xMsQuerySourceAuthorization 上的 RetrieveAsync 参数传递:
using Azure;
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.cn/.default" }
);
string userToken = (await serviceCredential.GetTokenAsync(userTokenContext)).Token;
// Create the retrieval client with the service credential
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<YOUR SEARCH SERVICE URL>"),
knowledgeBaseName: "<YOUR KNOWLEDGE BASE NAME>",
tokenCredential: 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, xMsQuerySourceAuthorization: userToken);
var text = (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text;
Console.WriteLine(text);
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
在 Python SDK 中,在 x_ms_query_source_authorization 上将令牌作为 retrieve 参数传递:
from azure.identity import DefaultAzureCredential
from azure.core.credentials import 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.cn/.default")
user_token = user_token_provider()
# Create the retrieval client with the service credential
kb_client = KnowledgeBaseRetrievalClient(
endpoint="<YOUR SEARCH SERVICE URL>",
knowledge_base_name="<YOUR 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, x_ms_query_source_authorization=user_token)
print(result.response[0].content[0].text)
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
在 REST API 中,包含 x-ms-query-source-authorization 具有用户访问令牌的标头:
@search-url = <YOUR SEARCH SERVICE URL>
@accessToken = <YOUR ACCESS TOKEN> // Service credential
@userAccessToken = <USER ACCESS TOKEN> // User identity token
POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
x-ms-query-source-authorization: {{userAccessToken}}
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What companies are in the financial sector?"
}
]
}
]
}
参考:知识检索 - 检索
查看响应
成功检索会返回200 OK状态代码。 如果知识库无法从一个或多个知识源中检索,服务将 206 Partial Content 返回状态代码。 响应仅包括成功源的结果。 活动数组包含有关部分响应作为错误的详细信息。
检索操作返回三个主要组件:
提取的响应
提取的响应是通常传递给 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”字段。
retrieve 请求中的
maxOutputSizeInTokens属性(在 2026-05-01-preview 中为maxOutputSize)用于确定字符串的长度。Important
可以从响应中省略超出
maxOutputSizeInTokens输出预算的文档。 当最相关的文档超过最大输出大小时,活动数组中会包含一条警告。 若要保留更多内容,请增加maxOutputSizeInTokens。 有关详细信息,请参阅 对空响应进行故障排除。
活动数组
活动数组输出的查询计划为操作透明度提供了跟踪操作、计费影响和资源调用。 它还包括发送到检索管道的子查询,以及由于无法访问的知识源等原因导致的任何检索失败错误。
输出包括以下组件。
| Section | Description |
|---|---|
modelQueryPlanning |
对于使用 LLM 进行查询规划的知识库,本部分报告用于输入的令牌计数,以及子查询的令牌计数。 包括一个 modelName 字段,其中包含运行活动的模型的公共模型名称(而不是部署名称)。 |
| 特定于源的活动 | 对于查询中包含的每个知识源,本节将报告已用的时间以及查询中使用的参数,包括语义排名器。 知识源类型包括 searchIndex、 azureBlob支持的其他 知识源。 |
agenticReasoning |
本部分报告检索期间代理推理的令牌消耗情况,具体取决于指定的 检索推理工作。 |
modelAnswerSynthesis |
对于使用 答案合成的知识库,本部分将报告用于制定答案的令牌计数,以及答案输出的令牌计数。 包括一个 modelName 字段,其中包含运行活动的模型的公共模型名称(而不是部署名称)。 |
modelWebSummarization |
对于使用 Web 摘要的知识库,本部分报告用于汇总 Web 结果的令牌消耗情况。 包括一个 modelName 字段,其中包含运行活动的模型的公共模型名称(而不是部署名称)。 |
下面是活动数组的示例:
"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,以及由代理检索引擎查找和进行语义排名的每个文档。
sourceData 包含 id 及语义字段:title、terms 和 content。
id 用于作为具体响应中某个项目的引用 ID。 它不是搜索索引中的文档标识符。 使用它来提供引文。 字段 activitySource 交叉引用生成引用的活动条目 id,这对于引文链接非常有用。
下面是引用数组的示例:
"references": [
{
"type": "searchIndex",
"id": "0",
"activitySource": 2,
"docKey": "earth_at_night_508_page_104_verbalized",
"sourceData": null
},
{
"type": "searchIndex",
"id": "1",
"activitySource": 2,
"docKey": "earth_at_night_508_page_105_verbalized",
"sourceData": null
}
]
检查响应中的敏感度标签元数据(预览版)
Important
2026-05-01-preview 无法修改在 2026-05-01-preview 之外设置的访问权限。 如果您使用 2026-05-01-preview 处理受访问限制或权限限制的内容,则在 2026-05-01-preview 识别到这些访问或权限限制的更改之前,会存在一段时间延迟。
查询引入Microsoft Purview敏感度标签的知识库时,检索响应包含两个级别的标签元数据:
| Location | 字段 | Description |
|---|---|---|
| 按参考项 | 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-05-01-preview API 版本调用检索操作的不同方法,该版本支持完整的功能集,包括答案合成和可配置的推理工作。 有关 2026-04-01 用法,请参阅前面的部分。
查看活动日志中的模型名称
模型支持的活动记录在启用modelName时包含includeActivity字段。 使用此字段可确认在检索请求期间哪个配置的模型处理了查询规划、答案合成或 Web 摘要。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("Which policy applies to returns?")
}
) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
var result = await kbClient.RetrieveAsync(retrievalRequest);
foreach (var entry in result.Value.Activity)
{
Console.WriteLine($"{entry.Type} modelName={entry.ModelName}");
}
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="Which policy applies to returns?")],
)
],
include_activity=True,
)
result = kb_client.retrieve(request)
for entry in result.activity:
print(entry.type, "modelName=", getattr(entry, "model_name", None))
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Which policy applies to returns?" }
]
}
],
"includeActivity": true
}
参考:知识检索 - 检索
以下响应摘录显示了包含 modelName的活动记录。
{
"activity": [
{
"type": "modelQueryPlanning",
"id": 0,
"modelName": "gpt-5-mini",
"inputTokens": 1842,
"outputTokens": 87,
"elapsedMs": 1923
},
{
"type": "searchIndex",
"id": 1,
"knowledgeSourceName": "operations-ks",
"count": 12,
"elapsedMs": 234
},
{
"type": "modelAnswerSynthesis",
"id": 2,
"modelName": "gpt-5-mini",
"inputTokens": 2418,
"outputTokens": 179,
"elapsedMs": 931
}
]
}
需要知识源才能成功
failOnError设置为knowledgeSourceParams根据需要标记知识源。 当部分答案具有误导性或不符合要求(如果该源不可用)时,请使用此参数。
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);
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)
POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
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"
}
]
}
参考:知识检索 - 检索
根据知识源优化候选文档
在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);
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)
POST {{search-url}}/knowledgebases/operations-kb/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What safety procedures apply?" }
]
}
],
"knowledgeSourceParams": [
{
"knowledgeSourceName": "operations-ks",
"kind": "searchIndex",
"maxOutputDocuments": 50
}
]
}
参考:知识检索 - 检索
限制最终依据文档
顶层 maxOutputDocuments 参数限定了最终检索响应中返回的 grounding 文档数量上限。 当应用程序需要可预测的引文或引用计数时,请使用此参数。
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.MaxOutputSize = 6000;
var result = await kbClient.RetrieveAsync(retrievalRequest);
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What is the return policy?")],
)
],
output_mode="extractedData",
max_output_documents=3,
max_output_size=6000,
)
result = kb_client.retrieve(request)
POST {{search-url}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What is the return policy?" }
]
}
],
"outputMode": "extractedData",
"maxOutputDocuments": 3,
"maxOutputSize": 6000
}
参考:知识检索 - 检索
下表展示了 maxOutputDocuments 和 maxOutputSize 在全部四种组合中的交互方式。
maxOutputDocuments |
maxOutputSize |
Behavior |
|---|---|---|
| 未指定 | 未指定 | 使用默认 maxOutputSize 响应限制行为。 |
| 未指定 | 已指定 | 一旦达到有效负载大小限制,就会丢弃文档。 |
| 已指定 | 未指定 | 最多返回指定数量的基础文档,并且不受 maxOutputSize 限制。 |
| 已指定 | 指定的 | 最多返回 maxOutputDocuments 个文档,或者返回在 maxOutputSize 限制内可容纳的文档数量,以先达到的限制为准。 |
替代默认推理工作并设置请求限制
此示例指定 答案合成,因此检索推理工作必须是 low 或 medium。 它还设置为 maxRuntimeInSeconds 限制请求总延迟并 maxOutputSize 绑定响应有效负载。
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.MaxOutputSize = 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
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
)
],
retrieval_reasoning_effort=KnowledgeRetrievalLowReasoningEffort(),
output_mode="answerSynthesis",
max_runtime_in_seconds=30,
max_output_size=6000,
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
POST {{search-url}}/knowledgebases/kb-override/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
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,
"maxOutputSize": 6000
}
参考:知识检索 - 检索
为每个知识源设置引用
在 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-url}}/knowledgebases/kb-medium-example/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
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-url}}/knowledgebases/kb-minimal/retrieve?api-version=2026-05-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
{
"intents": [
{
"type": "semantic",
"search": "what is a brokerage"
}
]
}
参考:知识检索 - 检索
排查空响应问题
可以在搜索步骤期间找到文档,但如果其基础内容超过 maxOutputSizeInTokens (maxOutputSize 2026-05-01-preview)输出预算,则仍会从最终响应中省略文档。 发生这种情况时,活动数组显示找到匹配项,活动记录包含一条警告,指出最相关的文档超过了最大输出大小。 该文档的引用数组和地面响应内容为空。 若要保留更多内容,请增加 maxOutputSizeInTokens。
为了避免此行为,请使用稳定标识符和源元数据将大型源文档作为较小的区块编制索引。 这尤其适用于较长的手册、策略或知识库文章。