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

混合搜索将文本(关键字)和矢量查询结合在单个搜索请求中。 这两个查询并行执行。 结果按新的搜索分数进行合并和重新排序,使用倒数排名融合 (RRF) 返回一个统一的结果集。

在本文中,您将学习如何:

  • 设置基本混合请求
  • 添加参数和筛选器
  • 使用语义排名或矢量权重提高相关性
  • 通过控制输入优化查询行为 (maxTextRecallSize

先决条件

选择 API 或工具

  • Azure 门户中的搜索资源管理器(支持稳定版和预览版 API 搜索语法)有一个 JSON 视图,可让你将混合请求粘贴进去。

  • 如果使用的是 maxTextRecallSize 和 countAndFacetMode(预览版)等预览功能,则使用稳定的 REST API 或最近的预览 API 版本。

    为了方便阅读,我们使用 REST 示例来解释 API 的工作原理。 可以使用带 REST 扩展的 REST 客户端(例如 Visual Studio Code)来构建混合查询。 还可以使用 Azure SDK。

设置混合查询

本部分介绍混合查询的基本结构,以及如何在搜索资源管理器中设置一个查询或在 REST 客户端中执行。

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

  1. 登录到 Azure 门户 并查找搜索服务。

  2. “搜索管理>索引”下,选择包含矢量和非矢量内容的索引。 搜索资源管理器 是第一个选项卡。

  3. “视图”下切换到 JSON 视图 ,以便可以粘贴向量查询。

  4. 将默认查询模板替换为混合查询。 基本混合查询具有指定的 search文本查询,以及指定的 vectorQueries.vector向量查询。 文本查询和矢量查询可以等价,也可以不等价,但通常具有相同的意向。

    此示例来自矢量快速入门,其中包含矢量和非矢量内容,以及多个查询示例。 为简洁起见,本文中截断了矢量。

    {
        "search": "historic hotel walk to restaurants and shopping",
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  5. 选择搜索

    提示

    如果隐藏矢量,搜索结果将更易读。 在“查询选项”中,启用“在搜索结果中隐藏矢量值”

  6. 下面是另一个版本的查询。 这一项包含一个 count 用于显示找到的匹配项数量,一个 select 参数用于选择特定字段,以及一个 top 参数用于返回前七个结果。

     {
         "count": true,
         "search": "historic hotel walk to restaurants and shopping",
         "select": "HotelId, HotelName, Category, Tags, Description",
         "top": 7,
         "vectorQueries": [
             {
                 "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                 "k": 7,
                 "fields": "DescriptionVector",
                 "kind": "vector",
                 "exhaustive": true
             }
         ]
     }