改进 Elastic Stack 中的信息检索:混合检索 - hybrid retrieval

news2024/11/24 0:18:03

作者:Quentin Herreros, Thomas Veasey

在上一篇博文中,我们介绍了 Elastic Learned Sparse Encoder,这是一种经过训练可有效进行零样本文本检索的模型。 Elasticsearch® 还具有强大的词汇检索功能和丰富的工具来组合不同查询的结果。 在本博客中,我们介绍了混合检索的概念,并探讨了 Elasticsearch 中可用的两种具体实现。 特别是,我们探索如何通过使用倒数排名融合(Reciprocal Rank Fusion - RRF)和加权分数和将 Elastic 学习稀疏编码器(Learned Sparse Encoder)与 BM25 相结合来提高其性能。

我们还讨论了为探索一些一般性研究问题而进行的实验。 其中包括如何最好地参数化倒数排名融合以及如何校准分数的加权和。

 

混合检索

尽管现代训练管道产生了在零样本场景中具有良好性能的检索器模型,但众所周知,词汇检索器(例如 BM25)和语义检索器(例如 Elastic Learned Sparse Encoder)在某种程度上是互补的。 具体来说,如果假设检索到的相关文档比检索到的不相关文档出现更多匹配,那么结合检索方法的结果将提高相关性。

对于使用非常不同的检索机制的方法来说,这种假设是合理的,因为对于大多数查询和语料库来说,不相关的文档比相关文档多得多。 如果方法独立且统一地随机检索相关和不相关文档,这种不平衡意味着相关文档比不相关文档匹配的可能性更大。 我们进行了一些重叠测量 ,以检 Elastic Learned Sparse Encoder、BM25 和各种密集检索器之间的这一假设,如表 1 所示。这为使用所谓的混合搜索提供了一些基本原理。 接下来,我们研究混合搜索的两种具体实现。

表 1:ArguAna 中前 1000 个文档的三个检索器与 Elastic Learned Sparse Encoder(称为“ELSER”)的 重叠系数

 

倒数排名融合 - Reciprocal Rank Fusion

本文提出了倒数排名融合。 它易于使用,完全无人监督,甚至不需要分数校准。 它的工作原理是使用 BM25 和模型对文档进行排名,并根据两种方法的排名位置计算其分数。 文档按分数降序排序。 分数定义如下:

该方法使用常数 k 来调整低排名文档的重要性。 它应用于每种方法检索到的前 N ​​个文档集。 如果任一方法的该集中缺少文档,则该项设置为零。

介绍倒数排名融合的论文建议 k 值为 60,并且没有讨论要检索多少个文档 N。 显然,增加 N 会影响排名质量,而对于任一方法,recall@N 都会增加。 定性地讲,k 越大,排名较低的文档对最终顺序越重要。 然而,对于现代词汇语义混合检索来说,k 和 N 的最佳值是什么并不清楚。 此外,我们想了解结果对这些参数的选择有多敏感,以及最优值是否可以在数据集和模型之间推广。 这对于在零样本设置中对方法有信心非常重要。

为了探索这些问题,我们进行了网格搜索,以最大化各种模型的 BEIR 基准子集的加权平均值 NDCG@10。 在本实验中,我们使用 Elasticsearch 进行检索,通过单个文本字段和向量表示每个文档。 BM25 搜索是使用 match 查询和使用带有 script_score 查询的精确向量搜索的密集检索来执行的。

表 2:BEIR 数据集子集(webis-touche2020、scidocs、nq、hotpotqa、fiqa、dbpedia-entity、arguana、trec-covid、nfcorpus)的平均 NDCG@10,根据各种 k 和前 N 个参数的查询数量进行加权使用双编码器 roberta-base-ance-firstp 进行语义检索

 

参考表2,我们看到对于 roberta-base-ance-firstp,k 和 N 的最佳值分别是 20 和 1000。 我们强调,对于大多数单独的数据集,相同的参数组合是最佳的。 我们对 distilbert-base-v3 和 minilm-l12-v3 进行了相同的网格搜索,每个模型都得出相同的结论。 还值得注意的是,最好和最差参数组合之间的差异仅为 5% 左右; 因此错误设置这些参数的惩罚相对较小。

我们还想看看是否可以使用倒数排名融合在零样本设置中提高 Elastic Learned Sparse Encoder 的性能。 BEIR 基准测试的结果如表 3 所示。

