摘要:本文解读Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training(arXiv:2501.11425v1)。Agent-R 的核心思路,是把数据构造与当前策略的错误连在一起:先用 MCTS 搜索出可比较的好/坏分支,再由当前模型判断“从哪里开始纠正”,把失败历史、反思标记与好路径拼接成训练样本,通过迭代 SFT 逐轮更新模型。文章重点区分了“拼接的文本”与“能执行的恢复路线”,指出坏路径可能已改变环境,续接需重新执行与检查;同时厘清主评测与恢复评测是两种不同指标,并梳理了消融实验里值得带走的发现(满分轨迹仍可能保留坏习惯、多加较好路线不一定更好、更早转折是模型识别行为的指标等)。适合想理解 Agent-R 机制、并关注其工程落地边界的读者。
一个合成物品的智能体缺少原料,却反复执行同一条制作命令。环境每次都告诉它“材料不足”,它每次都换一种措辞说“再试一次”。
如果训练集全是成功路线,模型很容易学到“拿原料、制作、完成”,却未必学到“已经制作失败时,检查库存并补齐原料”。
Agent-R 想把后一种经验写进模型参数。它先让模型搜索出好坏路径,再把失败历史与纠正过程组织成训练样本,逐轮更新模型。重点不只是留下一个最终正确答案,而是学习在错误继续扩散前,切换下一步行为。
本文依据Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training的 arXiv2501.11425v1,2025-01-20版本,核对正文和附录 A–C。本文没有复现原实验;下文机制例子和工程检查建议会单独标明。[1]
一份成功轨迹,为什么没有教会恢复
交互任务的训练样本通常长成“动作—观察—动作—观察”。动作会改变后续状态,因此,学习者一旦走偏,后面的输入也可能与成功示范不同。
成功路线告诉模型在理想状态下怎么做。恢复路线还需要告诉它:之前做错了什么,环境实际上变成了什么,现在怎样继续完成目标。
把失败轨迹配一个“失败”标签,可以用于结果奖励或偏好训练。但这个标签本身没有明确指出:应在哪一步停止盲试,下一条有效动作是什么。长任务里,终局分数尤其难提供细粒度纠正信息。
Agent-R 将数据构造和模型更新连在一起。训练前先探索,再判断可修正的位置;训练后用更新模型重新探索和判断。这是一种迭代 SFT,即监督微调。MCTS 用于采集与比较轨迹,不代表训练阶段直接运行了策略梯度强化学习。
图 1|Agent-R 的两个阶段:构造轨迹与迭代训练。终局奖励支持筛选,当前模型参与动作判别;训练还混入好轨迹和通用数据。回路表示下一轮重新构造数据,不能理解为拿着固定纠正集反复训练。依据 v1 第 3 节整理。
MCTS 提供的,是可以比较的不同分支
蒙特卡洛树搜索(MCTS)把交互过程组织成一棵树。一个节点包含当前交互历史;往下扩展一个动作,环境返回新的观察,形成一个子节点。
搜索反复进行选择、扩展、模拟和回传。模拟会继续运行到终点或深度限制,用最终奖励估计分支质量。选择阶段同时考虑目前看起来较好的分支,以及访问较少、值得探索的分支。
原文使用基于置信上界的树搜索选择规则(UCT):
UCT(s) = Q(s) + c√(ln N_parent(s) / N(s))
Q(s) 是估计的平均奖励,N(s) 是该节点的访问次数,N_parent(s) 是父节点的访问次数,c 控制探索项权重。第一次访问等实现边界需要在搜索器中处理,这个公式描述的是选择原则。
从搜索树里,可以找到一段共同前缀,以及从同一位置分出的低奖励路径和高奖励路径。这比从两份无关日志里随意挑一个失败和一个成功更有约束:两条路径至少有可核对的共同历史与分岔点。[1, §3.1]
论文将轨迹分为四类:
| 轨迹 | 含义 | 在训练构造中的作用 |
|---|---|---|
| 初始轨迹 | 分岔前共享的动作与观察 | 给出共同任务上下文 |
| 坏轨迹 | 从共同前缀延伸,最终奖励低 | 提供模型实际可能遇到的失败历史 |
| 好轨迹 | 从共同前缀延伸,最终奖励较高 | 提供较好的后续行为 |
| 纠正轨迹 | 保留一段坏轨迹,加入反思标记,再接入好路径 | 让模型在失败上下文中学习切换行为 |
“好”不必一开始就等于满分。模型对环境不熟悉时,要求所有训练路线都完美,会导致早期能收集到的样本太少。论文额外设置好轨迹质量门槛,并在后续轮次提高它。
谁来决定,从哪里开始纠正
一种简单做法是让模型一直走到坏轨迹结尾,再附上反思和好路线。这就是论文比较的 Direct-Revision。它容易构造,但模型看到的切换时机总是很晚。
Agent-R 让当前 actor 模型逐步判断自己的动作。给它任务、历史、当前动作和观察,要求先解释,再判断动作是 Good、Bad,还是 Uncertain。遇到它能辨认的第一个错误动作,就用这个位置作为转折点,截断后面的坏路径。[1, §3.1;附录 A]
这里的“第一个错误”有一个重要限定:**是当前模型能够识别的错误,不是经过人工或因果分析认证的最早致败步骤。**判断器也可能漏判、误判,Uncertain 则表示信息不足。这些标签与环境给出的终局奖励承担不同职责。
判断器寻找切换位置,搜索树提供好分支,环境奖励筛选整体质量。不能把这三个环节合成“模型自己已经知道哪里一定错了”。
接下来,保留转折点之前的错误历史,加入反思标记 rs,再接入好路径。v1 中的 rs 是一个短对话标记:助手表示需要调整,人类侧给一个确认。构造时从十条手写的通用反思语句中随机选取一条。
因此,训练数据并非每个位置都附有专家撰写的精细诊断。rs 的主要作用是标记行为切换;具体下一步怎样走,来自拼入的好轨迹。
图 2|训练文本的组织关系。模型判断决定错误片段保留到哪里,相邻好分支提供正确续段;不能把红色错误片段也当成希望模型重复的目标。图表达训练数据拼接,不声称一句反思会自动把真实环境恢复到共同前缀的状态。依据 v1 式 3、附录 B 整理。
把这个过程翻译成一个教学例子:库存里没有石英板,智能体制作失败;它读到失败反馈后,学习先确认库存、取得原料,再制作。保留失败动作与材料不足的观察,才能让模型理解“为什么现在要补原料”。这个例子是本文解释,未运行 Minecraft 或 TextCraft。
拼接的文本,与能执行的恢复路线,要分开检查
这一步很容易被读成:“把错误动作替换成正确动作,整条轨迹就修好了。”
实际上,坏路径可能已经改变了环境。原料被消耗、网页跳到别处、文件已被覆盖之后,原好分支中的动作,未必还能在当前状态直接执行。
v1 的轨迹定义将好路径接在坏片段与 rs 之后,并说明 rs 本身不改变环境。共享前缀为分支比较提供依据,但不能推出任意拼接后的状态都一致。因此,把该思路用于生产环境时,还需重新执行续段、检查状态,必要时显式回滚或生成新的恢复动作。这是根据轨迹定义提出的工程限制,不能写成原论文已经完成了通用状态一致性验证。
如果错误动作只是一次无效调用,环境状态没有改变,续接比较容易成立;如果错误具有不可逆影响,问题就更难。只修改 action、不更新后续 observation,会留下“环境从未发生过却出现在日志里”的训练样本。
训练损失也要区分上下文与目标。原文的纠正项以坏轨迹前缀作为条件,监督反思标记和较好的后续动作。错误历史进入输入,是为了教恢复;它不因此变成需要再次模仿的动作目标。环境观察则作为后续动作的条件。[1, §3.2]
用通常的负对数似然记法,可以把目标概括为:
L = η(L_good + L_revision) + (1−η)L_general
这里三个 L 分别表示好轨迹、纠正部分以及通用对话的监督损失;这是机制层面的改写,并未替原文补定具体归一化实现。本文采用最小化负对数似然的惯例,因为 v1 式 6 写正的 log 概率、文字却说最小化,符号存在不一致,不能直接照抄成损失实现。
迭代训练:提高数据门槛,也改变错误分布
实验的主模型是 Llama-3.1-8B-Instruct。每轮用当前模型重新收集轨迹、判断转折并训练,总共三轮。混合通用 ShareGPT 数据,原文设置 η=0.2,兼顾交互训练和一般语言能力。
好轨迹门槛 α 依次设为 0.5、0.7、1.0;好坏划分阈值 β 为 0.2。β 在这里是奖励门槛,不是专家接管概率。与 DAgger 使用的同名符号含义不同。
还有一个复现时需要看清的边界:v1 式 4 写 α < r_good ≤ 1,却在第三轮令 α=1.0。严格按这个不等式没有可用样本。结合正文,应理解为第三轮意在筛选满分轨迹;真正编码时,仍需核对实现是否采用包含端点的阈值。
| 原文设置 | 数值 | 它约束的环节 |
|---|---|---|
| 搜索任务数 | WebShop 300;SciWorld 200;TextCraft 200 | 采集的任务起点,不是总轨迹条数 |
| 搜索深度 | 20 | 单次树搜索路径深度限制 |
| 每次扩展候选动作 | 4 | 局部候选数量 |
| 每次蒙特卡洛估计的 rollout 数 | 8 | 分支价值估计成本 |
| UCT 探索系数 | 0.25 | 探索与利用的权衡 |
| 测试任务数 | 200;200;100 | 三个环境各自的评估集合 |
各轮筛选后的好轨迹与纠正轨迹数量也不同。模型、质量门槛和数据分布同时变化,跨轮增益不能简单归因于一个因素;与其他方法比较时,还要关注数据量和采集成本是否对齐。
这些数值不能组合成“实际搜索了完整的 4²⁰ 棵树”。MCTS 选择性探索,论文也没有据此报告完整枚举量。
附录报告训练使用 8 张 A100-80GB;学习率 2×10⁻⁵,首轮 3 epochs,后两轮各 1 epoch。每卡 batch 为 1,梯度累积为 16,并根据序列并行调整;序列长度原文写 8,196。硬件配置不等于公开的总训练时长或推理成本,原文没有给出的部分不宜推算成复现承诺。[1, §4.2;附录 C.1]
整体得分与失败后续跑,是两种不同评测
主评测从任务起点开始运行,最多 100 轮交互。WebShop 和 ScienceWorld 采用平均终局奖励,TextCraft 采用成功率。原表以百分制呈现,并对三个分数做算术平均。
| 同一基础模型上的训练方法 | WebShop | SciWorld | TextCraft | 三任务平均 |
|---|---|---|---|---|
| 未做上述任务训练 | 19.65 | 14.36 | 26.00 | 20.00 |
| ETO | 52.80 | 67.55 | 75.00 | 65.12 |
| Direct-Revision | 54.44 | 66.65 | 66.00 | 62.36 |
| Agent-R | 63.91 | 70.23 | 78.00 | 70.71 |
数据:v1 表 2。不同列的指标含义不同,不能把全部数值都叫作成功率。70.71−65.12=5.59 是平均分增加 5.59 点,不是相对提升 5.59%,也不是所有任务统一提高了同一种指标。
恢复评测则先收集基础模型在测试任务中的零奖励失败轨迹,随机选择一个位置截断,然后要求不同模型从该历史继续,最多再交互 50 轮。它专门检查模型面对失败上下文时能否改善结果。
图 3|恢复评测与从头完成任务的评测分开。截断位置和已有状态共同定义起点,续跑预算限制剩余机会。实际复现须保证日志、环境状态与截断位置一致;这项状态一致性要求是执行协议的必要条件,图中没有新增教师答案提示。依据 v1 第 4.4 节整理。
第三轮 Agent-R 在这一评测中的三任务平均为 46.75,Direct-Revision 为 35.67;在 TextCraft 上分别为 43.24 与 29.73。[1, 表3]
这些结果是在“基础模型已经失败且随机截断”的条件集合上取得的分数,不能当作所有日常运行的通用恢复概率。恢复评测与主评测的起点、分母、步数上限都不同。
消融实验里,哪些发现值得带走
原文的分析不仅比较最终表格,还检查了训练数据类型、动作重复和转折位置。
**只保留满分轨迹,仍可能保留坏习惯。**一条最后成功的路径,中间也可能多次重复无用动作。Agent-R 的纠正样本提供了摆脱错误模式的信号。论文观察到它减少反复动作;没有把“重复减少”证明成一切性能增益的唯一原因。
多加一些较好路线,不一定更好。“最优轨迹+好轨迹”的对照可能低于只用最优轨迹。作者解释为较好路线可能包含噪声;纠正路线虽然也有不完美部分,却额外提供恢复信息。这是对结果的解释,不是严格分离全部数据因素后的因果结论。
**更早的转折,是模型识别行为的指标。**论文的 revision length 从坏路径起点数到模型第一个判错位置。它变短,表示判别更早;仍需检查判别是否正确,不能把这个长度直接称作“真实错误定位准确率”。
**多任务训练的优势有设置边界。**第三轮 Agent-R 的多任务平均为 70.71,单任务为 67.96。但 Direct-Revision 的第三轮多任务为 62.36,低于单任务 65.11。附录还讨论较早轮次和较分离任务可能受益不同。因此,“多任务总是优于单任务”并不是这组实验的结论。[1, §4.4;附录 C.2]
Agent-R 最有价值的启发,是把数据构造跟当前策略的错误连起来。若把它迁移到工具调用系统,先要能记录真实历史、复现状态、找到有效续段,再决定怎样选择转折和训练目标。模型会说“我错了”,只是这条链路中很小的一步。
参考资料
- Yuan, S., Chen, Z., Xi, Z., Ye, J., Du, Z., & Chen, J.Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training.arXiv:2501.11425v1,2025-01-20。指定版本 HTML · 指定版本 PDF。