当前位置: 首页 > news >正文

在 OpenSearch 中建立有效的混合搜索: 技术和最佳实践

在这里插入图片描述
OpenSearch 提供了支持现代搜索需求的多种功能,包括使用 BM25 进行词法搜索等传统的基于关键字的技术,以及语义搜索和混合搜索等更先进的方法。对于许多依赖关键词相关性的应用来说,BM25 仍然是可靠、高效的选择。在此基础上,语义搜索利用机器学习(ML)捕捉关键词以外的含义。先进的混合技术结合了词法和语义方法,使用基于分数和等级的算法等规范化方法来平衡和整合来自不同搜索方法的分数。这些技术逐步提高了搜索相关性和灵活性,满足了现代应用中的各种搜索要求。

在这篇博文中,我们将逐一探讨这些技术–文字、语义和混合技术,并深入探讨混合搜索在 OpenSearch 中的工作原理。

比较词法搜索和语义搜索

词法搜索和语义搜索使用不同的技术来检索相关文档。下面是它们的比较。

词法(BM25)搜索

BM25 是 OpenSearch 默认使用的概率评分算法。它作为 OpenSearch 标准全文搜索功能的一部分提供,用于查询,如 multi_matchrange、和 term。BM25 支持字段级增强和灵活匹配,使其成为从电子商务产品搜索到文档检索等众多应用的多功能选择。

示例请求

以下请求将搜索 the martian中的title字段:

GET /bookstore_catalog/_search
{"query": {"match": {"title": "the martian"}}
}
语义搜索

语义搜索引入了 ML 和自然语言处理技术,以增强搜索结果。它使用密集向量嵌入来表示高维空间中的文档和查询。这些嵌入捕获了文本的语义,使系统能够超越精确的关键词匹配。

文本嵌入是通过在大型数据集上训练的大型语言模型(LLM)生成的。在 OpenSearch 中,嵌入以密集向量场的形式存储,并使用 k-nearest neighbor (k-NN) 算法进行搜索。在搜索时,您的查询也会转化为嵌入,OpenSearch 会使用内积或余弦相似度等相似度量找到包含最接近查询向量的向量的文档。

请求示例
以下请求将检索包含与查询science fiction最相似的嵌入式内容的文档:

GET /bookstore_catalog/_search
{"_source": {"excludes": ["passage_embedding"]},"query": {"neural": {"title_embedding": {"query_text": "science fiction","k": 100}}}
}

此查询使用以下参数:

  • title_embedding:包含文档标题嵌入的密集向量场。
  • query_text:要转换为嵌入的输入查询。
  • k:要检索的最近邻的数量。
摘要

像 BM25 这样的文字搜索方法可以提供快速、准确的关键词匹配,但却无法捕捉到查询的含义或上下文。相反,语义搜索擅长理解意图和自然语言,但可能会遗漏重要的关键词,尤其是在基于事实的搜索中。

随着越来越多的使用案例(尤其是在使用生成式人工智能的应用中)同时要求关键字精确度和语义理解,混合搜索变得至关重要。OpenSearch 中的混合搜索结合了两种方法的优势,以提高相关性和灵活性。

混合搜索:结合词法搜索和语义搜索

混合搜索整合了多种搜索方法的结果,如用于关键词匹配的 BM25 和用于语义理解的矢量搜索,以提供更全面、更准确的结果。由于这些方法使用不同的标度来生成分数,因此要进行归一化转换,使它们使用相同的标度。这样,OpenSearch 就可以对它们进行公平的比较和组合。

OpenSearch 支持两大类规范化技术:

  • 基于分数的标准化(Score-based normalization): 直接操作搜索算法返回的原始分数。当实际分数值包含有意义的信息,需要以某种形式保留时,这些方法就非常有用。有三种基于分数的规范化技术:最小最大值、L2 和 z-score(将在 OpenSearch 3.0 中发布)。
  • 基于等级的标准化(Rank-based normalization): 侧重于结果的相对顺序。这些方法在合并不同来源的结果时非常有用,因为不同来源的原始分数可能使用不同的标度,无法直接进行比较。基于文档等级的归一化可以解决这个问题,它根据文档等级对分数进行归一化,使其在不同评分系统的算法中更加可靠。

使用最小-最大规范化进行混合搜索

最小-最大归一化将单个子查询分数缩放至一个固定范围,通常为 [0,1],同时保留其相对分布。例如,BM25 分数没有固定的范围,但在归一化后,它们的值将落在 0 到 1 的范围内。

正常化公式为:

normalized_score = (score - min_score) / (max_score - min_score)

