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

在 Azure AI 搜索 中创建知识库

注意

此智能检索功能在 2026-04-01 REST API 版本中通过编程接口普遍可用。 Azure门户和 Microsoft Foundry 门户继续提供对所有代理检索功能的仅限预览的访问权限。 有关迁移指南,请参阅 将代理检索代码迁移到最新版本

如果选择使用预览版 REST API 版本,则可以访问尚未正式发布此功能的功能。 预览版功能在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

在 Azure AI 搜索 中,knowledge base 是一个顶级对象,用于协调 agentic 检索。 它定义要查询的知识源以及用于检索操作的默认行为。 在查询时, 检索方法 以知识库为目标,以运行配置的检索管道。

可以在 Microsoft Foundry (new) 门户中的 Foundry IQ 工作负荷中创建知识库。 在使用 Azure AI 搜索 API 创建的任何代理解决方案中,还需要一个知识库。

知识库指定:

  • 指向可搜索内容的一个或多个知识源。
  • 用于查询规划、答案合成或 Web 内容摘要的可选 LLM。 支持的任务因 API 版本和知识源类型而异。
  • 控制路由、源选择和对象加密的自定义属性。

使用支持

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

先决条件

  • 在提供代理检索的任何区域,使用 Azure AI 搜索。 如果使用托管标识对已部署的模型进行基于角色的访问,则搜索服务必须位于基本定价层或更高层。

  • 一个或多个 知识来源。 如果计划使用 2026-04-01 API 版本创建知识库,则知识库必须正式发布。 否则,可以使用预览知识源类型。

  • (条件)部署了支持的 LLM 的 Azure OpenAI。 对于 2025-11-01-preview 和 2026-04-01 API 版本,如果知识库包含 Web 知识库,则需要 LLM。 对于仅 2025-11-01 预览版而言,LLM 对于所有其他类型的知识源都是可选项。 2026-04-01 不支持非 Web 知识源的 LLM。

  • 在Azure AI 搜索上创建和使用对象的权限。 建议 使用基于角色的访问搜索服务参与者 可以创建和管理知识库。 搜索索引数据读取器 可以运行查询。 或者,如果角色分配不可行,则可以使用 API 密钥 。 有关详细信息,请参阅 “连接到搜索服务”。

  • 必需Azure.Search.Documents 包:

    • 对于 2025-11-01-preview 功能,最新的预览包:dotnet add package Azure.Search.Documents --prerelease

    • 关于2026-04-01的功能,最新的稳定包是:dotnet add package Azure.Search.Documents

  • 所需的 azure-search-documents 包:

    • 对于 2025-11-01-preview 功能,最新的预览包:pip install azure-search-documents --pre

    • 关于2026-04-01的功能,最新的稳定包是:pip install azure-search-documents

支持的模型

在 Foundry 模型中使用 Azure OpenAI 中的以下 LLM 之一。 有关部署说明,请参阅 Foundry 门户中的 Deploy Microsoft Foundry 模型

  • gpt-4o
  • gpt-4o-mini
  • gpt-4.1
  • gpt-4.1-mini
  • gpt-4.1-nano
  • gpt-5
  • gpt-5-mini
  • gpt-5-nano
  • gpt-5.1
  • gpt-5.2
  • gpt-5.4
  • gpt-5.4-mini
  • gpt-5.4-nano

配置访问权限

Azure AI 搜索 需要从 Foundry 模型中的 Azure OpenAI 访问 LLM。 我们建议使用 Microsoft Entra ID 进行身份验证,并使用基于角色的访问控制进行授权。 若要分配角色,你必须是 所有者或用户访问管理员。 如果无法使用角色,请改用基于密钥的身份验证。

  1. 配置Azure AI 搜索以使用托管标识

  2. 在模型提供程序上,将认知服务用户分配给搜索服务的托管标识。 如果要在本地进行测试,请将相同的角色分配给用户帐户。

  3. 对于本地测试,请按照快速入门中的步骤操作 :在没有密钥的情况下连接 以登录到特定订阅和租户。 在每个请求中应使用DefaultAzureCredential而不是AzureKeyCredential,应类似于以下示例:

    // Authenticate using roles
    using Azure.Search.Documents.Indexes;
    using Azure.Identity;
    
    var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new DefaultAzureCredential());
    
  1. 配置Azure AI 搜索以使用托管标识

  2. 在模型提供程序上,将认知服务用户分配给搜索服务的托管标识。 如果要在本地进行测试,请将相同的角色分配给用户帐户。

  3. 对于本地测试,请按照快速入门中的步骤操作 :在没有密钥的情况下连接 以登录到特定订阅和租户。 在每个请求中应使用DefaultAzureCredential而不是AzureKeyCredential,应类似于以下示例:

    # Authenticate using roles
    from azure.identity import DefaultAzureCredential
    index_client = SearchIndexClient(endpoint = "search_url", credential = DefaultAzureCredential())
    
  1. 配置Azure AI 搜索以使用托管标识

  2. 在模型提供程序上,将认知服务用户分配给搜索服务的托管标识。 如果要在本地进行测试,请将相同的角色分配给用户帐户。

  3. 对于本地测试,请按照快速入门中的步骤操作 :在没有密钥的情况下连接 以获取特定订阅和租户的个人访问令牌。 在每个请求中指定访问令牌,该令牌应类似于以下示例:

    # List indexes using roles
    GET https://{{search-url}}/indexes?api-version=2026-04-01
    Content-Type: application/json
    Authorization: Bearer {{access-token}}
    

