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

在 Azure AI 搜索 中创建知识库

注意

Azure AI 搜索可通过Azure门户、REST API 和Azure SDK获取。 它也是 Foundry IQ 的基础;Foundry IQ 是一个托管式知识层,可将企业内容转化为供 Microsoft Foundry 门户中的智能体使用的、可复用且具备权限感知能力的知识库。

重要

标记为“预览”的特性、功能或属性不受服务级别协议 (SLA) 保障,不建议用于生产工作负载,并且在正式发布之前可能会更改或受到限制。 Azure AI 搜索预览条款适用于所有预览功能,无论是独立功能还是正式版功能的一部分。

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

知识库指定:

  • 指向可搜索内容的一个或多个知识源。

  • 用于查询规划、答案合成或 Web 内容摘要的可选 LLM。 支持的任务因 API 版本和知识源类型而异。

  • 控制路由、源选择和对象加密的自定义属性。

使用支持

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

先决条件

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

  • 一个或多个 知识来源。 使用 2026-08-01-preview API 版本来访问预览版知识源,或将 LLM 与非 Web 知识源配合使用。 将 2026-04-01 API 版本用于正式发布的知识源和最少的提取检索。

  • (条件)部署了支持的 LLM 的 Azure OpenAI。 如果知识库包含 Web 知识库,则需要 LLM。 对于其他知识源,在 2026-08-01-preview API 版本中,LLM 是可选的;在 2026-04-01 API 版本中,则不支持 LLM。

  • 创建知识库的权限。 使用分配给用户帐户的搜索服务参与者角色(建议)或使用管理员 API 密钥配置无密钥身份验证。

  • 如果知识库指定了 LLM,则搜索服务必须在 Microsoft Foundry 资源上具有 管理的身份,并具有 Cognitive Services User 权限。

  • 所需 Azure.Search.Documents 软件包:

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

    • 对于 2026-04-01 功能,最新稳定版软件包:dotnet add package Azure.Search.Documents

  • 对于无密钥身份验证,请使用 Azure.Identity 软件包:dotnet add package Azure.Identity

  • 所需 azure-search-documents 软件包:

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

    • 对于 2026-04-01 功能,最新稳定版软件包:pip install azure-search-documents

  • 对于无密钥身份验证,请使用 azure-identity 软件包:pip install azure-identity

支持的模型

在 Foundry 模型中使用 Azure OpenAI 中的以下 LLM 之一。 Azure OpenAI 确定所选部署的区域可用性。 有关部署说明,请参阅 Foundry 门户中的 Deploy Microsoft Foundry 模型。

GPT-4 系列已弃用。 有关模型生命周期指南、停用日期和当前状态,请参阅模型停用和弃用和模型停用计划 - Microsoft Foundry。

型号 支持的 API 版本
gpt-4o(已弃用) 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-4o-mini(已弃用) 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-4.1(已弃用) 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-4.1-mini(已弃用) 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-4.1-nano(已弃用) 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-5 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-5-mini 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-5-nano 2025-11-01-preview、2026-05-01-preview、2026-08-01-preview
gpt-5.1 2026-05-01-preview, 2026-08-01-preview
gpt-5.2 2026-05-01-preview, 2026-08-01-preview
gpt-5.4 2026-05-01-preview, 2026-08-01-preview
gpt-5.4-mini 2026-05-01-preview, 2026-08-01-preview
gpt-5.4-nano 2026-05-01-preview, 2026-08-01-preview
gpt-5.5 2026-08-01-preview
gpt-5.6-sol 2026-08-01-preview
gpt-5.6-terra 2026-08-01-preview
gpt-5.6-luna 2026-08-01-preview

