Skip to content
←返回博客
训练智能体的后训练课程:从 SFT、蒸馏到 GRPO 与异步环境
后训练SFT蒸馏

训练智能体的后训练课程:从 SFT、蒸馏到 GRPO 与异步环境

Hugging Face 用五步课程串起智能体后训练:SFT 学轨迹,蒸馏传概率,GRPO 优化结果,环境承接多回合行动,异步 harness 让训练接近真实部署。

Ben Burtenshaw, Sergio Paniego, Merve2026年10月20日4 分钟阅读20次阅读
EN

训练智能体的后训练课程:从 SFT、蒸馏到 GRPO 与异步环境

来源:A curriculum for post-training agents,Hugging Face,2026 年 10 月 20 日。

预训练语言模型可以继续一段文本,但智能体要做的事情不同:读取任务、选择工具、观察结果、修正计划,然后继续行动,直到任务结束。此时,一次回答不再是行为的完整单位。一个 episode 可能包含几十条消息、多次工具调用,以及由外部程序返回的观测。训练智能体,也就是训练这整段交互历史,而不只是训练一个漂亮的最终答案。

这套课程把智能体后训练分为五个阶段。原文用编码智能体作为贯穿案例,因为代码动作可以执行、测试和验证;但同样的递进关系也适用于数据分析、浏览器操作、运维工作,以及基于仿真的机器人任务。五个阶段从最强、最昂贵的监督,逐步走向更弱、但更可扩展的结果信号:

  1. 监督微调(SFT):从更强模型产生的完整轨迹中学习。
  2. 蒸馏:通过教师生成的数据,或教师对学生自身 token 给出的概率,传递教师行为。
  3. GRPO:对同一 prompt 采样多个回答,根据组内相对得分学习。
  4. 强化学习环境:把得分变成有状态、多回合任务中的真实行动反馈。
  5. Harness 与异步基础设施:把真实智能体循环放进远端沙箱,并让生成和训练不必互相等待。

最关键的结论是:训练接口应尽量接近部署接口。如果线上智能体使用特定的工具 schema、上下文策略和停止条件,训练 rollout 就不应在无人察觉时替换成一份理想化的模仿数据。否则,优化器学到的只是一个用户永远不会运行的模拟器策略。

五步课程总览

阶段 信号来源 TRL 训练器 需要准备什么 主要限制
SFT 正确的智能体轨迹 SFTTrainer Prompt、完整轨迹和 assistant token 的 loss mask 模型没有机会练习如何从自己的错误中恢复。
蒸馏 教师输出或教师概率 DistillationTrainer Prompt 与教师模型 学生受教师能力上限约束,教师推理成本高。
GRPO 强化学习 采样回答获得的分数 GRPOTrainer Prompt 与一个或多个奖励函数 奖励稀疏,且必须难以被模型钻空子。
强化学习环境 多次行动后观察到的结果 GRPOTrainer 配合 OpenEnv 任务、工具、状态转移和最终检查器 Rollout 生成成为最慢且运维最复杂的部分。
规模化 Harness 通过接近生产的循环完成完整 episode AsyncGRPOTrainer 任务、环境、harness 与独立推理算力 要处理权重陈旧、沙箱隔离、失败恢复与吞吐。

这五项是一条课程路径,不是所有项目都必须依次支付全部成本。没有可用策略的团队可能需要先做 SFT;有强教师而数据预算有限时,蒸馏可能最合适;存在可靠 verifier 时,GRPO 能优化 demonstrations 中很少出现的能力;当任务结果取决于连续行动而不是单次回答时,才需要把训练推进到有状态环境。

0. 开始之前:把智能体与运行时拆开

在比较训练器之前,先把四个概念说清。这里的模型是学到的策略;智能体循环决定何时调用模型、如何解析输出,以及何时把下一次观测送回模型;harness 是包围这个循环的可执行脚手架,包含系统提示、工具、上下文管理、解析器、重试规则和停止逻辑;环境持有任务状态,并决定动作执行后会发生什么。

这些边界没有唯一标准,但在同一个实验内必须保持一致。可以用下面五个问题做检查:

  • 哪些角色产生训练 loss:只有 assistant、整个对话,还是带标签的子集?
  • 每一回合中,策略能看见哪些 observation?
  • 工具是否会失败、超时、返回畸形结果,或要求模型自行恢复?
  • episode 何时视为结束,最终 reward 由谁产生?
  • SFT、RL 与评测之间,哪些组件保持冻结?

只要其中一项在训练和评测之间发生改变,就会出现很难察觉的分布偏移。一个模型可能在清理过的训练轨迹上表现很好,却在真实工具连续成功五次后突然报错时完全不会恢复。

1. 监督微调:从完整轨迹学习

