你当前正在访问 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 门户中的智能体使用的、可复用且具备权限感知能力的知识库。

本文介绍代理检索所需的索引字段和配置。 这些要求都不是新的。 可以使用符合条件的现有索引,即使它是使用早期 API 版本创建的。

每个索引的知识源都依赖于基础索引。 根据管道的设置方式,索引可以是以下项之一:

  • 现有: 通过 搜索索引知识源公开的独立索引。 索引必须满足本文中的条件。

  • 生成: 由 索引知识源自动创建的索引。 默认情况下,生成的索引满足所有条件。

代理检索的条件

下表按要求级别组织影响代理检索的索引元素。

索引元素 要求 备注
searchable 和 retrievable 字符串字段 必需 用于查询执行和结果检索。
语义配置 必需 使用 defaultSemanticConfiguration 或替代知识源中的语义配置。
引用字段 推荐 用户定义字段,这些字段将响应属性为源内容,例如文档名称、页码或区块 ID。
矢量字段和向量器 推荐 在查询时启用文本到矢量转换。
评分配置 Optional 提高特定领域的相关性。 将 defaultScoringProfile 设置为自动应用。
分析器 Optional 控制文本的标记方式,例如处理空格或特殊字符。
同义词映射 Optional 通过加入术语或行话来扩展查询。

示例索引定义

以下示例显示了一个可用于代理检索的索引。 它满足所需元素的条件,并作为最佳做法包括矢量字段。

{
  "name": "earth_at_night",
  "description": "Contains images and descriptions of our planet in darkness as captured from space by Earth-observing satellites and astronauts on the International Space Station over the past 25 years.",
  "fields": [
    {
      "name": "id", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "key": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
      "analyzer": "en.microsoft",
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk_vector_text_3_large", "type": "Collection(Edm.Single)",
      "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
      "dimensions": 3072,
      "vectorSearchProfile": "hnsw_text_3_large",
      "stored": false,
      "synonymMaps": []
    },
    {
      "name": "page_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "chapter_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    }
  ],
  "semantic": {
    "defaultConfiguration": "semantic_config",
    "configurations": [
      {
        "name": "semantic_config",
        "flightingOptIn": false,
        "prioritizedFields": {
          "prioritizedContentFields": [
            {
              "fieldName": "page_chunk"
            }
          ],
          "prioritizedKeywordsFields": []
        }
      }
    ]
  },
  "vectorSearch": {
    "algorithms": [
      {
        "name": "alg",
        "kind": "hnsw",
        "hnswParameters": {
          "metric": "cosine",
          "m": 4,
          "efConstruction": 400,
          "efSearch": 500
        }
      }
    ],
    "profiles": [
      {
        "name": "hnsw_text_3_large",
        "algorithm": "alg",
        "vectorizer": "azure_openai_text_3_large"
      }
    ],
    "vectorizers": [
      {
        "name": "azure_openai_text_3_large",
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
          "deploymentId": "text-embedding-3-large",
          "modelName": "text-embedding-3-large"
        }
      }
    ],
    "compressions": []
  }
}

为生成式 AI 或检索增强生成(RAG)设计良好的索引具有以下组成部分:

  • LLM 或智能体可以用来确定是否应使用或跳过索引的描述。

  • 可读文本块,你可以将其作为输入词元传递给 LLM 以形成答案。

  • 语义排名器配置,因为代理检索使用级别 2 (L2) 语义排名来标识最相关的区块。

  • (可选)用于补充矢量搜索的人类可读文本区块的矢量等效版本。

分块文本很重要,因为 LLM 消耗并发出人类可读的纯文本内容的分词字符串。 因此,你需要 searchable 字段,这些字段提供纯文本字符串,并且在响应中是 retrievable。 在Azure AI 搜索中,可以使用 内置或第三方解决方案创建分块文本。

