Don't Mask the Environment: Observation Supervision Changes How Agents Explore Under RL
Juzheng Zhang, Disha Makhija, Manoj Ghuhan Arivazhagan, Vinayshekhar Bannihatti Kumar, Rashmi Gangadharaiah
cs.LG, cs.AI, cs.CL
2026-09-18
标准agent SFT只学动作、把环境观察mask掉。ActObs解开这些已有token,Qwen3-4B经同一套GRPO后在Terminal-Bench 2.0上pass@1相对高29%,并迁到未见过的代码编辑任务。
训练语言模型 agent,常见流程是先用专家轨迹做 SFT,再上 GRPO 一类靠可验证奖励更新策略的强化学习。轨迹里动作和环境反馈是交错的:agent 敲一条命令,终端吐出一段输出,再决定下一步。标准 SFT 却只对动作 token 算 loss,环境观察留在上下文里当条件,不当预测目标。
这个习惯看起来合理。部署时模型本来就不会去「生成」终端输出。但它默认了一件事:读反馈有用,学着预测反馈没用。AWS AI Labs 和马里兰大学把这个默认拿出来测了一遍,尤其是 SFT 只作为后续 RL 初始化的时候。
ActObs 的改动只发生在 loss mask 上。同一批轨迹、同一个模型、同一段 token 序列,把已经在序列里的观察 token 从 mask 里解开,让语言模型同时预测动作和环境反馈。部署时模型仍然只吐动作,观察预测纯粹是训练信号。
轨迹写成任务提示加一串(动作,观察)对。默认 λ=1,动作 token 和观察 token 等权;λ=0 退回只学动作的 ActionSFT。分母按有效 token 数缩放,换 λ 时单条样本的 loss 量级大致不变。实现上就是改标签 mask,不加数据、不加参数、不加前向。
对照有三组。ActionSFT 是行业默认。Obs→Act 先做一轮只学观察的 SFT,再做一轮只学动作,总观察监督量和 ActObs 相当,但时间上错开。ECHO 是另一条线:SFT 之后的 GRPO 里再加一项权重 0.05 的下一观察预测,用来看 RL 阶段再补世界模型能不能替代 SFT 阶段的联合监督。
数据是 Nemotron-Terminal-Corpus 合成部分的 5 万条多轮终端轨迹,约 0.71B token,观察大约占 45%,教师模型是 DeepSeek-V3.2。Qwen3-4B 和 Qwen3-8B 各 SFT 一个 epoch(781 step)。随后在 Endless Terminals 的 2392 个容器任务上跑 135 step GRPO,每题 16 条 rollout,二值 verifier。评测与训练任务都不重叠:主榜 Terminal-Bench 2.0 共 89 题、每题 16 次尝试;迁移榜 aider-polyglot 共 225 道多语言代码编辑、每题 4 次。
SFT 刚结束时,三组初始化在 Terminal-Bench 2.0 上几乎分不开。差别是同一套 GRPO 跑完之后才拉开的。
| 设置 | pass@1 | pass@4 | pass@8 | pass@16 |
| 4B ActionSFT→GRPO | 5.6 | 11.1 | 14.0 | 18.0 |
| 4B ActObs→GRPO | 7.2 | 12.5 | 15.5 | 19.1 |
| 8B ActionSFT→GRPO | 12.3 | 18.7 | 21.0 | 23.6 |
| 8B ActObs→GRPO | 11.0 | 19.3 | 23.6 | 27.0 |
4B 上 ActObs 在每个采样预算都更高,pass@1 相对 ActionSFT 高 29%。8B 上单次尝试反而低 1.3 个点,但从 pass@4 开始反超,pass@16 高出 3.4 个点(相对 14%),解出 24/89 题,比 ActionSFT 的 21 题多 3 道,其中 3 道是所有 SFT 策略和 ActionSFT→GRPO 都解不出的。
迁移更明显。aider-polyglot 的 225 题不在 SFT 语料也不在 RL 任务集里。4B 的 ActObs SFT 检查点在这张榜上还弱于 ActionSFT(pass@1 1.0 vs 1.4),GRPO 之后却变成 13.9 vs 9.7,相对高出 43%;pass@4 是 25.3 vs 20.4。8B 上 pass@1 也还有 1.5 个点的优势(14.2 vs 12.7)。
顺序对照 Obs→Act 拿了同等量的观察监督,pass@16 仍落后 ActObs 2.2(4B)和 3.4(8B)个点。只学观察、或者先学动作再只学观察,8B 上一道题都解不出。把观察和别的轨迹打乱配对,SFT 的 pass@1 从 7.9 掉到 3.7。有用的是「这条命令之后会发生什么」的配对,不是观察文本单独出现。
机制侧,动作梯度和观察梯度在 SFT 开始时余弦相似度 0.83,10 到 20 step 内掉到噪声底。之后两条更新方向几乎正交。ActionSFT 把动作 loss 拟合得很平,观察梯度范数比动作梯度大约 41 倍,终端反馈预测掉到不如基座模型;ActObs 把这个比例压在 0.5 附近。GRPO 阶段 ActObs 训练熵更高、相对自己的 SFT 检查点 KL 更小。熵差主要出现在命令后半段的参数、flag、路径,开头几个 token 两边一样尖。把 ActionSFT 策略的采样温度从 0.6 提到 0.64 去对齐熵,pass@k 最多动 0.7 个点,多解不出一道题。
λ 从 0 扫到 1,8B 上 GRPO 后 pass@1 从 12.3 降到 11.0,pass@8 从 21.0 升到 23.6。观察权重大,单次更不稳,多次采样覆盖更宽。
对在做 SFT 再 RL 的 agent 训练的人,这是一个几乎零成本的开关:数据已经在轨迹里,改的是哪些 token 进 loss。SFT 榜上看不出差别,不等于初始化一样。只学动作的 SFT 会把预训练里对「命令会引发什么」的预测能力写坏,后续 GRPO 更容易把概率质量收成少数几条老师示范过的命令,pass@1 好看、pass@k 和任务覆盖变差。这和近两年 RLVR 文献里「奖励上去、熵下来、大 k 覆盖收缩」是同一类现象,ActObs 把干预点提前到了 SFT。
能直接用的场景是终端、命令行 agent,以及类似的「动作之后环境会回一段文本」的轨迹。想要多次采样覆盖、或者任务分布和 SFT 不完全同域,λ 可以偏大;强依赖 pass@1 的线上服务要自己权衡。它替代不了更好的轨迹和更好的 RL 环境,只是别把已经付过钱的观察 token 当背景音。
作者自己划了三条。实验几乎全在终端 agent 上,aider-polyglot 只证明了迁到多语言单文件改代码,web、GUI、具身这些观察更丰富的环境还没测。模型只试了 Qwen3 的 4B 和 8B,同家族、同 tokenizer;教师只有 DeepSeek-V3.2,每条轨迹只有老师动作对应的那一个真实后果。SFT、RL、评测三条流水线的观察格式、上下文构造、shell 是否持久(tmux vs 新 shell)并不完全对齐,组内对照是干净的,绝对分数和 SFT 对 RL 的跨阶段对比要打折。
另外,绝对水平仍然很低:4B 最好的普通 GRPO 策略 pass@1 只有 7.2,8B ActionSFT→GRPO 也才 12.3。Terminal-Bench 2.0 很难,这篇证明的是初始化改变了 RL 能挖出什么,不是把终端 agent 做到能用。ECHO 在 8B pass@16 上 ActionSFT 反而略高(25.8 vs 24.7),观察感知的 RL 并不能处处补上 SFT 的缺口。代码和数据要等接收后才放,现在还无法复核。