RAG系统执行的初始检索步骤,通常会为了在语料库中实现速度和召回率优化,可能会返回范围上相关但并非总是最精确相关的文档。这一阶段会全面搜集信息,以确保不会遗漏潜在有用的内容。然而,这也可能引入噪声或不太相关的文档。将这种质量不一的集合直接提供给大型语言模型(LLM)可能会降低生成内容的质量;LLM可能会侧重于不太相关的细节,甚至生成不太准确的信息。在这种情况下,高级重排架构变得不可或缺。重排会对初始检索到的文档集进行第二次更细致的处理。它采用计算密集型且复杂的模型,根据这些候选文档与用户查询的精确相关性进行评分和重新排序。目标从广泛召回转变为高准确率,确保最终传递给LLM的文档是最相关且能最好地支持生成任务。两阶段检索方法高级RAG系统中有效的检索通常遵循两阶段流程:候选生成(第一阶段): 一种快速检索器,例如BM25、密集向量搜索(双编码器)或混合方法,扫描整个文档集合。它返回一个候选文档列表,通常为50-100个。这一阶段旨在提高速度并最大化包含相关文档的几率(高召回率)。重排(第二阶段): 一个更强大但通常较慢的重排模型,精心检查这组较小的前N个候选文档。它对每个查询-文档对进行更详细的分析,分配更准确的相关性分数。从这个重新排序的列表中,只选择前K个文档(例如3-5个)作为上下文传递给LLM。digraph G { rankdir=LR; graph [bgcolor="transparent"]; node [shape=box, style="rounded,filled", fontname="Arial", fontsize=10, margin="0.2,0.1", fillcolor="#e9ecef"]; edge [fontname="Arial", fontsize=9, color="#495057"]; subgraph cluster_initial_retrieval { label = "第一阶段:候选生成"; style="rounded"; bgcolor="#f8f9fa"; query [label="用户查询", fillcolor="#a5d8ff"]; retriever [label="初始检索器\n(例如,密集型、混合型)", peripheries=1, fillcolor="#74c0fc"]; candidates [label="前N个候选文档\n(例如,N=100)", shape=note, fillcolor="#dee2e6"]; query -> retriever; retriever -> candidates [label=" 侧重召回 ", fontsize=8, fontcolor="#339af0"]; } subgraph cluster_reranking { label = "第二阶段:重排"; style="rounded"; bgcolor="#f8f9fa"; reranker [label="重排模型\n(例如,交叉编码器)", peripheries=1, fillcolor="#b197fc"]; reranked_docs [label="前K个重排文档\n(例如,K=5)", shape=note, fillcolor="#dee2e6"]; reranker -> reranked_docs [label=" 侧重准确率 ", fontsize=8, fontcolor="#7048e8"]; } llm [label="LLM生成器", peripheries=1, fillcolor="#96f2d7"]; answer [label="生成的答案", fillcolor="#c3fae8"]; candidates -> reranker; query_to_reranker_edge [style=invis]; query -> query_to_reranker_edge [style=invis]; query_to_reranker_edge -> reranker [label=" 查询上下文 ", style=dashed, arrowhead=open, constraint=true, color="#495057", fontsize=8]; reranked_docs -> llm; llm -> answer; }一个典型的两阶段检索流程。初始检索器快速将大型语料库缩小到一组可管理的候选文档。重排器随后细致地优化此集合以获得最高相关性,然后将上下文传递给LLM。实施重排时的主要权衡点是在计算成本与相关性提升之间取得平衡。更强大的重排器通常能提供更出色的结果,但也会增加延迟和资源需求。主要的重排架构让我们了解一些常见的重排架构,它们在生产环境RAG系统中得到使用。1. 交叉编码器交叉编码器是目前重排任务中最有效的模型之一。与双编码器不同,双编码器在密集检索中很常见,它们在比较之前(例如通过点积)为查询和文档生成单独的向量嵌入;而交叉编码器会同时处理查询和文档。工作原理: 典型的交叉编码器会将查询文本和文档文本连接起来,通常使用一个特殊的、例如 [SEP] 的分隔符。这个组合输入序列,例如 [CLS] query_text [SEP] document_text [SEP],随后被送入一个Transformer模型(例如BERT、RoBERTa)。模型对应于 [CLS] 令牌的输出(或所有输出令牌的池化表示)随后通过一个线性层。这一层会生成一个单一的分数,通常是一个logit值,代表该特定文档与给定查询的相关性。优点:高准确率: 通过Transformer的自注意力机制实现查询和文档之间深度的、令牌级别的交互,交叉编码器可以捕捉到语义上的细微联系、上下文中的词语重要性,以及双编码器可能忽略的其他细致的相关性信号。最优性能: 对于许多重排基准测试,特别是涉及段落排名的(如MS MARCO),交叉编码器模型通常能获得领先的性能。缺点:计算成本: 主要缺点是它们的计算强度高。由于每个查询-文档对都必须通过整个Transformer架构进行处理,交叉编码器显著慢于双编码器。这使得它们不适用于对大型语料库(数百万或数十亿文档)进行第一阶段检索。它们的用例通常限于对由初始、更快速检索阶段返回的相对较小的候选文档集(例如前10到100个)进行重排。无预计算文档表示: 与双编码器不同,双编码器可以预计算文档嵌入并进行索引以进行快速相似性搜索;交叉编码器需要在查询时对每个待重排的候选文档进行完整的计算。常见实现: 在以相关性为目标的任务上微调的Transformer模型,例如 BERT-base 或 BERT-large,是很受欢迎的选择。例如,在MS MARCO(段落排名)等数据集上微调的模型被广泛使用。Sentence Transformers 或 Hugging Face Transformers 等库提供了预训练的交叉编码器模型及其应用的便捷接口。示例应用场景: 设想一个初始的密集检索器为某个查询返回了50个候选文档。一个基于BERT的交叉编码器随后会单独处理这50个查询-文档对,生成50个相关性分数。然后根据这些分数对文档进行重新排序,并选择前3-5个文档包含在LLM的提示中。2. 排序学习(LTR)模型排序学习(LTR)是信息检索中一个成熟的分支,它应用机器学习技术来优化列表中项目的排序。在RAG重排的背景下,LTR模型可以被训练来根据比单一密集检索器或交叉编码器相似性分数更丰富、更多样化的特征集对文档进行排序。工作原理: LTR模型通常通过为每个查询-文档对获取一个特征向量来运作,并预测相关性分数或排名。这些特征可以非常多样化:初始检索器的分数: 例如,BM25分数,来自密集向量搜索的余弦相似度。词汇特征: 词语重叠度量(例如,单元词、二元词计数)、TF-IDF分数、Jaccard相似度。语义特征: 来自其他(可能更轻量级)神经网络模型的相似性分数,或从知识图谱中提取的特征。文档特征: 文档长度、时新性、感知到的权威性(例如,适用的PageRank类分数)、命名实体数量。查询特征: 查询长度、查询类型(例如,基于关键词与自然语言问题)、歧义度量。常见的LTR算法根据其方法分类:逐点法: 这些模型独立处理每个文档,预测其绝对相关性分数(作为回归问题)或将其分类到相关性类别(例如,“高度相关”、“有些相关”、“不相关”)。示例包括逻辑回归或适用于回归的SVM。成对法: 这些模型对给定查询的文档进行配对,并预测配对中哪个文档更相关。训练目标是最小化错序的配对。RankSVM和LambdaMART常用于此模式。列表法: 这些模型直接优化与查询关联的整个文档列表的排名指标(如NDCG或MAP)。它们考虑列表中所有文档的相互依赖性和相对位置。LambdaMART和AdaRank是其示例。梯度提升决策树(GBDT),特别是像LambdaMART这样的算法,已被证明是非常有效的LTR模型,并被许多商业搜索引擎所采用。优点:特征丰富性: LTR模型可以整合多种信号,结合不同检索方法、文档特点和查询属性的优势。技术成熟: LTR领域已得到充分理解,并有强大的开源实现可用(例如XGBoost、LightGBM、TensorFlow Ranking)。高效(相对): 一旦训练完成,像GBDT这样的LTR模型在推理时相对较快,特别是与大型交叉编码器模型相比,前提是特征提取也高效。缺点:特征工程: LTR模型的性能在很大程度上取决于所设计特征的质量和相关性。设计和选择有效的特征可能是一个复杂且耗时的过程。训练数据复杂性: LTR模型需要带有相关性判断的标注数据。对于成对和列表方法,这些判断通常需要捕捉给定查询的文档之间的相对偏好,这比收集简单的逐点标注更复杂。3. 轻量级交互模型(例如,ColBERT风格的后期交互)尽管完整的交叉编码器在查询和文档令牌之间提供了最大的交互,某些模型架构旨在平衡双编码器的效率和交叉编码器的有效性。ColBERT(基于BERT的上下文后期交互)是这一领域的一个显著例子。尽管由于其执行可扩展的第一遍检索的能力,它通常被归类为高级检索器,但其核心的“后期交互”机制可以被视为一种高效、细致的重排形式,或者是一个已经融入重排原则的非常复杂的首遍检索器。ColBERT的工作原理(为重排上下文简化):查询编码: 查询由一个类似BERT的编码器处理,为其每个令牌生成一组上下文嵌入。文档编码(离线): 同样,语料库中的每个文档都会进行预处理。对于文档中的每个令牌,都会生成并存储一个上下文嵌入。这通常是离线完成的。后期交互(在线): 在查询时,对于每个候选文档(无论是来自非常粗略的初始过滤器,还是如果ColBERT是主要检索器则为所有文档),ColBERT会执行“后期交互”。这包括计算每个查询令牌嵌入与文档所有令牌嵌入之间的最大相似度。然后将这些最大相似度分数求和,以生成查询-文档对的最终相关性分数。 $Score(Q, D) = \sum_{i \in Q} \max_{j \in D} (q_i \cdot d_j^T)$。重排(或作为强大的首遍检索器)的优点:更细致的相关性: 通过考虑令牌级别的交互,ColBERT可以捕获比标准密集向量点积(每个文档/查询只操作一个向量)更详细的相关性信号。比交叉编码器更高效: 后期交互(最大相似度之和)在计算上显著低于作用于连接的查询-文档文本的交叉编码器中的完整自注意力机制。文档令牌嵌入可以预计算。缺点(如果纯粹作为针对非常小的候选集进行的第二阶段重排器使用):如果一个快速的初始检索器已经提供了一个非常小且高质量的候选集(例如少于10个文档),那么将ColBERT作为第二阶段重排器所增加的复杂性,相比于完整的交叉编码器,可能收益递减。其主要的架构优势在于其能够将细致的相关性计算扩展到更大的候选集,甚至用于第一阶段检索的整个语料库。重排器的实现与训练在生产RAG系统中成功部署重排器,需要仔细考虑训练数据、待处理的候选文档数量以及与整体流程的整合。训练数据: 重排器的质量与其训练数据的质量息息相关。这些数据通常由 (查询, 文档, 相关性标签) 格式的元组组成。相关性标签: 它们可以是二元的(例如,0表示不相关,1表示相关)或分级的(例如,从0到4的刻度表示相关性递增)。数据来源:公开数据集: 像MS MARCO(段落和文档排名)、TREC集合或BEIR数据集等标准基准测试提供了有用的标注数据。人工标注: 雇佣人工标注者来判断给定查询的文档相关性通常是质量的黄金标准,尽管这可能成本高昂且耗时。点击日志: 用户交互,例如点击搜索结果,可以作为隐式积极反馈。然而,点击数据可能存在噪声(例如,用户可能出于好奇点击不相关的结果)。LLM生成的数据: 使用强大的LLM(例如GPT-4)生成相关性分数,甚至合成查询-文档对进行训练。这种方法需要仔细验证,因为LLM自身的偏见或事实不准确性可能会被重排器学习到。难负例: 为了训练有效的重排器,特别是交叉编码器和LTR模型,在训练集中包含“难负例”是很重要的。难负例是指那些由较弱的第一阶段检索器(如BM25或基本双编码器)检索到的文档,它们可能表面上看起来合理或与查询共享关键词,但最终是不相关或比正例相关性更低的。这些有助于重排器学习进行更精细的区分并提升其判别能力。待重排的候选文档数量($N$): 选择从第一阶段检索器传递给重排器的文档数量($N$)是一个重要的调整参数,它会影响性能和延迟。如果$N$过小,相关文档可能在到达重排器之前就被过滤掉。重排器无法改进它未曾处理的内容。如果$N$过大,重排步骤可能成为一个显著的延迟瓶颈,尤其是在使用计算密集型模型(如交叉编码器)时。 在生产系统中,$N$的常见取值范围是20到200,取决于重排器的推理速度、RAG系统的整体延迟预算以及第一阶段检索器的召回特性。传递给LLM的文档数量($K$): 重排后,您会选择前$K$个文档作为上下文提供给LLM。$K$的选择取决于多种因素,例如LLM的最大上下文窗口大小、生成答案所需的详细程度、LLM推理的成本(通常更多令牌意味着更高成本和延迟),以及文档本身的详细程度。通常情况下,$K$是一个较小的数字,通常在1到5之间。目标是提供足够且高度相关的上下文,而不会使LLM负担过重或产生不必要的成本。RAG系统中重排的优势将复杂的重排阶段集成到您的RAG流程中,提供了多项显著的优势:提高上下文相关性: 这是最直接的优势。通过确保提供给LLM的文档与查询高度相关且精确匹配,LLM拥有更优质的源材料可供处理。增强事实准确性: 获得更准确且相关的上下文后,LLM更不容易“幻觉”或生成事实不正确的陈述。它可以更牢固地将其回应基于所提供的证据。更简洁和集中的答案: 高度相关的上下文有助于LLM生成与用户查询直接相关的答案,避免不相关的离题内容或过于宽泛的信息。减少LLM的噪声: 上下文中不相关或低质量的文档可能会成为噪声,可能使LLM困惑或误导它。重排有效过滤掉这些噪声。更好的用户体验: 最终,更准确、相关和可靠的答案会为RAG应用程序的终端用户带来更满意和值得信赖的体验。尽管增加重排阶段会给RAG流程带来额外的计算开销和复杂性,但输出质量的显著提升通常证明这项投入是值得的。对于生成信息准确性、可靠性和可信度很重要的生产系统来说,尤其如此。特定重排架构的选择将取决于您的RAG系统的具体需求,涵盖延迟限制、可用的计算预算以及所需的相关性精确度。关于实现和评估这些技术的实践经验将在本章后续的“动手实践:实现和评估高级重排”部分中介绍。