Agentic Abstention:Agent 真的知道什么时候该停手吗?

  • 关联论文:2606.28733
  • 作者:spark
  • 更新:2026-07-23

一句话结论

论文正式定义并系统研究了「Agentic Abstention(代理式弃答)」这一序列决策问题:在多轮工具调用场景中,LLM Agent 何时该停止行动、承认任务不可完成;并提出一种不更新模型参数的上下文工程方法 CONVOLVE,把成功轨迹蒸馏为可复用的停止规则。

它要解决的真问题

现有 LLM Agent 的评测几乎只奖励「完成任务」,却忽略一个事实——大量用户指令本身就有歧义,或者在当前环境(搜索结果、终端工具、商品库)中根本不可达。一个被工业界反复看到的现象是:能力更强的模型在「做不到」时反而更会胡来、会反复调用工具、给出看似合理但完全编造的回答。论文作者把这类现象抽成一个可测量、可改进的子问题:在「无法完成」已经显现时,Agent 能否尽早、正确地停手。

这与传统 LLM abstention(弃答)研究有本质区别:传统弃答是单轮的「答 / 不答」二选一,而 Agentic Abstention 是序列决策——每一步都可选择「再调用工具 / 回答 / 弃答」,且「应当弃答」往往要和环境交互若干轮之后才显现。

核心方法

1. 问题形式化

在每一轮 t,Agent 状态 s_t 包含历史工具输出与已生成文本。可选动作 a_t ∈ {Answer, Abstain, Gather-More-Info}。奖励设计鼓励「任务真正无法完成时及时 Abstain」与「可完成时尽量 Answer」两端最大化,并显式惩罚「在已经判定不可能时仍消耗工具预算」。

2. CONVOLVE(核心贡献)

CONVOLVE 的关键观察是:成功的轨迹中隐含了「在什么时候停止也仍然正确」的判别信号。作者用一个上下文工程 pipeline 把这些信号蒸馏成可复用的 stopping rules:

  • 第一步:让一个或多个较强的模型在 WebShop / 终端 / QA 等任务上跑出成功轨迹,并标注每一步的状态(信息不足 / 已确认可达 / 已确认不可达)。
  • 第二步:从轨迹中抽取「触发弃答」的特征模式,例如「连续 N 次搜索返回空集」「终端多次返回 Permission denied」「目标商品 SKU 在所有变体中均无货」等。
  • 第三步:把抽取出的规则连同若干正/反例 few-shot 演示直接写入系统提示或工具回包,使 Agent 不需要任何参数更新就能在下次任务中触发同样的停止模式。

伪代码可表示为:

def convolve_update(trajectories):
    rules = []
    for traj in trajectories:
        if traj.outcome == "abstain_correct":
            rules.append(extract_stopping_pattern(traj))
    dedup = cluster_and_dedupe(rules)
    return rank_by_coverage(dedup)   # 覆盖最多的停止模式排在前面

上线时把 rank_by_coverage(dedup) 的前 K 条注入 prompt 中的「Stopping Heuristics」段,配合一个「累计触发次数阈值」控制器即可生效。

3. 评测设置

  • 任务:WebShop、终端环境、QA 三类共 28,000 以上任务。
  • 模型:13 个 LLM-as-agent 系统 + 2 种 agent scaffold(ReAct 与自研变体)。
  • 指标:及时弃答率(timely recall)、过度弃答率、每任务平均工具调用数、未弃答但仍失败的「幻觉完成」率。

关键实验与数据

  • 整体趋势:13 个被评测 Agent 中,没有任何一种在「及时弃答」与「避免过度弃答」两个维度同时占优;多数模型要么从不弃答,要么在做了大量无效工具调用后才弃答。
  • 典型反直觉点:在 WebShop 上,模型规模从 8B 升到 70B,「及时弃答率」反而下降;论文给出的解释是更强大模型更愿意通过重写 query、换关键词、再搜一轮来「赌一把」,而弱模型更快放弃。
  • ⚠️ CONVOLVE 在 Llama-3.3-70B + WebShop 上,把 timely recall 从 26.7 提升到 57.4(+30.7 绝对点),同时不影响 Answer 的成功率;这是论文最重要的单点结果——具体数字待原文核验。
  • ⚠️ 约 41% 的「应当弃答」任务集中在「指令看似可行但环境无匹配项」这一类,具体比例待原文核验。

亮点与局限

亮点 - 第一次把 Agent 弃答作为一个独立的序列决策问题来定义,并给出可复现 benchmark。 - CONVOLVE 不改模型参数,仅靠 prompt / 上下文工程就能拿到 +30 个绝对点的及时弃答提升,这对工业部署极其友好(不需要重训)。 - ⚠️ 数据集与代码全部公开(项目页 lhannnn.github.io/agentic-abstention)——该链接未经 web_fetch 验证,存在幻觉风险,建议访问前先用 web_fetch 确认。

局限 - 实验集中在 WebShop、终端、QA 三类任务,对真实开放域(自由网页、跨应用)的迁移性未充分验证,原文未明确给出 OOD 数字。 - 「Abstain」的动作语义仍是二元的,没有处理「部分完成 + 部分弃答」这种更细粒度的回答。 - CONVOLVE 抽取规则的过程需要 teacher 跑大量轨迹,蒸馏成本不低;论文未给出一次性蒸馏的边际收益曲线。

