保留 Claude Code 等
原有执行流程,
用真实修复结果训练模型
LEGO-RL 不改写 Agent 怎样管理上下文和工具。它在模型服务处记录实际生成的 token,在隔离仓库里执行修复,最后用隐藏测试给出 0/1 分。

Harness 决定怎样调用工具;policy 是它调用并训练的生成模型
一次 rollout 指模型与工具完成一道任务的整段执行记录。Claude Code 仍管理提示、工具调用和历史压缩;训练系统用代理程序(proxy)记录模型请求和返回。
问题与仓库
Agent 收到 issue 描述和初始化仓库;参考修复和隐藏测试不可见。
决定上下文
原生程序准备模型输入,执行工具操作,再发起下一次模型调用。
记录真实生成
保存 token ID、生成概率、哪些位置由模型生成的标记(mask)和 MoE 专家选择。
隔离执行
Agent 在独立容器内读写仓库,不影响其他任务。
结束后验收
注入隐藏测试。修复目标全过、原有测试不回归才给 1。
更新模型
同题有效记录算相对得分;重算生成概率,做 GSPO 更新并同步新权重。
GSPO 根据同题相对成绩,提高好记录的生成概率
σi 是整条记录的平均概率比,不是逐 token 的 PPO 比值。
4 条通过、4 条失败
均值 0.5,按总体标准差 0.5 计算,成功的 Â≈+1,失败的 Â≈−1。裁剪限制单次概率改变幅度。
全错:Â 全为 0
没有组内差异,这组无法提供相对学习信号。
全对:Â 也全为 0
模型变强后,题池仍需要让它有时成功、有时失败。
历史文字可能被 harness 改写,训练仍须保留模型当时真正生成的 token
历史压缩或工具参数重新排版后,重新编码的文字可能不等于原始生成序列。
论文要求保留原始 token、排除对不齐的历史;公开 a3e28f1 的异常分支却会重建,不能一概保证。
MoE(混合专家模型)每个 token 只用部分子网络。代理保存选择,训练程序用 R3 沿用这些专家。
只更新真实模型生成的位置。Harness 添加的文字和工具返回值不算模型输出;子 Agent 调用单独隔离。
LEGO-RL 在模型 API 处接入现有 harness,再补足训练和验收
| 路线 | 任务执行由谁组织 | 优势 | 与 LEGO-RL 的边界 |
|---|---|---|---|
| verl / slime / MOLT / SkyRL / AReaL | 训练框架管理或提供抽象接口 | 直接管理 token 与权重更新 | 完整 coding harness 往往要改写为框架内部循环 |
| ALE:ROLL + ROCK + iFlow | 训练、容器与 CLI Agent 共同设计 | 整个系统可共同保证一致性 | 一致性来自共同控制全套程序 |
| Agent Lightning | 在现有 Agent 中加入 SDK 回调 | 对原程序改动较少 | 作者表中未报告历史对齐、R3 路由重放和防评分作弊 |
| Polar / rLLM / OpenForgeRL | 在模型 API 处观察现有 harness | 保留原有执行流程 | 最接近;历史对齐、容器与诊断覆盖不同 |
| LEGO-RL | Claude Code / OpenHands / OpenCode 原生循环 | token 捕获、路由重放、隐藏验收和 Live UI 组合 | 贡献是完整系统组合,不声称每个组件都首次提出 |
一次任务执行怎样进入模型训练

数据准备、配置检查、运行、监控与人工复核各有职责

先排除坏任务,再保留当前模型有时能做对的任务
仓库、需求、参考修复、测试补丁与清单。
基本有效性、仓库多样性、粗略复杂度。
评分审计发现约 2.5% 错误套入参考修复。
固定用 OpenHands SDK 估计难度。
与 Verified 在仓库、任务两层不重叠。
第一次设置进度条 total,后续 update_progress 不应再次要求 total
# PR #814 的公开测试调用
alert.reset()
alert.update_progress(0, total=100)
alert.update_progress(50)
# 测试检查
assert alert.progress_bar.n == 50
assert alert.viz is True
旧实现:第二次调用报错
50 > total=1第二次没有传 total,旧代码又读取默认值 1;检查“进度必须在 0 到 total 内”后抛 ValueError,目标测试失败。
参考修复:沿用已初始化的总量
n=50 / total=100进度条已存在时读取 self.progress_bar.total,更新后进度为 50、进度条可见。完整判分还要求原有通过测试不回归。
同一任务从原始记录变成验收包;训练索引只保存包的路径



同一初始模型在三种 harness 下,成绩与执行长度都不同

按结束原因给训练权重;不能把所有未完成任务都当成模型答错


四组同样各 951 题,偏难任务和随机题池更难提供组内差异

训练分下降时,要查结束原因、具体任务和执行记录


模型更常重读和测试代码,格式错误的工具调用变少


异步不必等待整批最慢任务;按需下载镜像减少启动传输


从任务网格查看结束原因,以及生成和训练概率是否一致


三次训练的验证最高分都超过各自起点,不等于最终固定表现
| Harness | Qwen3.5 | Qwen3.6 | KAT-Coder-V2.5-Dev | LEGO-RL 验证最高分 |
|---|---|---|---|---|
| OpenHands SDK | 64.0 | 67.4 | 67.0 | 70.4 (+6.4) |
| Claude Code | 62.4 | 63.4 | 66.8 | 68.2 (+5.8) |
| OpenCode | 57.2 | 60.6 | 64.8 | 66.6 (+9.4) |
有端到端提升,也有生成对齐、案例复现和对照实验的缺口
训练原生 coding Agent,要把实际生成记录与验收结果对应起来
保存原始 token
正常路径保留模型实际输出;公开版本的历史重建回退不能保证同样准确。
执行结束再注入验收文件
Agent 执行时看不到隐藏测试、参考修复和评分脚本。
保留有组内差异的任务
同题全错或全对都不给相对学习信号;固定题池会随模型变化而变易。
从均值追到具体记录
查结束原因、工具调用、任务变化,以及生成和训练概率是否一致。
一个模型通用多种 harness
论文分别训练三次;不能据此宣称已学到跨 harness 的通用行为。
作者兴趣度 9.5 / 10
与 Claude Code、Codex 一类完整 harness 的 RL 训练直接相关。