SFT 把一段记录下来的智能体运行过程当作目标序列。轨迹中包含任务、消息、工具调用、工具结果,以及模型之后的决策。训练要让模型提高强模型或人类示范者所采取动作的概率。

智能体 SFT 示意图:输入 prompt、记录完整轨迹并进行监督训练
智能体 SFT 学习的是包含工具调用和观测的完整轨迹,而不只是最终答案。

对于轨迹 $i$ 中的 assistant token $y_{i,t}$,常用目标是下面的 token 级交叉熵。智能体训练中的 mask $m_{i,t}$ 很重要:prompt、工具 schema 和环境 observation 通常不应被当作模型必须预测的动作。

$$L_{\mathrm{SFT}}=-\frac{\sum_{i,t}m_{i,t}\log\pi_\theta(y_{i,t}\mid x_i,y_{i,<t})}{\sum_{i,t}m_{i,t}}$$

这种方法的优势是稳定。每个目标 token 都已知,监督稠密,同一配方可以扩展到大型离线数据集。它也是最便宜的格式教学方式:何时调用工具、如何写参数、如何解释 observation、何时停止。对于尚不能稳定输出一次合法工具调用的小模型,SFT 往往就是必须经过的第一阶段。

限制同样明显:学生只能看到成功示范,不能生成自己的错误,也就得不到“从错误中恢复”的训练信号。真实部署时,策略一定会犯错;训练时却从未被要求在一个错误之后继续。这就是 exposure bias 在智能体场景中的表现。

因此,好的 SFT 数据远不止最终代码。要保留完整工具序列、observation 边界、重试行为和终止方式,同时删除线上策略看不到的隐藏推理。如果轨迹被清洗得过于理想,模型学到的就是另一项任务。

2. 蒸馏:传递比硬标签更多的信息

蒸馏仍然使用教师,但可以提供更丰富的信号。序列级蒸馏让教师生成轨迹,再由学生模仿;token 级蒸馏则让教师对学生自己产生的下一个 token 给出概率。后者是 on-policy 的:学生创建上下文,教师告诉它下一步动作应如何分布。

蒸馏示意图:教师生成轨迹,以及教师对学生 token 给出概率
蒸馏可以提供教师生成的数据,也可以在每个学生 token 上提供稠密概率目标。

设教师分布为 $q_t$,学生在词表 $V$ 上的分布为 $p_\theta$,一种概念性的蒸馏损失是:

$$L_{\mathrm{KD}}=-\sum_t\sum_{v=1}^{V}q_t(v)\log p_\theta(v\mid c_t),\qquad q_t=\operatorname{softmax}\left(\frac{z_t^{T}}{\tau}\right)$$

其中 $c_t$ 是学生产生的上下文,$z_t^{T}$ 是教师 logits,$\tau$ 是温度。教师不只告诉学生“调用 run_tests”,还可以表达多个动作各自有多合理。这种稠密监督通常比 RL 需要更少样本,因为 RL 可能只给整条轨迹一个分数。

蒸馏有两项成本。第一,学生的能力上限受教师提供的证据约束,除非学生通过自身归纳偏置或额外 on-policy 探索获得新能力。第二,on-policy 蒸馏必须在学生 rollout 或训练期间运行教师。对于长 episode,教师推理很容易成为主要预算。

所以真正要选择的不是“蒸馏还是 RL”,而是监督密度。有优秀轨迹时先利用 demonstrations;教师能评价学生自己的局部选择,并且 token 级指导值得额外算力时使用概率蒸馏;行为难以模仿、但最终结果可以检查时,再使用基于 reward 的 RL。

3. 强化学习:用 GRPO 从结果学习

RL 不再要求教师。模型针对同一 prompt 采样回答,reward function 打分,训练再提高高分行为出现的概率。奖励可以来自精确检查器、测试套件、受约束的模型评分器,或经过仔细验证的组合信号。

Hugging Face 在这门课中使用 Group Relative Policy Optimization,即 GRPO。对每个 prompt,GRPO 采样一组 $K$ 个回答,并在组内比较 reward。它不需要额外的 value model 来估计 baseline,组内均值就是参照点。

$$A_i=\frac{r_i-\operatorname{mean}(r_1,\ldots,r_K)}{\operatorname{std}(r_1,\ldots,r_K)+\epsilon}$$

设策略概率比为 $\rho_t(\theta)$,裁剪阈值为 $\epsilon$,一种标准 GRPO 风格的目标可以写成:

$$\rho_t(\theta)=\frac{\pi_\theta(y_t\mid s_t)}{\pi_{\theta_{\mathrm{old}}}(y_t\mid s_t)}$$

$$L_{\mathrm{GRPO}}=-\mathbb{E}\left[\min\left(\rho_t(\theta)A_i,\operatorname{clip}\left(\rho_t(\theta),1-\epsilon,1+\epsilon\right)A_i\right)\right]+\beta D_{\mathrm{KL}}\left(\pi_\theta\Vert\pi_{\mathrm{ref}}\right)$$

