Agent 训练
第 27 课:Agent 训练
上一课我们把"会用工具、会规划"交给提示与编排去实现。但编排改一次、生效一次,换个场景就得重写:怎么把会用工具训进权重?这一课从"提示做不到的事"讲起,把一次 Agent 执行变成可训练的信号(轨迹 → 奖励),再看只给结果奖励为什么会出问题、过程奖励与工具结果奖励怎么设计,最后回答一个成本问题——提示、工作流、微调、RL,到底该怎么选。
② 把一次 Agent 执行变成可训练的轨迹与奖励信号,说出 ReTool / ToolRL 报告的效果与代价,并分清算法归属(ReTool 用 PPO、ToolRL 用 GRPO;GRPO 即「不用单独训练一个打分模型、直接拿一组采样答案的相对好坏当基准来更新策略」)
③ 解释结果奖励为什么会教坏模型、过程奖励与工具结果奖励怎么补,并解释训练循环为什么要盯稳定性与成本
上一课我们把"会工具、会规划"交给提示与编排。这一张要问:既然提示能改行为,为什么还要动权重?
因为提示是"每次都要重新交代"的软约束:它占 tokens、随措辞漂移、换个场景就可能失效;而权重里的策略是默认行为,不占提示、无需每次交代、更容易迁移。就像教新人:口头交代一次(提示)能应付今天,反复练到成肌肉记忆(训练)才能在新情况下也做对。所以先分清两条路各自管什么。
| 维度 | 写进提示 | 写进权重 |
|---|---|---|
| 生效时机 | 改一次即生效 | 需一次训练 |
| tokens 开销 | 每次请求都占 | 不占提示 |
| 稳定性 | 随措辞 / 场景漂移 | 成为默认行为 |
| 迁移性 | 换个场景要重写 | 泛化到相似场景 |
| 训练方式 | 擅长 | 短板 |
|---|---|---|
| SFT(模仿轨迹) | 复现见过的模式 | 遇到新工具 / 新场景就退化 |
| RL(按反馈探索) | 学会"何时用、何时不用" | 需要可打的奖励与更多算力 |
| 对比 | 提升 |
|---|---|
| RL 相比基座 | 约 +17% |
| RL 相比 SFT | 约 +15% |
| 能否直接相减 | 原文只说 +17% over base / +15% gain over SFT,未声明为同一基线的绝对百分点;若两者确为同一基线,才有 SFT ≈ 17 − 15 = +2(示意,非原文口径) |
提示与权重不是替代关系,而是分工:提示管"多变、临时、要立刻生效",权重管"稳定、高频、要跨场景一致"。判断该不该训,只问一句——这条策略靠提示能不能长期稳住?
这条路最早的标志性工作是 Toolformer(Meta, 2023, arXiv:2302.04761):让模型在预训练阶段自己标注「这句话里该调哪个 API、参数填什么」,把工具用法直接写进权重。它证明了「会用工具」可以不完全依赖提示,而是训练出来的能力——这正是本课要走的那条路的起点。
上一张卡片说明策略该不该写进权重。要训练,就得先有可学的信号——一次执行怎么变成训练数据?
因为模型要学的是"在什么状态下、做什么动作"这个映射,所以需要把执行过程记录成一条轨迹(trajectory):每一步的思考、动作、环境观察都写进 context,再对整条轨迹或某些步打分。就像教练看比赛录像:先把每个回合拆出来,再逐球点评,才知道哪一招该表扬、哪一招该改。所以先看一条轨迹的构成,再看它怎么被"打分"用起来。
| 片段 | 内容 | 能否当信号 |
|---|---|---|
| State 状态 | 任务 + 当前上下文 | —— |
| Thought 思考 | 模型的推理文本 | 难直接判对错 |
| Action 动作 | 调用工具 + 参数 | 可判格式 / 参数 |
| Observation 观察 | 工具返回值 | 可判结果 |
| 方法 | 训练步数 | AIME 准确率 |
|---|---|---|
| 纯文本 RL 基线 | 1080 | 40% |
| ReTool(工具+RL) | 400 | 67% |
| 步数比 | 1080 ÷ 400 = 2.7× | 准确率 +27 点 |
| 设置 | 数值 |
|---|---|
| ReTool 扩展设置 | 72.5% |
| 相对 o1-preview 报告口径 | +27.9 个百分点 |
| 关键副作用 | 出现"代码自我纠错"等涌现行为 |
把 Agent 训练起来的第一步不是"选算法",而是把一次执行记录成能打分的轨迹:状态、思考、动作、观察。能直接打分的是动作与观察;思考要靠结果或过程奖励来间接监督。
上一张卡片说轨迹要能被打分。最容易实现的打分就是"看最后答对没有"——可为什么只看结果会把模型教坏?
因为长轨迹里"结果对"不等于"过程对":模型可能用错误的推理蒙对答案,也可能在正确推理后算错最后一步。只看结果,奖励就分不清哪一步立了功、哪一步闯了祸——这就是信用分配(credit assignment)难题。就像只按期末总分表扬一个学生:他可能靠押题蒙对,真实能力并没提高。所以要看得更细。
| 情形 | 结果 | 过程 | 结果奖励会给 |
|---|---|---|---|
| 推理全对、答案对 | 对 | 对 | 高分(应得) |
| 推理错、蒙对答案 | 对 | 错 | 高分(错奖) |
| 推理对、末步算错 | 错 | 基本对 | 低分(误罚) |
| 奖励模型 | MATH 子集(best-of-N) |
|---|---|
| ORM(只看结果) | 72.4% |
| PRM(逐步打分) | 78.2% |
| 差值 | 78.2 − 72.4 = 5.8 个百分点 |
| 项 | 数值 |
|---|---|
| 公开的过程标注量 | 约 80 万条(PRM800K) |
| 标注粒度 | 逐步(positive / negative / neutral) |
| 代价 | 标数据贵、比结果奖励更难自动化 |
结果奖励的问题不是"不准",而是太粗——它把"整条轨迹"压成一个数,于是既奖错也罚错。过程奖励用 5.8 个点的优势换来了精确定位能力,代价是要标中间步。
上一张卡片说过程奖励更细。落到工具调用上,为什么一个"结果分"还不够?
因为工具调用可能错在三个不同层次:格式(标记缺失)、选择(工具名错)、参数(名字对、值填错)。只给一个总分,模型不知道错在哪、也就无从改起。就像考试分步给分:过程分、结果分分开算,学生才知道是"思路错"还是"算错";只给一个总分,改错题时两眼一抹黑。所以要把奖励拆细。
| 层次 | 典型错误 | 对应奖励项 |
|---|---|---|
| 格式 | 缺标记、顺序乱 | 格式奖励(0/1) |
| 选择 | 工具名编造 / 选错 | 工具名匹配 |
| 参数 | 参数名或值不对 | 参数名 / 值匹配 |
| 组合方式 | 效果 | 出处 / 定位 |
|---|---|---|
| 加性(求和) | 可用格式分"补偿"正确性,诱导刷格式 | ToolRL 原文做法(R = R_format + R_correct) |
| 乘性(相乘) | 任一项为 0 则总分 0,堵住捷径 | 本课推荐的改进(非 ToolRL 口径) |
| 对比 | 提升 |
|---|---|
| 相比基座 | 约 +17% |
| 相比 SFT | 约 +15% |
| 训练稳定性 | 报告称训练更稳、可扩展 |
工具训练的奖励设计有一条铁律:把错误拆到"可归因"的粒度——格式、选择、参数各算各的;并且(本课推荐)用乘性把格式当门槛,防止模型用"格式漂亮"掩盖"答错"。
上一张卡片把奖励拆细了。但拆得细不代表训得稳——为什么 Agent 的 RL 更容易训崩?
因为它比纯文本多了一条真实世界的链路:采样时要真的调工具、等返回,工具慢就把 GPU 晾在那里;同时奖励一旦有缝,gradients(梯度,即参数更新的方向)会顺着缝去"刷分"而不是学本事。就像开车时方向盘猛打——单步看着有效,跑一段就翻车;训练要的是可控、可复现的更新。所以要从循环、瓶颈、稳定性三处一起看。
| 环节 | 做什么 | 常见瓶颈 |
|---|---|---|
| Rollout | 采样轨迹 | 工具执行最慢 |
| Tool exec | 真实调用工具 | 受外部系统限制 |
| Reward | 打分 | 奖励设计易被钻空子 |
| Update | 更新参数 | 学习率 / 批大小不稳 |
| 场景 | 异步相对同步的加速 |
|---|---|
| 数学工具(Math-TIR) | 1.32× |
| SQL | 1.22× |
| 深度搜索(DeepSearch) | 1.97× |
| 漏洞 | 模型学到什么 |
|---|---|
| 只看格式 | 输出漂亮格式、内容乱写 |
| 只看答案匹配 | 记住答案、跳过推理 |
| 可被检索到的奖励 | 把奖励信号"抄"进回答 |
Agent RL 的稳定性来自两处:工程上把"等工具"异步掉(1.22×–1.97×),算法上让奖励不可钻空子。判据一句话:把奖励定在"行为造成的结果"上,而不是"模型能说出来的话"上。
前面五张卡片把"训练"这条线讲完了。最后回到最实用的一问:四条路到底该怎么选?
因为四条路的成本大致差一个数量级(示意):改提示几乎免费、写工作流要工程、SFT 要标数据、RL 要奖励与算力。用最重的手段去解决最轻的问题,就是浪费。就像出行选工具:三公里走路、三十公里地铁、三百公里高铁——不是越贵越好,而是匹配距离。所以用一张判据表把选择固化下来。
| 路径 | 成本量级 | 适合解决 |
|---|---|---|
| 提示 | 最低(改文本) | 临时、多变、要立刻见效 |
| 工作流 | 低(写编排) | 步骤可提前写死 |
| SFT | 中(标轨迹) | 稳定行为 / 格式 / 风格 |
| RL | 高(奖励 + 算力) | 策略写不进示例(该不该用工具) |
| 问题 | 答案 | 选 |
|---|---|---|
| 改提示能稳定解决吗 | 能 | 提示 / 工作流 |
| 只能用示例教、且要稳定 | 是 | SFT |
| 要学"该不该做"的取舍 | 是 | RL |
| 误配 | 后果 |
|---|---|
| 能改提示却上 RL | 多花数量级算力,收益不成比例 |
| 该学取舍却只做 SFT | 新场景泛化差(ToolRL 报告的现象) |
| 该写死流程却上 Agent | 引入不确定性,得不偿失 |
本课收口:Agent 训练的链条是先分清提示与权重的分工 → 把执行变成可打分的轨迹 → 用过程奖励修正结果奖励的粗糙 → 把工具奖励拆到可归因 → 把训练循环做稳 → 最后按成本选型。下一课收口全课程:怎么证明一个 Agent 真的能上生产——评测、可靠性、安全与发布门禁。