配置访问权限

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

  1. 在Azure AI 搜索上启用基于角色的访问控制。

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

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

  4. 对于本地测试,请按照快速入门中的步骤操作 :在没有密钥的情况下连接 以登录到特定订阅和租户。 在每个请求中使用 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. 配置Azure AI 搜索以使用托管标识。

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

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

    # Authenticate using roles
    from azure.identity import DefaultAzureCredential
    index_client = SearchIndexClient(endpoint = "<search-endpoint>", credential = DefaultAzureCredential())
    
  1. 在Azure AI 搜索上启用基于角色的访问控制。

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

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

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

    # List indexes using roles
    GET {{search-endpoint}}/indexes?api-version=2026-04-01
    Content-Type: application/json
    Authorization: Bearer {{search-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.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint = "<search-endpoint>", credential = DefaultAzureCredential())

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

Reference:SearchIndexClient

# List knowledge bases
GET {{search-endpoint}}/knowledgebases?api-version={{api-version}}&$select=name
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

参考:知识库 - 列表

还可以按名称返回单个知识库来查看其 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.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
import json

index_client = SearchIndexClient(endpoint = "<search-endpoint>", credential = DefaultAzureCredential())

kb = index_client.get_knowledge_base("<knowledge-base-name>")
print(json.dumps(kb.as_dict(), indent = 2))

Reference:SearchIndexClient

# Get knowledge base
GET {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

参考:知识库 - 获取

以下 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 版本创建的知识库返回的定义范围比 2026-08-01-preview 更窄。 有关每个版本支持的属性的详细信息,请参阅 创建知识库。

创建知识库

重要

2026-04-01 API 版本仅接受正式发布的知识源类型,并支持最少的提取检索。 它不支持仅预览功能,例如查询规划、答案合成和可配置推理工作。 如需使用完整功能,请使用 2026-08-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.Identity;

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

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 = "Answer in two concise sentences.",
    OutputMode = KnowledgeRetrievalOutputMode.AnswerSynthesis,
    Models = { new KnowledgeBaseAzureOpenAIModel(azureOpenAIParameters: aoaiParams) },
    RetrievalReasoningEffort = new KnowledgeRetrievalAutoReasoningEffort()
};

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

Reference:SearchIndexClient、 KnowledgeBase

# Create a knowledge base
from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    AzureOpenAIVectorizerParameters,
    KnowledgeBase,
    KnowledgeBaseAzureOpenAIModel,
    KnowledgeSourceReference,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeRetrievalAutoReasoningEffort,
    KnowledgeRetrievalOutputMode,
)

index_client = SearchIndexClient(endpoint = "<search-endpoint>", credential = DefaultAzureCredential())

aoai_params = AzureOpenAIVectorizerParameters(
    resource_url = "<aoai-endpoint>",
    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 = "Answer in two concise sentences.",
    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 = KnowledgeRetrievalAutoReasoningEffort(),
)

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

Reference:SearchIndexClient、 KnowledgeBase

# Create a knowledge base
PUT {{search-endpoint}}/knowledgebases/my-kb?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
    "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": "Answer in two concise sentences.",
    "outputMode": "answerSynthesis",
    "knowledgeSources": [
        {
            "name": "hotels-ks"
        },
        {
            "name": "earth-at-night-ks"
        }
    ],
    "models" : [
        {
            "kind": "azureOpenAI",
            "azureOpenAIParameters": {
                "resourceUri": "{{aoai-endpoint}}",
                "deploymentId": "gpt-5.4-mini",
                "modelName": "gpt-5.4-mini"
            }
        }
    ],
    "encryptionKey": null,
    "retrievalReasoningEffort": {
        "kind": "auto"
    }
}

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

配置默认检索限制(预览版)

从 2026-08-01-preview API 版本开始,可以使用可选 retrieveDefaults 对象在知识库上存储请求范围的默认值。 仅当检索请求省略相应的请求字段时,每个存储的属性才适用:

存储属性 检索请求字段
maxRuntimeInSeconds maxRuntimeInSeconds
maxOutputDocuments maxOutputDocuments
maxOutputSizeInTokens maxOutputSize

存储并重写输出令牌预算时使用不同的属性名称。 在maxOutputSizeInTokens中设置retrieveDefaults,并在检索请求中使用maxOutputSize。

每个属性的有效值按以下顺序独立确定:

  1. 检索请求中的对应值。
  2. 知识库 retrieveDefaults 对象中的值。
  3. 如果该属性在这两个级别中都不存在,则使用服务默认值。

以下示例使用名为 your-knowledge-source 的现有搜索索引知识源。 它存储 45 秒的运行时预算、最多 8 个输出文档和 12,000 个令牌输出预算。

using System;
using Azure.Identity;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.Models;

string searchEndpoint = "<search-endpoint>";

var options = new SearchClientOptions(
    SearchClientOptions.ServiceVersion.V2026_08_01_Preview);
var indexClient = new SearchIndexClient(
    new Uri(searchEndpoint),
    new DefaultAzureCredential(),
    options);

var knowledgeBase = new KnowledgeBase(
    "your-knowledge-base",
    new[] { new KnowledgeSourceReference("your-knowledge-source") })
{
    Description = "A knowledge base for product support content.",
    RetrieveDefaults = new KnowledgeBaseRetrieveDefaults
    {
        MaxRuntimeInSeconds = 45,
        MaxOutputDocuments = 8,
        MaxOutputSizeInTokens = 12000
    }
};

await indexClient.CreateOrUpdateKnowledgeBaseAsync(knowledgeBase);

