全面解析RAG技术中重排序(Rerank)为何不可或缺
本文将深入探讨检索增强生成(RAG)中的核心环节——重排序(Rerank)。RAG技术自推出以来备受关注,尤其是与大语言模型(LLM)结合后,许多人一度以为能够轻松应对复杂的问答任务。然而现实并非如此。许多开发者在搭建完RAG流程后都会面临困惑:为什么实际效果远不如预期?
实际上,与大多数工具类似,RAG的入门门槛并不高,但要精通却绝非易事。它并非仅仅将文档存入向量数据库,然后简单对接一个LLM就能完美运行——某些场景下或许可行,但更多情况下会出现问题。那么,当现有流程效果不佳时,应该从何处着手?这里有一个最简单且能快速见效的解决方案——重排序(Rerank)。大多数问题往往就出在这个环节。
召回率与上下文窗口:RAG的瓶颈
在探讨解决方案之前,我们先分析传统RAG流程中的关键问题。在实际应用中,我们需要对海量文本文档进行语义搜索,文档数量从数万到数百亿不等。为确保检索速度,通常采用向量搜索——将文本转化为向量,放入同一向量空间,然后利用余弦相似度等指标与查询向量进行比较。
向量搜索的核心在于向量本身。这些向量将文本背后的“语义”压缩为低维向量(通常为768维或1024维)。然而,压缩过程必然导致信息丢失。因此经常出现这样的情况:向量搜索返回的前几篇文档中,遗漏了真正关键的信息,而这些信息恰好落在我们设定的top_k阈值之外。
如果那些排名靠后的文档能够帮助LLM生成更优质的答案,该怎么办?最直接的办法是增加返回文档数量(提高top_k),并将所有文档一股脑地传给LLM。这里涉及一个关键指标——召回率,它衡量“我们检索到了多少相关文档”。召回率不关注总量,理论上可以通过返回全部文档来达到完美。然而问题在于,你无法返回所有文档。
LLM能够接收的文本量存在限制,这个限制被称为上下文窗口。例如,Anthropic的Claude拥有高达100K Token的上下文,足以容纳几十页文本。那么,能否通过返回大量文档(尽管无法全部返回)并填满上下文窗口来提高召回率?答案是否定的——这会降低LLM的召回性能。注意,这里的LLM召回率与前面提到的检索召回率不同。研究表明,随着上下文窗口中放入更多标记,LLM的召回率会逐渐下降;当窗口被填满时,LLM甚至难以遵循指令。因此,填充上下文并不是一个好方法。
矛盾由此产生:增加向量数据库返回的文档数量能够提升检索召回率,但将所有文档传递给LLM会损害其召回率。如何解决?答案是:通过检索大量文档来最大化检索召回率,再通过最小化传递给LLM的文档数量来最大化LLM的召回率。要实现这一目标,就需要对检索到的文档进行重新排序,只保留最相关的部分。而承担这一任务的关键组件,正是重排序(Rerank)。
重排序(Rerank)的强大之处
重排序模型,也称为交叉编码器,它接收查询与文档对作为输入,输出一个相似度分数,从而根据相关性对文档进行重新排序。
现代检索系统通常采用两阶段策略。第一阶段,利用双编码器或稀疏嵌入模型从大规模数据集中快速筛选出一组候选文档,注重效率;第二阶段,Rerank模型登场,对候选文档进行更精细的重排序,提升最终结果的质量。搜索工程师在两阶段系统中使用Rerank已有多年,核心逻辑很简单:从大数据集中检索一小部分文档,速度远比直接对大量文档进行重排序要快。Rerank运行较慢,而检索器则非常迅速。
为什么采用两阶段检索?原因有三:
- 效率与精度的平衡:第一阶段使用高效模型快速筛选,第二阶段采用精细模型提升精度,两者相辅相成。
- 资源优化:直接对海量数据进行重排序,计算成本高昂且效率低下。两阶段方法先快速筛选出一小部分,再进行精细化处理,大幅降低资源消耗。
- 灵活性与扩展性:不同阶段可以使用不同模型和技术,例如第一阶段采用向量检索,第二阶段使用交叉编码器,根据实际需求灵活调整。
重排序模型在两阶段系统中扮演着关键角色——确保最终返回的文档数量适中,且相关性更高。其具体作用包括:提升相关性、优化上下文窗口(在有限的窗口中选择最相关的文档)、减少噪声(剔除第一阶段检索到但实际相关性较低的文档)。
为何需要使用重排序(Rerank)?
既然Rerank速度这么慢,为什么还要使用它?答案很简单:它比嵌入模型准确得多。
双编码器的局限性:
- 信息压缩导致的丢失:双编码器需要将文档的所有可能含义压缩成一个单一向量,在固定维度下必然导致信息丢失。例如,一个文档包含多个主题,压缩后只能保留平均含义。
- 缺乏查询上下文:文档的嵌入向量在查询之前就已创建,无法根据具体查询动态调整表示。同一个文档在不同查询下的相关性可能天差地别,但双编码器无法应对。
Rerank的优势:
- 直接处理原始信息:Rerank直接处理文档和查询原文,不依赖压缩后的向量,信息丢失少,能够更准确地评估相关性。例如,它可以分析具体的句子和段落,而不是依赖一个固定向量。
- 动态分析文档含义:由于Rerank在查询时运行,它能够根据具体查询动态提取文档中相关部分,而不是生成一个通用的平均含义。例如,一个文档包含多种主题,Rerank能精准定位与查询最匹配的部分。
Rerank的代价:时间。双编码器可以在100毫秒内完成4000万条记录的检索;而Rerank需要直接处理原始文档,计算复杂度高,速度较慢。例如,使用BERT这样的小型重排序模型,在V100 GPU上处理一个查询可能需要50多个小时(针对全量数据)。当然,在实际的两阶段系统中,它只处理第一阶段筛选出的小部分文档,因此总体时间可控。
总结
尽管Rerank模型运行速度较慢,但其在准确性上的优势使其在许多场景中不可或缺。通过两阶段检索系统,第一阶段快速筛选候选文档,第二阶段利用Rerank进行精细排序,既保证了效率,又显著提升了检索结果的质量。这种策略在处理复杂的问答和生成任务时尤为重要,能够确保最终返回的文档数量适中、相关性高,从而让LLM发挥出最佳性能。
