S2G-RAG:让 RAG 学会回答"我到底还差什么"——HotpotQA 上 F1 暴涨 13 个点
核心摘要
多跳 QA 的 iterative RAG 这两年卷得很厉害,但你仔细看一线系统的 failure mode,会发现两个反复出现的毛病:要么在证据不够的时候就硬答(answer from incomplete chains),要么不停检索一堆重复或干扰文档(distractor-heavy text),越查越糊涂。
苏州大学这篇 S2G-RAG 给的方案挺干净:把 RAG 的检索控制做成一个独立的结构化 judge——每一轮检索后,先问自己"够不够",不够的话还要明确说出"缺哪个具体信息"。Sufficiency 是 binary decision;Gap 是 structured item(target + slot 等字段),直接映射成下一轮 query。再配一个 sentence-level evidence extractor 做证据压缩,避免噪声累积。
效果挺打的:HotpotQA 上 EM/F1 从 SIM-RAG 的 32.7/43.3 跳到 43.3/56.5(+10.6 EM、+13.2 F1);2WikiMultiHopQA +7.6 EM;TriviaQA +1.3 EM。判断子 backbone 用 LoRA 微调过的 Llama-3.2-3B,轻量到可以即插即用——不动 retriever、不重训 generator。
一句话评价:把 iterative RAG 的"决策语义"从 free-form text 升级成 structured prediction,是个工程感很强、值得抄的范式。
论文信息
- 标题:S2G-RAG: Structured Sufficiency and Gap Judging for Iterative Retrieval-Augmented QA
- 作者:Minghan Li, Junjie Zou, Xinxuan Lv, Chao Zhang, Guodong Zhou
- 机构:Soochow University, Suzhou, China
- 日期:2026/04/26
- arXiv:https://arxiv.org/abs/2604.23783

图1:给定问题 q 和当前证据上下文 C_t,S2G-Judge 先输出"够不够"的 sufficiency 决策 s_t;如果够,reasoner 直接基于 (q, C_t) 出答案;如果不够,输出 structured gap items G_t 驱动下一轮 query 构造,再由 sentence-level 抽取器把新检索结果压成 E_t,更新 C_t = C_{t-1} ⊕ E_t。整个循环直到证据充分或预算耗尽。
问题动机:iterative RAG 的"控制黑盒"
说实话,自己手撸过 multi-hop RAG 的人都懂这种痛——
你让模型自己判断"还要不要继续查",结果它的判断逻辑藏在 free-form CoT 里,完全没法 audit;你让它生成下一轮 query,结果它要么换个 paraphrase 检回同样的文档,要么 query 太泛接收一堆噪声;你想用 process supervision 训判断子,发现训练数据里的中间状态全是"理想轨迹",跟真实 pipeline 跑出来的"带噪上下文"完全两个 distribution。
论文里举了个非常具体的例子:
"In which country was the director of Home Alone born?"
第一轮检索可能识别出 bridge entity(Chris Columbus),但漏了 answer-bearing attribute(他的出生地)。这时候要么硬答错,要么继续检索——但通用的 follow-up query 容易反复检回近似页面,noise 越堆越多。
S2G-RAG 想解决的就是这个控制信号的 explicit & auditable 化。
我之前在做企业 RAG 的时候特别有共鸣——业务方最常问的不是"准确率多少",是"为什么这个 case 答错?"。如果控制信号是 free-form text,你根本没法解释;如果是 binary sufficient + structured gap,至少能告诉客户"系统判断证据不够,缺少 X 字段的 Y 信息"。这是个工程刚需。
方法核心:三件套
1. S2G-Judge:结构化判断
每一轮,judge 收到 (q, C_t),输出:
- sufficiency:s_t ∈ {true, false}
- gap items:G_t = {(target, slot, ...)} 一组结构化字段
如果 s_t = true,answer reasoner 直接基于 (q, C_t) 生成答案。否则进入下一轮。
这里 "结构化 gap" 是关键设计——不是"我还需要更多关于 Chris Columbus 的信息"这种 free text,而是 {target: "Chris Columbus", slot: "country_of_birth"} 这种 typed field。论文里对比了 free-text gap query vs structured gap query:
| 变体 | EM | F1 | Correct Retrieval |
|---|---|---|---|
| Free-text gap query | 41.5 | 54.5 | 50.5 |
| Structured gap query (K=1) | 43.3 | 56.5 | 52.7 |
差距 +1.8 EM / +2.0 F1。Structured 在 BM25 这种 lexical retriever 上特别吃香——因为字段化的 query 词形稳定,避免 free-text 那种"换个说法就检不到"的脆性。
2. Gap → Query:BuildQuery
把 gap items 映射成下一轮 retrieval query。论文消融发现 K=1(只用一个 gap item)就够了,K=2/3 没明显增益。这跟我们工程经验一致——multi-hop 的实质是逐跳推进,每一跳只问一件事更稳。
3. Sentence-level Evidence Context
iterative retrieval 最大的副作用就是 context bloat——直接 concat 检索结果到上下文,跑到第 4 轮就成了"distractor heaven"。S2G-RAG 用一个 evidence extractor,从新检索文档里挑出 ≤ K_e 个 salient sentence,还会显式 prioritize 跟 G_t 对齐的句子。

