用强化学习训练会操作终端的模型,依赖环境告诉它任务做对了没有。RIVER 先检查这些分数是否可信:GPT-5.4 阅读 TMax-15K 的任务说明、容器配置和测试程序后,只把 35.8% 判为 CLEAN,即没有发现列出的环境缺陷。这不是人工确认的正确率。有的测试会奖励直接复制泄露答案,有的会因函数名不同而拒绝功能正确的实现。作者保留审查通过的环境,再让强模型各跑两次,删掉两次都未完成的题;训练时还对没有新信息的重复操作扣减更新信号。
1. Motivation:错误的测试信号为什么会强化错误行为?
模型会学习如何通过测试程序,即使测试条件偏离任务要求。 对数学题,错误答案通常只是一次负样本;对长程终端任务,一个检查不严的测试程序会让整条错误策略得到正向强化。Agent 如果发现复制 /app/ground_truth.txt 最容易拿到 1 分,RL 就会提高这种捷径的概率。
现有路线已经覆盖了更多技能和任务类型。Endless-Terminals 展示了大规模合成环境上的 RL,TMax 又扩展到 14,399 个跨领域任务。RIVER 检查这些环境的 reward integrity(验收分数是否可信):任务说明的目标、Docker 实际提供的状态和测试检查的条件,是否指向同一件事。
论文用一个假设解释这种训练:预训练与监督微调主要提供写命令、调用编译器等基础技能;强化学习更可能改变跨多个步骤的行为,例如先检查环境、遇错后换方案、结束前验证,以及减少无效重复。作者把这些行为在未训练任务中的组合使用称为 Agentic Compositional Generalization。实验检查了这一解释,但没有证明全部提升都来自这些行为。
这套解释有两个可检验预测。第一,监督微调数据覆盖哪些技能应该影响较弱模型的起点。第二,训练环境的验收程序会决定哪些跨步骤行为被强化。RIVER 的方法和实验都围绕这两个预测展开。
2. Related Work:与扩大环境、生成更强测试的路线相比
Endless-Terminals 与 TMax 主要扩大训练覆盖,RIVER 研究验收分数是否可信,并尝试解释强化学习改变了执行记录中的哪些行为。 它不是新的通用终端评测,也没有另造任务生成器。上游环境仍来自 TMax。
| 路线 | 主要扩展对象 | 怎样验收 | 与 RIVER 的边界 |
|---|---|---|---|
| Endless-Terminals | 大规模可执行终端环境 | 每个环境的结果验收程序 | 表明合成环境训练能提升终端 Agent;RIVER 进一步检查评分是否对题。 |
| TMax | 14,399 个任务的领域和技能覆盖 | 随任务发布的专用验收程序 | RIVER 直接使用它作为初始任务集合,只留下约 3.5K 个任务。 |
| 更强测试 / 自动生成验收 | 为代码任务生成更强单元测试 | 更准确判断输出是否正确 | 同时检查任务说明、环境与验收是否一致,以及评分如何影响多步行为。 |
| 基础推理步骤的组合与泛化 | 单轮推理的基本步骤与组合 | 通常按最终答案给分 | 扩展到包含命令、反馈和错误恢复的多轮 Agent 执行。 |
RIVER 把方法和机制解释绑在一起:如果强化学习主要塑造可复用行为,那么错误评分也可能影响多个领域;一个简单但可靠的重复检测规则,也可能在许多任务上同时生效。
3. Method:环境筛选、两条误判记录与训练更新
作者先筛任务与测试,再训练模型;重复惩罚改的是每次生成的训练优势,不是最终测试分。
3.1 数据来源、筛选与责任边界
RIVER 从 TMax 的 14,399 个训练环境开始。每个环境的核心是任务说明、Docker 和任务数据,以及专用验收程序。论文没有报告人工标注者逐条创建 CLEAN 标签,而是让 GPT-5.4 同时读取这三类材料,围绕“一个认真遵守说明的 Agent 能否理解任务并通过验收”给出一个主要判定。
八类判定是 CLEAN、VERIFIER-TOO-WEAK、INSTR-VERIFIER-MISMATCH、INSTR-ENV-MISMATCH、ANSWER-LEAK、INSTR-AMBIGUOUS、TASK-TRIVIAL 和 OTHER。一个任务可能同时有多个缺陷,但审计强制选择一个主类别。GPT-5.4 判 CLEAN 后,作者再用 GPT-5.4 + Terminus-2 对环境做 oracle pass@2,移除两次都失败的任务。后一步主要排除过难任务和训练设施不兼容,而不是再次判断验收是否正确。
横向总览(可打开原尺寸)
- 1 · 提供任务TMax 作者提供任务说明、容器与验收程序。
- 2 · 静态检查GPT-5.4 读三类材料,给八类判定。
- 3 · 试做筛选GPT-5.4 + Terminus-2 各跑两次,去掉 pass@2=0。
- 4 · 模型执行训练模型在保留的容器中,通过原程序执行任务。
- 5 · 任务验收原任务验收全部通过,最终分才为 1。
- 6 · 调整优势重复步骤的回复 token 额外扣减训练优势。
3.2 Agent 能看见什么,什么应当隐藏?
训练模型能看见任务说明、命令历史和终端输出,以及容器权限允许读取的文件。静态审计标签、强模型两次试做和其他训练样本不进入它的提示。任务验收在执行后运行,给出最终分数。
理想情况下,参考答案、参考实现和隐藏测试应当只对验收程序可见。TMax 的部分任务把它们直接放进 /app,于是“应当隐藏”与“实际隐藏”发生分离。RIVER 的 ANSWER-LEAK 标签就是为这种问题准备的。论文没有给出统一的隔离环境访问权限规范,也没有发布 3.5K 过滤结果供本文逐条核查;这里能确认的是论文和项目页公开的审计结果与案例文件。
3.3 两条真实误判:答案泄露与实现方式绑定
完整案例重绘图(可打开原尺寸)
task_003722 因参考答案文件可读而奖励抄答案的捷径;右侧 task_006064 因源码字符串检查而拒绝功能正确的 Rust 实现。task_003722 要从 archive_broadcast.mp4 中用 OCR(图像文字识别)提取新闻滚动字幕,按时间顺序写到 reconstructed_ticker.txt。Agent 先发现并读取 /app/ground_truth.txt,随后还是尝试了正常抽帧与 OCR,但自己的结果与参考文字相似度只有 0.368,低于 0.85 门槛。第 7 步用泄露的参考答案覆盖输出,第 8 步相似度达到 1.0,于是最终得分为 1。参考答案放在 Agent 可读区域,使得验收接受了直接复制的结果。
task_006064 要求 Rust 程序保留 a-z 与空格。Agent 使用 is_ascii_alphabetic(),生成的高频词和协方差矩阵都通过功能测试。第三个测试却在源码里搜索 is_alphabetic 字面量。合法 API 名不含这段连续字符串,整题因此得 0。这个失败判定拒绝了不同写法,测到的不是任务要求的实际行为。
这两条是作者在 Appendix C.4 整理的真实执行案例。项目仓库的 build_inputs/cases.json 复述了步骤与判定,没有提供完整原始命令日志、任务文件和可运行验收器;本文没有独立重放这两题,也无法核验相似度计算的全部细节。
3.4 重复操作怎样影响这一轮的训练优势?
GRPO 先给整条执行记录一个组内标准化优势,再在重复 turn(一次模型回复与对应环境观察)上加 s_(i,t)。命令和观察都与早前某轮的 Jaccard 相似度大于 0.8 时,该轮全部回复 token 的优势各扣 0.05。Jaccard 是两个集合交集大小除以并集大小;论文没有充分交代文本怎样切成集合。
例如成功记录原训练优势为 +1,某一轮重复,则该轮变为 +0.95;失败记录原为 −1,重复轮变为 −1.05。扣的是训练优势,不是把成功任务最终分数从 1 改成 0.95。这是公式说明例,不是模型日志。
下面是 Python 3 的公式说明代码,由本文编写,不是官方训练代码。它只表达 Eq. (1) 的逐回复扣减。Table 4 另列了每条执行记录 0.15 的惩罚上限,却没有说明怎样在回复和 token 间分配;因此不能据此补出“只罚前三个重复步骤”的实现。
# Article reconstruction from Eq. (1), not official code.
def repeat_shaping(turns, delta=0.05):
"""Eq. (1) only; each value applies to all response tokens of a turn."""
penalties = [0.0] * len(turns)
for i, current in enumerate(turns):
repeated = any(
jaccard(current.command, old.command) > 0.8
and jaccard(current.observation, old.observation) > 0.8
for old in turns[:i]
)
if repeated:
penalties[i] = -delta
return penalties规则要求命令和观察结果同时相似,避免把“同一命令得到新信息”也罚掉。它只降低对应回复 token 的训练优势,不改最终 PASS/FAIL。论文还试过奖励结束前验证(verify-before-done),虽然增加了这种行为,却没进一步提高评测分数;最终方法只保留重复惩罚。
Appendix D 用来分析行为的“重复率”只检查命令 token 的 Jaccard ≥0.8。它是更宽的统计指标,不能当成训练时要求命令、观察都 >0.8 的同一个检测器。
3.5 一轮训练实际用了多少交互?
Qwen3-8B 先在 78K 条执行记录上做一轮全参数 SFT,只对 assistant token 计算损失,学习率为 1e-5,最长序列 16,384 tokens。随后每个 RL 批次取 32 道题,每题采样 8 条执行记录;训练最多 16 轮交互,每轮最多生成 2,048 tokens,输入上限 16,384,temperature 为 0.6。作者用 8 张 H200 跑约 60 小时,完成 400 个 RL step。
最终评测的预算另算:最多 64 次动作、600 秒,提供模型完整的 40,960-token 输入窗口。训练的 16 轮与评测的 64 次动作不能混写成同一个预算。 这些都是上限,不是每题实际平均调用数。
3.6 静态审计本身可靠吗?
作者让 Claude Opus 4.8 在看不到 GPT 标签的情况下复判 120 个环境,每个 GPT 判定类别抽 15 个。八分类完全一致只有 22.5%,因为同一坏环境常有多个缺陷;合并成 CLEAN(无缺陷)/ defective(有缺陷) 后,一致 100/120,即 83.3%。更有用的是条件结果:GPT 判 defective 的 105 个中,Claude 也判 defective 的有 94 个,89.5%;GPT 判 CLEAN 的 15 个中,Claude 仍判 CLEAN 的只有 6 个,40%。所以这套审计更适合保守排除明显坏环境,不适合把 CLEAN 当成经过充分人工认证。
4. Experiments:主结果、环境过滤消融与跨领域测试
筛掉有问题的环境后,终端任务成功率提高;其他领域的保持能力还依赖广任务 SFT。
4.1 River-8B 的主结果
横向总览(可打开原尺寸)
River-8B 从 Qwen3-8B 出发,先用约 78K OpenThoughts 执行记录做监督微调,再用 RIVER-TMax-3.5K、EndlessAgent harness 和 GRPO 做 RL。四项评测共 589 道题;每个模型版本用 3 个随机种子评测,单题最多 64 次动作或 600 秒。OpenThoughts-TBLite 给连续分数,其余三项只有全部验收通过才记 1。主表 Average 是四项等权算术平均:(21.8 + 9.7 + 23.0 + 23.0) / 4 = 19.375,显示为 19.4。± 是三个种子成绩的标准差,不是标准误。
最精确的主结论是:River-8B 在论文重测的开源、经强化学习训练的 8B Agent 中,四项与平均分均最高。 不能把它直接扩成“所有终端 Agent 中的最优模型”,因为闭源 Claude / Codex 不在这张表里,而且对照模型使用各自原部署程序。作者尽量统一模型服务与预算,但模型、SFT 数据、RL 环境和 harness 仍有多处同时变化。
更直接检验过滤效果的是 Appendix Table 8:训练都用约 3.5K 个环境,一组经过 RIVER 筛选,另一组从完整 TMax 随机抽取。这样至少控制了环境数量。
| 约 3.5K 环境的训练组 | OT-TBLite | TB-v2.1 | TB-Pro | TW-Verified | 四项平均 |
|---|---|---|---|---|---|
| RIVER 筛选组 | 21.8 ±2.9 | 9.7 ±0.6 | 23.0 ±3.1 | 23.0 ±2.5 | 19.4 ±1.2 |
| TMax 随机组 | 18.6 ±1.9 | 8.2 ±1.3 | 23.7 ±1.5 | 20.3 ±0.6 | 17.7 ±0.7 |
过滤组平均高 1.7 个百分点,但 TB-Pro 上随机组 23.7 高于过滤组 23.0。结果支持这套筛选在四项合计上更有效,不支持每个评测都提升,也没有隔离出八类缺陷中的哪一类贡献最多。训练代码未公开,所有细微设置是否相同仍无法逐项核验。
4.2 为什么还要先用覆盖多种技能的数据微调?
作者为 Qwen3-8B 构造了三个 SFT 起点:以 nl2bash 和 InferredBugs 为主的 Narrow-SFT,约 13.6K 执行记录;从更广来源组成的 Diverse-SFT,约 78K;以及从 Diverse-SFT 随机抽到同样 13.6K 的 Diverse-DS-SFT。Narrow-SFT 与 Diverse-DS-SFT 在 SFT 后的平均分接近,继续做同一套 RL 后却拉开明显差距。这个相同数据量的对照部分排除了数据量的影响,剩下的差别主要来自基础技能覆盖。
论文还报告了一次失败的早期实验。作者在未经过 RIVER 过滤的 TermiGen 环境上使用部分完成度奖励,训练分和同来源测试分都上升,外部四项平均分反而下降,同时执行越来越早结束。换成 Diverse-SFT 起点后,同一设置下利用评分漏洞的行为有所减少。作者因此把覆盖多种技能的监督微调放在较弱模型的强化学习之前;它不是 RIVER 的环境过滤核心,但会影响模型有没有能力通过正常路径完成训练任务。
4.3 少于 30% 的环境,为什么会出现 +106%?
作者进一步沿用 TMax 的 Qwen3.5-2B/4B/9B、Qwen3.6-27B、Vanillux2 harness 与 DPPO 设置,只把完整 TMax 训练集换成 RIVER 过滤后的约 3.5K 环境。论文按每个模型的 RL score − base score 先算训练增益,再比较两套数据的增益。
结果是 Terminal-Bench-Lite 上的平均训练增益相对 TMax 增大 106%,Terminal-Bench-v2.1 上增大 30%。这说明过滤后的验收分数在这些配置里更有效率。它不表示模型得分增加 106 个百分点,也不表示每种模型规模都提高相同比例。
4.4 学到的行为是否真的跨领域迁移?
作者从 RIVER-TMax-3.5K 中另留约 300 个任务做受控评测,再只用 2、4、6 或 8 个领域训练。两域训练只包含 Debug 和 Systems,其他六域仍然出现提升。轨迹里的检查环境、错误恢复与重复操作等行为变化也同时出现在未训练域。
这组结果支持“跨领域的行为迁移”。但领域来自作者对 TMax 任务技能的分类,未训练题仍属同一个合成环境来源;它不是独立收集的真实用户分布。
5. Discussion:对完整 coding harness 训练的启发
评分程序本身就是训练系统的一部分。 任务要求、容器、可读文件、隐藏答案、测试步骤与分数聚合应一起审计,而不只是数任务数量和类别。
答案泄露会让错误捷径得分,源码字符串检查会让正确实现受罚。仅按强模型能否通过来筛难度,不能替代对这两类错误的检查。
分析行为也需要区分标注方法。§5.1 由 GPT-5.4 标出 60 种技能在 589 题执行记录中是否出现;§5.2 的 Model-S 还包含任务类别,Model-B 则用规则提取 12 种跨步骤行为,再比较它们预测成功的能力。标出某种技能“出现过”不等于它被正确使用。
这些特征适合先用于诊断。奖励某个行为是否有帮助,还要单独干预测试;本文的 verify-before-done 方案让验证行为更多,却没有提高成绩,已经给出一个反例。
后续应在 Claude Code、Codex CLI 和开源执行器上使用同一批隐藏任务;让人工和多个模型复核测试分歧;按任务家族、容器来源和测试作者划分未见集合。这样才能区分跨任务行为与某个数据生成器的惯例。
6. Conclusion:有说服力的证据与尚未公开的部分
这篇论文最强的部分,是用真实误放行与误拒绝记录说明,错误评分会怎样影响 Agent 行为,再换模型、规模、执行程序与领域检查同一训练方案。 它还认真报告了一个负结果:verify-before-done 与成功相关,但直接奖励它没有继续提高性能。
需要保留的限制也很具体:
6da2749,仍没有训练代码、3.5K 清单、模型权重或完整逐任务日志。上游 TMax 数据公开,但不等于 RIVER 筛选集。我的最终判断是:RIVER 要求先审计验收分数,再决定是否扩大训练环境。 它的 3.5K 环境未公开,限制了完全复核;但两类真实验收错误、明确区分的筛选阶段,以及行为奖励的正负消融,已经给终端 Agent 强化学习提供了一套很实用的实验框架。
论文为 arXiv non-exclusive distribution license,项目仓库未声明 license。本文没有复用原图像素,图表根据 arXiv:2608.22631v3 与作者整理的案例重绘,具体 Figure、Table 和 Algorithm 编号见图注。项目页与仓库于 2026-10-20 重查,固定 revision 为 6da2749578df2779b8a7e134ccb8d063d84693aa;公开案例摘要不等于完整可重放的轨迹和验收代码。
留言