其中:

  • score 是来自子查询的原始分数。
  • min_scoremax_score 是该子查询结果集中的最低和最高分。

要在 OpenSearch 中使用最小-最大归一化,首先要定义一个搜索管道:

PUT /_search/pipeline/min_max-search-pipeline
{"description": "Post processor for hybrid search","phase_results_processors": [{"normalization-processor": {"normalization": {"technique": "min_max"},"combination": {"technique": "arithmetic_mean","parameters": {"weights": [0.3, 0.7]}}}}]
}

该管道对每个子查询的结果进行最小-最大归一化处理,并使用加权算术平均值将其合并: 词法占 30%,语义占 70%。

然后使用管道运行混合查询:

GET /bookstore_catalog/_search?search_pipeline=min_max-search-pipeline
{"query": {"hybrid": {"queries": [{"match": {"title": {"query": "science fiction"}}},{"neural": {"title_embedding": {"query_text": "science fiction","model_id": "aVeif4oB5Vm0Tdw8zYO2","k": 5}}}]}}
}

此查询使用以下参数:

  • hybrid:OpenSearch 内置的混合查询类型。
  • search_pipeline:应用最小最大归一化和加权分数组合。
最小-最大规范化的工作原理

最小-最大规范化的工作原理如下:

  1. OpenSearch同时运行matchneural 查询。
  2. 管道使用最小-最大缩放对每个结果集进行归一化。
  3. 采用加权平均法合并归一化分数,得出最终分数。

在本例中,文件的最终得分是通过以下公式计算得出的:

0.3 * normalized_BM25_score + 0.7 * normalized_neural_score

何时使用基于分数的规范化

基于分数的归一化适用于需要对如何合并不同方法的结果进行微调控制的情况。在以下情况下可以考虑使用它

  • 您可以校准或训练权重:如果您有可靠的方法对分数进行归一化(例如,使用最小最大值或 L2 规范)并调整每种检索方法的权重,那么线性分数组合在相关性指标上可能会略微优于等级融合。
  • 您想强调一种方法:得分规范化允许您明确强调使用案例中更可靠的模型。在一般文档搜索中,有些查询可能主要通过关键字匹配来回答,而另一些查询则可能需要语义理解。通过调整权重(或使用查询逻辑),您可以在适当的时候给予 BM25 或神经模型更多的影响。
  • 您需要精确控制合并(减少误报):归一化线性组合可让您对合并结果的方式进行更多控制,这可以减少相关性较低的文档仅因一种方法而被提升的几率。例如,如果一个语义模型返回了一个等级较高的不相关结果,基于等级的归一化(将在下一节中介绍)仍然会因为该结果的等级而对其应用高分。而基于分数的方法则可以通过降低文档的归一化相关性分数来缓解这种情况(因为 BM25 可能会给文档打 0 分,而语义分数本身可能不足以克服其他综合分数)。因此,在一个经过良好调试的混合系统中,得分归一化可以带来更精确的前十排名,因为每个文档的最终得分反映了词汇和语义相关性的平衡。

Hybrid search using RRF

基于排名的技术侧重于文档在结果集中的位置,而不是原始得分。这些技术在组合不同检索方法的结果时特别有用,因为不同检索方法的得分无法直接比较。

Reciprocal Rank Fusion (RRF) 就是这样一种技术。它使用每个文档在单个查询结果中的排名来计算综合得分,从而使其能够抵御 BM25 和语义搜索等方法中不匹配的评分标准。

首先,定义 RRF 搜索管道:

PUT /_search/pipeline/rrf-pipeline
{"description": "Post processor for hybrid RRF search","phase_results_processors": [{"score-ranker-processor": {"combination": {"technique": "rrf"}}}]
}

然后运行混合查询:

GET /bookstore_catalog/_search?search_pipeline=rrf-pipeline
{"query": {"hybrid": {"queries": [{"match": {"title": {"query": "science fiction"}}},{"neural": {"title_embedding": {"query_text": "science fiction","model_id": "aVeif4oB5Vm0Tdw8zYO2","k": 5}}}]}}
}

此查询使用以下参数:

  • hybrid:结合词法搜索和语义搜索的结果。
  • search_pipeline:应用 RRF 组合逻辑对最终结果进行排序。
RRF 如何工作

RRF的工作原理如下:

  1. 按得分排序文档:每个查询方法都按得分排序文档。

  2. 指定排名位置:根据每个查询的得分对文档进行排序。

  3. 计算 RRF 分数:对于每个文档,RRF 分数使用以下公式计算:

rankScore(document_i) = sum((1/(k + query_1_rank), (1/(k + query_2_rank), …, (1/(k + query_j_rank)))

其中:

  • k是秩常量。
  • query_j_rank 表示文档在特定查询方法中的排名。
  1. 添加排名贡献:合并排名计算,并按排名得分递减对文档进行排序。

  2. 返回排名贡献: 返回排名靠前的结果:根据查询大小检索排名最高的文档。

何时使用基于等级的规范化

考虑在以下情况下使用基于等级的归一化:

  • 异质分数分布:当 BM25 和语义模型在不相容的尺度上产生分数或包含异常值时,等级融合(尤其是 RRF)就会表现出色。它只使用结果排名而不是原始分数,从而避免了复杂的分数校准。这就产生了稳定的排名,即使在归一化评分方案中,一种查询方法的评分范围会使其他方法黯然失色。
  • 无需调整或校准:RRF 是一种开箱即用的方法。它不需要预训练、权重调整或分数范围知识。在通用搜索系统中(查询和内容多种多样),针对每种情况手动调整权重往往是不切实际的。当无法获得用于校准的标注数据时,排名融合是一种稳健的默认方法。
  • 对异常值和域偏移的适应能力:由于 RRF 不考虑绝对得分大小,因此得分极高的异常值不会影响结果。这在一般的数据集中非常有用,因为在使用一种模型时,某些查询或文档可能会产生异常高的分数。同样,如果数据分布或查询组合随时间发生变化,RRF 也会保持稳定,无需重新校准,因为它使用的是相对排名位置。
  • 适应不断变化的环境:当查询和/或数据的性质随时间发生变化时,基于分数的方法通常需要对权重进行持续的微调,以保持高相关性。RRF 依靠的是相对排名而不是绝对分数,因此无需持续维护。这使得它在动态环境中尤为重要,因为在这种环境中,持续的重新校准会耗费大量资源或不切实际。

结论

OpenSearch已经发展到可以满足广泛的需求,从使用BM25的精确关键词匹配到使用语义模型的深度上下文检索。混合搜索结合了这些优势,为信息检索提供了一种灵活、强大的方法。通过结合词法和语义方法,混合搜索在相关性、召回率和排名稳定性之间取得了平衡。

实施混合搜索时,请使用以下最佳实践:

  • 数据和查询类型:根据内容和查询的结构化程度、稀疏程度或特定领域程度选择技术。
  • 性能要求:考虑搜索精度和计算资源之间的权衡,特别是对于大规模应用。
  • 调整和测试:仔细调整和测试每种技术,以针对特定用例实现最佳效果。
  • 可扩展性:随着数据量的增长,请确保您选择的搜索策略能够有效扩展。
http://www.xdnf.cn/news/236341.html

相关文章:

  • PCB设计工艺规范(四)安规要求
  • 变量char2、*char2、pChar3、*pChar3的存储位置
  • 冰冰一号教程网--介绍采用vuepress搭建个人博客
  • CrowdStrike推出新型工具防御恶意AI模型与数据窃取
  • 「Mac畅玩AIGC与多模态10」开发篇06 - 使用自定义翻译插件开发智能体应用
  • ai改写智能助手在线润色,高效产出优质文章!
  • Qt -DFS可视化
  • 乐西高速大凉山1号隧道实现双幅贯通:成都到昭觉9小时变3.5小时
  • 代码随想录打卡|Day31动态规划(最后一块石头的重量2、目标和、一和零)
  • 分割链表题解
  • 2025年“深圳杯”数学建模挑战赛A题-芯片热弹性物理参数估计
  • 记一次 MyBatis 缓存引发的问题
  • 高级测试工程师 的面试题汇总
  • 实验-单总线温度采集与显示(汇编语言与接口技术)
  • 视觉问答大模型速递:Skywork-R1V2-38B
  • 【人工智能】深入探索Python中的自然语言理解:实现实体识别系统
  • 第二部分:赤色的世界
  • 提高设计的综合性能
  • ESP32开发之freeRTOS的信号量
  • 免费在Colab运行Qwen3-0.6B——轻量高性能实战
  • Learning vtkjs之ImplicitBoolean
  • Java大师成长计划之第8天:Java线程基础
  • 树状结构转换工具类
  • 沙箱逃逸-通过题解了解沙箱逃逸
  • Flow Matching 是什么?
  • 如何做表征对齐?
  • Kettle下载安装教程
  • C# 异步详解
  • 探索MySQL InnoDB:事务、日志与锁的奥秘
  • 从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件