论文标题:Inference Scaling for Long-Context Retrieval Augmented Generation
会议:ICLR 2025
作者:Zhenrui Yue、Honglei Zhuang、Aijun Bai、Kai Hui、Rolf Jagerman、Hansi Zeng、Zhen Qin、Dong Wang、Xuanhui Wang、Michael Bendersky
机构:University of Illinois Urbana-Champaign、Google DeepMind、UMass Amherst
论文主题:长上下文 RAG、推理时计算扩展、DRAG、IterDRAG、Inference Scaling Laws


0. 先说结论

这篇论文讨论的是一个很实际的问题:

对于长上下文大模型来说,RAG 效果是不是只要塞更多文档就会变好?

作者的回答是:不是。

传统 RAG 很容易陷入一个误区:
既然模型上下文窗口变长了,那我就多检索一些文档,把更多外部知识塞进去。

但论文发现,单纯增加检索文档数量,标准 RAG 很快就会进入性能平台期,甚至可能因为噪声文档太多导致效果下降

作者提出的核心观点是:

长上下文 RAG 的关键不是“塞更多文档”,而是“在推理阶段合理分配计算资源”。

这篇论文提出了两个策略:

  • DRAG:Demonstration-based RAG

  • IterDRAG:Iterative Demonstration-based RAG

然后进一步研究:
在不同推理预算下,应该如何分配:

检索文档数量 k
上下文示例数量 m
迭代生成轮数 n

论文最重要的结论是:

当推理时计算资源被合理分配时,长上下文 RAG 的性能可以随着 effective context length 的增加呈现近似线性提升。

这也是论文所谓的:

Inference Scaling Laws for RAG

简单说,这篇论文不是在说“长上下文一定有用”,而是在说:

长上下文有用的前提是,你得会用。


1. 论文想解决什么问题?

这篇论文想解决的问题可以概括为一句话:

在长上下文大模型时代,RAG 应该如何有效扩展推理时计算资源?

以前做 RAG,大家最常见的做法是:

用户问题
  ↓
检索 TopK 文档
  ↓
把文档和问题拼进 Prompt
  ↓
LLM 生成答案

如果效果不好,很多人会直接调大 TopK

TopK = 5 不够,那就 10
TopK = 10 不够,那就 20
TopK = 20 不够,那就 100

长上下文模型出现后,这种想法更自然了:

反正模型支持 100K、1M 甚至更长上下文,那就多塞点文档。

但真实情况没有这么简单。

论文在 Introduction 里指出,当前长上下文大模型虽然可以接收很长的输入,但它们在复杂任务中并不总能有效定位超长上下文里的关键信息。也就是说,能装下,不等于能用好

这就引出了论文的两个核心问题:

1. 当推理时计算资源增加时,RAG 性能到底能提升多少?
2. 给定一个推理预算,能不能预测最优的计算资源分配方式?

这里的“推理时计算资源”不只是检索文档数量,还包括:

  • 放多少文档;

  • 放多少示例;

  • 是否做多轮检索;

  • 是否做迭代生成;

  • 每一轮怎么组织 Prompt。

论文把这些统一放在 inference scaling 的框架下讨论。


2. 过去的方法有什么不足?

过去的 RAG 扩展方法,大多把重点放在“增加知识量”上。

比如:

增加检索文档数量
增加每篇文档长度
扩大上下文窗口
把更多知识塞进 Prompt

这种思路有一定道理。
如果原来没有召回正确知识,多检索一些文档确实可能提升召回率。

但问题在于,RAG 最终效果不只取决于“有没有正确文档”,还取决于模型能不能:

从很多文档里找到关键信息
忽略无关噪声
完成多跳推理
把证据正确组合成答案

论文里提到,很多研究发现,当检索文档数量超过某个软阈值后,RAG 性能会进入平台期,甚至下降。原因也很直观:文档越多,噪声越多,模型越容易被干扰。

比如一个用户问:

A 公司的 CEO 毕业于哪所大学?

检索系统可能召回:

A 公司介绍
A 公司 CEO 简介
A 公司财报
A 公司新闻
A 公司竞争对手信息
A 公司历史沿革

正确答案可能只在某一段里。
如果上下文太长、噪声太多,模型反而可能抓错重点。

所以过去方法的不足主要有三个:


2.1 只扩文档数量,没有考虑计算资源分配

标准 RAG 通常只调一个参数:

TopK

但长上下文场景下,可调参数其实更多:

检索多少文档
放多少 in-context examples
是否做多轮检索
每轮生成多少中间答案
是否拆分子问题