分块内容的内置假设是原始源文档具有大量详细内容。 如果源内容是结构化数据(如产品数据库),索引应放弃分块,而是包括映射到原始数据源的字段,例如产品名称、类别或说明。 searchable 和 retrievable 的署名要求同样适用于结构化数据。 searchable 使内容进入查询范围,retrievable 则将其添加到搜索结果中(基础数据)。

矢量内容可能很有用,因为它增加了对信息检索的 相似性搜索 。 在查询时,当索引中存在矢量字段时,代理检索引擎将并行执行向量查询与文本查询。 由于矢量查询查找类似内容而不是匹配字词,因此矢量查询可以找到文本查询可能错过的高度相关结果。 添加矢量可以增强和提高地面数据的质量,但并非严格要求。 Azure AI 搜索具有用于矢量化的内置方法。

矢量字段仅用于Azure AI 搜索上的查询执行。 你不需要结果中的向量,因为它既无法被人类阅读,也无法被大型语言模型(LLM)读取。 为了最大程度地减少空间要求,我们建议设置 retrievable 和 stored 设置为 false。 有关详细信息,请参阅 优化矢量存储和处理。

如果使用矢量,请在矢量搜索配置中定义 向量化器 至关重要。 它决定在查询执行过程中是否使用您的向量场。 vectorizer 在查询时将字符串子查询编码为矢量,以便对矢量进行相似性搜索。 向量器必须是用于在索引中创建矢量的同一嵌入模型。

默认情况下,所有 searchable 字段都包含在查询执行中,所有 retrievable 字段都会在结果中返回。 你可以选择要用于 搜索索引知识源定义中每个操作的字段。

添加说明

索引 description 字段是用户定义的字符串,可用于在决定对查询使用特定索引时向 LLM 和模型上下文协议 (MCP) 服务器提供指导。 当系统必须访问多个索引并根据说明做出决策时,此可读文本非常有用。

索引说明是架构更新,无需重新生成整个索引即可添加它。

  • 字符串长度最大为 4,000 个字符。

  • 在 Unicode 中,内容必须是人可读的。 用例应确定要使用的语言(例如英语或其他语言)。

添加语义配置

索引必须至少有一个 语义配置。 语义配置必须具有:

  • 命名配置。
  • 将 prioritizedContentFields 设置为至少一个同时为 searchable 和 retrievable 的字符串字段。

可通过两种方法按名称指定语义配置。 如果索引已 defaultSemanticConfiguration 设置为命名配置,则检索会使用它。 或者,可以在 搜索索引知识源内指定语义配置。

在配置中, prioritizedContentFields 是必需的。 标题和关键字是可选的。 对于分块内容,可能没有其中任何一个。 但是,如果添加 实体识别 或 关键短语提取,则可能具有一些与每个区块关联的关键字,这些关键字可用于搜索方案(也许在计分配置文件中)。

以下示例显示了一个可用于代理检索的语义配置。

"semantic":{
   "defaultConfiguration":"semantic_config",
   "configurations":[
      {
         "name":"semantic_config",
         "flightingOptIn":false,
         "prioritizedFields":{
            "titleField":{
               "fieldName":""
            },
            "prioritizedContentFields":[
               {
                  "fieldName":"page_chunk"
               }
            ],
            "prioritizedKeywordsFields":[
               {
                  "fieldName":"Category"
               },
               {
                  "fieldName":"Tags"
               },
               {
                  "fieldName":"Location"
               }
            ]
         }
      }
   ]
}

注意

响应提供title、terms和content,这些均映射到此配置中的优先字段。

添加向量器

如果索引包含向量字段,则查询计划包括这些字段(如果这些字段是 searchable 且具有 vectorizer 分配)。

向量器指定一个嵌入模型,该模型在查询时提供文本到向量转换。 它必须指向用于在索引中对矢量内容进行编码的同一嵌入模型。 可以使用Azure AI 搜索支持的任何嵌入模型。 通过 矢量配置文件 为向量字段指定向量化器。