具体实现可能采用不同的 advantage normalization、token 级或序列级概率比、工具 observation mask,或 DAPO、Dr. GRPO、GSPO、CISPO 等变体。共同思想仍是相对比较:同一 prompt 的多次尝试,足以告诉模型哪些行为应获得更高概率。

GRPO 示意图:每个 prompt 采样多个回答,分别评分并提高高于组均值的回答概率
GRPO 在组内比较多个采样回答,因此 reward 能监督 demonstrations 中没有出现过的行为。

这种信号比 token 级蒸馏弱得多。一整个回答或 episode 最终可能只压缩成一个标量,因此模型需要大量尝试。稀疏奖励还会带来方差和探索问题:如果所有样本得分相同,中心化后的 advantage 为零,这个 prompt 就不再产生梯度;如果奖励容易作弊,优化器一定会找到作弊路径。

因此,实际 reward stack 不能只放一个主指标。它通常包含正确性检查、格式闸门、破坏性动作防护、延迟或步数惩罚,以及 reward hacking 检测。每一项都会改变策略,增加一个 reward 不是增加无害指标,而是重新定义目标。

4. 强化学习环境:让智能体连续行动

普通 reward function 通常只给一次回答打分。环境则允许智能体反复行动、观察状态变化并修复自己的工作。它把“让模型写一个 patch”变成“让模型查看仓库、编辑文件、运行测试、读取失败信息,然后再次尝试”。

这个接口继承自 Gym 的 reset-step 循环:重置任务、应用动作、接收新 observation 与 reward,最后把 episode 标记为结束。

observation, info = env.reset(seed=task_seed)
done = False
while not done:
    action = policy(observation)
    observation, reward, terminated, truncated, info = env.step(action)
    done = terminated or truncated

在智能体环境中,返回的 observation 可能是 shell 结果、文件 diff、浏览器截图、仿真器状态或测试报告。环境持有状态转移,可以执行工具、约束权限,并判断最终产物是否通过。

智能体环境示意图:任务状态、工具动作、观测与最终奖励检查器
环境跨回合保留状态、执行动作并检查最终结果,让 rollout 从单次回答变成长期交互。

一段轨迹可以表示为:

$$\tau=(s_0,a_0,o_1,s_1,a_1,o_2,\ldots,s_T,a_T,o_{T+1})$$

如果使用学习到的 reward function,目标可能是折扣回报:

$$R(\tau)=\sum_{t=0}^{T}\gamma^t r_t$$

许多智能体任务更愿意使用终局 verifier:$R(\tau)=V(\tau)$。这里的 $V$ 会运行测试、检查数据库、验证文件或评估仿真目标。最终检查通常比逐步模型判断更可信,但它不会给整条轨迹提供细粒度梯度,信用分配仍然困难:最终通过时,三十个动作中究竟哪个值得奖励?

原文强调,这个循环本身很旧,真正变新的是使它可行的条件。2016 年已经有 reset-step 接口,但当时缺少强预训练策略、大规模且可达的任务、可靠的程序化奖励检查,以及低成本沙箱编排。今天的语言模型能在工具中行动,云平台能为每个 rollout 启动隔离机器,大量数字任务又天然提供可执行的成败条件。这些条件同时成熟,环境才从“概念上合理”变成“工程上可用”。

环境组件 职责 软件智能体示例 机器人示例
状态 保留先前动作造成的变化 仓库、shell 与浏览器 session 机器人位姿、物体状态与仿真时钟
动作 API 定义合法操作与参数 编辑文件、运行命令、点击元素 关节指令、抓取请求、导航目标
观测 返回动作结果 测试输出、diff 或页面快照 相机帧、本体感觉或接触反馈
终止 判断成功或失败何时确定 测试通过、超时或预算耗尽 到达目标、碰撞或 episode 上限
验证器 把最终状态转成 reward 运行隐藏测试 测量目标距离与安全约束

长 episode 会让 rollout 生成成为瓶颈。训练器更新一次权重可能只要几秒,却要等待一个困难任务完成几分钟。更糟的是,一次基础设施失败可能让已经完成一半的轨迹全部作废。稳健环境需要 timeout、retry、资源上限、尽可能确定的随机种子,并清楚区分“任务失败”和“harness 失败”。

5. Harness 与规模:在最终部署的循环里训练

最后一步把完整的、接近生产的 harness 放进远端沙箱。模型拿到的不再是训练器临时拼出的简化 transcript,而是与真实智能体相同的 prompt 组装、工具解析、上下文管理、重试策略和完成检查器。每个 rollout 都在隔离机器里完成一次完整 episode。