表 3:BM25(使用 Elasticsearch 8.8 和默认英语分析器)、BM25 和通过 RRF 组合的 Elastic Learned Sparse Encoder(简称“ELSER”)之间的 NDCG@10 比较,k=20 和 N=1000

与单独的 Elastic Learned Sparse Encoder 相比,Reciprocal Rank Fusion 将平均 NDCG@10 提高了 1.4%,比单独的 BM25 提高了 18%。 此外,重要的是,对于所有测试数据集,结果都优于或类似于单独的 BM25。 无需模型调整、训练数据集或特定校准即可实现改进的排名。 唯一的缺点是,目前,由于两个查询在 Elasticsearch 中顺序执行,查询延迟会增加。 BM25 检索通常比语义检索更快,这一事实缓解了这一问题。

我们的研究结果表明,倒数排名融合可以安全地用作有效的 “即插即用” 策略。 此外,值得回顾一下使用 BM25、Elastic Learned Sparse Encoder 以及它们在你自己的数据上的排名融合获得的结果的质量。 如果要在 BEIR 套件中的每个单独数据集上选择性能最佳的方法,则平均 NDCG@10 的增长分别比 Elastic Learned Sparse Encoder 和 BM25 单独提高 3% 和 20%。

作为这项工作的一部分,我们还执行了一些简单的查询分类来区分关键字和自然问题搜索。 这是为了尝试了解导致给定方法表现最佳的机制。 到目前为止,我们对此还没有明确的解释,并计划进一步探索。 然而,我们确实发现,当两种方法具有相似的整体精度时,混合搜索表现强劲。

最后,倒数排名融合可以与两种以上的方法一起使用,或者可以用于组合来自不同领域的排名。 到目前为止,我们还没有探索过这个方向。

分数加权总和

Elasticsearch 支持的另一种混合检索方法是使用线性函数组合 BM25 分数和模型分数。 本文研究了这种方法,结果表明,在校准良好的情况下,它比倒数秩融合更有效。 我们通过分数的凸线性组合探索混合搜索,定义如下:

其中 α 是模型得分权重,介于 0 和 1 之间。

线性组合的理想校准并不简单,因为它需要类似于用于微调模型的注释。 给定一组查询和关联的相关文档,我们可以使用任何优化方法来找到检索这些文档的最佳组合。 在我们的实验中,我们使用 BEIR 数据集和贝叶斯优化来寻找最佳组合,针对 NDCG@10 进行优化。 理论上,分数尺度的比率可以纳入到α的学习值中。 然而,在接下来的实验中,我们使用最小-最大归一化对每个数据集的 BM25 分数和 Elastic Learned Sparse Encoder 分数进行归一化,计算每个数据集上一些代表性查询的前 1,000 个分数的最小值和最大值。 我们希望通过标准化分数获得最佳的转会价值(value of transfer)。 我们没有找到这方面的证据,但它更加一致,因此归一化确实可能提高校准的稳健性。

获取注释的成本很高,因此了解需要收集多少数据才能有信心击败倒数排名融合 (RRF)。 图 1 显示了 BM25 和 Elastic Learned Sparse Encoder 分数线性组合的 NDCG@10 作为 ArguAna 数据集带注释查询数量的函数。 作为参考,还显示了 BM25、Elastic Learned Sparse Encoder 和 RRF NDCG@10。 这种曲线在数据集中很常见。 在我们的实验中,我们发现大约 40 个带注释的查询可以超越 RRF,尽管不同数据集的确切阈值略有不同。

图 1:NDCG@10 的演变取决于用于优化 alpha 的查询数量(在 ArguAna 数据集上)。

 

我们还观察到,不同数据集(见图 2)以及不同检索模型的最佳权重差异很大。 即使在标准化分数之后也是如此。 人们可能会想到这一点,因为最佳组合将取决于各个方法在给定数据集上的执行情况。

为了探索零样本参数化的可能性,我们尝试为基准集中的所有数据集选择单个权重 α。 尽管我们使用相同的监督方法来做到这一点,但这次选择权重来优化全套数据集的平均 NDCG@10,我们认为数据集之间存在足够的变化,我们的发现可能代表零样本表现。

总之,这种方法比 RRF 产生更好的平均 NDCG@10。 然而,我们还发现结果不如 RRF 一致,并且我们强调最佳权重是特定于模型的。 因此,即使针对特定模型进行了校准,我们也不太有信心将该方法转移到新设置。 我们认为,线性组合并不是 “即插即用” 的方法。 相反,我们认为仔细评估组合在你自己的数据集上的性能以确定最佳设置非常重要。 然而,正如我们将在下面看到的,如果校准得当,它会产生非常好的结果。

