注释
此功能目前处于预览状态。 此预览版未随附服务级别协议,建议不要用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Azure 预览版的使用条款。
在代理检索管道中,检索操作从知识库调用并行查询处理。 可以直接使用搜索服务的 REST API 或 Azure SDK 调用检索操作。 每个知识库还公开一个模型上下文协议(MCP)终结点,供MCP兼容的代理使用。
本文介绍如何调用检索方法并解释三管齐下响应。
先决条件
具有知识库的 Azure 人工智能搜索服务。
如果知识库指定了 LLM,则搜索服务必须具有一个托管标识,并对 Azure AI 服务资源具有认知服务用户权限。
- 最新的
Azure.Search.Documents预览版软件包:dotnet add package Azure.Search.Documents --prerelease
- 最新的
azure-search-documents预览版软件包:pip install --pre azure-search-documents
- 搜索服务 REST API 的 2025-11-01 预览版。
调用检索操作
在知识库上指定检索操作。 输入是自然语言的聊天对话历史记录,其中 messages 数组包含对话。 仅当 检索推理工作 较低或中等时,代理检索引擎才支持消息。
using Azure.Identity;
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(retrieval_request=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=2025-11-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"
}
]
}
参考:知识检索 - 检索
Important
2026-04-01 API 版本仅支持 intents 输入和最低限度的提取式检索。 不支持仅预览功能,包括 messages 输入、查询规划、答案合成和可配置推理工作。 为了完整的功能性,请使用 2025-11-01-preview。
查询时筛选 (搜索索引)
从搜索索引知识源检索时,可以在查询时应用 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'
示例筛选器表达式:
status eq 'published'created ge 2025-01-01city eq 'Redmond' and department eq 'Engineering'(priority eq 'High' or priority eq 'Critical') and resolved eq false
按语言分类的示例
using Azure.Identity;
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(retrieval_request=request)
print(result.response[0].content[0].text)
POST https://<YOUR SEARCH SERVICE>.search.azure.cn/knowledgebases/<YOUR KNOWLEDGE BASE NAME>/retrieve?api-version=2025-11-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"
}
请求参数
传递以下参数以调用检索操作。
| Name | Description | 类型 | 可编辑 | 必选 |
|---|---|---|---|---|
messages |
阐明发送到 LLM 的消息。 消息格式类似于Azure AI 服务 API。 | 物体 | 是的 | 否 |
messages.role |
定义消息来自何处,例如 assistant 或 user。 使用的模型确定哪些角色有效。 |
String | 是的 | 否 |
messages.content |
发送到 LLM 的消息或提示符。 必须是文本。 | String | 是的 | 否 |
knowledgeSourceParams |
覆盖每个知识源的默认检索设置。 可用于在查询时自定义查询或响应。 | 物体 | 是的 | 否 |
从搜索索引中检索信息
对于面向搜索索引的知识源,所有 searchable 字段都在查询执行范围内。 隐式查询类型为 semantic,没有搜索模式。
如果索引包含矢量字段,则需要有效的向量器定义,以便代理检索引擎可以向量化查询输入。 否则,将忽略向量字段。
有关详细信息,请参阅 创建索引进行代理检索。
调用 MCP 端点
MCP 是一种开放协议,用于标准化 AI 应用程序如何连接到外部数据源和工具。
在 Azure AI 搜索 中,每个知识库都是一个独立的 MCP 服务器,用于公开knowledge_base_retrieve 工具。
MCP 终结点格式
每个knowledge base都有一个位于以下 URL 的 MCP 终结点:
https://<your-service-name>.search.azure.cn/knowledgebases/<your-knowledge-base-name>/mcp?api-version=2025-11-01-preview
指定的 API 版本确定连接返回的内容。 借助 2025-11-01-preview,当底层知识库配置了 LLM 和兼容的推理能力时,知识库可以返回合成答案。 使用 2026-04-01时,检索始终是最小化和提取型的,并且连接仅返回基础数据。
在 MCP 终端进行身份验证
MCP 终结点需要通过自定义标头进行身份验证。 可以使用两个选项:
(推荐) 在
Authorization标头中传递持有者令牌。 令牌背后的标识必须在搜索服务上分配Search Index Data Reader角色。 此方法可避免将密钥存储在配置文件中。 有关详细信息,请参阅 使用标识将应用程序连接到Azure AI 搜索。在
api-key标头中传递管理密钥。 管理密钥提供对搜索服务的完整读写访问权限,因此请谨慎使用。 有关更多信息,请参阅 使用 API 密钥连接到 Azure AI 搜索。
在查询时强制实施权限
如果知识源包含受权限保护的内容,检索引擎可以筛选结果,以便每个用户只看到他们有权访问的文档。 通过在检索请求上传递最终用户的标识来启用此筛选。 如果没有身份令牌,来自启用权限的知识源的结果会无过滤地返回。
权限执行有两个部分:
引入时间:仅适用于被索引的知识源,将
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.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.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, 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=2025-11-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”字段。
在检索请求中,
maxOutputSizeInTokens属性(在 2025-11-01-preview 中为maxOutputSize)决定了字符串的长度。Important
可以无提示地省略超出
maxOutputSizeInTokens输出预算的文档,而无需发出警告。 有关详细信息,请参阅 对空响应进行故障排除。
活动数组
活动数组输出的查询计划为操作透明度提供了跟踪操作、计费影响和资源调用。 它还包括发送到检索管道的子查询,以及由于无法访问的知识源等原因导致的任何检索失败错误。
输出包括以下组件:
| Section | Description |
|---|---|
| modelQueryPlanning | 对于使用 LLM 进行查询规划的知识库,本部分报告用于输入的令牌计数,以及子查询的令牌计数。 |
| 特定于源的活动 | 对于查询中包含的每个知识源,本节将报告已用的时间以及查询中使用的参数,包括语义排名器。 知识源类型包括 searchIndex、 azureBlob支持的其他 知识源。 |
| 主体性推理 | 本部分报告检索期间代理推理的令牌消耗情况,具体取决于指定的 检索推理工作。 |
| modelAnswerSynthesis | 对于使用 答案合成的知识库,本部分将报告用于制定答案的令牌计数,以及答案输出的令牌计数。 |
注释
这些 modelQueryPlanning 和 modelAnswerSynthesis 节不会显示在 2026-04-01 活动数组中,因为查询规划和答案合成只是预览功能。 对于完整活动输出,请使用 2025-11-01-preview。
下面是活动数组的示例:
"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
}
]
例子
以下示例演示了使用 2025-11-01-preview API 版本调用检索操作的不同方法,该版本支持完整的功能集,包括答案合成和可配置推理工作。 有关 2026-04-01 用法,请参阅前面的部分。
替代默认推理工作并设置请求限制
此示例指定 答案合成,因此检索推理工作必须较低或中等。
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(retrieval_request=request)
print(result.response[0].content[0].text)
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
POST {{search-url}}/knowledgebases/kb-override/retrieve?api-version=2025-11-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
}
参考:知识检索 - 检索
为每个知识源设置引用
此示例使用knowledge base中指定的默认推理工作。 此示例的重点是规范响应中要包含的信息量。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
}
) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-financials-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = true
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-communicationservices-ks")
{
IncludeReferences = false,
IncludeReferenceSourceData = false
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-healthcare-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = false,
AlwaysQuerySource = true
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
参考: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(retrieval_request=request)
print(result.response[0].content[0].text)
参考:KnowledgeBaseRetrievalClient、 SearchIndexKnowledgeSourceParams
POST {{search-url}}/knowledgebases/kb-medium-example/retrieve?api-version=2025-11-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
}
]
}
参考:知识检索 - 检索
注释
对于索引的 OneLake 或索引的 SharePoint 知识源,请将 includeReferenceSourceData 设置为 true,以便在引文中包含来源文档 URL。
使用最少的推理工作量
在此示例中,没有用于智能查询规划或答案合成的 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(retrieval_request=request)
print(result.response[0].content[0].text)
参考:KnowledgeBaseRetrievalClient、 KnowledgeBaseRetrievalRequest
POST {{search-url}}/knowledgebases/kb-minimal/retrieve?api-version=2025-11-01-preview
Authorization: Bearer {{accessToken}}
Content-Type: application/json
{
"intents": [
{
"type": "semantic",
"search": "what is a brokerage"
}
]
}
参考:知识检索 - 检索
排查空响应问题
即使在搜索步骤中找到了文档,如果其内容超过了 maxOutputSizeInTokens (在2025-11-01-preview中为maxOutputSize)的输出预算,仍然会在最终响应中省略该文档。 发生这种情况时,活动数组显示找到匹配项,但该文档的引用数组和基础响应内容为空。 不返回截断警告或显式错误。
为了避免此行为,请使用稳定标识符和源元数据将大型源文档作为较小的区块编制索引。 这尤其适用于较长的手册、策略或知识库文章。