工具一报错,智能体就接连翻车:Agent-Reflex 把反思训练成技能

强模型也扛不住工具报错与用户改口,因为训练时没人教过它这两件事

Agent-Reflex 是中国人民大学高瓴人工智能学院团队 2026 年 10 月挂上 arXiv 的预印本,它把两件训练里一直被默认不会发生的事写进了训练分布:工具返回报错,用户中途改口。方法由 RSD、ReSFT、ORPO 三个阶段组成,目标是让 Agent 在工具或用户侧出现扰动时自行恢复,并把这种恢复从推理时临时贴上的提示词,变成训练时写进参数、可跨环境复用的技能。在以 Qwen3-8B 为底座、与其他方法同等预算的对照里,它把五个长程工具基准的 Overall 从基线的 40.2 拉到 58.6,并在专测噪声鲁棒性的 AgentNoiseBench 上拿到 8B 规模最高分 29.1 Agent-Reflex。这两个数字说的是同一件事:为工具与用户扰动专门训练一套可内化的恢复技能,确实比把噪声当奖励更管用。要理解它为什么需要这一整套训练,得先回到真实的扰动缺口有多大。

这个缺口有多大,论文用真实错误日志量了一遍。作者从 9 个公开 agentic benchmark 上重放了 177,700 条工具返回,挑出其中 24,510 条报错,按表面形式聚成 8 个失败族。这些报错正是训练配方默认不存在、而部署时反复出现的东西,也是 Agent-Reflex 要把它们注回训练环境的原因。需要说清楚的是,这些占比是多标签计数,同一条返回可能同时落进多个族,它们描述的是"哪类错出现得多",而不是互斥的份额分布。

失败族占比
Server/gateway unavailable33.6%
Auth/permission17.9%
Timeout14.7%
Resource missing10.5%
Argument/validation10.2%
Generic execution exception8.3%
Rate limit4.5%
Network connection0.3%

服务不可用和鉴权错误这两族加起来已经过半。这意味着大量失败并不是 agent 想错了,而是环境先坏了。agent 能不能在出错之后把自己拉回来,直接决定任务成败,这正是 Agent-Reflex 要训练的那类恢复能力。论文 Figure 1 的实验说明连前沿模型也躲不过:给工具返回注入噪声,或者让用户中途改口,GPT-5.2 与 Claude-4.5-Sonnet 的成功率都会明显下台阶。

这条线上的评估工具已经把"噪声"从模糊抱怨变成可枚举的清单。AgentNoiseBench 把它拆成 user-noise 与 tool-noise 两层共十个子类,在 24 个模型上做受控注入,平均掉点 20.8%,其中 tool-noise 的破坏力约为 user-noise 的两到三倍 AgentNoiseBench。噪声既然能分层枚举,就能被当成训练分布的一部分,Agent-Reflex 正是把工具报错这类扰动按失败族注回环境来训的。它的评测还要求轨迹级通过:最终答案对了但中间推理跑偏,不算数。

用户那一侧的扰动同样是环境层的,不是加一句提示词能挡住的。τ²-Bench 把会话任务形式化成双边可控的 Dec-POMDP,agent 与 user 各自握有一套工具和数据库,用户调工具会真的改写环境状态。论文报告,从"agent 全控"切到这种双边模式,GPT-4.1 成功率掉 18%,o4-mini 掉 25%,落差来自沟通与协调而非推理能力 τ²-Bench。用户改口既然是环境级扰动,就同样需要被训练进模型,这也正是 Agent-Reflex 把用户扰动一并纳入训练分布的理由。

图注:AgentNoiseBench 的三组件总览。从左到右依次是经验噪声分类法(把真实噪声拆成 user-noise 与 tool-noise)、受约束的对抗噪声注入(在保证任务仍可解的前提下施加噪声),以及轨迹感知的评测协议。这张图说明噪声不是模糊的一团,而是分层可枚举的两类,各自又能细到具体子类。AgentNoiseBench

两个缺口放在一起,就能看出为什么此前的训练配方不灵:训练时默认工具可靠、用户配合,于是模型从没学过"反馈本身可能是错的"这种情形,而真实部署里这种情况会反复出现。

四种已有的反思做法,都停在提示词或单条轨迹上,没有做成可复用的训练信号

反思不是新概念,但此前四条代表性路线都没把它提到"可跨环境复用的训练信号"这一层。用两个维度就能把它们切开:反思是活在推理时的提示词里,还是被写进训练目标;以及它修的是单条轨迹,还是整个环境里的一类恢复规则。

