在 Azure AI 搜索中创建用于代理检索的索引

注释

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

在 Azure AI 搜索中,代理检索使用上下文和用户问题生成一系列子查询,这些子查询可以针对 知识源中的内容执行。 知识源可以指向 Azure AI 搜索上的索引内容,或者使用提供程序原生 API 检索的远程内容。 在代理检索中使用索引时,它们要么是:

  • 包含可搜索内容 的现有索引 。 可以通过 搜索索引知识源 定义使现有索引可用于代理检索。

  • 从索引的知识源创建的生成的索引。 索引知识源使用完整的索引器管道(数据源、技能集、索引器和索引)在搜索索引内创建外部数据源的副本,以便进行代理检索。 索引知识源通过使用完整的索引器管道(包括数据源、技能集、索引器和索引)在搜索索引中创建外部数据源的副本,以支持智能检索。多个知识源可以生成一个索引器管道,进而创建一个可搜索的索引。 这些包括:

生成的索引基于满足知识库和代理检索的所有条件的模板。

本文介绍哪些索引元素会影响代理检索查询逻辑。 任何必需的元素都不是新的或特定于代理检索的,这意味着,如果它符合本文中标识的条件,则可以使用现有索引,即使它是使用早期 API 版本创建的。

注释

以下知识源直接访问外部源,不需要搜索索引:Web 知识源(必应)。

智能体检索的条件

在智能体检索中使用的索引必须具有以下元素:

  • 属性为 searchableretrievable. 的字符串字段。
  • 在知识源中,语义配置或者语义配置替代。

它还应具有可用于引文的字段,例如文档或文件名、页面或章节名称,或者至少包含区块 ID。

如果要在管道中包含文本到向量查询转换,它应具有 向量字段和向量化器

(可选)以下索引元素可增加优化机会:

  • 使用 scoringProfiledefaultScoringProfile,用于提升相关性
  • 术语或行话的 synonymMaps
  • analyzers 适用于语言规则或模式(如空格保留或特殊字符)

示例索引定义

下面是一个可用于代理检索的示例索引。 它满足所需元素的条件。 它包括矢量字段作为最佳实践。

{
  "name": "earth_at_night",
  "description": "Contains images an 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",
          "apiKey": "<redacted>",
          "modelName": "text-embedding-3-large"
        }
      }
    ],
    "compressions": []
  }
}

要点

用于生成型人工智能或检索扩充生成(RAG)结构的精心设计的索引包含以下组件:

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

  • 可以作为输入令牌传递给 LLM 进行答案表述的人类可读文本块。

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

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

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

分块内容的内置假设是原始源文档具有大量详细内容。 如果源内容是结构化数据(如产品数据库),则索引应放弃分块,而是包括映射到原始数据源的字段(例如产品名称、类别、说明等)。 searchableretrievable的归属适用于结构化数据。 可搜索使内容可以被查询,并可检索使内容被添加到搜索结果中(提供数据支撑)。

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

矢量字段仅用于 Azure AI 搜索上的查询执行。 你不需要结果中的向量,因为它不是人或 LLM 可读的。 建议设置 retrievablestored 设置为 false 以最大程度地减少空间要求。 有关详细信息,请参阅 优化矢量存储和处理

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

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

添加说明

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

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

  • 字符串长度最大为 4,000 个字符。
  • 在 Unicode 中,内容必须是人可读的。 用例应确定要使用的语言(例如英语或其他语言)。

添加语义配置

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

  • 命名配置。
  • prioritizedContentFields 设置为至少一个字符串字段,该字段同时为 searchableretrievable

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

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

下面是可用于代理检索的语义配置的示例:

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

注释

响应提供titletermscontent,这些映射到此配置中的优先字段。

添加向量器

如果索引中有矢量字段,则查询计划将包含它们(如果它们为 searchable 且具有 vectorizer 赋值)。

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

回顾索引示例中的 向量字段定义 。 矢量字段的属性包括维度或模型生成的嵌入数量,以及特征。

  {
    "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",
        "apiKey": "<redacted>",
        "modelName": "text-embedding-3-large"
      }
    }
  ],
  "compressions": []
}  

添加计分概要文件

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

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

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

可以使用对你的索引有意义的任何计分概要文件。 下面是一个示例,当特定字段中找到匹配项时,该示例可提升匹配项的搜索分数。 字段通过提升乘数来加权。 例如,如果在“类别”字段中找到匹配项,则提升分数乘以 5。

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

添加分析器

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

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

{
  "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":[ "region-synonyms" ]
}

将索引添加到知识源

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

  • 用于封装索引内容的 searchIndex 知识库。

  • 一个 知识库 ,表示一个或多个知识源和其他知识检索说明。