正在翻开……

先查资料,再回答:RAG

Lewis, Perez, Piktus, Petroni, Karpukhin, Goyal, Küttler, Lewis, Yih, Rocktäschel, Riedel, Kiela · Facebook AI Research · NeurIPS 2020 · arXiv:2005.11401

这篇论文的名字读起来像绕口令:检索增强生成(Retrieval-Augmented Generation,简称 RAG)。它还带着一串配件名——DPR、参数化记忆、边缘化。你一个都不用记。你只需要回想一种熟悉的冲动:考试的时候,特别想翻书。这篇论文干的事,就是光明正大地让 AI 翻书。开始之前,请你先参加一场考试——闭卷的。

先当一次闭卷考生

1911 年,《蒙娜丽莎》从卢浮宫失窃,整整两年下落不明——这是艺术史上最有名的盗窃案。现在考你一道题:偷画的人,案发前是干什么的?别去搜,这是闭卷考试。凭感觉,点一个你觉得最像的答案

闭卷考试进行中 · 凭感觉押一个
这个案子后来怎么样了?(纯彩蛋,和论文无关)

佩鲁贾在意大利受审,刑期很短——不少意大利人真把他当成了让国宝回家的爱国者。《蒙娜丽莎》在意大利短暂巡展后,于 1914 年初回到卢浮宫。讽刺的是,正是这桩失窃案让它从「卢浮宫众多名作之一」变成了「全世界最有名的一幅画」:失窃那两年,来看空墙的人比从前来看画的还多。你在第 4 节还会遇到这个细节——以一种意想不到的方式。

它的记忆是烤进脑子里的

语言模型训练时确实读过维基百科,但训练一结束,那些文章一个字都不在它身上了。留下的只有几亿个数字——权重。打个比方:它把整座图书馆通读了一遍,然后一把火烧掉,只留下脑中的印象。论文管这叫参数化记忆(parametric memory,白话:烤进权重里的记忆)。

印象这种东西有三个毛病:会过时——烤好之后世界还在变,它不知道;无法指认出处——你没法揪着一团印象问「你从哪本书看来的」;模糊处自动补全——印象缺角的地方,它会用「像不像」补齐,也就是编。记住这三个毛病,后面每一节都在跟其中一个算账。

空口无凭。左边是一个纯闭卷的模型,右边是同款模型接上了书架。同一个问题,先读两边的回答,再分别点「追问:你的依据?」

闭卷 · 纯生成
问:1911 年谁偷走了《蒙娜丽莎》?
「案犯是画商阿尔弗雷多·杰里。他趁闭馆日潜入卢浮宫,把画藏在大衣下带了出去。」
开卷 · 检索增强
问:1911 年谁偷走了《蒙娜丽莎》?
「案犯是文森佐·佩鲁贾,一名曾受雇于卢浮宫的玻璃匠。」
同一个问题 · 两种记忆 · 追问出处见分晓

然而书架有个致命的前提:两千多万段文本,你得在几十毫秒之内翻到相关的那几段。一页一页读过去是不可能的。怎么翻?

不读书的图书管理员

靠一位从来不读书的图书管理员。论文用的检索器叫 DPR(Dense Passage Retrieval,稠密段落检索——白话:把意思变成坐标)。它不做关键词匹配,而是提前把每段文档压成一串数字,相当于在一张「意义地图」上给它分配一个住址:讲名画失窃的文档们住在同一个街区,讲绘画技法的住在另一个街区,讲意大利面的住在城郊。你的问题来了,也被压成同一张地图上的一个点。然后事情简单得让人失望:捞出离问题最近的 k 段文档,完事。管理员不需要读懂任何一本书,它只量距离。

拖动滑块改变 k,看这一网下去捞上来什么:

k = 3(捞回最近的 3 段)
k=3 · 资料甲乙丙一网打尽——刚刚好

把滑块拖到最左:k=1 只捞到资料甲,凶手名字有了,但作案手法和结局全缺。k=3 正好甲乙丙齐活。再往右拖,圈里开始进来《达芬奇生平》《卢浮宫馆史》——不算错,但生成器得分心读完这些不相干的段落。k 是一个权衡:太小会漏,太大会浑。论文的选择是每次取 5 到 10 段。

还有个细节请记住:《呐喊》失窃案离你的问题也很近——同样是名画被盗,在意义地图上它就住在隔壁。量距离的管理员分不清「同一个案子」和「同一类案子」。这条伏笔,第 7 节回收。

管理员的真实算术?(可跳过,不影响后面)

「压成坐标」由两个 BERT 编码器完成,一个管问题、一个管文档,各自输出一个 768 维向量——所以真实的意义地图不是本图的二维,而是 768 维。「近」用内积衡量;两千万段文档的最近邻搜索靠 FAISS 索引做到亚线性时间(MIPS,最大内积搜索),这就是几十毫秒的来历。DPR 的训练方式很直白:让「问题—含答案的段落」这样的配对在地图上互相靠近,不相干的对互相远离。RAG 训练时,问题编码器和生成器一起端到端微调,文档编码器保持冻结——不然每一步都得给两千万段文档重新分配住址。