路线代表反思住在哪留下的缺口
推理时自我批评Reflexion自然语言反思写进 episodic memory,下一轮拼回 prompt参数一动不动,反思跨不出上下文窗口
推理时自我精化Self-Refine同一个模型自产 feedback 再据此改写输出只在单轮 prompt 里迭代,不留训练信号
训练时轨迹修复Agent-R用 MCTS 拼出"改对了"的轨迹当监督监督绑在单条轨迹上,换环境不保证管用
训练时噪声增强NoisyAgentclean 与 noisy 两组 rollout 一起训噪声只变成更难的奖励,没挖出失败里的结构

最早的反思是推理时的。Reflexion 让 Actor 失败后由一个 Self-Reflection 模型写一段自然语言总结,塞进 episodic memory,下一轮再拼回 prompt;整个过程不更新任何参数,反思只活在上下文窗口里,记忆上限还只有一到三条经验 Reflexion。Self-Refine 更轻,同一个模型既当生成器又当反馈者还当修改者,用 self-feedback 反复改写自己的输出,同样不动参数,也不需要任何训练数据 Self-Refine。

图注:Reflexion 的反思回环。Actor 生成动作送入 Environment,环境返回的 observation 交给 Evaluator 与 Self-Reflection,Self-Reflection 把反思写回 Memory,Memory 再反馈给下一轮 Actor。整圈里没有任何参数更新,反思只以文本形式在记忆里传递。Reflexion

把反思写进训练的路线里,Agent-R 是代表。它用 MCTS 在错误轨迹上找到最早出错的那一步,把好轨迹拼上来,造出一条"改对了"的 revision trajectory 当监督,让模型学会从错误中恢复,而不是只模仿全对的专家轨迹 Agent-R。这条路线的监督仍然绑在单条轨迹上。NoisyAgent 则换了思路,把 clean 和 noisy 两组 rollout 一起拿来训,让策略在更难的分布里做决策,但噪声最终只变成一个更难的标量奖励 NoisyAgent。

四条线的共同上限是清楚的:反思要么活在提示词里,要么只修一条轨迹,没有一条能变成"换个任务还管用"的训练信号。表格里空着的那一格,也就是训练时加环境级,正是 Agent-Reflex 要占的位置。

把反思变成技能,第一步是从环境失败里把它们挖出来

Agent-Reflex 的第一阶段叫 Environment Reflection Skill Discovery,简称 RSD,目标是把"反思"从一个抽象说法变成一批带环境索引、可验证、可复用的技能卡。产出规模是 557 个环境、合计 1,170 条反思元技能(平均每环境约 2 条)。技能卡描述的是环境索引的元技能:这类问题是什么、适用于哪些任务、触发边界在哪、恢复要点是什么。

RSD 不是从零搭环境,它站在两条既有的环境扩展线路上。EnvScaler 把环境形式化成可执行的 Python 类加状态加工具签名,并给每个任务配一个在终点状态上运行的校验函数 EnvScaler。Agent-World 把环境写成数据库加工具集的二元组,从 Smithery 的 MCP server specifications 挖真实数据库、生成并验证工具 Agent-World。RSD 从这里取来 557 个高用量的 MCP 环境,平均每个环境 60 个任务。

图注:Agent-Reflex 两阶段总览。左半是 Stage 1 RSD,从 557 个 MCP 环境出发注入挖出来的失败族,用能力多样的模型池采样,把同一任务的成功与失败轨迹配成对,提炼成离线技能库;右半是 Stage 2 ReSFT,从同一个技能库采样三类 continuation,经校验器确认后把技能提示剥掉,用于监督微调。中间的技能库既是第一阶段的产物,也是第二阶段的输入。Agent-Reflex

挖技能的过程是一条三步的因果链,每一步都在解决前一步遗漏的东西。第一步让扰动有据可依,RSD 不是随手加噪,而是把前面那 24,510 条真实报错聚成的 8 个失败族按伯努利分布注入到工具返回值里,注入概率 0.2,各族均衡采样。第二步解决单模型偏见,它用一个能力多样的模型池采样,9 个模型跨 5 个家族,规模从 4B 到 284B 都有,同一个任务在不同模型手里会在不同地方栽跟头。第三步把同一任务里的成功与失败轨迹配成对,交给 analyzer 归纳。

举一个示意性的例子:同一个查询退款的任务,模型甲碰到权限错误后反复重试同一个调用,把步数耗光;模型乙碰到同样的权限错误后先重新鉴权再继续,最终完成。把这两条轨迹配对,就能归纳出一条带触发条件的恢复规则,即遇到鉴权类错误时先刷新凭证再重试。单看一条失败轨迹只能得到"这次错了",把成功与失败摆在一起才能得到"这种错该怎么救"。

RSD 的原创性就在这里:反思不再是某次交互里的一句话,而是从环境失败里挖出来、带环境索引、可复用也可验证的一批技能。做完这一步,"把技能当训练数据用"才有落脚点。

技能挖出来只是半成品:ReSFT 把它变成监督数据,ORPO 再压进 token 级损失