如果只调 TopK,其实没有充分利用长上下文模型的能力。


2.2 长上下文模型并不天然擅长超长信息定位

模型上下文窗口变长,不代表它真的能在 10 万 token 里稳定找到关键证据。

这也是很多 RAG 系统线上效果不稳定的原因之一:

正确文档召回了
但模型没有用到

这种情况下,继续增加文档数量不一定有帮助。


2.3 多跳问题需要推理链,不只是更多文档

很多知识密集型问答不是单跳问题,而是多跳问题。

比如:

某部电影导演的出生地是哪里?

这类问题可能需要:

先找到电影导演是谁
再找导演出生地
最后生成答案

标准 RAG 一次性检索一批文档,然后直接回答,可能无法很好处理这种组合推理。

这就是论文提到的 compositionality gap


3. 作者的核心思路是什么?

作者的核心思路是:

不要只扩展文档数量,而是把推理阶段的计算资源分配到“文档、示例、迭代步骤”多个维度上。

论文提出两个方法。


3.1 DRAG:Demonstration-based RAG

DRAG 可以理解为:

RAG + 多个带检索文档的示例。

普通 RAG 的 Prompt 大概是:

参考文档:
doc1
doc2
doc3

问题:
用户问题

答案:

DRAG 会在测试问题前面加入多个完整示例:

示例 1:
文档:
doc1, doc2, doc3
问题:
question1
答案:
answer1

示例 2:
文档:
doc1, doc2, doc3
问题:
question2
答案:
answer2

测试问题:
文档:
test_doc1, test_doc2, test_doc3
问题:
test_question
答案:

这样做的目的不是简单 few-shot,而是让模型在上下文里看到:

如何从一堆文档中定位相关信息
如何忽略无关文档
如何根据检索内容回答问题

所以 DRAG 利用了长上下文模型的 in-context learning 能力。


3.2 IterDRAG:Iterative Demonstration-based RAG

IterDRAG 更进一步。

它不是一次性回答,而是把复杂问题拆成子问题,然后每个子问题都可以触发新的检索。

大致流程是:

输入问题
  ↓
生成子问题 1
  ↓
检索相关文档
  ↓
生成中间答案 1
  ↓
生成子问题 2
  ↓
再次检索相关文档
  ↓
生成中间答案 2
  ↓
综合所有中间结果
  ↓
生成最终答案

论文里的 Figure 3 很清楚地对比了 DRAG 和 IterDRAG:

  • DRAG:一次性把文档和示例放进去,然后直接生成最终答案;

  • IterDRAG:先拆解问题,再交替进行检索和生成,最后合成答案。

这其实很接近工程里常说的:

多步 RAG
Agentic RAG
Self-Ask
Iterative Retrieval

只不过论文把它放到了 inference scaling 的框架下研究。


4. 方法结构是怎样的?

这篇论文的方法结构可以分成三层。


4.1 第一层:定义推理计算量 effective context length

论文没有简单用“上下文窗口长度”来衡量推理计算量,而是定义了一个指标:

effective context length

它表示:

在模型输出最终答案之前,所有推理步骤输入 token 数量的总和。

对于只调用一次 LLM 的方法,比如普通 RAG 或 DRAG:

effective context length = 当前 Prompt 的输入 token 数

对于 IterDRAG 这种多轮调用模型的方法:

effective context length = 每一轮输入 token 数之和

这个定义很重要。

因为 IterDRAG 不一定需要单次塞进 5M token,它可以通过多轮调用累计更大的 effective context length。

这也符合真实工程场景。
很多时候模型上下文窗口有限,但我们可以通过多轮检索、多轮调用来扩展推理计算。


4.2 第二层:设计 DRAG 和 IterDRAG

DRAG 的结构

DRAG 的参数主要有两个:

k:每个问题检索的文档数量
m:in-context examples 数量

DRAG 的推理结构是:

m 个示例,每个示例包含:
  - 检索文档
  - 问题
  - 答案

测试样本包含:
  - 检索文档
  - 问题

然后一次性让模型生成答案。

DRAG 的关键是:
示例不是普通 QA 示例,而是带有检索文档的 RAG 示例。


IterDRAG 的结构

IterDRAG 的参数多了一个:

n:最大迭代生成轮数

它在 DRAG 的基础上引入多轮:

生成子问题
检索文档
生成中间答案
继续生成子问题
继续检索
最终回答

论文中设置最多 5 轮迭代。

它的优势在于,多跳问题不需要一次性解决,而是可以拆成更简单的子问题。