这样做能改善迁移,却也提高吞吐难度。生成和训练使用不同的硬件画像与延迟模式。如果二者同步运行在同一组 GPU 上,训练器会在智能体等待工具时空转,推理引擎又会在权重更新时闲置。异步 RL 把两个池拆开,在它们之间传递 rollout 与权重。

flowchart LR
  D[Task dataset] --> R[Rollout workers]
  R --> H[Production-like harness]
  H --> E[Remote sandbox and tools]
  E --> H
  H --> B[Completed episodes buffer]
  B --> T[Policy trainer GPUs]
  T -->|Updated weights| V[vLLM inference GPUs]
  V --> R

异步循环引入一个新的状态变量:策略年龄。如果一个 rollout 由策略版本 $k_r$ 采样,而训练器已经推进到 $k_p$,样本抵达更新时就已经陈旧。

$$\Delta_{\mathrm{policy}}=k_p-k_r,\qquad \Delta_{\mathrm{policy}}\leq S_{\max}$$

TRL 的实验性 AsyncGRPOTrainer 暴露了控制这个系统的参数。独立 vLLM server 在其他 GPU 上生成轨迹,训练器同时更新策略。max_staleness、weight_sync_steps 与 max_inflight_tasks 在样本新鲜度和硬件利用率之间权衡。权重同步越新,on-policy 程度越高;同步过频或 in-flight 任务过少,又会让硬件闲置。

异步智能体训练架构:rollout、沙箱、推理与训练组件相互分离
异步 GRPO 把 rollout 生成与训练放在不同 GPU 池中,再把更新后的权重同步回推理引擎。

最小训练器配置可以很短:

from trl.experimental.async_grpo import AsyncGRPOTrainer
from trl.rewards import accuracy_reward
from datasets import load_dataset

dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = AsyncGRPOTrainer(
    model="Qwen/Qwen3-4B",
    reward_funcs=accuracy_reward,
    train_dataset=dataset,
)
trainer.train()

推理 server 需要独立 GPU。文档示例用 vLLM server development mode、特定 log-probability 模式和 NCCL 权重传输启动它:

CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3-4B \
  --max-model-len 4096 \
  --logprobs-mode processed_logprobs \
  --api-server-count 8 \
  --weight-transfer-config '{"backend":"nccl"}'

这段示例展示的是接口,不是完整的生产配方。真实训练还需要沙箱生命周期管理、任务队列、失败分类、reward 审计、checkpoint 与策略陈旧度监控。最昂贵的部分往往不是 optimizer,而是让数千个异构 episode 持续流动,同时不污染状态,也不在无人察觉时给错产物打分。

如何选择下一阶段

当前症状 更合适的下一阶段 原因
模型无法产生要求的工具格式 SFT 先用大量干净示范,并对非 assistant token 做 mask。
格式正确,但教师能解释更好的 token 选择 蒸馏 在学生自己产生的上下文上增加稠密监督。
最终答案容易验证,但 demonstrations 很少 GRPO 用 reward 驱动的探索替代模仿。
单次回答无法完成任务 RL 环境 暴露状态、工具与多回合成功条件。
玩具轨迹上能训练,部署后却失效 生产 Harness 通过真实解析器、prompt、工具与停止规则训练。
智能体等待工具时 GPU 利用率骤降 异步 Harness 基础设施 解耦 rollout 生成与策略更新,并限制陈旧度。

对具身智能的启示

同一套课程也适用于机器人基础模型,即使 observation 与 action space 完全不同。SFT 可以从 demonstrations 教会策略产生合法动作块或工具调用;蒸馏可以把大型多模态教师压缩为更小的端侧策略;存在仿真器、judge 或任务检查器时,GRPO 可以优化结果;环境能在感知、规划与操作之间保留机器人状态;harness 则能复现机器人实际使用的上下文窗口、安全过滤器和工具 API。

困难也会更清楚。机器人 rollout 比 shell 命令更慢、更昂贵;仿真器只是近似;物理上无效的动作可能损坏硬件或制造不安全状态。因此,环境必须把硬安全约束与 reward 分开编码。异步训练能让仿真器和策略推理并行,但当环境不稳定或控制器依赖新鲜观测时,陈旧权重尤其危险。

组织原则没有改变:让监督尽可能贴近真正部署的行为。Demonstrations 展示期望路径,蒸馏评价局部决策,reward optimization 发现新的解法,环境检验行动的后果,harness 则让训练循环看起来像真实循环。

参考资料


来源:A curriculum for post-training agents,Ben Burtenshaw、Sergio Paniego、Merve,Hugging Face,2026 年 10 月 20 日。RobotWorld 中文版补充了实现细节、公式与具身智能场景分析。

作为亚马逊联盟会员,我们可能从符合条件的购买中获得佣金。