重要

本文中的代码片段使用 API 密钥。 如果使用基于角色的身份验证,请相应地更新每个请求。 在指定这两种方法的请求中,API 密钥优先。

检查现有知识库

知识库是顶级可重用对象。 了解现有知识库有助于重复使用或命名新对象。

运行以下代码,按名称列出现有知识库。 该列表包括你的搜索服务上的所有知识库,而不考虑用于创建它们的 API 版本。

// List knowledge bases by name
using Azure.Search.Documents.Indexes;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);
var knowledgeBases = indexClient.GetKnowledgeBasesAsync();

Console.WriteLine("Knowledge Bases:");

await foreach (var kb in knowledgeBases)
{
    Console.WriteLine($"  - {kb.Name}");
}

Reference:SearchIndexClient

# List knowledge bases by name
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))

for kb in index_client.list_knowledge_bases():
    print(f"  - {kb.name}")

Reference:SearchIndexClient

# List knowledge bases
GET {{search-url}}/knowledgebases?api-version={{api-version}}&$select=name
Content-Type: application/json
api-key: {{search-api-key}}

参考:知识库 - 列表

还可以按名称返回单个知识库来查看其 JSON 定义。

using Azure.Search.Documents.Indexes;
using System.Text.Json;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);

// Specify the knowledge base name to retrieve
string kbNameToGet = "earth-knowledge-base";

// Get a specific knowledge base definition
var knowledgeBaseResponse = await indexClient.GetKnowledgeBaseAsync(kbNameToGet);
var kb = knowledgeBaseResponse.Value;

// Serialize to JSON for display
string json = JsonSerializer.Serialize(kb, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);

Reference:SearchIndexClient

# Get a knowledge base definition
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
import json

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))

kb = index_client.get_knowledge_base("knowledge_base_name")
print(json.dumps(kb.as_dict(), indent = 2))

Reference:SearchIndexClient

# Get knowledge base
GET {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
Content-Type: application/json
api-key: {{search-api-key}}

参考:知识库 - 获取

以下 JSON 是知识库的示例响应。

{
  "name": "my-kb",
  "description": "A sample knowledge base.",
  "retrievalInstructions": null,
  "answerInstructions": null,
  "outputMode": null,
  "knowledgeSources": [
    {
      "name": "my-blob-ks"
    }
  ],
  "models": [],
  "encryptionKey": null,
  "retrievalReasoningEffort": {
    "kind": "low"
  }
}

注意

响应架构反映用于创建知识库的 API 版本。 使用正式版 2026-04-01 API 版本创建的知识库返回比 2025-11-01-preview 更窄的定义。 有关每个版本支持哪些属性的详细信息,请参阅下一部分。

创建知识库

在 Foundry 模型中,知识库将一个或多个知识源(可搜索内容)与 Azure OpenAI 的可选 LLM 连接起来。 设置的属性为查询执行和检索响应建立默认值。

创建知识库后,可以随时更新其属性。 如果知识库正在使用中,更新将对下一次检索生效。

// Create a knowledge base
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases.Models;
using Azure;

var indexClient = new SearchIndexClient(new Uri(searchEndpoint), new AzureKeyCredential(apiKey));

var aoaiParams = new AzureOpenAIVectorizerParameters
{
    ResourceUri = new Uri(aoaiEndpoint),
    DeploymentName = aoaiGptDeployment,
    ModelName = aoaiGptModel
};

var knowledgeBase = new KnowledgeBase(
    name: "my-kb",
    knowledgeSources: new KnowledgeSourceReference[] 
    { 
        new KnowledgeSourceReference("hotels-ks"),
        new KnowledgeSourceReference("earth-at-night-ks")
    }
)
{
    Description = "This knowledge base handles questions directed at two unrelated sample indexes.",
    RetrievalInstructions = "Use the hotels knowledge source for queries about where to stay, otherwise use the earth at night knowledge source.",
    AnswerInstructions = "Provide a two sentence concise and informative answer based on the retrieved documents.",
    OutputMode = KnowledgeRetrievalOutputMode.AnswerSynthesis,
    Models = { new KnowledgeBaseAzureOpenAIModel(azureOpenAIParameters: aoaiParams) },
    RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort()
};

await indexClient.CreateOrUpdateKnowledgeBaseAsync(knowledgeBase);
Console.WriteLine($"Knowledge base '{knowledgeBase.Name}' created or updated successfully.");

Reference:SearchIndexClientKnowledgeBase

# Create a knowledge base
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import KnowledgeBase, KnowledgeBaseAzureOpenAIModel, KnowledgeSourceReference, AzureOpenAIVectorizerParameters, KnowledgeRetrievalOutputMode, KnowledgeRetrievalLowReasoningEffort

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))

