搜不出来硬答对吗?阿里 x 城大这篇 AWA-RL 想让搜索 Agent 先学一句"我查不到"

arXiv: 2607.10738 | 论文 PDF | 开源代码

核心摘要

你有没有过这种经历:让一个 AI 智能体去查资料,问它"某某公司在 2023 年的 CEO 是谁",它答错了——但更让人抓狂的是,答错之后它还信誓旦旦地列了三条引用。检索明明没找到,它却从某个犄角旮旯的文档里摘了一段似是而非的话,硬编一个答案出来。

这其实不是个别现象,是当前"结果奖励强化学习(outcome-reward RL)"训练范式的一个结构性漏洞。模型被训练成"答对就给奖",但没有任何机制告诉它,遇到查不到的情况时该怎么说。结果就是:检索失败时,模型倾向于过度回答(over-answering),幻觉反而被加剧了。

阿里 x 香港城大这篇 AWA-RL(Abstention-aWAre Reinforcement Learning)瞄准的就是这个缝。它做了一件朴素但关键的事:把"弃答奖励"从常数改成和模型自身能力挂钩的动态量——对模型擅长的问题少给拒答分,对它搞不定的问题多给拒答分。再叠一个实时训练观察的"超额拒答率"做惩罚项。整个机制由一个叫"勇气因子(courage factor)" \(\gamma\) 的单旋钮控制。

在 HotpotQA、2WikiMultiHopQA、MuSiQue 三个多跳 QA 基准上,最优 \(\gamma=0.2\) 时,绝对精度(Precision)从 0.559 提到 0.662,涨了 10.3 个点;RA-F1 从 0.556 升到 0.585——而且 Accuracy 只掉了不到 2 个点。这个"少答但答得对"的甜点,传统静态奖励方法完全打不到。

我的判断:这是工程整合型工作,不是底层突破。核心 idea 朴素(按模型能力动态调拒答奖励),但胜在把一个真实存在、但被大多数 RL-for-Agent 工作忽视的训练漏洞指了出来。奖励设计挺精巧,"勇气因子"那一步的非线性映射有 insight。限制在 7B + 三 QA 上,泛化性还得再看看。


论文信息

字段 内容
标题 To Answer or to Abstain: Mitigating Search-Agent Hallucinations via Abstention-Aware Reinforcement Learning
作者 Fengji Zhang¹, Tianyu Fan², Yuxiang Zheng², Xinyao Niu², Chengen Huang², Jacky Keung¹, Bei Chen²
机构 ¹City University of Hong Kong ²Alibaba Group
日期 2026 年 7 月 12 日(v1)
分类 cs.LG / cs.AI / cs.CL
主页 arXiv: 2607.10738
代码 github.com/zfj1998/AWA-RL

问题:搜索 Agent 真的"敢拒答"吗?

RAG 已经不够用了。最近一年的工作,像 Search-R1、Tongyi Deep Research 这一类搜索 Agent(search agent),核心思路是:让 LLM 在推理过程中主动调用搜索工具——搜不到再搜,多轮迭代,直到证据齐了再回答。整个训练过程用 outcome-reward RL(GRPO 算法)做,端到端优化最终答案是否正确。

效果很猛,在多跳 QA 上把传统 RAG 甩开一截。但阿里和城大这个团队发现一个问题:这种训练范式只奖励答对,不奖励拒答

模型学到的是什么?——"不管三七二十一,先编一个看起来合理的答案上去"。为什么?因为:

  1. 答对:reward = 1
  2. 答错:reward = 0
  3. 拒答("not enough information"):reward = 没人定义

在 GRPO 的相对优势计算里,拒答的轨迹和答错的轨迹待遇一模一样,都被当作"零分"。模型很快就会发现:拒答的期望收益永远 ≤ 编一个的期望收益(万一蒙对呢)。所以只要有一丝机会,模型就会硬答

这就是所谓的"过度回答(over-answering)"。检索失败时,模型没有证据支撑,还要输出"自信"的答案——这恰恰是 hallucination 的一种。

