检索增强生成中的上下文分配法则:因果测量与闭环编排

你有没有想过这样一个问题:当你让AI帮你查资料、写报告的时候,它到底"读"了你给它的那一大堆参考资料里的哪些内容?
大部分人的直觉是:AI应该都读了,而且读得挺仔细。毕竟你喂给它的每一段文字,都出现在它的输入窗口里,它不可能视而不见吧?
但北京大学的研究团队做了一件挺较真的事:他们把这个问题拆开来,一点点验证。结果发现,事情比想象中复杂得多,甚至有点反直觉。
检索增强生成
RAG,Retrieval-Augmented Generation的缩写,指的是让大语言模型先去检索一堆相关文档,再根据这些文档生成答案的技术路线,是目前对抗AI"胡编乱造"最主流的手段之一。
这篇论文的核心发现可以先剧透一下:当你给AI塞的资料越多,它每一条资料受到的"关注"反而越少;而与其把预算花在把一次的资料塞得更满,不如让AI分好几轮读,每轮读少一点,这样反而能覆盖更多信息。这个结论听起来简单,但要证明它,团队做了一件更难的事情:先证明我们过去用来衡量"AI读没读某段资料"的工具,基本上是失灵的。
一个被戳穿的假象:我们一直用错误的尺子测量AI
先说说这篇论文最让人意外的部分。
想验证AI到底用没用上某份资料,最简单的做法是什么?大概是看这份资料和AI最终生成的答案像不像。如果文本相似度很高,那就说明AI大概率参考了它。这个思路几十年来一直是信息检索领域的标准做法,业内也一直是这么评估RAG系统的。
问题是,这个"像不像"的判断,严重依赖于你拿什么东西去对比。
研究团队做了一个很巧妙的实验。他们准备了两种"陪衬"文档来测试相似度这类方法到底准不准:一种是完全跑题的文档,比如给一个关于"糖尿病症状"的问题,塞进去几篇讲"篮球战术"的文章当干扰项;另一种叫同查询难负样本,就是那些和问题高度相关、读起来煞有介事,但压根不包含正确答案的文档。
同查询难负样本
指那些与用户提问在话题上高度贴近、语言表达也很接近,却实际上并不含有正确答案信息的干扰文档。
结果非常戏剧性。用第一种跑题干扰项来测试的时候,像BM25(一种经典的关键词匹配算法)和"问题-文档语义相似度"这些传统方法,几乎能做到近乎完美,AUC值(一种衡量分类准确度的指标,1.0代表完美,0.5代表纯瞎猜)高达0.98以上。看起来简直无可挑剔。
可一旦换成同查询难负样本,这些传统方法直接崩了。BM25的AUC值跌到0.444,问题-文档相似度跌到0.484,比瞎猜(0.5)还差。换句话说,当干扰项和真正的答案文档长得很像的时候,这些传统工具完全分不清谁是谁。
这个发现的杀伤力在哪?
在于过去几乎所有RAG系统的评测,用的都是第一种简单粗暴的跑题干扰项测试集。这就好比你想测试一个保安辨认可疑人员的能力,结果你只找了几个穿着完全不搭调、行为举止明显不对劲的人去测试他。保安当然次次都能揪出来,你也就会误以为这个保安很厉害。可如果真正的坏人是伪装成普通员工混进来的呢?这时候你才会发现,这个保安根本没有你以为的那种辨别能力。
论文把这个现象叫做"诊断幻觉":我们过去看到的那些近乎完美的评测分数,很大程度上是评测集设计得太简单造成的假象,而不是方法本身真的强。
用"拿走试试"代替"看着像不像"
既然相似度这条路走不通,那该怎么真正判断AI用没用上一份资料?
研究团队的做法其实挺朴素:与其猜AI用没用,不如直接把这份资料拿走,看看AI原来生成的那段话,现在还有多大概率被生成出来。
具体来说,他们固定住AI已经生成好的回答文本不变,然后计算:如果context(输入给AI的上下文,也就是那堆检索来的资料)里少了某一份文档,这段已经生成的文字的概率(用对数似然衡量)会下降多少。下降得越多,说明这份文档对生成这段话的贡献越大,是真正被"用上"的证据。
对数似然
一种衡量语言模型对某段文字"认可程度"的数值,数值越高说明模型认为这段话越合理、越符合上下文。
这个方法专业名字叫留一法探针(leave-one-out probe),简称LOO。它的巧妙之处在于,因为回答文本已经写死了,不需要重新生成,只需要做一次"回顾性打分",这个过程可以批量并行处理,速度比让AI重新写一遍答案快得多。
这就像什么呢?
想象你在调查一场晚宴的成功要素,晚宴上有十道菜,你想知道客人到底喜欢哪几道。相似度式的做法相当于问客人"你觉得这道菜和晚宴主题搭不搭",这种问法测出来的是菜品和主题的关系,而不是客人到底吃没吃、爱不爱吃。留一法探针的做法则是,把某道菜从菜单上悄悄撤掉,重新回放整场晚宴的"满意度评分记录"(而不是重新办一场晚宴问客人),看这道菜在不在对总体评分的影响有多大。如果撤掉某道菜后,原本记录里客人反复提到的那道招牌菜的好评分数明显掉了,说明这道菜是真被吃了、真起作用了;如果撤不撤都没差别,那这道菜可能只是摆在那里凑数的。这个方法的精妙之处在于,它不需要真的重新办一场晚宴(也就是不需要AI重新生成一遍答案),只需要用已有的记录重新核算一遍分数,效率高得多。
用这个方法重新测试同查询难负样本的场景,结果就完全不一样了。留一法探针在最难的场景下依然保持0.876的AUC(context宽度为3份文档时),即使context拉宽到24份文档,依然有0.824。相比BM25和相似度方法崩到瞎猜水平,这个差距说明了因果探针确实抓住了本质,而不是被表面相似性糊弄。
论文还进一步测试了这个探针在面对信息高度冗余的情况下,能不能准确找出真正"够用"的那个最小文档集合。结果显示,留一法探针能识别出0.792的答案覆盖率,比随机排序高出0.144,而BM25在这个任务上基本毫无作用,甚至比随机排序还略差一点。
校准出来的"注意力稀释定律"
拿到了这把靠谱的尺子之后,研究团队开始认真测量一个更基础的问题:context越宽,AI对里面每一份文档的关注度到底会怎么变化?
context
指喂给AI模型的整段输入文本,包括用户的问题和检索到的相关文档,是模型生成回答时能"看到"的全部信息。
直觉上大家可能觉得,反正AI能"看到"所有文档,关注度应该是差不多的,顶多稀释一点点。但论文测出来的结果是,这种稀释效应相当剧烈,而且是数学上可以精确刻画的规律。
研究团队排除了各种可能干扰测量结果的因素。比如他们怀疑,是不是单纯删掉一份文档,会导致后面文字位置发生偏移,从而人为造成分数下降的假象?他们专门做了对照实验,用等长的中性文本去替换被删除的文档而不是直接删除,结果发现效应几乎没变化(-0.104比-0.112),说明这不是位置偏移造成的假象。
他们又发现另一个更隐蔽的干扰:自由生成的场景下,给AI喂更宽的context会让AI生成的文字变得更长、更啰嗦,这种"啰嗦"本身就会拉低每个词的似然分数,和真实的证据利用完全是两码事,会导致虚假的信号,把误判率(false positive rate)推高到37%那么夸张。
于是团队改用一种叫固定目标的协议:强行让AI生成的文字长度和内容保持一致,只改变context宽度,这样才能干净地隔离出context宽度本身造成的影响,而不被生成长度这个混杂因素干扰。
在排除掉这些干扰之后,团队得出了一个校准后的核心数字:上下文宽度弹性为-0.68(标准误0.02)。
这个数字什么意思?
简单说就是,context每宽一倍,AI对单份文档的有效利用程度大约会打六到七折。而且论文特别强调,这不是因为文档超出了硬件的token(词元,大语言模型处理文本的最小单位)长度限制,他们的实验里最长的prompt(输入给AI的完整提示词)也才5485个token,远远没到模型的硬件上限。这纯粹是一种生成层面的认知规律,注意力天生就会随着信息量增加而分散,和硬件无关。
这就好比一个人同时要记住的事情越多,平均分配到每件事上的心力就越少。你让一个人专心盯一件事,他能记得清清楚楚;你让他同时盯二十件事,每件事他大概都能想起个大概,但细节全模糊了。这不是他记性变差了,是注意力这种资源本身就是有限、需要摊薄分配的。
这个-0.68的数字也不是一成不变的铁律,团队还测试了文档之间的冗余程度会不会影响这个斜率。结果发现,冗余程度确实会调节这个斜率的具体大小(从-0.43到-0.67不等),但无论冗余程度如何,这个"越宽越稀释"的方向性规律始终成立,从未被逆转过。
真正的分岔路口:context该"宽"还是该"多轮"
有了这把靠谱的尺子和这条注意力稀释定律,论文接下来要回答那个最实际的问题:同样一份固定预算的检索文档,到底应该一次性塞进一个很宽的context里让AI读一遍,还是应该分成好几轮,每轮读窄一点?
论文管这个叫k×T的析因实验设计。k代表每次context里塞多少份文档(宽度),T代表让AI生成多少轮(次数)。团队系统性地测试了k在{2,5,12,24}和T在{1,5,12}的各种组合,一共12种配置,横跨四个任务和多个模型。
结果相当震撼。
论文的核心指标叫portfolio recall(组合回忆率,记作PR@T)。
组合回忆率
指AI生成的这一整批(而不是单条)回答里,合起来一共覆盖了多少条标准答案要点的比例。比如一个问题标准答案有10个要点,AI分几轮回答后,只要合起来提到了7个,组合回忆率就是70%。
数据显示,固定context宽度k不变,把生成轮数T从1提高到12,能带来极为可观的提升,在窄context下(k=2、5)提升幅度大约在0.20左右,即使在k=24这种很宽的context下也有0.17左右的提升,而且这个提升在所有任务和模型组合上都是显著且稳定的。
相反,单纯拉宽context宽度k的收益就非常不牢靠。把context从2份文档拉宽到24份,单轮生成时确实能带来+0.050的提升,可一旦轮数增加到12轮,这个宽度带来的额外收益就萎缩到只剩+0.024,统计上已经很难说是真实存在的效果了。
最关键的一组对比来了:同样是24份文档的预算,一种方案是一次性塞满context(k=24, T=1),另一种方案是每轮只放2份、但轮换12次(k=2, T=12)。两者消耗的文档总量完全相同,但后者的组合回忆率达到了0.397,前者只有0.253,差距高达0.144。
这个数字意味着什么?
意味着同样一堆资料,你换一种"喂"给AI的方式,AI从中提取出来的有效信息量能差出将近15个百分点。这不是AI变聪明了,是同一份原材料,用不同的加工方式,产出效率天差地别。
这就好比同样一箱食材,你要么一股脑全倒进一个大锅里炖,要么分成几小锅,一锅一锅炒着吃。全倒进大锅里炖,食材虽然都在锅里,但你的舌头(注意力)同一时刻只能尝出锅里最突出的几种味道,底下很多食材的味道被压制、被忽略了;分成几小锅炒,虽然多花了些时间和灶台(计算轮次),但你每锅都能仔细尝出这一锅里食材真正的味道,几锅加起来,你尝到的滋味种类反而更丰富。如果你图省事只用大锅炖一次,省下的是时间,损失的是那些被压在锅底、你根本没尝到的滋味。
那这种宽度的失效,到底是AI能力不够,还是别的什么原因?论文给出了一个很扎实的解释:相关性密度。
相关性密度
指检索排名越靠后的文档,包含正确答案的概率就越低。排名第1到第5的文档往往是最相关的,排名第20到第30的文档很可能已经是噪音了。
当你把context拉宽,系统被迫把更多排名靠后、质量更差的文档也塞进去,这些文档本身信息量就低,还占用了宝贵的注意力资源,相当于稀释了那些真正有价值的部分。团队专门统计了几个任务的相关性密度分布:ASQA这个任务的答案高度集中在排名前5的文档里(头部集中度达到0.713),这种任务一旦宽度拉太大,收益反而会转负;而QAMPARI这个任务答案分布得很散(头部集中度只有0.398),拉宽context还能有一点点正向收益。这也解释了为什么"该宽还是该多轮"这个问题没有放之四海而皆准的答案,得看具体任务里答案信息的分布形态。
为了排除"这只是新鲜感"这种解释(也就是多轮生成带来的提升,可能只是AI换了个角度重新说了一遍同样的内容,文字不一样但信息没有增量),团队还专门设计了一个对照组:让AI在同样的context下反复生成多次(不换文档,纯粹靠生成时的随机性产生不同的措辞),来对比"真正看到新文档"和"只是重新采样一次"这两种收益的区别。
结果非常清楚:纯靠反复采样确实能带来一点提升(+0.054到+0.087),但这个提升很快就见顶了。到了12轮的时候,真正轮换新文档的方案比死磕同一个context反复采样的方案,能高出0.087到0.140。用更直白的数字看:在k=24、T=12的极限配置下,轮换方案实际上让AI的回答扎根在288份不同文档中的50.9份上;而死磕同一个context的方案,即使给了12次机会,最终也只扎根在10.3份文档上。
这说明什么?
说明AI没法凭空从一份一成不变的资料里"变"出更多样的信息。多轮生成真正的价值,不是让AI换着花样把同一件事重新说一遍,而是给它送去了它从没见过的新证据。
论文还专门做了一个规模验证,把这套结论从7B、8B级别的模型一路推到14B和32B。结果显示,即便模型参数量翻了好几倍,(2,12)这种多轮窄context的方案依然稳定地比(24,1)这种单轮宽context方案高出0.134到0.180。这说明这不是小模型能力不够导致的临时现象,而是一条相当基础的规律,模型越大也逃不掉。
团队还专门测试了极限情况:用支持百万级token的超长上下文模型,把context宽度一路拉到48甚至96(约1.1万个token)。结果依然是,超过24之后再继续拉宽context几乎没有统计显著的收益,反而在ASQA这个任务上还出现了负增长。而把生成轮数从1提到12,收益始终稳定在+0.101到+0.157之间。这基本把"context宽度受限只是因为模型记性不够长"这个猜测彻底排除了。
把发现变成可用的系统
光有理论发现还不够,论文接下来把这些结论组装成了一套真正能跑起来的系统,取名叫Ascp。
这套系统有两个关键部件。
第一个部件是闭环调度器,负责决定每一轮该给AI喂哪些文档。
论文特别强调了"闭环"和"开环"的区别。传统的多样性算法,比如MMR、xQuAD、PM-2这些经典信息检索方法,虽然也会试图让context里的文档更多样化,但它们判断"多样"的依据是文档内容本身有多不一样,完全不知道AI实际读进去了多少、用上了多少。这类系统叫开环系统。
开环系统
指调度逻辑完全依赖预先设定的规则运行,不会根据实际执行结果(比如AI真正用了哪些文档)动态调整下一步决策的系统。
Ascp的做法不一样,它每轮生成完之后,会用前面提到的因果探针去检测AI这一轮到底真正用上了哪些文档,然后把这个反馈信息喂回调度器,让调度器在下一轮主动避开那些已经被充分利用过的内容,把预算优先分配给还没被触及的知识面。这个过程用了一种叫submodular optimization(次模优化)的数学工具来保证调度策略有理论上的效果保证。
submodular optimization
一种数学优化框架,核心特点是"边际收益递减",也就是说随着已选内容越来越多,再增加一份新内容带来的额外价值会越来越小,这个性质保证了贪心算法也能得到不错的近似最优解。
第二个部件叫attribution-steered contrastive decoding(归因导向的对比解码),负责在AI生成文字的过程中,主动把它的注意力从已经用烂了的文档上"掰"到新证据上。
这个部件想解决的问题是什么呢?
论文观察到一个现象叫注意力惯性:即使调度器已经把新鲜文档端到AI面前了,AI在生成下一轮回答的时候,依然有很强的倾向继续说它上一轮已经说过的内容,像是产生了路径依赖。为了打破这种惯性,这套解码机制会在生成每个词的时候,人为地压低那些和"过度使用过的文档"相关联的词汇出现的概率,同时把概率抬高给那些和"新鲜文档"相关的词汇。
这就好比一个人写作文,写着写着总喜欢绕回去说自己最熟悉的那几个例子,即使题目要求他讲三个不同角度。这个解码机制相当于在他每次想写"老掉牙的例子"的时候,轻轻推他一把,让他转向还没写过的角度。但这种"推"不能推得太狠,否则容易逼着他瞎编,所以论文加了一个叫adaptive-plausibility constraint(自适应合理性约束,简称APC)的安全阀,确保这种"推力"不会把AI推到胡言乱语的地步。
实验结果显示,启用完整的这套对比解码之后,组合回忆率能获得+0.0107的独立提升,这个提升在五个不同的随机种子下都稳定复现,而且生成的文字反而变短了(平均少1个词),说明AI没有靠啰嗦凑字数,是真的更紧凑地把新信息塞进去了。而拆解开来看,如果只用"推力"不加安全阀,收益能冲到+0.0187,但风险也更高;只加安全阀不加推力,则几乎没有任何效果(-0.0009,统计上不显著)。两者合体,才是收益和风险的平衡点。
把整套系统摆上台面比一比
说了这么多,这套系统到底比传统方法强多少?
论文在2400组严格配对的评测样本上做了系统对比,涵盖了ASQA、QAMPARI、ELI5三个英文任务,还有一个西班牙语的跨文化菜谱改编任务作为开放域压力测试。
结果显示,像MMR、xQuAD、PM-2-RAG这些经典开环多样化算法,组合回忆率都停留在0.228到0.239之间,而当前较先进的多样化RAG框架Carriage能做到0.276。Ascp调度器则拿到了0.309的成绩,比Carriage高出0.033,比PM-2-RAG更是高出0.081,而且这些差距都通过了严格的统计显著性检验。
有意思的是,论文还专门对比了Ascp和一个纯靠"暴力轮换"(不看反馈,单纯按顺序轮换文档)的策略。结果发现,单看最终的组合回忆率,两者其实打了个平手(差距只有0.006,统计上不显著)。但这个平手背后藏着巨大的效率差距:暴力轮换要塞进去25份文档才能达到这个效果,而Ascp只用了10.55份文档就做到了同样的效果,证据覆盖率(Evidence Coverage Rate,简称ECR,衡量喂给AI的文档里到底有多少真正被用上了)达到0.626,而暴力轮换的证据覆盖率只有0.375。
证据覆盖率
指模型实际接触过的所有文档中,真正被生成过程用上的那部分文档所占的比例,用来衡量调度策略是不是在做"无用功"。
换句话说,暴力轮换是靠"多喂"硬凑出效果的,Ascp是靠"喂得准"用更少的资源达到同样效果的。这就好比考试前复习,一个学生把整本书从头到尾抄了三遍指望覆盖到所有考点,另一个学生先做了一遍模拟题,发现哪些知识点自己已经掌握了,专挑还没吃透的部分反复看。两人最后考出来的分数可能差不多,但后者花的复习时间明显更少,效率高得多。如果没有这种"先测试再针对性复习"的反馈机制,那就只能靠死记硬背式的地毯式轰炸,又慢又累。
论文还专门验证了,如果把Ascp里的因果探针换成普通的相似度打分,调度效果会不会打折扣。结果证实,一旦换成相似度反馈,整个调度系统的效果直接坍缩到和完全不用反馈(假设AI均匀使用所有文档)几乎没有差别(差距只有-0.002,不显著)。这再次印证了前面提到的核心观点:光看文字像不像,没法准确判断AI到底用没用上一份资料,这套调度系统的所有优势,都建立在那把靠谱的因果尺子之上。
计算代价:天下没有免费的午餐
当然,多轮生成不是没有代价的。
论文诚实地摆出了这个权衡:相比单轮宽context生成,多轮方案需要更长的实际运行时间。比如在(2,12)配置下,一次查询的实际耗时大约17.5秒,而(24,1)配置只需要1.7秒,差了整整10倍。
论文把这个权衡画成了一张计算量与效果的关系图。如果你的产品只需要达到0.35左右的组合回忆率门槛,单轮宽context已经够用,没必要折腾多轮。但如果你追求的是0.40甚至0.45这种更高的覆盖水准,论文的数据显示,不管你把模型参数量堆到多大,单轮生成永远够不到这个门槛,唯一的出路是往多轮生成这个方向投入更多的推理时间。
这个发现呼应了近两年AI领域一个越来越受关注的思路,叫inference-time scaling(推理时扩展)。
inference-time scaling
指不通过增大模型参数量,而是通过在推理阶段投入更多计算资源(比如生成更多次、思考更长时间)来提升效果的技术路线,和训练阶段扩大模型规模的传统"scaling law"形成对照。
过去大家谈"把AI做得更强",默认想到的是训一个更大的模型。这篇论文提供的证据说明,至少在检索增强生成这个场景里,把更多计算预算花在推理阶段的多轮迭代和因果反馈上,可能比单纯堆大模型参数更划算,至少在信息覆盖这个维度上是这样。
写在后面
读这篇论文的过程中,一直有个念头挥之不去:我们对AI系统的很多"常识性判断",可能建立在从未被认真检验过的评测方法之上。
BM25、余弦相似度这些工具用了几十年,大家默认它们"大差不差能用",可这篇论文用一个换干扰项的简单操作,就把这套默认判断打得稀碎。这种感觉有点像,你一直以为家里那台体重秤挺准的,直到有一天你拿一个已知重量的物体去校准,才发现它其实一直在系统性地撒谎。
另一个让我反复琢磨的地方是,这篇论文其实在讲一个更普遍的道理:资源分配问题里,"怎么分"往往比"分多少"更重要。同样24份文档的预算,换一种分配节奏就能差出14个百分点,这个比例放在很多别的场景里可能同样成立,比如人的学习时间分配、团队的任务安排,一次性堆量和分批消化,产出效率可能天差地别。
论文没有回答的一个问题是:这套多轮因果反馈机制的计算代价,在超大规模生产环境里到底能不能摊得起。10倍的延迟差距在实验室里是可以接受的代价,但放到每天要处理几百万次查询的真实系统里,这笔账要怎么算,恐怕还需要更多现实世界的检验。
Q&A
Q1:检索增强生成的组合回忆率提升16.8到20.5个百分点,是靠什么实现的?
A:核心是把固定的证据预算从"一次塞满context"改为"分成多轮、每轮用新文档",让AI能持续接触到未曾见过的证据,而不是反复咀嚼同一批资料,这在论文的k×T析因实验中得到了系统验证。
Q2:留一法探针和普通的相似度打分方法,区别到底在哪?
A:相似度方法比较的是文档和答案文字像不像,容易被话题相关但没有答案的干扰文档骗过;留一法探针直接把文档从context里拿掉,看AI已生成的回答概率下降多少,能真正反映这份文档是不是被实际用上了。
Q3:为什么单纯把context宽度拉得很大,反而收益不明显甚至变差?
A:因为context越宽,系统被迫检索排名更靠后、质量更差的文档进来,这些低质量文档不仅没用还占用注意力资源,论文测出的-0.68宽度弹性说明这种注意力稀释是模型的固有特性,和硬件长度限制无关。