技能库本身不构成训练信号,所以后两个阶段一个负责把它翻译成监督样本,一个负责把"有技能帮忙"这个事实压成 token 级的密集损失。

ReSFT 把每条技能拆成三类行为监督,区别在于从哪一步重来、给什么线索、要教出什么行为。

监督类型从哪里开始给什么线索教什么
Self-Reflection(SR)回到第一个出错步之前技能卡事后局部修复
Skill Recovery(KR)回到任务初始状态原任务加技能卡从头重规划
User-Centric(UR)回到第一个出错步之前用户说出的自然语言纠错把用户干预当成可学信号

Self-Reflection 让环境回到第一个出错步之前,把技能拼上去让策略续写,只保留校验器判定成功的样本。Skill Recovery 把环境退到任务初始状态,拿着原始任务和技能从头重规划,教的是全局恢复。User-Centric 让 user simulator 把技能转成一句自然语言纠错,插在出错的那一轮之后。三类样本和策略自己已经做对的轨迹合并成 SFT 数据,共 54,663 条。

这里最关键的设计是存样本时把技能卡从输入里剥掉。策略看到的是一个没有外挂提示的现场,却要产出技能所示范的那种行为。剥掉之后,它学到的是"我自己能恢复",而不是"照着提示抄"。用户那句话在 UR 样本里保留,因为它在部署时确实会出现。

ORPO 要解决的是另一个问题:SFT 教会的恢复行为,在真正的 on-policy 分布里还稳不稳。它每个任务采 G 条轨迹,多数来自干净环境,少数来自注入了扰动的环境,然后在整组上算一个 group-normalized advantage,而不是在干净组和扰动组里各自归一化。

图注:ORPO 训练流程。左侧是 mixed rollout group,旧策略为每个任务生成多条轨迹,多数干净、少数带扰动,共享同一个组内归一化优势;中间从环境的技能库里直接取技能卡;右侧让同一批 token 在普通上下文与技能增强上下文下分别打分,用置信权重合成蒸馏信号。技能分支只重新打分,不采样新轨迹。Agent-Reflex

这个归一化细节值得停一下。如果两组分开归一化,扰动组里的失败会被组内均值抹平,变成一组独立的对比信号;合在一起归一化,失败就留在策略自己的分布里,成为它必须直接面对的负向样本。NoisyAgent 走的正是分开归一化的路子。

ORPO 的另一半是把技能压进 token。做法是从环境对应的技能库里直接取一张技能卡,对同一批已经生成的 token 在两种上下文下重新打分,一种普通,一种带技能增强。两个 log-prob 之差记为 Δ 并做 stop-gradient,只保留它的大小信息,再经一个 sigmoid 门得到置信权重:

$$\Delta = \text{sg}[\ell^{\text{skill}} - \ell^{\theta}], \qquad \gamma = \sigma(\beta_{\text{opd}} \cdot \Delta)$$

直觉上,Δ 大于零说明技能卡在支撑这条 token,置信权重 γ 就把这条 token 上的辅助监督放大;Δ 小于零说明技能并不支持它,γ 就把它压下去。最终损失是 RL 项加上加权的蒸馏项,即 $\mathcal{L}{\text{ORPO}} = \mathcal{L}{\text{RL}} + \lambda_{\text{opd}}\mathcal{L}_{\text{OPD}}$。技能分支只负责打分,不采样新轨迹,梯度也只走 student 端。

这套 OPD 形式不是这篇论文发明的。SEED 已经提出用普通上下文与技能增强上下文重新打分、再用置信门加权的做法,区别在于技能从哪来:SEED 的技能是策略自己跑完轨迹后总结出的 hindsight,Agent-Reflex 换成了 RSD 挖出来的环境级技能库 SEED。

所以最终部署的是一个不带任何技能提示的策略。技能只在训练时出现,推理时既不需要技能库,也不需要检索,这是"内化"和"把提示摆在输入里"的关键差别。

58.6 与 29.1 说明它有效,但离线技能库卡住了泛化

Agent-Reflex-8B 在五个长程工具基准上的 Overall 是 58.6,在 8B 规模里排第一,比同规模的 EnvScaler-8B 高 7.7 分,比 Agent-World-8B 高 5 分,也比反思类的 NoisyAgent-8B 与 Agent-R-8B 高出一截 Agent-Reflex。这个数字的意义不是刷榜,而是说明在同等环境预算下,"把失败挖成技能再内化"比"把噪声当奖励"多拿到了实质收益。

同规模方法(8B)五基准 Overall
Qwen3-8B 底座40.2
Reflexion-8B44.7
Agent-R-8B40.1
NoisyAgent-8B43.4
EnvScaler-8B50.9
Agent-World-8B53.6
Agent-Reflex-8B58.6

