RAG 原始论文(2020):检索增强生成是怎么来的
这篇 2020 年的 RAG 原始论文把维基百科稠密检索器(DPR)接到 BART 生成器上,在三个开放域问答任务上刷新当时最优,还能靠换索引直接更新模型知识、无需重训。
快速答案
RAG 是 2020 年 Facebook AI(FAIR)那篇为「检索增强生成」命名并给出干净配方的论文:一个参数化的 seq2seq 生成器(BART-large),以从非参数记忆中取回的段落为条件——这块记忆是覆盖 2100 万维基百科文本块的稠密向量索引,用 DPR 检索。端到端微调后,它在当时三个开放域问答基准上刷新最优,而且只要换掉索引就能更新模型「知道」的内容,完全不做梯度更新。今天几乎所有生产级 RAG 栈,都是这套设计的后代。
参数记忆 vs 非参数记忆
这篇论文真正留下来的,是它的概念框架。普通语言模型把事实存在权重里——这是参数记忆。它快,但不透明:你说不清答案从哪来,改一个事实就得重训。RAG 加了一块非参数记忆:一个可以读、可以引用、可以编辑的外部文本索引。生成器不再需要背下整个世界,而是学会怎么用取回的证据。这正是摘要点名要解决的两个老问题——给决策提供出处,以及更新世界知识——纯参数模型对这两点都处理得很笨拙。
RAG 如何检索与生成
管线有两个被训练的部件。检索器是 DPR:基于 BERT 的问题编码器把查询编码成向量,在维基索引上做最大内积搜索,返回 top-K 段落(论文取 K 约为 5 到 10)。生成器是 BART-large,读入查询加上一个取回的段落,逐 token 生成答案。取回的段落被当作隐变量做边际化处理,于是整个系统通过对生成器与问题编码器反向传播来训练,文档索引保持固定。
论文比较了两个变体。RAG-Sequence 一次性选定段落,整段输出都以同一组段落为条件;RAG-Token 可以为每个生成 token 关注不同段落,当答案需要拼接多篇文档的事实时更有用。生成任务上 RAG-Token 通常更强,问答上 RAG-Sequence 往往更简单也够打。
关键结果
- 开放域问答,发表时即最优: RAG 在 Natural Questions、TriviaQA、WebQuestions 三个开放域问答数据集上登顶,既超过纯参数 seq2seq 模型,也超过专门的「检索-抽取」式管线。值得注意的是它是生成答案而非抽取片段,却仍打赢了抽取式系统。
- 更真实、更具体、更多样的生成: 在开放式生成(如 Jeopardy 问题生成)上,人工评估认为 RAG 的输出比纯 BART 基线更真实、更具体,自动指标也显示更高的多样性。
- 知识可热插拔: 作者把维基索引换成另一个日期的版本,模型在新索引上正确回答了时效性问题——全程没有任何重训。这是论文里关于「非参数记忆为何重要」最干净的一次演示。
- 知识任务上幻觉更少: 把生成锚定在取回的段落上,显著减少了闭卷生成器那种「自信但答错」的失败。
为什么值得读这一篇
这是 RAG 的原始论文。哪怕今天这个词已经塌缩成「在大模型前面挂个向量库」,读它仍然值得。2020 年的版本比多数现代 RAG 栈都更严谨:检索器与生成器联合训练,检索是被边际化的隐变量,换知识那个实验是真正的消融而非演示。今天的生产级 RAG——切块、嵌入、top-K 搜索、塞进 prompt——只是它一个简化、免训练的远亲。如果你在搭 RAG 系统,这篇论文能告诉你哪些设计是有原则的(分离记忆、端到端训练),哪些是后来为了工程方便被砍掉的(联合训练、边际化)。我的判断是:业界留下了 RAG 的接口,却扔掉了它的训练信号——这恰恰是多数部署里检索质量成为瓶颈的原因。
局限与存疑
这套设置在一些要害处已经过时。生成器是 BART-large(约 4 亿参数),和今天的大模型比小得可怜,所以绝对分数远低于当前系统——要看的是思想,不是排行榜。检索被固定在某个 top-K,微调时索引冻结,模型无法从糟糕的检索器中翻身:DPR 漏掉相关段落,RAG 就没有可锚定的东西。只用维基百科也限制了领域。而论文赖以成立的那套优雅的端到端联合训练既昂贵又很少被复现——今天多数所谓「RAG」根本不联合训练检索器和生成器,这意味着边际化那套论证对它们并不成立。把检索联合训练重新塞回现代大模型到底划不划算,仍是悬而未决的问题。
常见问题
RAG 是什么的缩写,又是谁提出的?
RAG 是 retrieval-augmented generation(检索增强生成)的缩写。这个词和这套方法都来自 2020 年 Patrick Lewis 等人在 Facebook AI Research(现 Meta AI)的这篇论文。它把预训练的 seq2seq 生成器和一个针对外部文本索引的神经检索器结合起来。
原始 RAG 论文和现在的 RAG 有什么不同?
2020 年的 RAG 联合训练检索器与生成器,并把取回的文档当作被边际化的隐变量。现在的生产级 RAG 通常完全跳过训练:把文本块嵌入、跑 top-K 向量搜索、把结果粘进大模型的 prompt。接口一样,训练上的严谨度不一样。
RAG-Sequence 和 RAG-Token 有什么区别?
RAG-Sequence 让整段答案都以同一组取回段落为条件;RAG-Token 可以为每个输出 token 用不同段落,当答案要综合多篇文档的事实时更有利。生成任务上 RAG-Token 通常更强,RAG-Sequence 更简单、在问答上也很能打。
RAG 能不重训就更新知识吗?
能——这正是论文的招牌结论之一。因为知识存在非参数索引里,把维基索引换成更新的版本,模型就能正确回答时效性问题,无需任何梯度更新。这也是今天用 RAG 给大模型补充新鲜或私有知识的根本原因。
一句话:把模型「记得的」和它「能查的」分开,再训练它学会用证据,你就得到更真实、也更可编辑的答案。阅读 arXiv 原文。