在 Azure AI 搜索中创建知识库

注释

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

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

知识库指定:

  • 指向可搜索内容的一个或多个知识源。
  • 一个可选的 LLM,它提供查询规划和答案表述的推理功能。
  • 用于确定是否调用 LLM 并管理成本、延迟和质量的检索推理工作。
  • 控制路由、源选择、输出格式和对象加密的自定义属性。

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

重要

2025-11-01-preview 将 2025-08-01-preview“知识代理”重命名为“知识库”。这是一项重大更改。

使用支持

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

配置访问权限

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

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

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

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

    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=2025-11-01-preview
    Content-Type: application/json
    Authorization: Bearer {{access-token}}
    ```

重要

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

检查现有知识库

知识库是顶级可重用对象。 了解现有知识库有助于重复使用或命名新对象。 任何 2025-08-01-preview 知识代理都返回在知识库集合中。

运行以下代码,按名称列出现有知识库。

// 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}");
  }

运行以下代码,按名称列出现有知识库。

# 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}")

使用 知识库 - 列表(REST API) 按名称和类型列出知识库。

# List knowledge bases
GET {{search-url}}/knowledgebases?api-version=2025-11-01-preview&$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);
# 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))
# Get knowledge base
GET {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version=2025-11-01-preview
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"
  }
}

创建知识库

知识库驱动代理检索管道。 在应用程序代码中,其他代理或聊天机器人调用它。

知识库将知识库(可搜索内容)连接到 Azure AI 服务的 LLM 部署。 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 AzureAIservicesVectorizerParameters
{
    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 KnowledgeBaseAzureAIservicesModel(AzureAIservicesParameters: aoaiParams) },
    RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort()
};

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

运行以下代码来创建知识库。

# 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, KnowledgeBaseAzureAIservicesModel, KnowledgeSourceReference, AzureAIservicesVectorizerParameters, KnowledgeRetrievalOutputMode, KnowledgeRetrievalLowReasoningEffort

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

aoai_params = AzureAIservicesVectorizerParameters(
    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 = [KnowledgeBaseAzureAIservicesModel(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.")

使用 知识库 - 创建或更新 (REST API) 创建知识库。

# 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": "AzureAIservices",
            "AzureAIservicesParameters": {
                "resourceUri": "{{model-provider-url}}",
                "apiKey": "{{model-api-key}}",
                "deploymentId": "gpt-4.1-mini",
                "modelName": "gpt-4.1-mini"
            }
        }
    ],
    "encryptionKey": null,
    "retrievalReasoningEffort": {
        "kind": "low"
    }
}

知识库属性

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

Name Description 类型 必选
Name 知识库的名称。 它在知识库集合中必须是唯一的,并遵循 Azure AI 搜索中对象的 命名准则 String 是的
KnowledgeSources 一个或多个 受支持的知识源 Array 是的
Description 知识库的说明。 LLM 使用该说明来指导查询规划。 String
RetrievalInstructions 提示 LLM 确定某个知识源是否应在查询范围内。 如果有多个知识源,请包含此提示。 此字段同时影响知识来源选择和查询表述。 例如,说明可以追加信息或确定知识来源的优先级。 指令直接传递到 LLM,这意味着可以提供破坏查询规划的说明,例如导致绕过关键知识源的说明。 String
AnswerInstructions 自定义指令以定制合成答案。 默认值为 NULL。 有关详细信息,请参阅 如何使用答案合成生成有引文支持的响应 String
OutputMode 有效值是 AnswerSynthesis(用于 LLM 制定的答案)或 ExtractedData(用于完整的搜索结果),你可以将其作为下游步骤传递给 LLM。 String
Models 用于答案制定或查询规划的受支持的 LLM 连接。 在此预览版中, Models 只能包含一个模型,模型提供程序必须是 Azure AI 服务。 从门户或命令行请求获取模型信息。 使用 KnowledgeBaseAzureAIservicesModel 类提供参数。 可以使用基于角色的访问控制,而不是将 API 密钥用于与模型建立的 Azure AI 搜索连接。 物体
RetrievalReasoningEffort 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 物体
Name Description 类型 必选
name 知识库的名称。 它在知识库集合中必须是唯一的,并遵循 Azure AI 搜索中对象的 命名准则 String 是的
description 知识库的说明。 LLM 使用该说明来指导查询规划。 String
retrieval_instructions 提示 LLM 确定某个知识源是否应在查询范围内。 如果有多个知识源,请包含此提示。 此字段同时影响知识来源选择和查询表述。 例如,说明可以追加信息或确定知识来源的优先级。 将指令直接传递给 LLM。 可以提供中断查询规划的说明,例如导致绕过基本知识源的说明。 String
answer_instructions 自定义指令以定制合成答案。 默认值为 NULL。 有关详细信息,请参阅 如何使用答案合成生成有引文支持的响应 String
output_mode 有效值是 answer_synthesis(用于 LLM 制定的答案)或 extracted_data(用于完整的搜索结果),你可以将其作为下游步骤传递给 LLM。 String
knowledge_sources 一个或多个 受支持的知识源 Array 是的
models 用于答案制定或查询规划的受支持的 LLM 连接。 在此预览版中, models 只能包含一个模型,模型提供程序必须是 Azure AI 服务。 从门户或命令行请求获取模型信息。 可以使用基于角色的访问控制,而不是将 API 密钥用于与模型建立的 Azure AI 搜索连接。 物体
encryption_key 客户 管理的密钥 ,用于加密知识库和生成的对象中的敏感信息。 物体
retrieval_reasoning_effort 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 物体
Name Description 类型 必选
name 知识库的名称。 它在知识库集合中必须是唯一的,并遵循 Azure AI 搜索中对象的 命名准则 String 是的
description 知识库的说明。 LLM 使用该说明来指导查询规划。 String
retrievalInstructions 提示 LLM 确定某个知识源是否应在查询范围内。 如果有多个知识源,请包含此提示。 此字段同时影响知识来源选择和查询表述。 例如,说明可以追加信息或确定知识来源的优先级。 将指令直接传递给 LLM,这意味着可以提供破坏查询计划的指令,例如会导致绕过关键知识源的指令。 String
answerInstructions 自定义指令以定制合成答案。 默认值为 NULL。 有关详细信息,请参阅 如何使用答案合成生成有引文支持的响应 String
outputMode 有效值是 answerSynthesis(用于 LLM 制定的答案)或 extractedData(用于完整的搜索结果),你可以将其作为下游步骤传递给 LLM。 String
knowledgeSources 一个或多个 受支持的知识源 Array 是的
models 用于答案制定或查询规划的受支持的 LLM 连接。 在此预览版中, models 只能包含一个模型,模型提供程序必须是 Azure AI 服务。 从门户或命令行请求获取模型信息。 可以使用基于角色的访问控制,而不是将 API 密钥用于与模型建立的 Azure AI 搜索连接。 物体
encryptionKey 客户 管理的密钥 ,用于加密知识库和生成的对象中的敏感信息。 物体
retrievalReasoningEffort.kind 确定与 LLM 相关的查询处理级别。 有效值为 minimallow (默认值)和 medium。 有关详细信息,请参阅 设置检索推理工作 物体

查询知识库

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

删除知识库

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

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.");
# 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.")
# Delete a knowledge base
DELETE {{search-url}}/knowledgebases/{{knowledge-base-name}}?api-version=2025-11-01-preview
api-key: {{search-api-key}}