索引示例中的 向量字段定义 显示了键字段属性: dimensions这是模型生成的嵌入次数,以及 vectorSearchProfile。

  {
    "name": "page_chunk_text_3_large", "type": "Collection(Edm.Single)",
    "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
    "dimensions": 3072,
    "vectorSearchProfile": "hnsw_text_3_large",
    "stored": false,
    "synonymMaps": []
  }

矢量配置文件包含矢量化器、算法和压缩技术的配置。 每个向量字段只能使用一个配置文件,但如果您希望为每个向量字段设置唯一的配置文件,索引可以包含多个配置文件。

查询向量和调用向量器会增加整个请求的延迟,但如果想要相似性搜索,它可能值得权衡。

下面的示例展示了一个用于智能体检索的矢量化程序,如其在 vectorSearch 配置中的所示。 矢量化定义中没有任何内容需要更改才能使用代理检索。

"vectorSearch": {
  "algorithms": [
    {
      "name": "alg",
      "kind": "hnsw",
      "hnswParameters": {
        "metric": "cosine",
        "m": 4,
        "efConstruction": 400,
        "efSearch": 500
      }
    }
  ],
  "profiles": [
    {
      "name": "hnsw_text_3_large",
      "algorithm": "alg",
      "vectorizer": "azure_openai_text_3_large"
    }
  ],
  "vectorizers": [
    {
      "name": "azure_openai_text_3_large",
      "kind": "azureOpenAI",
      "azureOpenAIParameters": {
        "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
        "deploymentId": "text-embedding-3-large",
        "modelName": "text-embedding-3-large"
      }
    }
  ],
  "compressions": []
}

添加计分配置文件

计分概要文件是用于提升相关性的标准。 它们应用于非矢量字段(文本和数字),并在查询执行期间进行评估,尽管精确行为取决于用于创建索引的 API 版本。

如果索引基于结构化数据,评分模型更有可能提升解决方案的价值。 结构化数据被索引到多个独立字段,这意味着评分配置可以设置针对某个特定字段内容或特征的条件。

如果使用 2025-05-01-preview 或更高版本创建索引,计分概要文件将最后执行。 如果索引是使用早期 API 版本创建的,那么计分概要文件会在语义重新排序之前被评估。 语义排名结果的实际顺序由索引中的 rankOrder 属性 确定,该属性设置为 boostedRerankerScore (已应用评分配置文件)或 rerankerScore (无评分配置文件)。

可以使用任何对索引有意义的计分概要文件。 以下示例显示一个评分配置文件,如果在特定字段中找到匹配项,该配置文件会提高该匹配项的搜索分数。 字段通过提升倍数进行加权。 例如,如果在“类别”字段中找到匹配项,则提升分数乘以 5。

"scoringProfiles": [
    {
      "name": "boostSearchTerms",
      "text": {
        "weights": {
          "Location": 2,
          "Category": 5
        }
      }
    }
]

添加分析器

分析器 适用于文本字段,可以是语言分析器或自定义分析器,用于控制索引中的标记化,例如保留特殊字符或空格。

分析器在搜索索引中定义,并分配给字段。 字段集合示例包括文本区块上的分析器引用。 在此示例中,默认分析器(标准 Lucene)替换为英语Microsoft语言分析器。

{
  "name": "page_chunk", "type": "Edm.String",
  "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
  "analyzer": "en.microsoft",
  "stored": true,
  "synonymMaps": []
}

添加同义词映射

同义词映射 通过为命名术语添加同义词来扩展查询。 例如,常见术语可能有科学或医学术语对应。

同义词映射被定义为搜索索引中的顶级资源,并被指定到字段上。 字段集合示例不包含同义词映射,但以下示例演示了如何将具有国家/地区名称变体拼写的同义词映射分配给假设的“locations”字段。

{
    "name":"locations",
    "type":"Edm.String",
    "searchable":true,
    "synonymMaps":[ "country-region-synonyms" ]
}

将索引添加到知识源

如果你有一个已存在且不是由知识源生成的独立索引,请创建以下对象: