RAG 检索增强之 Reranker 重排序模型详解!
什么是Reranker模型?ReRanker模型是对RAG检索返回的结果进行重新排序的模型。也就是下图所示中2nd Retrieval的模型。具体来说,ReRanker模型在RAG Pipeline中扮演着第二阶段的角色,即在初始检索步骤之后,对检索出的文档块chunks进行重新排序,以确保相关的文档块优先被传递给LLM进行处理。
为什么需要Reranker模型?
在回答这个问题之前,我们先深入了解一下背后的问题。
RAG通过在大量文本文档中进行语义搜索来工作,这些文档数量可能达到数十亿。为了实现大规模搜索的快速响应,我们一般采用向量搜索技术,即将文本转化为向量后,放入一个向量空间内,通过余弦相似度等度量标准来比较它们与查询向量之间的相似度。
向量搜索的前提是需要向量。这些向量基本上是将文本背后的意义压缩成固定维度的向量(如768或1536维),这一过程不可避免地会导致信息丢失。因此,常常会发现,即便是排名靠前的文档,也可能会遗漏一些关键信息。
如果较低位置的文档包含了有助于LLM更好地形成回答的相关信息,这些信息就很容易被忽略。这该怎么办?一个简单的方法就是增加返回的文档数量,即增加top_k值,并将它们全部传递给LLM。
我们此处关注的指标是召回率,即“我们检索到了多少相关文档”。值得注意的是,召回率衡量的是系统能够找到的相关文档的比例,而不考虑检索到的文档总数。因此,理论上通过返回所有文档可以实现完美的召回率。
然而,这在实际操作中是不可行的,一是因为大语言模型(LLM)对输入文本量有一定的限制,我们称之为「上下文窗口」。即使像Anthropic 的 Claude这样的模型拥有高达100K Token的巨大上下文窗口,也不能无限制地增加输入文本量。二是当上下文窗口被过多的Token填满时,大语言模型的回忆能力和执行指令的效果都会受到影响。研究表明,过度填充上下文窗口会降低模型在该窗口中检索信息的能力,从而影响生成回答的质量。
为了解决召回率和LLM上下文窗口之间的矛盾,Reranker模型提供了一种有效的解决方案。具体步骤如下:
(1) 最大化检索召回率
在初始检索阶段,通过增加向量数据库返回的文档数量(即增加 top_k 值),可以提高检索的召回率。这意味着尽可能多地检索相关文档,确保不会遗漏任何可能有助于 LLM 形成高质量回答的信息。
(2) 重新排序并筛选最相关的文档
在第二阶段,使用 Reranker 模型对检索到的大量文档进行> 重新排序。Reranker 模型能够更精确地评估查询与文档的相> 关性,筛选出最相关的文档,并减少最终传递给 LLM 的文档> 数量。这一步骤的关键在于:
[*]重新排序:根据查询和文档的相关性分数对文档进行重新排序。
[*]筛选:只保留最相关的文档,确保这些文档在 LLM 的上下文窗口内。
(3) 确保 LLM 处理高质量信息
通过上述两步,Reranker 模型不仅提高了检索的召回率,还确保了传递给 LLM 的文档是最相关的。这使得 LLM 能够基于高质量的信息生成更准确、更有价值的回答,同时避免了上下文窗口过载的问题。
Reranker模型的原理
重排序模型(也被称为Cross-Encoder)是一种模型,能够针对一个查询和文档对,输出它们的相似度分数。我们利用这个分数对文档按照与查询的相关性进行重新排序。
其本质是一个包含两阶段的检索系统:
[*]第一阶段:快速检索(Vector DB或Bi-Encoder检索):使用双编码器(Bi-Encoder)或稀疏嵌入模型从大数据集中快速提取一组相关文档。这一阶段的核心目标是高效地缩小搜索范围,确保能够在短时间内处理大规模数据集。双编码器将查询和文档分别编码为向量,并通过余弦相似度等度量标准计算它们的相似性。
[*]第二阶段:精确重排序(Reranker / Cross-Encoder):使用重排序模型(Reranker)对第一阶段提取的文档进行重新排序。Reranker模型能够更精确地评估查询与文档的相关性,输出它们的相似度分数,并根据相似度分数对文档进行重新排序,返回最相关的前K个文档。这一阶段的目标是提高检索结果的相关性,确保最相关的文档优先传递给大语言模型(LLM)。
为什么采用两阶段策略?
是因为从大数据集中检索少量文档的速度远快于对大量文档进行重排序。简而言之,重排序器处理较慢,而检索器速度快。
尽管重排序器的处理速度较慢,但我们仍然选择使用它们,关键在于其精确度远超过嵌入模型。
双编码器(Bi-Encoder)精度较低的根本原因在于:
[*]双编码器将文档和查询分别编码为固定维度的向量(如768或1536维),这一过程不可避免地会导致信息丢失。文本的丰富语义被压缩成一个低维向量,无法完全保留原始文本的所有潜在含义。
[*]双编码器在用户提出查询之前就已经创建了嵌入,因此它对查询的具体内容一无所知。这意味着它只能生成一个泛化的、平均化的含义,而无法针对具体查询进行优化。这种静态的嵌入方式限制了其在处理复杂查询时的表现。
而重排序器(Reranker / Cross-Encoder)能够在大型Transformer中直接处理原始文本信息,避免了信息压缩带来的损失。它可以直接分析查询和文档的原始文本,确保所有相关信息都能被充分考虑。
然而,尽管重排序器具有更高的精度,但它也有代价,就是需要更多的时间来生成相似度分数。
因此在实际应用中,通常会结合两者优势,采用两阶段检索策略:
[*]第一阶段:使用双编码器快速检索出一批候选文档。
[*]第二阶段:使用重排序器对这批候选文档进行重新排序,确保最终返回的文档是最相关的。
这种组合方式既能保证检索的速度,又能提高结果的准确性。例如,在处理4000万条记录的情况下,如果仅使用重排序器,可能会需要超过50小时来返回一个查询结果;而使用双编码器和向量搜索,则可以在不到100毫秒内完成初步筛选。随后,再用重排序器对筛选出的少量文档进行精排,既提高了效率又保证了质量。
页:
[1]