比如问题是:

电影 A 的导演出生在哪里?

IterDRAG 可能拆成:

Follow up 1:电影 A 的导演是谁?
Intermediate answer:导演是 B。

Follow up 2:B 出生在哪里?
Intermediate answer:B 出生在 C。

So the final answer is:C。

这样比一次性让模型在一大堆文档里直接推理更稳。


4.3 第三层:建立 computation allocation model

论文不仅提出方法,还试图回答一个更工程化的问题:

给定一个推理预算,应该选多少文档、多少示例、多少轮迭代?

这里作者把参数写成:

θ = (k, m, n)

其中:

k:检索文档数量
m:上下文示例数量
n:生成迭代轮数

然后用一个模型来预测不同配置下的性能。

这就是论文里的:

computation allocation model for RAG

它的目的不是训练一个新的 LLM,而是帮助我们选择更优的推理配置。


5. 关键公式或算法怎么理解?

论文里有两个比较关键的公式。


5.1 公式一:固定预算下的最优性能

论文定义了一个最优性能:

P*(Lmax)

它表示:

在最大推理预算 Lmax 内,通过枚举不同参数配置 θ,能够达到的最好平均性能。

公式可以简化理解为:

P*(Lmax) = 在所有满足预算限制的配置中,找到效果最好的那个

论文原式大概是:

P*(Lmax) = max over θ of average P(yi, f(xi; θ))
subject to l(xi; θ) ≤ Lmax

其中:

xi:输入问题
yi:标准答案
f(xi; θ):使用参数 θ 的 RAG 策略得到的预测
P:评价指标,比如 EM、F1、Accuracy
l(xi; θ):该配置消耗的 effective context length
Lmax:最大推理预算

这个公式其实很符合工程直觉。

假设你有一个预算:

最多允许 128k token 推理成本

那你可以选择:

方案 A:检索 100 个文档,不放示例
方案 B:检索 20 个文档,放 8 个示例
方案 C:检索 10 个文档,放 4 个示例,做 3 轮迭代

论文要找的就是:
在这个预算内,哪个方案效果最好?

这就是 P*(Lmax) 的意义。


5.2 公式二:计算资源分配模型

论文进一步提出:

σ^-1(P(θ)) ≈ (a + b ⊙ i)^T log(θ) + c

这个公式看起来有点复杂,但可以拆开理解。


θ 表示配置

θ = (k, m, n)

也就是:

检索文档数量
示例数量
迭代轮数

P(θ) 表示该配置的性能

比如 accuracy、F1、EM。


log(θ) 表示性能增长不是线性的

为什么要取 log?

因为在很多 scaling 现象里,资源增长和性能增长不是简单线性关系。
从 1 个文档增加到 10 个文档,收益可能很明显;
但从 500 个文档增加到 1000 个文档,收益可能很小。

所以用 log(θ) 更符合边际收益递减的情况。


i 表示任务对文档和示例的敏感程度

论文里定义了:

idoc:加一个文档带来的性能增益
ishot:加一个示例带来的性能增益

这相当于衡量当前任务更依赖什么。

有些任务更依赖外部知识,那 idoc 更重要。
有些任务更依赖示例模式,那 ishot 更重要。


σ^-1 是为了处理长上下文下的非线性

论文发现,当 context 特别长,比如超过 1M 后,性能增长会变缓。
所以引入 sigmoid 相关变换来更好拟合这种趋势。

这部分如果写代码落地,不一定要完全照搬论文公式。
但它传达的思想很重要:

不同任务、不同模型、不同预算下,RAG 的最优配置不是固定的,可以用实验数据建模预测。


6. 实验结果证明了什么?

论文实验主要使用 Gemini 1.5 Flash,在多个知识密集型问答数据集上评估,包括:

Bamboogle
HotpotQA
MuSiQue
2WikiMultiHopQA
StrategyQA
TriviaQA
Natural Questions

其中核心实验集中在多跳问答数据集上。


6.1 DRAG 和 IterDRAG 明显优于普通 RAG

论文 Figure 2 展示了不同方法在多个数据集上的准确率对比。

方法包括:

Zero-shot QA
Many-shot QA
RAG
DRAG
IterDRAG

结果显示:

  • Zero-shot QA 最弱;

  • Many-shot QA 有提升;

  • 标准 RAG 进一步提升;

  • DRAG 比标准 RAG 更好;

  • IterDRAG 整体效果最好。

论文摘要中提到,在最优配置下,长上下文 LLM 上扩展推理计算相比标准 RAG 最多可以带来 58.9% 的提升