图 2:BEIR 数据集的 alpha 变异性。 这些是使用贝叶斯优化和测试分割获得的。

 

标准化对于比较不同数据集和模型之间的分数至关重要,因为如果没有标准化,分数可能会有很大差异。 这并不总是那么容易做到,特别是对于 Okapi BM25,在进行查询之前分数范围是未知的。 密集模型分数更容易标准化,因为它们的矢量可以标准化。 然而,值得注意的是,一些密集模型是在没有标准化的情况下进行训练的,并且使用点积(dot products)可能会表现得更好。

Elastic Learned Sparse Encoder 经过训练可以复制跨编码器得分范围。 我们通常会看到它产生 0 到 20 范围内的分数,尽管不能保证这一点。 一般来说,查询历史记录及其前 N 个文档分数可用于近似分布并使用最小和最大估计值对任何评分函数进行标准化。 我们注意到,非线性归一化可能会导致线性组合的改进,例如,如果存在分数异常值,尽管我们没有对此进行测试。

至于倒数排序融合,我们希望了解 BM25 和 Elastic Learned Sparse Encoder 线性组合的准确性 —— 不过,这一次是在最好的情况下。 在这种情况下,我们对每个数据集优化一个权重 α,以使用线性组合获得理想的 NDCG@10。 我们使用 300 个查询进行校准 —— 我们发现这足以估计所有数据集的最佳权重。 在生产中,这种情况实际上很难实现,因为它需要精确的最小 - 最大归一化和具有代表性的注释数据集来调整权重。 如果文档和查询发生显着变化,也需要刷新。 尽管如此,限制最佳情况性能仍然有助于了解这种努力是否值得。 结果如表 4 所示。与单独的 Elastic Learned Sparse Encoder 相比,该方法的平均 NDCG@10 提高了 6%,比单独的 BM25 提高了 24%。

表 4:BM25(使用带默认英语分析器的 elasticsearch 8.8)、Elastic Learned Sparse Encoder(简称“ELSER”)、RRF(k=20 且 top N=1000)和线性组合(评估优化)之间的 NDCG@10 比较数据)

 

结论

我们表明可以结合不同的检索方法来提高其性能,特别是词汇和语义检索相互补充。 我们探索的一种方法是倒数排序融合。 这是一种简单的方法,通常可以产生良好的结果,而不需要任何注释或分数分布的先验知识。 此外,我们发现其性能特征在模型和数据集上都非常稳定,因此我们相信我们观察到的结果将推广到其他数据集。

另一种方法是分数加权总和,这种方法更难设置,但在我们的实验中,通过正确的设置产生了非常好的排名。 要使用这种方法,应该对分数进行归一化,这对于 BM25 来说需要典型查询的分数分布,此外还应该使用一些带注释的数据来训练方法权重。

在本系列的最后一篇计划博客中,我们将介绍在我们向 text_expansion 功能迈向 GA 的过程中,我们围绕推理和索引性能所做的工作。

原文:Improving information retrieval in the Elastic Stack: Hybrid retrieval | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试开发必备技能:JMeter 二次开发函数

一、简介 1、概述 Apache JMeter 是 Apache 基于 Java 开发的开源压力测试工具 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,像接口测试 但,随着 IT 行业的快速发展,不同企业或组织需求更加丰富,JMeter…

C# Linq 详解四

目录 概述 二十、SelectMany 二十一、Aggregate 二十二、DistinctBy 二十三、Reverse 二十四、SequenceEqual 二十五、Zip 二十六、SkipWhile 二十七、TakeWhile C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Li…

PMP,一场不可能fail的考试

2018年我参加了PMP考试,结果毫无悬念地轻松通过了。和我一起参加考试的七位伙伴也都取得了不错的成绩。 我是在去年7月份报名的,准备参加9月初的PMP考试。我记得我花费了3800元的培训费和3300元的考试费。由于PMP国内考试的报名条件之一是要求参加过由国…

C++ 指向vector[0]的指针

结论&#xff1a;指针p指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的其他元素&#xff0c;见test3 #include <vector> #include <iostream>/* 测试目的&#xff0c;指针p0指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的…

骨传导耳机好用吗?盘点五款好用的骨传导耳机推荐

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…

Spark编程-键值对RDD(K,V)创建及常用操作

简述 SparkRDD中可以包含任何类型的对象&#xff0c;在实际应用中&#xff0c;“键值对”是一种比较常见的RDD元素类型&#xff0c;分组和聚合操作中经常会用到&#xff0c;尤其是groupByKey和reduceByKey。 Spark操作中经常会用到“键值对RDD”&#xff08;Pair RDD&a…

