前言
现有的RAG框架大多依赖100词左右的短段落作为检索单元——这种设计虽然看似精细,却让检索器在庞大的语料库中疲于奔命。搜索范围广、干扰项多,性能自然受到拖累。LongRAG框架提出了一种更聪明的解法:直接将检索单元拉长到最多4K词,从而将语料库规模从2200万骤降至60万。检索器负担大幅减轻,检索质量反而得到提升。

一、方法
LongRAG由两大核心组件构成:长检索器(Long Retriever)和长阅读器(Long Reader)。整体思路是通过加大检索单元的粒度,让检索与生成阶段的负载更加均衡,同时充分释放长上下文语言模型的潜力。
长检索单元:将整个文档或一批相关文档打包成一个检索单元,长度超过4K token。原始文档如果本身较长(如超过4K),则直接作为一个单元;较短的文档则依据相关性进行分组,合并成一个长单元。相关分组算法如下——核心逻辑是根据文档间的语义关联进行聚类,从而保留更多的上下文信号。
长检索器:它的任务并非找出最短最精确的那一个片段,而是在整个语料库中捞出相关的大块上下文。具体分为三步:形成长检索单元、相似性搜索、聚合结果。相似性搜索利用编码器将查询和检索单元映射到向量空间,通过点积计算相似度。聚合时,将前K个最相似的检索单元拼接起来,构成长上下文。
相似性搜索:编码器EQ将问题映射为d维向量,编码器EC将检索单元也映射为d维向量。问题与检索单元的相似度即为向量点积。由于检索单元较长,实际采用近似方法——取单元内所有片段得分的最大值来估算。
聚合检索结果:将前k个检索单元直接拼接成长上下文。
长阅读器:将聚合后的结果(约30K词)输入现有的长上下文LLM,零样本生成答案——整个过程无需训练。流程如下:
提示设计上采用两步提示法,目的是从长上下文中高效提取答案:
- 第一步:将问题与长检索结果拼接后直接输入长语言模型,不带任何示例。模型先生成一个较长的初步答案。
- 第二步:提供8个上下文示例,引导模型从长答案中提炼出最终的简洁答案。
- 输入:指令 + 问题 + 长检索结果。
- 初始答案生成:模型输出一个包含几句话的长答案。
- 答案精炼:通过二次提示,从长答案中提取精炼的最终答案。
二、实验
在基于维基百科的数据集上,LongRAG无需任何训练,就达到了与最先进的全训练RAG模型相当的性能。在非维基百科数据集上,它同样表现优异,显著优于传统RAG框架。
消融实验进一步验证了长检索单元和长阅读器的有效性。结果显示,检索单元的大小和阅读器变体对性能的影响十分明显。
总结
LongRAG通过引入长检索器和长阅读器,成功减轻了检索器的负担,同时提升了检索质量与全文问答的性能。在零训练条件下,它足以比肩经过充分训练的最优模型。简而言之,这是一种让检索与生成更加平衡的思路——值得深入研究与应用。
