注释
此功能目前处于公开预览状态。 此预览版未随附服务级别协议,建议不要用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
在 Azure AI 搜索中,代理检索使用上下文和用户问题生成一系列子查询,这些子查询可以针对 知识源中的内容执行。 知识源可以指向 Azure AI 搜索上的索引内容,或者使用提供程序原生 API 检索的远程内容。 在代理检索中使用索引时,它们要么是:
包含可搜索内容 的现有索引 。 可以通过 搜索索引知识源 定义使现有索引可用于代理检索。
从索引的知识源创建的生成的索引。 索引知识源使用完整的索引器管道(数据源、技能集、索引器和索引)在搜索索引内创建外部数据源的副本,以便进行代理检索。 索引知识源通过使用完整的索引器管道(包括数据源、技能集、索引器和索引)在搜索索引中创建外部数据源的副本,以支持智能检索。多个知识源可以生成一个索引器管道,进而创建一个可搜索的索引。 这些包括:
生成的索引基于满足知识库和代理检索的所有条件的模板。
本文介绍哪些索引元素会影响代理检索查询逻辑。 任何必需的元素都不是新的或特定于代理检索的,这意味着,如果它符合本文中标识的条件,则可以使用现有索引,即使它是使用早期 API 版本创建的。
注释
以下知识源直接访问外部源,不需要搜索索引:Web 知识源(必应)。
智能体检索的条件
在智能体检索中使用的索引必须具有以下元素:
它还应具有可用于引文的字段,例如文档或文件名、页面或章节名称,或者至少包含区块 ID。
如果要在管道中包含文本到向量查询转换,它应具有 向量字段和向量化器 。
(可选)以下索引元素可增加优化机会:
-
使用
scoringProfile的defaultScoringProfile,用于提升相关性 -
术语或行话的
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 搜索中,可以使用 内置或第三方解决方案创建分块文本。
分块内容的内置假设是原始源文档具有大量详细内容。 如果源内容是结构化数据(如产品数据库),则索引应放弃分块,而是包括映射到原始数据源的字段(例如产品名称、类别、说明等)。
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":{
"prioritizedFields":{
"titleField":{
"fieldName":""
},
"prioritizedContentFields":[
{
"fieldName":"page_chunk"
}
],
"prioritizedKeywordsFields":[
{
"fieldName":"Category"
},
{
"fieldName":"Tags"
},
{
"fieldName":"Location"
}
]
}
}
}
]
}
注释
响应提供title、terms和content,这些映射到此配置中的优先字段。
添加向量器
如果索引中有矢量字段,则查询计划将包含它们(如果它们为 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 知识库。
一个 知识库 ,表示一个或多个知识源和其他知识检索说明。