Reference:SearchIndexClient、 SearchClientOptions.ServiceVersion、 KnowledgeBase

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    KnowledgeBase,
    KnowledgeBaseRetrieveDefaults,
    KnowledgeSourceReference,
)

search_endpoint = "<search-endpoint>"
index_client = SearchIndexClient(
    endpoint=search_endpoint,
    credential=DefaultAzureCredential(),
    api_version="2026-08-01-preview",
)

knowledge_base = KnowledgeBase(
    name="your-knowledge-base",
    description="A knowledge base for product support content.",
    knowledge_sources=[
        KnowledgeSourceReference(name="your-knowledge-source"),
    ],
    retrieve_defaults=KnowledgeBaseRetrieveDefaults(
        max_runtime_in_seconds=45,
        max_output_documents=8,
        max_output_size_in_tokens=12000,
    ),
)

index_client.create_or_update_knowledge_base(knowledge_base)

Reference:SearchIndexClient、 KnowledgeBase

PUT {{search-endpoint}}/knowledgebases/your-knowledge-base?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "name": "your-knowledge-base",
  "description": "A knowledge base for product support content.",
  "knowledgeSources": [
    {
      "name": "your-knowledge-source"
    }
  ],
  "retrieveDefaults": {
    "maxRuntimeInSeconds": 45,
    "maxOutputDocuments": 8,
    "maxOutputSizeInTokens": 12000
  }
}

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

若要用 20 秒、1 个文档和 5,000 个令牌替代这些存储的值,请参阅 验证知识库检索默认值。

为基于浏览器的检索调用配置 CORS (预览版)

重要

跨域资源共享(CORS)允许基于浏览器的应用程序直接从服务请求数据。 根据 CORS 配置,外部网页可以使用用户的浏览器上下文访问或调用服务及其数据。 此访问权限可能会造成安全威胁。 启用 CORS 有你自己的风险。

从 2026-05-01-preview API 版本开始,知识库可为基于浏览器的应用程序定义 corsOptions,这些应用程序可直接通过 JavaScript 调用 retrieve 操作。 CORS 策略标识哪些浏览器源可以向知识库发送检索请求。

省略 corsOptions时,知识库没有 CORS 策略,浏览器会阻止跨源检索请求。

以下示例创建一个知识库,该知识库允许从一个浏览器源检索请求。

using Azure.Identity;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

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

var knowledgeBase = new KnowledgeBase(
    name: "browser-chat-kb",
    knowledgeSources: new[] { new KnowledgeSourceReference("product-docs-ks") }
)
{
    Description = "A knowledge base that allows one browser app origin.",
    CorsOptions = new CorsOptions(new[] { "https://myapp.example.com" })
    {
        MaxAgeInSeconds = 300
    }
};

await indexClient.CreateOrUpdateKnowledgeBaseAsync(knowledgeBase);

参考:CorsOptions、 KnowledgeBase

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    CorsOptions,
    KnowledgeBase,
    KnowledgeSourceReference,
)

index_client = SearchIndexClient(endpoint="<search-endpoint>", credential=DefaultAzureCredential())

knowledge_base = KnowledgeBase(
    name="browser-chat-kb",
    description="A knowledge base that allows one browser app origin.",
    knowledge_sources=[KnowledgeSourceReference(name="product-docs-ks")],
    cors_options=CorsOptions(
        allowed_origins=["https://myapp.example.com"],
        max_age_in_seconds=300,
    ),
)

index_client.create_or_update_knowledge_base(knowledge_base)

参考:CorsOptions、 KnowledgeBase

PUT {{search-endpoint}}/knowledgebases/browser-chat-kb?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "name": "browser-chat-kb",
  "description": "A knowledge base that allows one browser app origin.",
  "knowledgeSources": [
    {
      "name": "product-docs-ks"
    }
  ],
  "corsOptions": {
    "allowedOrigins": [
      "https://myapp.example.com"
    ],
    "maxAgeInSeconds": 300
  }
}

查询知识库

创建知识库后,调用 检索操作或 MCP 终结点 对其进行查询。

删除知识库

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

// 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.identity import DefaultAzureCredential
from azure.search.documents.indexes import SearchIndexClient

index_client = SearchIndexClient(endpoint = "<search-endpoint>", credential = DefaultAzureCredential())
index_client.delete_knowledge_base("<knowledge-base-name>")
print(f"Knowledge base deleted successfully.")

Reference:SearchIndexClient

# Delete a knowledge base
DELETE {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}?api-version={{api-version}}
Authorization: Bearer {{search-access-token}}

参考:知识库 - 删除