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

注释

此功能目前处于预览状态。 此预览版未随附服务级别协议,建议不要用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Azure 预览版的使用条款

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

本文介绍如何调用检索方法并解释三管齐下响应。

先决条件

  • 具有知识库的 Azure 人工智能搜索服务。

  • 查询知识库的权限。 为用户帐户分配搜索索引数据读取者角色(推荐)来配置无密钥身份验证,或者使用API 密钥

  • 如果知识库指定了 LLM,则搜索服务必须具有一个托管标识,并对 Azure AI 服务资源具有认知服务用户权限。

调用检索操作

在知识库上指定检索操作。 输入是自然语言的聊天对话历史记录,其中 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
);

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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)

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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

参考:知识检索 - 检索

查询时筛选 (搜索索引)

从搜索索引知识源检索时,可以在查询时应用 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-01
  • city 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 定义消息来自何处,例如 assistantuser。 使用的模型确定哪些角色有效。 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

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

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

在 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状态代码。 如果knowledge base无法从一个或多个知识源中检索,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.text 是 JSON 数组。 给定查询和聊天历史输入,它是由搜索索引中找到的最相关的文档(或区块)组成的单一字符串。 此数组是聊天完成模型用来表述对用户问题的响应的基础数据。

    响应的这一部分包含 200 个区块或更少区块,不包括未能满足 2.5 重新评分的最低阈值的任何结果。

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

  • 在此预览版中,content.type有一个有效值: text

  • maxOutputSize知识库上的属性确定字符串的长度。

    Important

    可以无提示地省略超出 maxOutputSize 输出预算的文档,而无需发出警告。 有关详细信息,请参阅 对空响应进行故障排除

活动数组

活动数组输出的查询计划为操作透明度提供了跟踪操作、计费影响和资源调用。 它还包括发送到检索管道的子查询,以及由于无法访问的知识源等原因导致的任何检索失败错误。

输出包括以下组件:

Section Description
modelQueryPlanning 对于使用 LLM 进行查询规划的知识库,本部分报告用于输入的令牌计数,以及子查询的令牌计数。
特定于源的活动 对于查询中包含的每个知识源,本节将报告已用的时间以及查询中使用的参数,包括语义排名器。 知识源类型包括 searchIndexazureBlob支持的其他 知识源
主体性推理 本部分报告检索期间代理推理的令牌消耗情况,具体取决于指定的 检索推理工作
modelAnswerSynthesis 对于使用 答案合成的知识库,本部分将报告用于制定答案的令牌计数,以及答案输出的令牌计数。

下面是活动数组的示例:

  "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 及语义字段:titletermscontent

id 用于作为具体响应中某个项目的引用 ID。 它不是搜索索引中的文档标识符。 使用它来提供引文。

此数组的目的是提供聊天消息样式结构,以便轻松集成。 例如,如果要将结果序列化为不同的结构,或者需要对数据进行一些编程作,然后再将其返回给用户。

还可以从引用数组中的源数据对象中获取结构化数据,以对其进行操作,使之符合你的需求。

下面是引用数组的示例:

  "references": [
    {
      "type": "AzureSearchDoc",
      "id": "0",
      "activitySource": 2,
      "docKey": "earth_at_night_508_page_104_verbalized",
      "sourceData": null
    },
    {
      "type": "AzureSearchDoc",
      "id": "1",
      "activitySource": 2,
      "docKey": "earth_at_night_508_page_105_verbalized",
      "sourceData": null
    }
  ]

例子

以下示例演示了调用检索操作的不同方法:

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

此示例指定 答案合成,因此 retrievalReasoningEffort 必须为“low”或“medium”。

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

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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)

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

POST {{search-url}}/knowledgebases/kb-override/retrieve?api-version={{api-version}}
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;
// Knowledge source params are configured per source on the request

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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)

参考:KnowledgeBaseRetrievalClientSearchIndexKnowledgeSourceParams

POST {{search-url}}/knowledgebases/kb-medium-example/retrieve?api-version={{api-version}}
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
);

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

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)

参考:KnowledgeBaseRetrievalClientKnowledgeBaseRetrievalRequest

POST {{search-url}}/knowledgebases/kb-minimal/retrieve?api-version={{api-version}}
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
    "intents": [
        {
            "type": "semantic",
            "search": "what is a brokerage"
        }
    ]
}

参考:知识检索 - 检索

排查空响应问题

在搜索步骤中可以找到文档,但如果其基础内容超出 maxOutputSize 输出预算,该文档仍可能会从最终响应中被省略。 发生这种情况时,活动数组显示找到匹配项,但该文档的引用数组和基础响应内容为空。 不返回截断警告或显式错误。

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