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

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

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

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

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

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

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

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

混合查询的结构

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

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

POST https://{{searchServiceName}}.search.windows.net/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"
        }
    ],
    "queryType": "semantic",
    "queryLanguage": "en-us",
    "semanticConfiguration": "my-semantic-config"
}

要点包括:

  • search 指定单个全文搜索查询。
  • vectors 用于矢量查询,可以是针对多个矢量字段的多个查询。 如果嵌入空间包括多语言内容,矢量查询无需语言分析器或翻译即可找到匹配项。
  • select 指定要在结果中返回哪些字段,这些字段应是可人工读取的文本字段。
  • filters 可指定地理空间搜索或其他包含和排除条件,例如是否包含停车场。 此示例中的地理空间查询查找了华盛顿特区 300 公里半径范围内的酒店。
  • facets 可用于针对混合查询返回的结果计算 facet 存储桶。
  • queryType=semantic 调用语义排序器,应用机器阅读理解来显示相关度更高的搜索结果。 语义排名是可选的。 如果不使用该功能,请删除混合查询的最后三行。

筛选器和 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": "Swirling Currents 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 Valley 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
            }
        }
    ]
}

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

在实际应用中和基准数据集上进行的基准测试表明,使用语义排序器的混合检索在搜索相关性方面具有显著优势。

以下视频介绍了混合检索如何为你提供最佳基础数据以生成有用的 AI 响应。

另请参阅

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