swiper滚动块宽度踩坑记录

背景&#xff1a;需要给swiper增加图片懒加载优化性能&#xff0c;这里使用的是swiper自带的 lazy api。但是加了懒加载后发现滚动块的宽度变长了&#xff0c;这里的原因是我只给滚动条设置了宽度的样式但是没有给滚动块设置宽度的样式。于是我按照官方文档的做法给滚动块设置宽…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

LIS检验信息系统

LIS检验信息系统是以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标&#xff0c;将医学检验、科室管理和财务统计等工作进行整合&#xff0c;全面改善检验科室的工作现状。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通…

pandas的DataFrame转存MATLAB的mat格式

有的时候需要把 pandas 处理好的 DataFrame 进一步交给MATLAB来处理。当然可以保存成 excel 文件&#xff0c;不过当数据量比较大的时候&#xff0c;读取比较慢&#xff0c;这个时候转存成 MATLAB 可读的 mat 文件更合适&#xff08;MATLAB 能快速读取&#xff09;。 标准的操…

接口自动化测试的最佳工程实践 (ApiTestEngine)

目录 前言&#xff1a; 背景 核心特性 特性拆解介绍 写在后面 前言&#xff1a; 接口自动化测试是现代软件开发中不可或缺的一环。一个良好的测试框架和最佳工程实践可以提高测试效率和质量。 背景 当前市面上存在的接口测试工具已经非常多&#xff0c;常见的如Postman…

建筑结构健康监测常见问题及解决措施

建筑结构健康监测(SHM)是指利用无损传感技术&#xff0c;通过对结构特性进行分析&#xff0c;达到检测结构损伤或退化的目的&#xff0c;是当前守护建筑安全的一种新型技术手段&#xff0c;通过建筑结构健康监测管理者可以直观的了解到建筑物的健康状态&#xff0c;为建筑维护和…

【力扣算法13】之 12. 整数转罗马数字 python

文章目录 问题描述示例1示例2 示例 3:示例 4:示例 5:提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值I1V5X…

AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c;同时…

centos环境搭建nsq集群

简言 1. nsq是go语言开发的实时的分布式消息处理平台&#xff0c;目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构&#xff0c;该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征 2. nsq官网地址 NSQ Docs 1.2.1 …

【详解】C语言冷门知识点之--位段

文章目录 一&#xff0c; 位段的解释二&#xff0c; 位段的声明和使用位段的声明&#xff1a;位段的使用&#xff1a; 三&#xff0c;位段的空间大小计算第一个例子&#xff1a;第二个例子&#xff1a;注意&#xff1a; 四&#xff0c; 位段的内存分配五&#xff0c;位段的跨平…

@Autowired 到底是怎么把变量注入进来的?

文章目录 1. Bean 的创建2. populateBean3. postProcessProperties3.1 findAutowiringMetadata3.2 inject3.3 doResolveDependency 4. 时序图 在 Spring 容器中&#xff0c;当我们想给某一个属性注入值的时候&#xff0c;有多种不同的方式&#xff0c;例如可以通过构造器注入、…

C++ string类型的基本使用方法

目录 1.定义和初始化string对象 2.string对象上的常用操作 在C中string是用来处理可变长字符串的&#xff0c;是C标准库中提供的类型&#xff0c;使用起来十分方便。同时C也支持C语言的字符数组来表示字符串。使用时记得包含string头文件。 1.定义和初始化string对象&#xf…

讨论下相亲交友小程序介绍红娘系统搭建的功能有哪些

首页内容 同城会员&#xff0c;VIP会员&#xff0c;线下会员&#xff0c;热文推荐&#xff0c;恋爱话术&#xff0c;爱情故事&#xff0c;恋爱宝典&#xff0c;相亲宝典&#xff0c;浪漫约会&#xff0c;相亲活动&#xff0c;地区、年龄筛选&#xff0c;用户动态&#xff0c;用…

(简单)剑指Offer || 056. 二叉搜索树中两个节点的和 Java

方法一&#xff1a;深度优先搜索哈希表 使用深度优先搜索的方式遍历整棵树&#xff0c;用哈希表记录遍历过的节点的值 对于一个值为x的节点&#xff0c;检查哈希表中是否存在k-x即可。如果存在对应的元素&#xff0c;那么我们就可以在该树上找到两个节点的和为k&#xff1b;否…