改进 Elastic Stack 的信息检索功能:混合检索

info-retrieval-blog-720x420-v1.jpeg

上一篇博文中,我们介绍了 Elastic Learned Sparse EncodeR (ELSER),这是一种经过训练、可有效进行零样本文本检索的模型。此外,Elasticsearch® 还具有强大的词汇检索功能和丰富的工具来组合不同查询的结果。在这篇博文中,我们将介绍混合检索的概念,并探索 Elasticsearch 中的两种具体实现方法。具体而言,我们将探索如何通过使用倒数排序融合和加权分数总和将 Elastic Learned Sparse EncodeR 与 BM25 结合使用,以提高 Elastic Learned Sparse EncodeR 的性能。

此外,我们还将讨论为探索一些常规性研究问题而进行的实验。这些问题包括如何以最有效的方式对倒数排序融合进行参数化,以及如何校准加权分数总和。

Video thumbnail

混合检索

尽管现代训练管道生成的检索器模型在零样本场景中具有良好的性能,但众所周知,词汇检索器(如 BM25)和语义检索器(如 ELSER)在某种程度上是互补的。具体来说,如果假设检索到的相关文档之间的匹配次数多于检索到的不相关文档之间的匹配次数,那么将各检索方法的结果结合起来就能提高相关性。

对于所用检索机制截然不同的方法来说,这一假设是合理的,因为对于大多数查询和语料库来说,不相关文档要比相关文档多得多。如果检索相关文档和不相关文档的方法是独立和均匀随机的,那么这种不平衡就意味着相关文档比不相关文档匹配的可能性更大。为了验证这一假设,我们在 ELSER、BM25 和各种稠密检索器之间进行了一些重叠测量,如表 1 所示。这为使用所谓的混合搜索提供了一些理论基础。下面我们将探究混合搜索的两种显式实现方法。

表 1:三种检索器的重叠系数
表 1:针对 ArguAna 中前 1000 个文档,三种检索器与 ELSER 的重叠系数比较

倒数排序融合

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

倒数排序融合

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

提出倒数排序融合的论文建议 k 值为 60,但没有讨论要检索多少个文档 N。显然,增加 N 会影响排序质量,同时任何一种方法的 recall@N 都在增加。从定性角度看,k 越大,排名靠后的文档对最终排序越重要。但是,对于现代词汇语义混合检索来说,k 和 N 的最优值是什么并不是事先明确的。此外,我们还想了解结果对这些参数选择的敏感度,以及最优值是否在数据集和模型之间具有普遍性。这对于在零样本环境中对方法有信心非常重要。

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

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

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

此外,我们还想看看是否可以使用倒数排序融合来改进 ELSER 在零样本环境中的性能。BEIR 基准测试的结果请见表 3。

NDCG@10 比较
表 3:在 k=20 和 N=1000 条件下,BM25(使用 Elasticsearch 8.8 和默认英语分析器)、BM25 和 ELSER(通过 RRF 组合)之间的 NDCG@10 比较

与单用 ELSER 相比,倒数排序融合的平均 NDCG@10 提高 1.4%;与单用 BM25 相比,提高 18%。此外,重要的是,在所有测试数据集中,结果都优于或类似于单用 BM25。无需进行模型调优、训练数据集,也不必进行特定校准,即可实现排序改进。唯一的缺点是,由于两个查询是在 Elasticsearch 中顺序执行的,因此当前查询延迟会有所增加。而 BM25 检索通常比语义检索更快,这就缓解了这一问题。

我们的研究结果表明,倒数排序融合可以安全地用作一种有效的“即插即用”策略。此外,也有必要审视一下在您自己的数据上使用 BM25、ELSER 以及它们的排序融合所获得的结果质量。如果要在 BEIR 套件中的每个单独数据集上选择性能最佳的方法,平均 NDCG@10 会分别比单用 ELSER 和 BM25 提高 3% 和 20%。

作为这项工作的一部分,我们还执行了一些简单的查询分类,以区分关键字和自然问题搜索。这样做的目的是为了尽可能了解导致给定方法表现最佳的机制。到目前为止,我们还没有一个明确的解释,并计划对此做进一步的探索。不过,我们确实发现,当两种方法的总体准确率相似时,混合搜索的性能非常突出。

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