资料捞回来了,但只是摊在桌上。生成器怎么把三段文本变成一句有据可查的回答?

照着资料写,句句有出处

这一步几乎是本能。生成器(论文用的是 BART,一个擅长写句子的模型)把「问题+捞回的资料」一起读进去,然后一个词一个词地写答案——每写一个词,眼睛都同时瞟着桌上那几段资料。和你开卷考试一模一样:答案是你自己组织的话,但每一句都踩在资料上。既然每一句都踩在资料上,我们就可以反过来问:这一句,踩的是哪一段?点答案里的任何一句话,看它的出处亮起来:

问:1911 年谁偷走了《蒙娜丽莎》?后来怎么样了?

提示:前三句的下划线各有颜色,第四句的下划线是灰的——先点前三句,最后点它。

点击答案中的句子 · 出处会亮起来

前三句话,三个出处,颜色一一对应。这就是「可溯源」的意思:答案不再是一团印象的产物,而是一次有案可查的引用行为。就算答错了,你也能定位到是哪段资料的锅——这在闭卷模型那里根本无从谈起,第 2 节你已经领教过它现编报纸的本事了。

但你注意到第四句了吗?点一下它——三段资料全暗着,没有一段肯为它作证。那句话是生成器自己发挥的:听着顺、大概率也对,但它踩在印象上,不踩在资料上。溯源的价值不只在于能亮,更在于亮不起来的时候你看得见。把这句记住,第 7 节它会以更危险的形态回来。

论文里那个吓人的求和号 Σ 在说什么?(可跳过)

模型其实并不「确定」该信哪段资料。它的做法是:让每段捞回的资料各自主持生成一个答案的概率分布,再按「这段资料有多可能相关」加权平均——论文里的求和号(边缘化,marginalization)就是这个意思。这带来两个版本:RAG-Sequence,整句答案从头到尾认准同一批资料;RAG-Token,每写一个词都可以换一段参考——写凶手名字时看资料甲,写被捕经过时看资料丙。也正因为每个词头上都挂着「我更依赖哪段资料」的权重,出处才有得可查。本图「点句子亮出处」是这一机制的教学简化。

零件到齐了:一个书架,一位量距离的管理员,一个照着资料写的写手。现在看它们合体。

组装时刻:一次完整的翻书

拖动滑块,让一次完整的 RAG 问答在你眼前走完五步——还是那个问题:

① 问题进来——还是那句话

从问题到答案,全程不到一秒。请注意这条流水线上一个不存在的环节:哪里都没有「学习新知识」这一步。模型的权重从头到尾一动不动,动的只是桌上摆了哪几段资料。这句话听起来平平无奇,其实是整篇论文里最深远的一个决定。深远在哪?我们做个实验——让世界变一下。

世界变了,你改哪里

想让一个人跟上时事,你有两条路:给他订份报纸,或者送他回学校重读四年。对语言模型来说,「重读四年」就是重新训练——在 RAG 之前,这几乎是更新知识的唯一正路。论文里最漂亮的实验演示了另一条路:研究者准备了两个书架——2016 年和 2018 年两份维基百科快照。同一个模型,权重原封不动,问同一批「现任世界领导人是谁」的问题。先点两个书架按钮来回切换,再试试下面那条老路

问:美国现任总统是谁?
唐纳德·特朗普
当前书架:2018 年维基百科快照 · 权重改动:0 字节 · 更新耗时:换一个索引文件
论文的真实实验:同一模型 + 两份年代不同的维基百科索引,答案跟着书架走

同一个模型,换个书架,答案跟着换——知识更新从「训练操作」变成了「文件操作」。这是把知识放在模型外面的第一重红利:世界变了,改文档就行,秒级生效。第二重红利你在第 4 节亲手摸过:句句有出处。第三重正是第 2 节三个毛病里最后那个——事实有据可查了,靠「像不像」硬补的空间就小了,编造自然变少。三个毛病,一个书架,一起治。

这个实验在论文里长什么样?(可跳过)

论文作者把这一手称为索引热插拔(index hot-swapping):拿 2016 年 12 月和 2018 年 12 月两份维基百科快照分别建索引,用同一个训练好的模型回答「某国现任领导人是谁」这类问题。结果整齐得像对照组教科书:接 2016 索引时,模型按 2016 年的世界作答;换上 2018 索引,立刻按 2018 年的世界作答——权重一个字节没动。反过来问一个「跨年份都不变」的问题,两个书架给出同样的答案。除此之外,论文在开放域问答(Natural Questions、TriviaQA 等基准)上拿到了当时的最好成绩,并且人工评测认为它生成的答案比纯参数化的对照模型更符合事实、更具体——具体数字这里从略,感兴趣可查原文表格。

然而,说了这么多好话,这套系统有一个结构性的软肋。诚实地讲,它到今天也没被治好。

最后,试试能不能骗过它

RAG 的全部信仰是「照着资料写」。那——如果资料本身有问题呢?下面五个场景,挨个点开。第一个是给你信心的,中间三个是泼冷水的,最后一个告诉你冷水该往哪泼:

看出中间三个场景的共同点了吗?系统没有一个零件「犯病」:管理员忠实地捞了最近的资料,写手忠实地照着写——每个零件都在正确工作,答案还是错的。垃圾进,垃圾出。而场景⑤把话挑明了:解药也不在零件里。

所以 RAG 没有消灭幻觉,它做了一笔兑换:把「模型会不会编」这个没法下手修的玄学问题,兑换成「书架上放了什么、问题问得清不清楚」这个可以管理的工程问题。这笔兑换极其划算——玄学修不了,书架管得了——但兑换不等于消除。今天每家公司搭知识库问答时踩的坑和爬出坑的绳子,你刚刚在五个标签页里全部点过一遍。

顺便,如果你用过某个「基于文档回答」的产品并且被它坑过,现在可以给那次事故归档了:它答非所问,多半是场景②;它引经据典地胡说,看看库里是不是进了场景③的货;它对着一个库里根本没有的问题侃侃而谈——场景④,闭卷考生借尸还魂。

把知识放在模型外面

回到 2020 年。Lewis 和同事们在 NeurIPS 发表的这篇论文,全名是《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(面向知识密集型任务的检索增强生成)。它既没有发明检索,也没有发明生成——它做的是把两者焊死成一个整体来训练:检索器和生成器不是两个接力的部门,而是端到端联合微调的一台机器,检索哪段资料本身就是被「答案写得好不好」反向训练出来的。这是它和「先搜索、再把结果贴给模型」的朴素拼接最大的区别。

这篇论文之后的故事你已经在生活里见过了。你问企业客服机器人「我的保单涵盖什么」,问代码助手「我们的部署脚本怎么用」,用任何一个号称「基于你的文档回答」的产品——底层跑的都是你今天拨弄过的这条流水线:压坐标,捞 top-k,照着写。「RAG」从一篇论文的缩写,变成了一个行业的通用名词,成了几乎所有企业 AI 落地方案的第一块积木。

为什么偏偏是它成了第一块积木?原因你在前面全部亲手体会过:企业的知识天天变(第 6 节,换书架,零秒)、企业的回答必须可审计(第 4 节,点句子亮出处)、企业的机器人绝不能编(第 1、2 节,你和模型各编过一次)——三条要求,正好一一踩在书架的三重红利上。

杠精清单:四个你可能正想问的问题

「这不就是搜索引擎+复制粘贴吗?」——差在两处。其一,检索用的是意义坐标而不是关键词:第 3 节里「那幅名画是谁偷走的」一个关键词都不含《呐喊》,照样能捞到它,好坏都源于此。其二,检索器是被「答案写得好不好」端到端训练出来的,不是一个独立的搜索框——捞什么,本身是学出来的。

「为什么不微调?把新知识训练进去不就行了?」——你在第 6 节点过那条「老路」:慢、贵、每次世界一变就得重来,而且训进去的知识照样无法溯源、照样会跟旧印象搅成一团。微调适合教模型「怎么说话」,不适合当新闻订阅用。

「今天的模型上下文窗口那么大,把整个知识库直接塞进去不行吗?」——两千一百万段维基百科,塞不下的;就算塞得下,也等于每次提问都让考生现场重读整座图书馆。先捞相关的 k 段再读,是成本和准头的双重胜利。不过你说得对的部分是:窗口变大后,k 可以更大、每段可以更长——这正是 2020 年这篇论文之后整个领域一直在拧的旋钮。

「捞回的几段资料互相打架怎么办?」——好问题,论文的机制是给每段资料按「有多可能相关」加权(第 4 节折叠区那个 Σ),相当于让更可信的声音更大——但它不会真正「裁决」矛盾。资料库内部自相矛盾时该信谁,至今仍是开放问题。坦白说:这一条我们没有交互能给你演示解法,因为还没有公认的解法。

而最深远的还是那个安静的决定:把知识放在模型外面。它意味着「会说话」和「知道事」第一次分了家——模型负责语言,书架负责事实;知识第一次可以不经过训练就进入 AI(你换书架那一下,零秒);也意味着谁管理书架,谁就管理答案(你用一篇 1932 年的假新闻骗过整套系统那一下,也是零秒)。能力越界,责任越界。

回想你这一路亲手做过的事:你先当了一次闭卷考生,靠「像不像」押了个答案;追问出处时,看着闭卷模型现编了一份报纸;拖着 k 值看渔网忽松忽紧;点亮了三句话各自的出处,也点过一句谁都不肯作证的话;换了两次书架,看总统随之换人;最后用一个含糊的问题和一篇假新闻,两次骗过了一台每个零件都工作正常的机器。

下次再有 AI 一本正经地回答你时,你可以问出那个你已经掂得出分量的问题:你是闭卷答的,还是开卷答的?如果是开卷——书架上放的是什么?