aoai_params = AzureOpenAIVectorizerParameters(
    resource_url = "aoai_endpoint",
    api_key="aoai_api_key",
    deployment_name = "aoai_gpt_deployment",
    model_name = "aoai_gpt_model",
)

knowledge_base = KnowledgeBase(
    name = "my-kb",
    description = "This knowledge base handles questions directed at two unrelated sample indexes.",
    retrieval_instructions = "Use the hotels knowledge source for queries about where to stay, otherwise use the earth at night knowledge source.",
    answer_instructions = "Provide a two sentence concise and informative answer based on the retrieved documents.",
    output_mode = KnowledgeRetrievalOutputMode.ANSWER_SYNTHESIS,
    knowledge_sources = [
        KnowledgeSourceReference(name = "hotels-ks"),
        KnowledgeSourceReference(name = "earth-at-night-ks"),
    ],
    models = [KnowledgeBaseAzureOpenAIModel(azure_open_ai_parameters = aoai_params)],
    encryption_key = None,
    retrieval_reasoning_effort = KnowledgeRetrievalLowReasoningEffort(),
)

index_client.create_or_update_knowledge_base(knowledge_base)
print(f"Knowledge base '{knowledge_base.name}' created or updated successfully.")

Reference:SearchIndexClientKnowledgeBase