图3:横轴是 retrieval turn,纵轴是上下文长度。绿色 Evidence Context(只累积抽取器选中的句子)比红色 Concatenated Context(直接拼接全部检索文档)压缩了一个数量级。
K_e 的消融也挺干净:K_e ∈ {2,4,6,8,10},EM 都在 43.2-43.4,F1 在 55.8-56.5——说明这个 cap 是 ceiling 不是 target,抽取器会根据检索结果灵活返回。HotpotQA 这种 two-hop 问题通常只需要少量关键句,cap 调高了也不会变差。
训练:从执行 trace 蒸馏
这块是论文最有方法学价值的部分。
很多前作的 turn-level 监督来自"理想轨迹"——人工或 oracle 生成的完美检索路径。问题是测试时的真实中间状态根本没那么干净:有 redundancy、有 distractor、有偶尔检不到的轮次。理想轨迹训出来的 judge 在真实 pipeline 里水土不服。
S2G-RAG 的做法:
- Execution-trace collection:用未微调的 judge backbone 跑完整 iterative pipeline,rollout 到固定 budget T,记录每一轮的 (q, C_t) 快照。这些 C_t 自带 redundancy 和 distractor,跟测试分布一致。
- Teacher labeling:让 GPT-4o-mini 在"只看 evidence context"的约束下,给每个快照打 sufficiency + gap items。
- Distillation:用 LoRA 把这些 label 蒸馏到一个 lightweight judge(Llama-3.2-3B-Instruct)。
关键点:teacher 只看 context、不看 gold answer。这避免了 teacher 用"答案泄露信息"打标签的污染。
这个 supervision 设计我觉得是论文最容易被低估的地方——很多工作把"teacher label"当成 oracle,但 teacher 本身就有 hallucination 风险。约束 teacher 的可见信息范围,是个非常实用的工程纪律。
实验:在三个 benchmark 上的整体战绩
实验配置: - Reasoner:Llama-3-8B-Instruct - Judge:Llama-3.2-3B-Instruct + LoRA(蒸馏自 GPT-4o-mini) - Retriever:BM25(Pyserini)或 E5-base-v2 - Budget:T=4 轮,top-k=6 - 数据集:TriviaQA(单跳)、HotpotQA(二跳)、2WikiMultiHopQA(二跳+实体消歧)
主表关键提升(BM25 retriever,相对 SIM-RAG):
| 数据集 | SIM-RAG EM/F1 | S2G-RAG EM/F1 | ΔEM | ΔF1 |
|---|---|---|---|---|
| TriviaQA(单跳) | 70.7 / 75.6 | 72.0 / 77.9 | +1.3 | +2.3 |
| HotpotQA(二跳) | 32.7 / 43.3 | 43.3 / 56.5 | +10.6 | +13.2 |
| 2WikiMultiHopQA | 34.1 / 40.2 | 41.7 / 48.6 | +7.6 | +8.4 |
我看到 HotpotQA 上 +13.2 F1 的时候有点不敢相信。这种幅度在 RAG 领域不常见——通常是 1-3 个点的争夺。但仔细看就明白:
- 单跳 TriviaQA:提升小(+1.3)。说明在不需要多轮检索的场景,S2G 主要靠 evidence extractor 抗噪。
- 多跳 HotpotQA/2Wiki:提升大。这正是 structured gap prediction 该发挥作用的地方——每一轮明确"还差什么"。
这种"难度越大,提升越大"的 pattern 是好方法的标志。
判断子的稳定性

图2:S2G-Judge 在二分类 sufficiency 判断上的混淆矩阵——可以看到 judge 在 sufficient/insufficient 两类上的预测比较均衡,不是简单"全说不够"的退化策略。