这说明:

RAG 的效果提升不只是靠更多文档,也可以靠示例和迭代推理。


6.2 标准 RAG 很快进入平台期

论文 Figure 1 和 Figure 4 都展示了一个关键现象:

标准 RAG 在 effective context length 增加到一定程度后,很快进入平台期。

也就是说,继续增加文档数量,性能不再明显提升。

原因也很直观:

更多文档提高了召回率
但也引入了更多噪声
模型不一定能从长上下文里稳定找到关键信息

这和我们做工程时的经验非常一致。

很多时候 TopK 从 5 调到 20 有用,
但从 20 调到 100,效果可能不升反降。


6.3 DRAG 和 IterDRAG 展现出更好的 scaling 特性

论文发现:

  • DRAG 在较短预算,比如 16k、32k 时表现更好;

  • IterDRAG 在 128k 以上更有优势;

  • 当预算继续增加,IterDRAG 能通过多轮检索和生成继续利用推理计算。

Table 1 里可以看到,在 128k、1M、5M 这种更高预算下,IterDRAG 通常表现更强。

这说明:

长上下文预算越大,越应该考虑多轮检索和迭代生成,而不是一次性把所有文档塞进去。


6.4 最优性能与推理计算量近似线性相关

论文把这个现象称为:

Inference Scaling Laws for RAG

意思是:

当推理资源被最优分配时,RAG 性能会随着 effective context length 的数量级增长呈现近似线性提升。

注意这里有一个很重要的前提:

optimally allocated

不是随便增加 token 都能线性提升,而是要选对参数配置。

如果只是无脑增加文档数量,标准 RAG 很快平台期。
如果合理组合文档、示例和迭代步骤,才会呈现更好的 scaling。


6.5 计算资源分配模型具有一定预测能力

论文还验证了 computation allocation model。

几个结果比较关键:

  • 消融实验中,完整模型的拟合效果最好;

  • Domain generalization 中,预测配置能达到 oracle 结果的 96.6%;

  • Length extrapolation 中,从 128k 外推到 1M 时,预测和 oracle 的平均差距只有 2.8%;

  • 但外推到 5M 时误差变大,说明超长上下文预测仍然更难。

这说明该模型不是纯理论包装,而是确实能为配置选择提供参考。


7. 这篇论文有什么局限?

这篇论文很有启发,但也有明显局限。


7.1 主要实验基于 Gemini 1.5 Flash

论文实验主要使用 Gemini 1.5 Flash。

这带来一个问题:

结论能否完全迁移到其他模型?

比如:

GPT-4 系列
Claude 系列
Qwen 长上下文模型
DeepSeek 系列
Llama 长上下文模型

不同模型的长上下文利用能力、指令跟随能力、ICL 能力差别很大。

所以这篇论文的趋势有参考价值,但工程落地时不能直接照搬参数。


7.2 论文没有把输出 token 和检索成本纳入主要计算

论文用 effective context length 衡量推理计算量,并且主要统计输入 token。
它排除了输出 token 和检索成本。

在论文设定的知识密集型 QA 任务里,输出通常很短,这样处理可以理解。

但在真实业务里,输出可能并不短。
比如:

生成报告
总结长文档
合同审查
代码分析
多轮问答

这时输出 token 和多轮调用成本也会变得很重要。


7.3 检索质量仍然是瓶颈

论文 Appendix 里分析了检索质量。

结果显示,随着文档数量增加,Recall 会提升,但 NDCG 和 MRR 很早就进入平台期。

这说明:

更多文档能提高“有没有召回”
但不能保证“重要文档排得靠前”

如果检索器质量不高,或者没有 rerank,长上下文只会把更多噪声带给模型。


7.4 IterDRAG 成本更高,延迟更大

IterDRAG 需要多轮调用模型,每一轮还可能触发检索。

这会带来:

更高延迟
更高 token 成本
更复杂的工程链路
更难做线上稳定性保障

所以它适合复杂问题,不一定适合所有问题。

如果用户问的是简单事实:

公司报销标准是多少?

可能普通 RAG + rerank 就够了。

如果问题是多跳复杂推理:

某政策影响下,哪些部门的流程需要调整,依据分别是什么?

这时 IterDRAG 才更有价值。


7.5 评价指标仍然存在问题

论文错误分析里提到,有些错误来自评价本身。

比如:

310 sq. km
310 square kilometers

语义等价,但自动指标可能判错。

这说明 RAG 评测不能只依赖 EM、F1、Accuracy。
真实业务中还需要:

人工评测
引用正确性
证据一致性
拒答能力
幻觉率
用户满意度

8. 对工程落地有什么启发?

这篇论文对做 RAG 系统很有价值,尤其是长上下文 RAG。


8.1 不要迷信“长上下文 + 更多文档”

很多团队做 RAG,第一反应是:

模型上下文变长了,那我多塞点文档

但论文告诉我们:

多塞文档只是增加了信息量,不代表模型能有效使用信息。

工程上应该先问:

检索结果是否相关?
正确文档是否排在前面?
是否有 rerank?
是否有噪声过滤?
模型是否真的引用了正确证据?

如果这些没做好,长上下文可能只是让 Prompt 更贵。


8.2 TopK 不应该是固定值

很多系统里 TopK 是固定配置:

top_k = 5
top_k = 10
top_k = 20

但论文说明,不同任务、不同预算、不同数据集下,最优配置不同。

工程上可以考虑动态策略:

简单问题:少量文档 + 直接回答
复杂问题:更多文档 + rerank
多跳问题:query decomposition + iterative retrieval
高价值问题:允许更大推理预算
低价值问题:控制 token 成本

也就是说,RAG 系统应该有“预算意识”。


8.3 复杂问题可以引入 Iterative RAG

对于多跳问题,IterDRAG 的思想非常值得借鉴。

工程上可以实现成:

1. 判断问题是否复杂
2. 如果复杂,生成子问题
3. 每个子问题单独检索
4. 生成中间答案
5. 汇总所有证据
6. 生成最终答案

这个流程比一次性检索更稳,尤其适合:

复杂政策问答
多文档分析
法律条款对比
技术故障排查
论文综述
财报分析

8.4 RAG 示例也可以作为 Prompt 资产

DRAG 的思想提醒我们:

示例不一定只是普通 QA 示例,也可以是完整 RAG 示例。

比如企业知识库场景,可以准备一些高质量示例:

参考资料
用户问题
标准回答
引用依据
拒答示例
多版本冲突处理示例

这些示例能告诉模型:

怎么用资料
怎么引用来源
什么时候拒答
怎么处理噪声文档
怎么处理多个候选答案

这比只写一段 system prompt 更具体。


8.5 线上 RAG 应该记录推理配置和效果

论文的 computation allocation model 对工程有一个重要启发:

如果我们记录足够多的线上数据,就可以逐步学习什么配置最有效。

线上系统可以记录:

问题类型
检索文档数量
rerank 分数
上下文长度
是否使用多轮检索
模型回答
用户反馈
人工评分
token 成本
延迟

后续就可以做策略优化:

什么问题该用普通 RAG
什么问题该用多轮 RAG
什么问题该增加 TopK
什么问题该减少上下文
什么问题该直接拒答

这比拍脑袋调参数更可靠。


9. 我自己的理解和总结

这篇论文最有价值的地方,不是提出了一个特别复杂的新模型,而是把 RAG 的优化视角从“检索更多文档”推进到了“推理计算资源分配”。

以前我们做 RAG,经常纠结:

TopK 设多少?
chunk 多大?
上下文放多少?
要不要 rerank?

这篇论文给了一个更系统的视角:

给定一个推理预算,如何把 token 花在最有价值的地方?

这句话很重要。

因为真实业务里,RAG 系统不是只追求准确率,还要考虑:

延迟
成本
吞吐
稳定性
用户体验

如果用户问一个简单问题,却触发 5M token 的 IterDRAG,那显然不划算。
如果用户问一个复杂多跳问题,却只检索 5 个文档直接回答,那又很容易答错。

所以我觉得这篇论文最大的工程启发是:

RAG 系统应该从固定流程,走向动态推理策略。

未来比较合理的 RAG 系统,可能不是一个固定 pipeline:

retrieve → rerank → generate

而是一个带策略选择的系统:

判断问题复杂度
判断是否需要检索
判断检索多少文档
判断是否需要 rerank
判断是否需要拆分子问题
判断是否需要多轮检索
判断什么时候停止

DRAG 和 IterDRAG 都是这个方向上的探索。

当然,这篇论文也提醒我们,长上下文不是万能的。
长上下文模型确实让更多信息进入 Prompt 成为可能,但能不能用好这些信息,仍然取决于:

检索质量
文档排序
噪声过滤
Prompt 设计
模型长上下文能力
推理策略
评测体系

如果用一句话总结这篇论文,我会这样说:

长上下文 RAG 的关键,不是把上下文塞满,而是把推理预算用对。

这也是我认为它值得精读的原因。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