在专测噪声鲁棒性的 AgentNoiseBench 上,Agent-Reflex-8B 的 Overall 是 29.1,同样是 8B 规模里最高的。但要看清它的分布:ANB-τ² 上平均 45.9,ANB-Vita 上只有 12.3;两个子基准里,工具噪声那一列都明显低于用户噪声那一列,τ² 上是 38.4 对 53.4,Vita 上是 9.4 对 15.2。更重要的是别把 29.1 读成"问题解决了":同一个基准上 GPT-5.2 是 55.8,Claude-4.5-Sonnet 是 51.0,8B 模型离前沿还差得很远。

工具噪声为什么更难救,逐步分析熵演化的实验提供了一条解释线索。实验发现,用户噪声主要抬高的是轨迹第 0 步的初始熵,模型把用户意图消歧之后还能走;工具噪声从轨迹中段开始持续抬高熵,往上下文里灌进不可靠的信息 AgentNoiseBench。把这种持续抬高的熵直觉地描述成"抽掉推理链的锚点",与观测到的结果一致,但这只是对持续不确定性的一种直觉刻画,不能由熵现象直接断定因果机制。即便放在这条线索下看,工具侧的掉点更多,Agent-Reflex 在工具噪声列上仍然补不回来。

消融说明增益来自哪一步。在 AgentNoiseBench 上拿掉任何一类监督都会掉点,其中拿掉 Self-Reflection 掉得最多,τ² 上从 45.9 掉到 41.3,Vita 上从 12.3 掉到 8.9;拿掉 OPD 掉到 43.7 与 9.5,拿掉置信加权掉到 44.5 与 10.4。这三组数字排在一起说明:光把技能摆在输入里是不够的,增益主要来自 token 级的反思监督本身。

训练动力学那边也支持这个判断。ORPO 与 GRPO、SEED 在同一批任务、同样预算下跑 100 步,平均奖励曲线更早拉开并保持上升。

图注:五种策略优化算法的训练动力学对照。全部从 Qwen3-8B 起步,在同一个任务池上跑 100 步 RL。(a) 是在留出基准上的最终准确率柱条,(b) 是同一批任务上的平均训练奖励曲线,ORPO 更早与 GRPO、SEED 拉开并持续上升。这里主要看 (b),它支撑"更稳的训练"这一说法。Agent-Reflex

最硬的边界写在论文的局限一节:这是一个离线技能库,不能自动跟上工具接口、服务行为和环境动态的变化 Agent-Reflex。如果在线更新时环境与任务的多样性不足,归纳出来的技能仍可能只贴合某个具体环境或某种局部失败模式。换句话说,它把"反思该怎么训"回答得比较完整,"反思怎么持续保鲜"还留着。

这篇论文真正改变的是一层定位:反思不是推理时贴上去的提示词,而是可以从环境失败里挖出来、内化进参数、让策略在没有提示时也能恢复的技能。这条路能不能铺到更动态的真实环境,取决于技能库能不能跟着环境一起演化。

想深入可以读原文:Agent-Reflex: Teaching Language Agents to Act Reflectively — arXiv:2610.17953

参考文献

  1. Dong et al. Agent-Reflex: Teaching Language Agents to Act Reflectively. arXiv:2610.17953 (2026-10). https://arxiv.org/abs/2610.17953
  2. Song et al. EnvScaler: Scaling Tool-Interactive Environments for LLM Agent via Programmatic Synthesis. arXiv:2601.05808 (2026-01). https://arxiv.org/abs/2601.05808
  3. Dong et al. Agent-World: Scaling Real-World Environment Synthesis for Evolving General Agent Intelligence. arXiv:2604.18292 (2026-04). https://arxiv.org/abs/2604.18292
  4. Shinn et al. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (NeurIPS 2023). https://arxiv.org/abs/2303.11366
  5. Madaan et al. Self-Refine: Iterative Refinement with Self-Feedback. arXiv:2303.17651 (NeurIPS 2023). https://arxiv.org/abs/2303.17651
  6. Yuan et al. Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training. arXiv:2501.11425 (2025-01). https://arxiv.org/abs/2501.11425
  7. Chen et al. NoisyAgent: Learning to Act under Noise. arXiv:2605.27209 (2026-05). https://arxiv.org/abs/2605.27209
  8. Barres et al. τ²-Bench: Evaluating Conversational Agents in a Dual-Control Environment. arXiv:2506.07982 (2025-06). https://arxiv.org/abs/2506.07982
  9. Wang et al. AgentNoiseBench: Benchmarking Robustness of Tool-Using LLM Agents Under Noisy Condition. arXiv:2602.11348 (2026-02). https://arxiv.org/abs/2602.11348
  10. SEED: Self-Evolving On-Policy Distillation for Agentic Reinforcement Learning. arXiv:2607.14777 (2026-07). https://arxiv.org/abs/2607.14777
工具一报错,智能体就接连翻车:Agent-Reflex 把反思训练成技能