现有方案为什么不够?

论文把现有的拒答研究归为三类,每一类都有明显短板:

第一类:往训练数据里掺拒答样本。SFT 阶段注入 10%–30% 老师模型生成的拒答轨迹,或者 RL 阶段混入 10%–30% 不可回答的问题。作者的实验显示这种做法非常不可控

  • SFT 注入拒答轨迹:refusal 率在 10–13% 之间飘,没法调;
  • RL 注入不可答问题:要么从零训练时直接崩成"懒拒答"(30% 不可答时 refusal 率 52%),要么 cold-start 情况下模型"装作没看见"这些样本(refusal 率还是 0 左右)。

第二类:给一个固定的拒答奖励。论文里叫 Static Reward baseline,设定一个全局的 \(r_{\text{ref}}\),比如 0.5 或 0.9。问题在于"一刀切"——简单题也按这个权重拒答,难题也按这个权重,忽略了查询难度方差。更糟的是从零训练时,\(r_{\text{ref}}\) 哪怕只设到 0.05,模型立刻崩到 99.9% 拒答——reward hacking 直接被触发。

第三类:依赖启发式合成的不可答数据集。比如用模板造一些本来就答不上的问题。这种数据不可避免地带有人工设计痕迹,换个 base model 可能就失效了。

总结一下这三条共性缺陷:

  1. 场景错配:大多研究在单轮 QA 上做(数学 QA、时序 QA),但搜索 Agent 是多轮 agentic setting,能力边界会随检索结果动态变化。
  2. 能力退步:典型做法是"先 SFT 训能力,再 post-hoc 训拒答",两步脱节,拒答学习往往会拖累原本的搜索和推理能力。
  3. 启发式依赖:靠合成数据 + 人工阈值,换模型就不行。

AWA-RL 想要一次性解决这三个问题。


方法核心:把拒答奖励写成"问动态题"

AWA-RL 的核心是改写 GRPO 的最终 reward。在标准的 outcome-reward RL 里,奖励就三种值——1(答对)、0(答错)、未定义(拒答)。AWA-RL 把第三种显式参数化为一个查询相关、训练步相关的动态量:

\[ R(y, y^*, q_i) = \begin{cases} 1, & y = y^* \quad \text{(Correct)} \\ 0, & y \neq y^* \text{ and } y \neq \bot \quad \text{(Incorrect)} \\ r_{\text{ref}}(q_i), & y = \bot \quad \text{(Abstention)} \end{cases} \]

注意 \(\bot\) 就是拒答动作,输出"not enough information"那一类。

关键就是 \(r_{\text{ref}}(q_i)\) 怎么算。论文把它拆成两项:

\[ r_{\text{ref}}(q_i) = R_{\text{base}}(q_i) - P(E_t) \]

\(R_{\text{base}}\) 是查询相关的基线拒答奖励(和模型本身能力挂钩),\(P(E_t)\) 是 batch 级的动态惩罚(和训练步挂钩)。下面分别说。

步骤 1:先用一次离线推理估算模型先验能力

这一步在 RL 训练开始前完成:用标准的、不会拒答的 base checkpoint(Qwen2.5-7B-Instruct + SFT 冷启动版本),对所有训练 query 各跑一次推理,估计它能答对的概率 \(p_i = P(y = y^* \mid q_i)\)

直觉是:模型觉得"自己能答对"概率越高的题,拒答奖励应该越低(别瞎拒);反之,拒答奖励应该越高(鼓励说"不知道")。

为了防止"概率被截断到 0",先做个下界裁剪 \(p_{\text{clip}} = \max(p_i, \epsilon_1)\),论文里 \(\epsilon_1 = 0.05\)

步骤 2:非线性映射 + "勇气因子" \(\gamma\)

直接用 \(1 - p_i\) 当基线有个问题:模型对"多步搜索"有天然惰性——比起折腾检索,直接输出一句 "not enough information" 容易太多了。论文管这个叫懒拒答(lazy refusal)。

为了对抗这种惰性,作者引入了一个非线性扩张映射