# Create a knowledge base
PUT {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version=2025-11-01-preview
Content-Type: application/json
api-key: {{search-api-key}}

{
    "name" : "my-kb",
    "description": "This knowledge base handles questions directed at two unrelated sample indexes.",
    "retrievalInstructions": "Use the hotels knowledge source for queries about where to stay, otherwise use the earth at night knowledge source.",
    "answerInstructions": null,
    "outputMode": "answerSynthesis",
    "knowledgeSources": [
        {
            "name": "hotels-ks"
        },
        {
            "name": "earth-at-night-ks"
        }
    ],
    "models" : [ 
        {
            "kind": "azureOpenAI",
            "azureOpenAIParameters": {
                "resourceUri": "{{model-provider-url}}",
                "apiKey": "{{model-api-key}}",
                "deploymentId": "gpt-4.1-mini",
                "modelName": "gpt-4.1-mini"
            }
        }
    ],
    "encryptionKey": null,
    "retrievalReasoningEffort": {
        "kind": "low"
    }
}

参考:知识库 - 创建或更新

重要

2026-04-01 API 版本仅接受正式发布的知识源类型,并支持最少的提取检索。 不支持仅预览功能,例如查询规划、答案合成和可配置推理工作。 要获得完整功能,请使用 2025-11-01-preview。

知识库属性

传递以下属性以创建知识库。

名字 描述 类型 必填
Name 知识库的名称。 它必须在知识库集合中是唯一的,并遵循 Azure AI 搜索 中对象的命名准则 字符串 是的
KnowledgeSources 一个或多个 受支持的知识源 阵 列 是的
Description 知识库的说明。 LLM 使用描述来指导查询规划。 字符串
RetrievalInstructions 用于让 LLM 确定某个知识源是否属于查询范围的提示词。 如果有多个知识源,请包含此提示。 此字段影响知识源选择和查询表述。 例如,说明可以追加信息或确定知识源的优先级。 指令直接传递到 LLM,这意味着可以提供破坏查询规划的指令,例如导致绕过关键知识源的指令。 字符串
AnswerInstructions 用于调整合成答案的自定义说明。 默认值为 null。 有关详细信息,请参阅对引文支持的答复使用答案合成 字符串
OutputMode 有效值为 AnswerSynthesis,它用于 LLM 生成的答案;若希望获取完整搜索结果并将其作为下游步骤传递给 LLM,则有效值为 ExtractedData 字符串
Models 需要网络知识来源。 对于其他知识源类型,可选。 为查询规划或答案合成指定一个受支持的 LLM。 从 Microsoft Foundry 门户或命令行请求获取连接详细信息,然后使用 KnowledgeBaseAzureOpenAIModel 类提供它们。 可以使用基于角色的访问控制,作为通过 Azure AI 搜索 连接到模型的替代方案,而不是使用 API 密钥。 阵 列
RetrievalReasoningEffort 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 对象
名字 描述 类型 必填
name 知识库的名称。 它必须在知识库集合中是唯一的,并遵循 Azure AI 搜索 中对象的命名准则 字符串 是的
description 知识库的说明。 LLM 使用描述来指导查询规划。 字符串
retrieval_instructions 用于让 LLM 确定某个知识源是否属于查询范围的提示词。 如果有多个知识源,请包含此提示。 此字段影响知识源选择和查询表述。 例如,说明可以追加信息或确定知识源的优先级。 将说明直接传递给 LLM。 可以提供中断查询规划的说明,例如导致绕过基本知识源的说明。 字符串
answer_instructions 用于调整合成答案的自定义说明。 默认值为 null。 有关详细信息,请参阅对引文支持的答复使用答案合成 字符串
output_mode 有效值为 answer_synthesis,它用于 LLM 生成的答案;若希望获取完整搜索结果并将其作为下游步骤传递给 LLM,则有效值为 extracted_data 字符串
knowledge_sources 一个或多个 受支持的知识源 阵 列 是的
models 需要网络知识来源。 对于其他知识源类型,可选。 为查询规划或答案合成指定一个受支持的 LLM。 从 Microsoft Foundry 门户或命令行请求获取连接详细信息。 可以使用基于角色的访问控制,作为通过 Azure AI 搜索 连接到模型的替代方案,而不是使用 API 密钥。 阵 列
encryption_key 客户 管理的密钥 ,用于加密知识库和生成的对象中的敏感信息。 对象
retrieval_reasoning_effort 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 对象
名字 描述 类型 必填
name 知识库的名称。 它必须在知识库集合中是唯一的,并遵循 Azure AI 搜索 中对象的命名准则 字符串 是的
description 知识库的说明。 LLM 使用描述来指导查询规划。 字符串
retrievalInstructions 用于让 LLM 确定某个知识源是否属于查询范围的提示词。 如果有多个知识源,请包含此提示。 此字段影响知识源选择和查询表述。 例如,说明可以追加信息或确定知识源的优先级。 将指令直接传递给 LLM,这意味着可以提供可能破坏查询规划的指令,例如那些会导致绕过重要知识源的指令。 字符串
answerInstructions 用于调整合成答案的自定义说明。 默认值为 null。 有关详细信息,请参阅对引文支持的答复使用答案合成 字符串
outputMode 有效值为 answerSynthesis,它用于 LLM 生成的答案;若希望获取完整搜索结果并将其作为下游步骤传递给 LLM,则有效值为 extractedData 字符串
knowledgeSources 一个或多个 受支持的知识源 阵 列 是的
models 需要网络知识来源。 对于其他知识源类型,可选。 为查询规划或答案合成指定一个受支持的 LLM。 从 Microsoft Foundry 门户或命令行请求获取连接详细信息。 可以使用基于角色的访问控制,作为通过 Azure AI 搜索 连接到模型的替代方案,而不是使用 API 密钥。 阵 列
encryptionKey 客户 管理的密钥 ,用于加密知识库和生成的对象中的敏感信息。 对象
retrievalReasoningEffort.kind 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 对象

查询知识库

创建知识库后,使用 检索操作 对其进行查询并验证 LLM 连接。

删除知识库

如果不再需要知识库或需要在搜索服务上重新生成该知识库,请运行以下代码以删除该对象。

// Delete a knowledge base
using Azure.Search.Documents.Indexes;
var indexClient = new SearchIndexClient(new Uri(searchEndpoint), credential);

await indexClient.DeleteKnowledgeBaseAsync(knowledgeBaseName);
System.Console.WriteLine($"Knowledge base '{knowledgeBaseName}' deleted successfully.");

Reference:SearchIndexClient

# Delete a knowledge base
from azure.core.credentials import AzureKeyCredential 
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint = "search_url", credential = AzureKeyCredential("api_key"))
index_client.delete_knowledge_base("knowledge_base_name")
print(f"Knowledge base deleted successfully.")

Reference:SearchIndexClient

# Delete a knowledge base
DELETE {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
api-key: {{search-api-key}}

参考:知识库 - 删除