稠密向量+稀疏向量+全文搜索+张量重排=最佳检索RAG?

RAG中的混合检索如下图:

为什么要混合搜索(multi-way recall)?

越来越多的人认为,仅仅依靠向量搜索,通常是密集向量,可能并不总是产生令人满意的结果。当用户的特定查询关键字与存储的数据不精确匹配时,这种限制就会变得明显。这是因为向量本身不能表示精确的语义信息:向量可以表示一个词、一个句子、一段话,甚至一整篇文章。虽然用于传达查询的“含义”,但这种表示是查询与上下文窗口中的其他文本同时发生的概率。因此,对于精确的查询来说,向量是不够的。例如,用户查询其公司 2024 年 3 月财务计划中的投资组合,可能会收到来自不同时间段的投资组合,同一时间段的营销或运营计划,甚至其他类型的数据。

因此,更有效的方法是使用基于关键字的全文搜索进行精确的召回,并使其与矢量搜索协同工作。这种全文和向量搜索的结合被称为双向查全或混合查全。

另一种方法是引入稀疏向量,将其与密集向量相结合进行混合搜索。与密集向量不同,稀疏向量不是语义的简化表示,而是作为全文搜索的替代方案,旨在全文搜索中对关键字进行修剪和扩展,并为倒排索引词汇表定义关键字权重。这使得一个文档可以用由修剪过的关键字组成的稀疏向量来表示。在下面的例子中,第一行表示一个密集向量;第二行是稀疏向量。稀疏向量的维数通常明显高于密集向

量,最高可达 3 万个维数。由于大多数维度没有值,因此可以使用位置-值对 “{position: value}”来表示稀疏向量中的每个加权维度。

(0.2, 0.3, 0.5, 0.7 ,...
...] [{ 331: 0.5}, {14136: 0.7}]

SPLADE是将文本转换为稀疏向量的最著名的代表性作品之一。它使用标准的预训练数据集从文档中删除冗余项并添加扩展项,从而创建 30,000 维的稀疏向量输出。

这里冗余项的删除类似于传统搜索引擎中看到的“停词删除”过程,即在索引构建过程中删除“The”和“a”等常见但非信息性词汇。这种做法也适用于其他语言的预处理,而不会影响检索效率。同样,扩展术语的添加类似于传统搜索引擎中看到的同义词等扩展技术。

实际上,任何文档都可以用 30,000 维 SPLADE 稀疏向量表示,每个维表示单词的权重。在典型的信息检索评价任务中,SPLADE 稀疏向量优于基于 BM25 排序的传统搜索引擎。最近一项使用 BGE M3 嵌入模型的研究验证了在典型的信息检索评估任务中,使用稀疏向量和密集向量的混合搜索远远超过了 BM25。

如果看起来密集向量+稀疏向量证明了多重查全(多路检索)更有效的解决方案,那么是否还需要全文搜索+密集向量呢?

为什么是三路检索?

尽管信息检索理论的发展为 RAG 提供了重要的支持,但它仍然面临着许多未解决的问题和技术挑战。稀疏向量通过预训练的模型消除了许多停词并扩展了术语。它们无疑在一般的查询任务中表现良好,但在现实场景中表现不佳。这是因为在生成稀疏向量的预训练模型中,仍然有许多查询关键字,如模型类型、缩写和行话,没有被涵盖。稀疏向量无法覆盖 3 万个维度的所有关键字,更不用说多语言的情况了。在需要短语查询的情况下,稀疏向量也会导致严重的信息丢失。事实上,这些任务应该通过全文搜索来实现。最近 IBM 的一篇研究论文比较了各种检索方法的组合,包括 BM25、密集向量、BM25 +密集向量、密集向量+稀疏向量、BM25 +密集向量+稀疏向量。研究表明,采用三路检索是 RAG 的最佳选择。

很容易理解为什么三路检索表现良好。密集向量传递语义信息,稀疏向量可以在数据与预训练数据相似的场景中更好地支持精确召回,全文搜索提供了跨各种场景的另一种更健壮的检索选项。然而,三路检索的使用增加了任何 RAG 解决方案的工程复杂性。如果这些检索不能在单个数据库中实现,用户将不得不将多个数据库集成到他们的数据管道中,从而阻碍了 RAG 的广泛采用。

例如,维护一个用于密集和稀疏向量搜索的矢量数据库,维护一个用于全文搜索

的 Elasticsearch,可能会给两个数据库之间的数据同步带来挑战。如果文档存在于一个存储中,但尚未同步到另一个存储,则查询会出错。然后,例如,用于元数据存储的额外 OLTP 数据库和用于存储文档的一些对象存储,将作为促进数据同步的临时解决方案引入,从而导致高度复杂的后端架构。

另一方面,Infinity 提供了卓越的效率和便利性,并为您省去了所有这些麻烦。它允许你在不牺牲 ACID 遵从性的情况下,将所有三种数据类型连同原始数据一起插入到单个数据库中,并在单个查询语句中完成三路检索。

如何进行重排序?

很明显,三方检索必须配合融合排名。Infinity 整合了各种融合排名算法:

1.RRF (Reciprocal Rank Fusion)算法的工作原理如下:对于来自每个检索路径的

检索列表中的每个文档,根据其排名位置分配一个分数。该分数通常是其排名的

倒数。例如,排名第一的文档得分为 1,排名第二的文档得分为 0.5,排名第三的文档得分为 0.33,以此类推。最后的文档分数是所有检索路径的分数之和。RRF算法因其鲁棒性而受到重视。其直接的性质使得这个排名不容易出现过拟合,使其能够适应各种用户场景,而不需要大量的参数调整。

2.简单加权融合:虽然 RRF 算法具有鲁棒性,但它只根据每个检索路径的排名来

分配分数,而忽略了检索中的相似度信息。简单加权融合适用于需要进一步控制的情况。例如,在“如何修理型号为 ADX-156 的故障机器?”,则需要调整关键字分数的权重。

3.使用外部模型重新排名:Infinity 原生支持基于 colbert 的重新排名,我们将在下面进一步解释。

Infinity 提供了强大的排名融合机制,为用户提供了多种选择,如下面的两个例子所示:

第一种方法是将 RRF 直接应用于三路检索的结果,然后返回最终结果。它的用法极其简单:

res = table_obj.output ([' * '])
.match_vector(“矢量”,(3.0,2.8,2.7,3.1),“浮动”,“知识产权”,1)
.match_sparse (sparse_vec,{“指数”:0,10,20,“值”:(0.1,0.2,0.3)},“浮动”,“知识产权”,1)
.match_text(标题,正文,“hello world”,topn = 10)
.fusion(rrf)
.to_pl ()

第二种方法是使用向量搜索和基于 colbert 的重排序,使用关键字全文搜索作为第二次检索,在返回最终结果之前计算两种检索路径的结果的加权和。