对工程落地的启发

  • 把「及时弃答」纳入 Agent 评测的 KPI 体系,比单纯的成功率更接近真实用户体验。任何「完成率很高但客服投诉也很多」的系统,大概率就是缺少弃答机制。
  • 在生产系统里,与其重训模型,不如先做 CONVOLVE 风格的规则注入:把「连续 N 次无结果」「连续 M 次相同错误码」「用户预算/时间窗已耗尽」等场景写成结构化停止条件。
  • 对客服、检索、订票这类「负向场景占比高」的业务,引入二元 Abstain 动作 + 解释模板(不是空字符串,而是「我无法在当前条件下完成 X,原因是 Y」)通常比让模型硬答更安全。

与同方向工作的关系

  • 与 LLM abstention 文献(Chain-of-Thought「我不知道」、Self-Consistency 的不确定性门控)相比,本文把弃答从「单轮置信度问题」扩展为「多轮序贯决策」。
  • 与 Toolformer / ReAct / Reflexion 等 Agent 框架相比,本文不改变框架本身,而是给所有框架加一个 orthogonal 的停止层。
  • 与最近的「Agentic Risk」「LLM Hallucination」研究形成互补:那些工作关注「做错」,本文关注「做不到时别硬撑」。

适合谁读

  • 做 Agent 产品落地的工程师:直接借鉴 CONVOLVE 的停止规则设计。
  • LLM 评测研究者:这是少有的把「失败模式」拆成可量化子任务的论文。
  • RLHF / 对齐研究者:可作为序贯决策下「安全动作空间」的一个实证基线。

工程落地与核查(Jay)

真实系统怎么用

三层 abstention 触发器(可直接嵌入 ReAct/Plan-and-Execute 等主流 scaffold)

层级 触发条件 对应 Abstain 动作
L1 环境层 工具返回空集 / 无结果 / Permission denied 连续 N 次 Abstain(reason="环境无匹配项")
L2 语义层 LLM 自身输出中检测到「不确定」「没找到」「无法确认」等信号词超出阈值 Abstain(reason="置信度不足")
L3 预算层 工具调用次数达到单次任务上限,或时间/Token 消耗超阈值 Abstain(reason="资源耗尽")

实际生产系统中,L1 最可靠(环境状态非黑箱),L2 最容易误触发(模型自我评估往往不准),L3 是兜底安全网。三层同时开启比单独用任一层都稳。

停止规则的结构化注入模板(参考 CONVOLVE 第三步)

STOPPING_RULES = """
## 停止判断规则
以下任一条件满足时,直接输出 Abstain,不要继续调用工具:
1. 搜索类工具连续{n_empty}次返回空结果
2. 执行类工具连续{m_error}次返回相同错误码
3. 累计工具调用次数达到{max_calls}次
4. 用户指令中的目标实体(SKU/ID/日期/金额)在所有检索结果中均不匹配

正确示例:
- 输入:「查找 2019 年款 MacBook Pro 13寸,预算 8000 元」
- 环境:搜索返回「未找到符合条件的商品」
- 正确动作:Abstain 并说明「未找到符合条件商品,可尝试放宽条件」
- 错误动作:换关键词继续搜索3次后才放弃

错误示例:
- 连续搜索5次均无结果,仍换关键词重试
- 工具返回「无权限」后继续尝试其他类似操作
"""

注入方式:将其作为 system prompt 的固定段落,或作为每次工具返回后的 tool result 附加注释。

常见坑与避让

坑 1:把「LLM 说不知道」当成 abstention 信号

这是最常见的误设计——模型说「我认为 X」不代表它真的「判断 X 不可达」。正确做法是让环境层触发(L1),而不是语义层触发(L2 alone)。

坑 2:没有分环境写规则

WebShop 的「无货」和 API 的「401 Unauthorized」和文件系统的「Permission denied」是完全不同的语义,各自需要独立的停止判断。共用同一套「连续 N 次」阈值通常效果不好。

坑 3:Abstain 后返回空字符串

生产系统里很多团队图省事,abstention 后直接返回「无法回答」或空串——这等于把问题直接甩给用户。正确做法是返回结构化的「不可达原因 + 部分满足结果(如果有的话)」。

坑 4:过度 abstention(false positive)

如果阈值设得太低,模型会动不动就放弃,user experience 反而更差。论文里提到的 timely recall vs. 过度弃答率的 trade-off 在工程上真实存在,需要在真实流量上做 A/B 调参。

核查清单(落地前必查)

  • [ ] 确认「Abstain」在产品交互流程中有对应的 UX 设计,不是直接消失或报错
  • [ ] 在 staging 环境用历史负向场景(退货查询/无货商品/无权限操作)跑一遍全流程,确认 L1 触发正常
  • [ ] 统计 abstention rate:线上 > 30% 说明阈值过低,< 5% 说明阈值过高或场景覆盖不全
  • [ ] ⚠️ 论文 GitHub 链接(lhannnn.github.io/agentic-abstention)未经 web_fetch 验证,落地前需自行 fetch 确认代码存在