\[ p_i^* = (p_{\text{clip}})^\gamma, \quad R_{\text{base}}(q_i) = 1 - p_i^* \]

其中 \(\gamma \in (0, 1]\) 就是"勇气因子"。它做的事情很妙:当 \(p_{\text{clip}}\) 比较小(比如模型觉得这道题只有 10% 把握),取 \(\gamma = 0.2\) 后,\(p_i^* = 0.1^{0.2} \approx 0.63\)——模型原本觉得把握小的题,被数学上"放大"成有把握。这等于人为给模型打气,让它更愿意去搜、去尝试、去答。

作者还特意点出了理论均衡点:当 \(p_i^*\) 大于 0.5 时,"答"的期望收益(\(p_i^*\))严格大于"拒"的收益(\(1 - p_i^*\)),模型从数学上就被推着去答。\(\gamma\) 越小,模型越"敢答";\(\gamma\) 越大,模型越"敢拒"。

这是整篇论文最漂亮的一步。 一个旋钮控制从"过度自信"到"过度保守"的连续过渡,比静态 reward 灵活得多。

步骤 3:实时监控 + 动态惩罚

RL 跑起来之后,模型实际的拒答率会飘——可能因为某个 batch 里恰好难题多,拒答率飙上去;也可能因为某个 batch 里都是简单题,模型干脆不拒。

作者定义了一个 batch 级超额拒答率 \(E_t\)

\[ E_t = \frac{\hat{\mu}_{\text{ref}} - \mu_{\text{clip}}}{\mu_{\text{clip}}} \]

\(\hat{\mu}_{\text{ref}}\) 是当前 rollout batch 的实际拒答率,\(\mu_{\text{clip}}\) 是基于 \(p_i^*\) 算出来的理论期望拒答率(也做了下界裁剪)。\(E_t\) 被 bound 在 \([-1, E_{\max}]\) 之间。

然后用一段分段函数作为惩罚项 \(P(E_t)\)