res = table_obj_output (['*'])
.match_vector('vec', [3.0, 2.8, 2.7, 3.1], 'float', 'ip', 1)
.match_sparse('sparse_vec', {"indices": [0,10,20],"values": [0.1, 0.2, 0.3]},'float', 'ip',

.fusion('match_tensor','column_name=t;search_tensor=[[0.0, -10.0, 0.0, 0.7], [9.2, 45.6, -55.8, 3.5]];tensor_data_type=float;match_method=MaxSim;topn=2')
.match_text('title, body','hello world','topn=10')
.fusion('weighted_sum', 'weights=0.8, 0.2')
.to_pl()

这些多路检索和排名融合机制使 Infinity 能够为 RAG 应用程序提供最强大、最友好的多路检索功能。除此之外,Infinity v0.2.0 还引入了 Tensor 数据类型。该数据类型不仅支持 ColBERT 融合重排序,而且可以作为一种新的检索策略独立运行。在计算机科学中,Tensor 相当于多个向量、多维数组或矩阵。那么,为什么要支持这种数据类型呢?在回答这个问题之前,让我们先讨论一下 ColBERT。

在“ColBERT: Efficient and effective passage search via contextualized late interaction overbert,SIGIR2020”中,ColBERT 作为排序模型被引入,

这是近四年来信息检索领域被引用最多的论文之一。根据这篇论文,主流的排名模型架构遵循这三种范式:

1.双编码器:例如,在基于 bert 的双编码器中,查询和文档分别编码,每个编码后面都有一个池化层来输出嵌入。这样一来,只需要计算两个嵌入之间的相似度就可以进行排序。双编码器可以同时应用于排序和重新排序阶段,但是,由于查询和文档是分开编码的,它无法捕获查询和文档token之间的交互(相关性)。

2.交叉编码器:该模型使用单个解码器对查询和文档进行编码,允许自己捕获它们之间复杂的交互,并产生更精确的排名结果。而不是输出查询和文档段落的嵌入,交叉编码器使用额外的分类器直接输出查询和文档段落之间的相似度评分。然而,由于它需要同时“处理”查询段落和文档段落的编码任务,因此交叉编码器在排序任务时通常非常慢,只适合对最终结果进行重新排序。

3.晚期互动模型:以 ColBERT 为例,它与其他排名模型的区别在于以下两个方面。首先,与交叉编码器不同,ColBERT 采用双编码器架构,使用两个独立的编码器分别对查询和文档进行编码。这种分离使得文档编码可以离线执行,查询编码可以在查询期间独家执行,因此编码速度比交叉编码器快得多。其次,双编码器通过池化层将多个嵌入转换为单个嵌入输出,相比之下,ColBERT 直接从其转换器的输出层输出多个嵌入,而不会造成语义损失。 第三, ColBERT 引入了MaxSim(最大相似度),这是一个后期交互相似度函数,用于排序。该函数计算

每个查询token嵌入与所有文档token嵌入之间的余弦相似度,跟踪每个查询token嵌入的最大分数,并计算出这些分数的总和,从而得到查询文档的总分数。例如,如下图所示,查询最多 32 个token和 128 个token的文档将需要 32x128 的相似度计算。相反,交叉编码器可以被称为早期交互模型,因为它们在编码阶段执行交互计算。

下图对比了所讨论的排序模型与全文搜索的效率和排序效果。图中的“Dense Encoder”可以作为法向量搜索的检索器和重新排序器。ColBERT 固有的后期交互机制允许它在排序过程中捕获复杂的查询-文档交互,同时实现显著更快的排序。 ColBERT 证明在可比数据规模下比交叉编码器效率高 100 倍以上,在效率和效果之间取得了良好的平衡。这些优点使 ColBERT 成为一个非常有前途的排名模型。

尽管具有优势,但 ColBERT 在实践中面临两个关键挑战:

1.虽然与交叉编码器相比,使用后期交互相似函数 MaxSim 显著提高了效率,

但 ColBERT 的计算成本比普通向量搜索高得多。ColBERT 中的相似性计算涉及多个向量,是法向量搜索的 MxN 倍,其中 M 为查询token的数量,N 为文档token

的数量。此外,原始 ColBERT 的排序结果与交叉编码器的排序结果并不完全相同。为了解决这些问题,ColBERT 的作者在 2021 年引入了 ColBERT v2。这个新版本采用交叉编码器预训练和模型蒸馏来提高生成嵌入的质量,同时使用压缩技术进行文档嵌入量化以提高 MaxSim 的计算效率。尽管基于 ColBERT v2 的项目 RAGatouille已经显示出作为高质量 RAG 问答解决方案的希望,但 ColBERT 仍然是一个库,并且不容易用于生产级端到端企

业 RAG 系统。

2.ColBERT 作为一个预训练模型,从搜索引擎的查询和检索结果中获得相对较小的训练集。它的token限制通常为查询 32,文档 128,这可能会导致实际应用中的文本截断,使其不太适合长文档检索。

由于上述原因,Infinity v0.2 引入了张量数据类型来本地支持端到端 ColBERT 解决方案。

首先,由于 ColBERT 的多个嵌入输出可以很好地拟合到一个张量中,因此通过计算张量之间的相似性可以很容易地计算出 MaxSim 分数。Infinity 提供了两种 MaxSim 评分方法。一种是二进制量化。这种方法将张量所需的空间减少到原始大小的 1/32,而不改变 MaxSim 分数排名。它主要用作重新排序器,根据前一阶段的排序结果检索张量。另一种是张量索引,使用 EMVB 实现。作为对 ColBERT v2 的改进,EMVB 通过量化、预滤波和关键操作的 SIMD 指令来加速性能。张量索引用作检索器,而不是重新排序器。现在 Infinity 为用户提供了多种多样的多路检索选项:他们可以使用张量进行语义搜索,以获得比普通向量搜索更高的排名质量;他们可以将全文搜索与张量相结合,以实现高质量 RAG 所需的双向检索;他们还可以将向量搜索与张量配对,前者用于大规模数据集的粗略排序,而 ColBERT 用于快速、精细的排序……

res = table_obj.output ([' * '])
.match_tensor(“t”,[(0.0,-10.0,0.0,0.7),(9.2,45.6,-55.8,3.5)],“浮动”,“maxsim”)
.match_text(标题,正文,“hello world”,topn = 10)
.fusion (weighted_sum,权重= 0.8,0.2)
.to_pl ()

其次,Infinity 引入了张量数组数据类型来处理超出token限制的长文档:

超过 ColBERT token限制的文档被分成多个段落,每个段落编码为一个张量,并与原始文档存储在同一行中。在计算 MaxSim 分数时,将查询与每个段落进行比较,最高分成为该文档的分数。

实际上,Infinity v0.2 引入了一个内置的张量数据类型来支持端到端 ColBERT 应用程序。这使得后期交互排名模型能够在大规模数据集上提供高质量的排名结果,这对 RAG 至关重要。

所有这些不同的检索方法都需要在真实数据集上进行评估,以评估其有效性。下面是 Infinity 在 MLDR 数据集(MTEB 使用的默认数据集之一)上的结果。MTEB是评估嵌入模型最权威的基准,其排行榜上排名靠前的模型主要基于交叉编码器。

上面的条形图表明,将 BM25 全文搜索与矢量搜索相结合,可以显著提高相对于纯矢量搜索的 nDCG 增益。混合 RAG采用全文、密集向量和稀疏向量搜索,优于纯向量和双向混合搜索。进一步将 ColBERT 作为重新排序器与这种三路混合方法相结合,可以产生更实质性的改进。与使用外部重新排序器(如顶级 MTEB 编码器)相比,将混合搜索与 ColBERT 重新排序器相结合,可以在数据库内进行重新排序,而且效率更高。这种方法允许在重新排名之前扩展 Top K 范围(例如,到 1000),在不影响性能的情况下确保高检索质量。因此,它为高检索混

合搜索提供了一种经济有效的解决方案。同样值得注意的是,相同的检索方法在不同的数据集上可能会有不同的表现。然而,可以肯定的是,采用的混合搜索技术越多,检索质量就越好。应该注意的是,这个基准测试不包括将张量索引作为排名器的组合。我们的实验表明,使用张量作为重新排序器明显更具成本效益,我们将在以后的文章中探讨这个主题。因此,我们推荐混合 RAG 结合 ColBERT 重新排序作为最优混合搜索解决方案。

翻译自:https://infiniflow.org/blog/bes

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值