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

在 Azure AI 搜索中设计用于代理检索的索引

注释

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

在 Azure AI 搜索中, 代理检索 是一个新的并行查询体系结构,它使用聊天完成模型进行查询规划,生成扩展可搜索和相关的范围的子查询。

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

在代理检索中使用的搜索索引在知识代理上指定为知识源,可以是:

  • 包含可搜索内容的现有索引。 此索引可通过搜索索引知识来源定义进行智能体检索。

  • 由 Blob 索引器管道生成的索引。 此索引由 Blob 知识来源中的信息生成并填充。 它基于满足知识代理和智能体检索的所有条件的模板。

智能体检索的条件

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

  • 被指定为 searchableretrievable 属性的字符串字段
  • 使用 defaultSemanticConfiguration 的语义配置
  • 如果要在管道中包含矢量查询,则需要具有向量字段和矢量化器

它还应具有可用于引文的字段,例如文档或文件名、页面或章节名称,或者至少包含区块 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": []
    }
  ],
  "scoringProfiles": [],
  "suggesters": [],
  "analyzers": [],
  "normalizers": [],
  "tokenizers": [],
  "tokenFilters": [],
  "charFilters": [],
  "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": []
  }
}

要点

在代理检索中,使用大型语言模型(LLM)两次。 首先,它用于创建查询计划。 在查询计划执行并生成搜索结果后,这些结果会再次传递给 LLM,这一次作为基础数据,用于生成答案。

LLM 使用和发出人类可读纯文本内容的标记化字符串。 因此,你必须具有提供纯文本字符串且在响应中为 searchableretrievable 字段。 矢量字段和矢量搜索也很重要,因为它们增加了对信息检索的相似性搜索。 矢量可增强和提高生成可靠数据的搜索的质量,但并非绝对必需。 Azure AI 搜索具有简化和自动化矢量化的内置功能。

前面的示例索引包括查询时使用的矢量字段。 结果中不需要包含矢量,因为它既不可供人类阅读,也不可供 LLM 阅读,但请注意它对于向矢量搜索来说具备 searchable。 由于响应中不需要向量,所以retrievablestored均为false。

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

所有 searchable 字段都包含在查询执行中。 不支持显式声明要查询的字段的 select 语句。

添加说明

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

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

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

添加语义配置

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

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

在配置中, 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 版本创建的,则计分概要文件将在语义重新排序之前进行评估。

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