在 Azure AI 搜索中使用矢量和全文进行混合搜索

混合查询是全文搜索和矢量搜索的结合,执行的对象是一个包含可搜索的纯文本内容和生成的嵌入的搜索索引。 就查询而言,混合搜索定义如下:

  • 包含 searchvectors 查询参数的单一查询请求
  • 并行执行
  • 利用查询响应中的合并结果,使用倒数排名融合 (RRF) 打分

本文将解释混合搜索的概念、优势和局限性。 请观看此嵌入式视频,了解混合检索如何为高质量的聊天式和 Copilot 应用助力的说明和简短演示。

混合搜索的工作原理是什么?

在 Azure AI 搜索中,包含嵌入的矢量字段可以与文本字段和数字字段并存,从而可以构建并行执行的混合查询。 混合查询可以利用单个搜索请求中的筛选、分面、排序、计分概要文件等现有功能。

混合搜索将全文查询和矢量查询的结果相结合,使用 BM25、HNSW 和 EKNN 等不同的排名函数。 倒数排序融合 (RRF) 算法合并结果。 查询响应仅提供一个结果集,使用 RRF 对统一结果进行排名。

混合查询的结构

混合搜索的前提是要有一个包含各种数据类型字段,包括纯文本和数字、地理坐标(如果需要地理空间搜索)以及用于对文本区块进行数学表示的矢量。 除纯文本客户端交互(如自动完成和建议)以外,几乎可以在 Azure AI 搜索中使用所有查询功能进行矢量查询。

代表性混合查询可能如下所示(请注意,为了简洁起见,矢量查询的值使用了占位符):

POST https://{{searchServiceName}}.search.azure.cn/indexes/hotels-vector-quickstart/docs/search?api-version=2024-07-01
  content-type: application/JSON
{
    "count": true,
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelId, HotelName, Category, Description, Address/City, Address/StateProvince",
    "filter": "geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 300",
    "facets": [ "Address/StateProvince"], 
    "vectors": [
        {
            "value": [ <array of embeddings> ]
            "k": 7,
            "fields": "DescriptionVector"
        },
        {
            "value": [ <array of embeddings> ]
            "k": 7,
            "fields": "Description_frVector"
        }
    ],

}

要点包括:

  • search 指定单个全文搜索查询。
  • vectors 用于矢量查询,可以是针对多个矢量字段的多个查询。 如果嵌入空间包括多语言内容,矢量查询无需语言分析器或翻译即可找到匹配项。
  • select 指定要在结果中返回哪些字段,这些字段应是可人工读取的文本字段。
  • filters 可指定地理空间搜索或其他包含和排除条件,例如是否包含停车场。 此示例中的地理空间查询查找了华盛顿特区 300 公里半径范围内的酒店。
  • facets 可用于针对混合查询返回的结果计算 facet 存储桶。

筛选器和 facet 针对索引内的数据结构,它们不同于全文搜索所用的倒排索引,也不同于矢量搜索所用的矢量索引。 因此,当执行筛选器和 facet 操作时,搜索引擎可将操作结果应用于响应中的混合搜索结果。

请注意,查询中并没有 orderby。 显式排序顺序会覆盖相关性排名的结果,因此,如果你需要获得相似性和 BM25 相关性,请在查询中省略排序。

上述查询中的响应可能如下所示:

{
    "@odata.count": 3,
    "@search.facets": {
        "Address/StateProvince": [
            {
                "count": 1,
                "value": "NY"
            },
            {
                "count": 1,
                "value": "VA"
            }
        ]
    },
    "value": [
        {
            "@search.score": 0.03333333507180214,
            "@search.rerankerScore": 2.5229012966156006,
            "HotelId": "49",
            "HotelName": "Old Carrabelle Hotel",
            "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
            "Category": "Luxury",
            "Address": {
                "City": "Arlington",
                "StateProvince": "VA"
            }
        },
        {
            "@search.score": 0.032522473484277725,
            "@search.rerankerScore": 2.111117362976074,
            "HotelId": "48",
            "HotelName": "Nordick's Motel",
            "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
            "Category": "Boutique",
            "Address": {
                "City": "Washington D.C.",
                "StateProvince": null
            }
        }
    ]
}

混合搜索取矢量搜索和关键字搜索两者之长。 矢量搜索的优势在于,即使倒排索引中没有关键字匹配项,也能找到与搜索查询在概念上相似的信息。 关键字或全文搜索的优点是精度。 在某些场景(例如查询产品代码、高度专用的术语、日期和人员姓名)中,使用关键字搜索可以获得更准确的结果,因为它可以识别确切的匹配项。

另请参阅

使用混合检索和排名超越矢量搜索(技术博客)