现有的RAG框架通常使用100词的短段落作为检索单元,这种设计使得检索器需要在大量语料库中搜索,增加了工作负担,并且容易引入难负样本,影响性能。LongRAG框架为了解决这一问题,该框架使用长检索单元(最多4K词),显著减少了语料库的大小(从22M减少到600K),从而减轻了检索器的负担,并提高了检索性能。
一、方法LongRAG框架由两个主要组件构成:长检索器(Long Retriever)和长阅读器(Long Reader)。LongRAG框架的目标是通过使用长检索单元来平衡检索器和阅读器之间的工作负载,并利用长上下文语言模型的能力。
长检索单元:LongRAG框架通过组合整个文档或相关文档组来形成长检索单元,这些单元的长度超过4K个token。如果原始文档已经很长(例如超过4K个令牌),则将其视为一个单一的检索单元。对于较短的文档,则通过相关文档分组来形成单个检索单元。下面是一种用于将多个短文档分组以形成长检索单元的算法:
算法的核心思想是根据文档之间的相关性将它们分组,以便在长检索单元中保留更多的上下文信息。
长检索器:长检索器的任务是在整个语料库中搜索相关的上下文信息,而不是寻找精确的细粒度短上下文。检索过程分为三个步骤:形成长检索单元、相似性搜索和聚合检索结果。相似性搜索使用编码器将查询和检索单元映射到向量空间,并通过点积计算它们之间的相似性。聚合检索结果时,将前K个最相似的检索单元连接起来作为长上下文。相似性搜索:使用编码器EQ(·)将输入问题映射到d维向量,使用另一个编码器EC(·)将检索单元映射到d维向量。定义问题和检索单元之间的相似性为向量的点积:由于g的长度较长,采用近似方法(通过最大化检索单元内所有片段的得分来近似):
聚合检索结果:将前k个检索单元连接成长上下文作为检索结果:长阅读器:长阅读器将检索到的结果(约30K词)输入现有的长上下文LLM中进行零样本答案生成。不需要任何训练,流程如下:提示设计:为了有效地从长上下文中提取答案,长阅读器采用了两步提示法:
提示词模版
第一步提示:将问题和长检索结果拼接后输入到长语言模型中,不使用任何上下文示例。长语言模型生成一个较长的初步答案。第二步提示:使用8个上下文示例来引导长语言模型从长答案中提取最终的简短答案。a. 输入:将相关指令、问题和长检索结果输入到长语言模型中。
b. 初始答案生成:长语言模型首先生成一个较长的答案,这个答案通常包含几句话。
c. 答案精炼:通过进一步的提示,长语言模型从初始的长答案中提取出最终的简短答案。
二、实验在基于维基百科的数据集上,LongRAG框架在不进行任何训练的情况下,达到了与最先进的全训练RAG模型相当的性能。在非基于维基百科的数据集上,LongRAG框架也表现出色,显著优于传统的RAG框架。
消融实验,验证了长检索单元和长阅读器在提高性能方面的有效性。发现检索单元大小和阅读器变体对性能有显著影响。
总结LongRAG框架通过引入长检索器和长阅读器,减轻了检索器的负担,提高了检索质量和全文问答性能。该框架在不进行任何训练的情况下,达到了与最先进的全训练RAG模型相当的性能。总的来说,LongRAG是一种检索和生成平衡的方法,供参考。