图4:横轴是最大 retrieval budget T,纵轴是 HotpotQA F1。蓝色是 GPT-4o-mini teacher、红色是训练后的 S2G-Judge、灰色是未微调 controller。可以看到 S2G-Judge 在 T=3-4 时已经追近 teacher,远高于未微调 baseline。说明 LoRA 蒸馏出来的小模型 judge 是真的学会了。
判断子 backbone 的消融:
| Judge backbone | TriviaQA EM/F1 | HotpotQA EM/F1 | 2Wiki EM/F1 |
|---|---|---|---|
| Llama-3.2-3B-Instruct | 72.0 / 77.9 | 43.3 / 56.5 | 41.7 / 48.6 |
| Qwen-3-4B-Instruct | 70.4 / 77.4 | 44.6 / 56.0 | 42.8 / 50.2 |
两个 3-4B 的小模型 backbone 表现几乎一样。这说明接口设计的稳健性大于 backbone 选择——只要 judge 学会输出 structured sufficiency + gap,具体用哪家小模型不太重要。
Retrieval breadth 的鲁棒性

图5:横轴是每轮检索的 top-k(从 2 到 20),纵轴 EM/F1。可以看到曲线非常平——k 翻 10 倍,性能波动也就 1-2 个点。这是 sentence-level evidence management 在起作用——k 越大噪声越多,但抽取器把进入 context 的只是 salient sentences,挡住了 distractor。
这个 robustness 结果对工程部署特别有意义——你不用精确调 retriever 的 top-k,给个保守的中间值就行,系统自己会把噪声挡在 context 之外。
我的判断
亮点:
- decision interface 升级到 structured prediction:从"判断子说一段话"升级到"输出 typed sufficiency + gap fields"。可 audit、可 debug、对 retriever 友好。
- process supervision 设计很干净:execution trace 取代 ideal trajectory,teacher 在 context-only 约束下打标签——这两件事一起避免了 distribution mismatch 和标签泄露。
- 轻量、即插即用:judge 是 LoRA 微调的 3-4B 小模型,不动 retriever、不重训 generator。任何现有 iterative RAG 系统都可以接。
- 多跳收益巨大:HotpotQA +13.2 F1 这种数字不是堆出来的,是 method 本身打在 pain point 上。
问题:
- structured gap schema 怎么设计是个开放问题:论文用了 target + slot 这种 OpenIE 风格的 schema,对 Wikipedia 类问答效果好。但金融、法律、医疗这些领域的"事实结构"非常不同,schema 需要重新设计。可迁移性这块论文没多说。
- teacher 是 GPT-4o-mini:成本端可控,但如果 teacher 本身在 gap labeling 上有偏差,整个学习系统都会带着同样的 bias。论文没做 teacher 选型的消融。
- TriviaQA 提升很小:在不需要多轮检索的场景,S2G-RAG 的优势没那么明显。如果你的 workload 主要是单跳,引入一个额外 judge 的 latency 不一定划算。
- 真实生产场景的 budget:T=4 轮、每轮 6 文档、top-k 灵活。生产环境延迟敏感的场景能不能跑到 T=4 还是个问题。
工程启发
如果你在做:
- 企业 multi-hop QA:S2G-Judge 这套结构化判断子的设计值得直接抄。把"决定再检索/停止"和"决定查什么"分开,比让一个大模型 free-form 决策可控得多。
- agentic RAG:把 sufficiency + structured gap 当成 agent 的 internal state,可以让 trajectory 变得 inspectable。这对 debug agent 死循环、no-progress 检索特别有帮助。
- knowledge-intensive 应用:sentence-level evidence extractor 这一组件可以单独提出来用,对任何长 context RAG 都是减负工具。
- 小模型 + 大模型混搭:judge 用 3B + reasoner 用 8B 这种配置,在保留多跳能力的同时把 inference 成本压下来——比起全程跑 70B 性价比高得多。
最后说一句反向论证——你可能觉得"现在的 LLM 智能体不就是 ReAct 思考+行动吗?为什么还要专门设计 sufficiency judge?" 但你看看 ReAct 实际跑出来的 trajectory,会发现"我应该再查"和"我已经够了"的判断全藏在 free-form text 里,没有一个明确的状态变量。S2G-RAG 的贡献就是把这个隐藏状态显式化、结构化、可学化——这对生产系统是真正有价值的事。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我