\[ P(E_t) = \begin{cases} \frac{E_t}{E_{\max}} \cdot (R_{\text{base}} + 1), & E_t \ge 0 \quad \text{(over-refusal)} \\ E_t \cdot (1 - R_{\text{base}}), & E_t < 0 \quad \text{(under-refusal)} \end{cases} \]
  • 过拒(\(E_t > 0\):把 \(r_{\text{ref}}\) 往下压,模型拒答就不划算了,强迫它去搜;
  • 欠拒(\(E_t < 0\):把 \(r_{\text{ref}}\) 往上拉,模型更愿意用拒答当退路。

整个 \(r_{\text{ref}}\) 被严格 bound 在 \([-1, 1]\),不会爆炸。

步骤 4:让训练稳定的两招

光有上面的设计还不够,RL 训练本来就抖。作者又叠了两个稳定化 trick:

  1. EMA 平滑:用 \(\bar{E}_t = \alpha \bar{E}_{t-1} + (1-\alpha) E_t\)\(\alpha = 0.5\))当低通滤波器,避免单步噪声掀翻奖励。
  2. 阶梯量化:把 \(\bar{E}_t\) 按阈值 \(\tau = 0.1\) 取整,让 \(r_{\text{ref}}\) 阶梯式变化而不是连续飘——这叫"staircase effect"。

步骤 5:附送一个稠密引用奖励

光靠稀疏的 outcome 奖励训练多跳搜索太慢了。作者又加了一个 LLM-judged 引用奖励,分两项:

  • \(R_{\text{cov}}\)(Coverage):引用是否覆盖了推理所需的全部关键文档,0–1 连续值;
  • \(R_{\text{red}}\)(Redundancy):惩罚乱引一气的行为,0 / 0.25 / 0.5 / 1 的离散值。

最终的复合优势是 z-score 归一化后的加权和:

\[ A_i = 2 \cdot \text{Wh}(R) + 3 \cdot \text{Wh}(R_{\text{cov}}) - 1 \cdot \text{Wh}(R_{\text{red}}) \]

覆盖率权重 3 最高,正好对应"会搜"是 Agent 能力的主要矛盾;outcome 奖励 2 负责"答 vs 拒"的平衡;冗余度权重 -1 防止乱引。这个权重分配挺有讲究的,思路清晰。

一张图看训练动态

图1:AWA-RL 在不同勇气因子 \(\gamma\) 下的训练动态(90 个 GRPO step 内 batch 拒答率的演化)

图 1:左图是从零训练(from scratch),右图是冷启动(cold-start)。横轴是训练步数,纵轴是 batch 拒答率。不同曲线对应不同的 \(\gamma\)

左图(从零训练):\(\gamma = 0\)(亮绿色)几乎不拒答,曲线在底部横盘;\(\gamma = 1\) 拒答率一路飙到 0.7+;中间档(\(\gamma = 0.125, 0.2, 0.25\))平滑收敛到 0.3–0.5 的区间。

右图(冷启动):所有曲线都从接近 0 起步,20 步之后按 \(\gamma\) 大小稳定分层。\(\gamma = 1\) 最终到 0.6+,\(\gamma = 0\) 还是 0.03 左右,\(\gamma = 0.2\) 稳定在 0.2 上下。

重点是曲线没有乱抖,也没有 reward hacking 那种"突然全部拒答"或"突然全部不拒答"的阶跃。不同 \(\gamma\) 落到不同 plateau 之后基本横盘,这种"可预测分层"是工程上很有用的特性——调 \(\gamma\) 就像调音量旋钮,不会动一下整个训练就崩了。


实验结果:传统方法都不行,AWA-RL 找到甜点

实验在三个多跳 QA 基准上跑——HotpotQA、2WikiMultiHopQA、MuSiQue,每个取验证集 1000 条样本。Base model 是 Qwen2.5-7B-Instruct。冷启动 SFT 数据 5000 条(GPT-oss-120b 生成),RL 训练数据 5000 条(从 2Wiki 和 MuSiQue 训练集筛出来的)。

主表给出了三类 baseline 和 AWA-RL 的对比。我把它浓缩成下表(取三数据集平均):

数据驱动 baseline:操纵数据比例的方法

设置 比例 Acc Refuse Prec RA-F1
SFT + 拒答轨迹 0% 0.530 0.000 0.530 0.530
SFT + 拒答轨迹 30% 0.505 0.107 0.570 0.534
RL from scratch + 不可答题 0% 0.472 0.005 0.474 0.473
RL from scratch + 不可答题 30% 0.305 0.522 0.588 0.394
Cold-start RL + 不可答题 0% 0.544 0.002 0.545 0.545
Cold-start RL + 不可答题 30% 0.557 0.018 0.567 0.562

看一眼冷启动那一档:调比例对 Acc 几乎没影响,refusal 率始终趴在 0.018 以下——模型根本懒得拒。从零训练那档倒是能逼出拒答,但代价是 30% 不可答时 Acc 跌到 0.305,几乎是"答不动了"。

Static Reward baseline:固定拒答奖励

设置 \(r_{\text{ref}}\) Acc Refuse Prec RA-F1
RL from scratch 0.00 0.493 0.017 0.500 0.496
RL from scratch 0.05 0.000 0.999 0.000 0.000
Cold-start RL 0.00 0.552 0.012 0.559 0.556
Cold-start RL 0.40 0.469 0.338 0.708 0.561
Cold-start RL 0.80 0.426 0.441 0.747 0.540

经典的"静态奖励崩盘"——从零训练时 \(r_{\text{ref}} = 0.05\) 直接触发 catastrophic reward hacking,99.9% 拒答,模型变成"答什么都不如拒"。冷启动虽然稳定些,但 Acc 和 Prec 是严格零和(Acc 从 0.552 跌到 0.426,Prec 从 0.559 涨到 0.747),RA-F1 始终在 0.55 上下飘,找不到甜点

AWA-RL:动态奖励,\(\gamma\) 一调就灵

设置 \(\gamma\) Acc Refuse Prec RA-F1
AWA-RL from scratch 1.00 0.322 0.360 0.475 0.381
AWA-RL from scratch 0.20 0.459 0.246 0.591 0.515
AWA-RL from scratch 0.00 0.493 0.017 0.500 0.496
AWA-RL cold-start 1.00 0.458 0.383 0.738 0.561
AWA-RL cold-start 0.20 0.529 0.192 0.662 0.585
AWA-RL cold-start 0.00 0.552 0.012 0.559 0.556

冷启动 + \(\gamma = 0.2\) 是全文最佳点:相比无拒答基线(\(\gamma = 0\)),Acc 只掉 2.3 个点(0.552 → 0.529),Refuse 涨到 19.2%,Prec 直接从 0.559 跳到 0.662(涨 10.3 个点),RA-F1 从 0.556 升到 0.585。

这个结果验证了论文的核心主张:动态奖励打破了静态方法的"零和"约束。你不必在"答得多"和"答得准"之间二选一——少答一些题,剩下的答对率反而上去了。

分数据集看:哪些场景收益最大

我没在主表里放全部细节(附录里有按 HotpotQA / 2Wiki / MuSiQue 拆开的三张表),挑几个有意思的:

  • HotpotQA(最简单的一档):冷启动 \(\gamma = 0.2\) 时 Prec 飙到 0.757,RA-F1 0.719。简单题多,模型最敢拒也最受益。
  • 2WikiMultiHopQA(中等难度):冷启动 \(\gamma = 0.125\) 时 RA-F1 最优 0.621。略低于 HotpotQA。
  • MuSiQue(最难):冷启动 \(\gamma = 0.2\) 时 RA-F1 0.424,绝对值最低,但相对 baseline 提升最明显——MuSiQue 的题跨文档跳跃多,本身就是幻觉高发区,弃答收益最大。

HotpotQA 基线 Acc 0.674 时 RA-F1 也才 0.675,基线就已经"无拒答"接近上限了;MuSiQue 基线 0.392 时 RA-F1 0.393,提升空间大得多。说明 AWA-RL 真正吃红利的,是题库本身难度高、模型容易瞎编的场景

训练稳定性

图 1 那个分层曲线就是答案——\(\gamma\) 越大,最终 plateau 越高;\(\gamma = 0\) 几乎不拒答;中间档在 0.2–0.5 拒答率收敛。没有振荡,没有 reward hacking。对比 Static Reward 的"一行直接归零",这个稳定性是工程上很值钱的特性。


我的判断

亮点

指出了一个真实存在但被忽视的训练漏洞。 "答对有奖,拒答无奖"这个结构性问题,在 Search-R1 系工作里基本没人正面处理过。大家都默认"答不出来模型会自然拒答",但实验数据打脸——冷启动 baseline refusal 率 0.012,几乎不拒答。AWA-RL 把这个隐性假设捅破了,单凭这一点就有发表价值。

勇气因子 这一步的非线性映射有真 insight。** \(p_i^* = p_i^\gamma\) 这一步把"调模型自信度"压缩成一个旋钮,比传统加 reward bonus 的做法干净得多。从图 1 看,\(\gamma\) 在 0.125 / 0.2 / 0.25 之间微调就能精确控制拒答率落点——这在 RL 训练里很少见。

完整的失败案例分析。 论文没有回避 baseline 的崩盘——从零训练 + \(r_{\text{ref}} = 0.05\) 直接 99.9% 拒答这种 reward hacking 经典坑,作者专门拎出来展示,并解释了为什么 AWA-RL 不会重蹈覆辙。好的 RL 论文就该这么写

稠密引用奖励设计合理。 覆盖率 3 权重 + outcome 2 权重 + 冗余 -1 权重的分配对应了"会搜 > 会答 > 别乱引"的能力优先级。z-score 归一化也避免了不同尺度奖励互相打架。

问题与怀疑

1. 评估基准相对窄。 三个多跳 QA 都是英文 Wikipedia 上的事实型问答,对应的"幻觉"主要是事实捏造。真实工业场景里,搜索 Agent 面对的是中文查询、多源混合数据、长尾 query、模糊意图——AWA-RL 在这些场景下表现如何,论文没给答案。

2. 评测指标 RA-F1 的"公平性"可以再推敲。 论文把 Acc 当 Recall、Prec 当 Precision 算 F1。但严格来说 F1 的 Recall 分母是"应当被回答的总数",而 Acc 的分母是"所有 query"——这里"应该拒答的 query"和"应该答的 query"是混在一起的。当模型拒答率提高时,Acc 必然下降但不该被当成 Recall 损失。这个定义虽然方便,但概念上有点 hack 嫌疑。

3. "勇气因子"还是需要人肉调。 论文承认"最优 \(\gamma\) 还是得经验调"(Limitations 一节明说了)。虽然响应性比静态奖励好得多,但"自动调 \(\gamma\)"这个问题没解。如果能做一个"在线估计最优点"的扩展,论文会更闭环。

4. 先验 \(p_i\) 的离线估算开销不小。 RL 训练前要跑一遍完整训练集推理,5000 条多跳查询 × 多轮搜索 × GPT-oss-120b 判分,这是个不小的固定开销。论文自己也在 Limitations 里坦白了,但没说具体多少 GPU 小时。

5. 缺少和同期 abstention 工作的直接对比。 比如 Abstain-R1(2604.17073)也是 2026 年做拒答 RL 的工作,AWA-RL 没引用也没对比。这个对比如果是赢的,论文说服力会上一个台阶;如果是平的,至少也得有交代。

跟同期工作怎么比

  • vs Search-R1(基础 SOTA):AWA-RL 在 Search-R1 训练范式上叠加动态拒答奖励,是同方向的延伸,不是替代。简单说,AWA-RL 是 Search-R1 + 拒答
  • vs Static Reward baseline:完全胜出,\(\gamma = 0.2\) 冷启动的 RA-F1 0.585 vs \(r_{\text{ref}} = 0.4\) 冷启动的 0.561,绝对差 2.4 个点。
  • vs Abstain-R1(同期拒答 RL):场景不一样。Abstain-R1 关注"unanswerable query 上怎么拒答 + 怎么追问澄清",主要在数学推理 QA 上做;AWA-RL 关注"搜索 Agent 检索失败时怎么拒答",场景在多跳搜索 QA。两者解决的问题不同——AWA-RL 不是 abstention-RL 的"更优版本",而是"在 agentic search 场景里的特定方案"。

工程上能借鉴什么

如果要在自己项目里复现这个思路,三个点值得拿:

  1. 先做能力先验估算:用基础 SFT 模型离线跑一遍训练集,把每个 query 的成功率当 \(p_i\) 存下来。这一步开销大但价值高。
  2. 给拒答奖励一个旋钮:别用常数 \(r_{\text{ref}}\),给个跟 \(p_i\) 相关的动态量。最简单的起点是 \(1 - p_i\)
  3. EMA + 阶梯量化防抖:单步 batch 拒答率本身很 noisy,EMA 平滑 + 阶梯量化是 RL 训练里通用 trick,不光 AWA-RL 用得上。

一句话收尾

AWA-RL 不是那种让你"看完直呼优雅"的工作,但它是真把一个被忽略的训练漏洞补上了——而且补的方式相当克制:一个旋钮 + 一条 EMA 平滑线 + 一步非线性映射。这种"小而稳"的工程改进,在 RL 实战里往往比花哨的大模型架构更有用

如果团队正在做搜索 Agent / RAG 类应用,强烈建议读一下论文 + 跑一下作者开源的代码——至少把那个"勇气因子"\(\gamma\) 在自己的数据上扫一遍,可能就能捞到几个点的 Precision。


论文信息:Fengji Zhang, Tianyu Fan, Yuxiang Zheng, Xinyao Niu, Chengen Huang, Jacky Keung, Bei Chen. To Answer or to Abstain: Mitigating Search-Agent Hallucinations via Abstention-Aware Reinforcement Learning. arXiv: 2607.10738, 2026.

觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我。