在 Azure AI 搜索中创建混合查询

混合搜索将一个或多个关键字查询与矢量查询合并在一个搜索请求中。

响应包括按搜索分数排序靠前的结果。 矢量查询和自由文本查询都根据各自的评分或相似性算法获得初始搜索分数。 这些分数是使用倒数排名融合 (RRF) 合并的,用于返回单个排名结果集。

先决条件

  • 在任何区域内、任何层级上的 Azure AI 搜索。 大多数现有服务都支持矢量搜索。 对于在 2019 年 1 月之前创建的服务,有一小部分不支持矢量搜索。 如果包含矢量字段的索引的创建或更新失败,则这是一个指示器。 在这种情况下,必须创建新服务。

  • 包含矢量字段和非矢量字段的搜索索引。 请参阅创建索引向搜索索引添加矢量字段

  • 使用搜索 Post REST API 版本 2023-11-01、Azure 门户中的搜索资源管理器,或已更新为使用此功能的 Azure SDK 中的包。

提示

矢量搜索的稳定版本 (2023-11-01) 不提供查询输入字符串的内置矢量化。 查询字符串的编码(文本到矢量)需要将查询字符串传递给外部嵌入模型进行矢量化。 然后,将响应传递给搜索引擎,以便通过矢量字段进行相似性搜索。

矢量搜索的预览版本 (2023-10-01-Preview) 增加了集成矢量化。 如果要浏览此功能,请创建和分配矢量器,以获取查询字符串的内置嵌入。

所有结果均以纯文本形式返回,包括标记为 retrievable 的字段中的矢量。 由于数值矢量在搜索结果中不起作用,因此请选择索引中的其他字段作为矢量匹配的代理。 例如,如果索引具有“descriptionVector”和“descriptionText”字段,则查询可以匹配“descriptionVector”,但搜索结果可以显示“descriptionText”。 使用 select 参数仅指定结果中可人工读取的字段。

混合查询请求

混合查询结合了全文搜索和矢量搜索,其中 "search" 参数采用查询字符串,"vectors.value" 采用矢量查询。 搜索引擎并行运行全文查询和矢量查询。 使用倒数排名融合 (RRF) 评估所有匹配项的相关性,并在响应中返回单个结果集。

混合查询非常有用,因为它们添加了对所有查询功能(包括 orderby)的支持。 例如,除了矢量查询之外,还可以搜索人员或产品名称或标题,相似性搜索不适合的方案。

以下示例演示了混合查询配置。

POST https://{{search-service-name}}.search.azure.cn/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "contentVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "what azure services support full text search",
    "select": "title, content, category",
    "top": "10"
}

要点

  • 矢量查询字符串是通过矢量“vector.value”属性指定的。 查询针对“contentVector”字段执行。 将“kind”设置为“vector”以指示查询类型。 (可选)将“exhaustive”设置为“true”以查询矢量字段的完整内容。

  • 关键字搜索通过“search”属性指定。 它与矢量查询并行执行。

  • “k”确定从向量查询返回的最近邻匹配项数,并将其提供给 RRF 排名器。

  • “top”确定响应中返回的匹配项数。 在此示例中,假设合并的结果中至少有 10 个匹配项,响应会包含 10 个结果。

使用筛选器的混合搜索

此示例添加了一个筛选器,该筛选器应用于搜索索引的“可筛选”非矢量字段。

POST https://{{search-service-name}}.search.azure.cn/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "contentVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "what azure services support full text search",
    "vectorFilterMode": "postFilter",
    "filter": "category eq 'Databases'",
    "top": "10"
}

要点

  • 筛选器应用于可筛选字段的内容。 在此示例中,类别字段在索引架构中标记为可筛选。

  • 在混合查询中,可以在查询执行之前应用筛选器以减少查询图面,也可以在查询执行之后应用筛选器来剪裁结果。 "preFilter" 是默认值。 若要使用 postFilter,请设置筛选器处理模式

  • 在筛选后查询结果时,结果数可能小于 top-n。

配置查询响应

设置混合查询时,请考虑响应结构。 响应是平展行集。 查询中的参数确定每行中有哪些字段以及响应中有多少行。 搜索引擎对匹配的文档进行排名,并返回相关度最高的结果。

响应中的字段

搜索结果由搜索索引中的“可检索”字段组成。 结果可以是:

  • 所有“可检索”字段(REST API 默认值)。
  • 在查询的“select”参数中显式列出的字段。

本文中的示例使用了“select”语句来指定响应中的文本(非矢量)字段。

注意

矢量不是为可读性而设计的,因此避免在响应中返回它们。 相反,选择代表搜索文档的非矢量字段。 例如,如果查询以“descriptionVector”字段为目标,则在响应中有一个(“description”)时返回等效的文本字段。

结果数量

查询可能与任意数量的文档匹配,如果搜索条件较弱(例如“search=*”用于 null 查询),则会尽可能匹配所有文档。 由于很少有实际返回无限制的结果的情况,因此应为响应指定最大值:

  • 对于仅矢量查询,使用 "k": n 个结果
  • 对于包含“search”参数的混合查询,使用 "top": n 个结果

“k”和“top”都是可选的。 如果未指定,响应中的默认结果数为 50。 可以设置“top”和“skip”以浏览更多结果或更改默认值。

Ranking

为混合查询创建多个集。 结果排名由倒数排名融合 (RRF) 计算得出。

在本部分中,比较单矢量搜索和简单混合搜索之间的响应,来获得排名靠前的结果。 不同的排名算法、HNSW 的相似性指标和 RRF 就是这种情况,会产生具有不同量级的分数。 此行为是设计使然。 即使存在很高的相似性匹配,RRF 分数也可能看起来很低。 较低的分数是 RRF 算法的一个特征。 在使用 RRF 的混合搜索中,考虑到已通过 RRF 排名的文档的分数相对较小(这与纯矢量搜索相反),结果中会包含已排名文档的更多倒数。

单矢量搜索:按余弦相似性排序的结果(默认矢量相似性距离函数)。

{
    "@search.score": 0.8851871,
    "title": "Azure AI Search",
    "content": "Azure AI Search is a fully managed search-as-a-service that enables you to build rich search experiences for your applications. It provides features like full-text search, faceted navigation, and filters. Azure AI Search supports various data sources, such as Azure SQL Database, Azure Blob Storage, and Azure Cosmos DB. You can use Azure AI Search to index your data, create custom scoring profiles, and integrate with other Azure services. It also integrates with other Azure services, such as Azure Cognitive Services and Azure Machine Learning.",
    "category": "AI + Machine Learning"
},

混合搜索:使用倒数排名融合组合关键字和矢量搜索结果。

{
    "@search.score": 0.03333333507180214,
    "title": "Azure AI Search",
    "content": "Azure AI Search is a fully managed search-as-a-service that enables you to build rich search experiences for your applications. It provides features like full-text search, faceted navigation, and filters. Azure AI Search supports various data sources, such as Azure SQL Database, Azure Blob Storage, and Azure Cosmos DB. You can use Azure AI Search to index your data, create custom scoring profiles, and integrate with other Azure services. It also integrates with other Azure services, such as Azure Cognitive Services and Azure Machine Learning.",
    "category": "AI + Machine Learning"
},

后续步骤

接下来,建议查看 PythonC#JavaScript 的演示代码。