加权分数总和

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

加权分数总和

其中 α 为模型得分权重,取值范围介于 0 到 1 之间。

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

获取人工标注数据的成本很高,因此了解需要收集多少数据才能确信优于倒数排序融合 (RRF) 是非常有用的。图 1 显示了 BM25 和 ELSER 分数线性组合的 NDCG@10 与 ArguAna 数据集的注释查询数量的函数关系。同时,图中还给出了 BM25、ELSER 和 RRF NDCG@10 以供参考。这种曲线在数据集中很典型。在这个实验中,我们发现使用大约 40 个注释查询就有可能超过 RRF,尽管不同数据集的确切阈值略有不同。

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

我们同时还观察到,在不同数据集(见图 2)和不同检索模型中,最佳权重都存在很大差异。即使在对分数进行归一化处理后,情况也是如此。之所以会出现这种情况,是因为最佳组合将取决于各个方法在给定数据集上的执行情况。

为了探索零样本参数化的可能性,我们尝试为基准集中的所有数据集都选择单一权重 α。尽管我们为此使用了相同的监督方法,但这次选择的权重是为了优化全套数据集的平均 NDCG@10,我们认为数据集之间存在足够的差异,因此我们的研究结果可能代表了零样本性能。 

总之,这种方法产生的平均 NDCG@10 优于 RRF。不过,我们也发现这个结果不如 RRF 一致,我们要强调的是,最优权重是特定于模型的。因此,即使针对特定模型进行了校准,我们也不太相信这个方法能适用新的环境。在我们看来,线性组合不是一种“即插即用”的方法。相反,我们认为重要的是,在您自己的数据集上仔细评估组合的表现,以确定最优设置。但是,正如我们将在下文看到的,如果校准得当,就会产生非常好的结果。

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

归一化对于比较不同数据集和模型之间的分数至关重要,因为如果不进行归一化处理,分数可能会有很大差异。要做到这一点并不容易,尤其是对 Okapi BM25 来说,在进行查询之前分数范围是未知的。稠密模型的分数更容易进行归一化,因为它们的矢量可以进行归一化处理。不过,值得注意的是,一些稠密模型是在未进行归一化处理的情况下训练的,因此使用点积时可能会有更好的性能。

ELSER 经过训练,可以复制跨编码器的分数间隔。我们通常会看到它产生的分数范围在 0 到 20 之间,尽管不能保证这一点。一般来说,查询历史记录及其前 N 个文档分数可用于近似分布和归一化任何具有最小和最大估计值的评分函数。我们注意到,采用非线性归一化可能有助于改进线性组合,比如当存在分数异常值时,不过我们并未对此进行过测试。

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

Elastic Learned Sparse Encoder
表 4:BM25(使用 Elasticsearch 8.8 和默认英语分析器)、ELSER、RRF(k=20,前 N 文档数=1000)和线性组合(已优化评估数据)之间的 NDCG@10 的比较

结论

我们发现,可以结合使用不同的检索方法来提高它们的性能,尤其是词汇检索和语义检索是可以相互补充的。我们探索的一种方法是倒数排序融合。这是一种简单的方法,通常不需要任何人工标注数据,也不需要事先了解分数分布情况,就能获得良好的结果。此外,我们发现这个方法的性能特征在各种模型和数据集之间非常稳定,因此我们相信,我们所观察到的结果也将能够在其他数据集上获得。

另一种方法是加权分数总和,这种方法的设置比较麻烦,但在我们的实验中,只要设置正确,就能获得非常好的排序。要使用这种方法,需要对分数进行归一化处理,对于 BM25 来说,这需要典型查询的分数分布;此外,还需要使用一些带注释的数据来训练方法权重。

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

请查看本信息检索系列的其他文章:

本博文所描述的任何特性或功能的发布及上市时间均由 Elastic 自行决定。当前尚未发布的任何特性或功能可能无法按时提供或根本不会提供。