把 Claude Code 等编码 harness 变成 RL 环境,用捕获代理不改代码即可训练
RT @ClementDelangue:我们把 Claude Code、Codex、Hermes、Pi、@opencode 等编码 harness 都变成了 RL 环境。没有改动 harness,也没有改动训练代码。任何开放模型、任何任务集,全部开源,朋友们!
同一个模型、同一份权重:在 Mini-SWE-Agent 下为 62%,在 Claude Code 下为 33%。但要在真实 harness 里训练,通常就意味着得把它重新实现成一个环境,于是大多数模型都是在没人真正会发布的脚手架上训练出来的。
解决办法是用代理,而不是重写。harness 以为自己在跟模型 API 对话,实际上是在跟一个捕获代理对话:这个代理会说编码 agent 使用的 4 种格式(OpenAI Chat Completions、OpenAI Responses、Anthropic Messages、Gemini),把请求转发给 @vllm_project,记录下 vLLM 采样出的精确 token ID 和 logprobs,再把可训练的序列交给 TRL。harness 本身就成了环境。目前有 10 个 harness 通过它运行,一个都没改。
而且因为奖励由你控制,你可以塑造 harness 从未要求过的行为。我们为用更少工具调用完成任务加了一点小奖励:在它本就能解决的任务上,模型现在的调用次数减少了 31%,在所有 harness 中都如此,在 Codex 下大约减少一半。
在 @liquidai 的 LFM2.5-2.6B 上测试:
→ 在单个 harness 中训练:主要在该 harness 中变好(OpenCode 34% → 58%)。
→ 同时在 4 个 harness 中训练:4 个全部变好(42% → 54%)。
→ 改用 Qwen3.8-27B 的 3,189 条 rollout 做 SFT:停在 47.5%,低于两次 RL 训练。
一切都开放且可复现:OpenEnv 中的捕获代理、TRL 中的训练器、任务集、SFT 数据、训练代码以及全部 7 个训练好的模型。接下来是更大的模型和更大规模的训练。
完整指南:https://t.co/sKZURuOcza
同一个模型、同一份权重:在 Mini-SWE-Agent 下为 62%,在 Claude Code 下为 33%。但要在真实 harness 里训练,通常就意味着得把它重新实现成一个环境,于是大多数模型都是在没人真正会发布的脚手架上训练出来的。
解决办法是用代理,而不是重写。harness 以为自己在跟模型 API 对话,实际上是在跟一个捕获代理对话:这个代理会说编码 agent 使用的 4 种格式(OpenAI Chat Completions、OpenAI Responses、Anthropic Messages、Gemini),把请求转发给 @vllm_project,记录下 vLLM 采样出的精确 token ID 和 logprobs,再把可训练的序列交给 TRL。harness 本身就成了环境。目前有 10 个 harness 通过它运行,一个都没改。
而且因为奖励由你控制,你可以塑造 harness 从未要求过的行为。我们为用更少工具调用完成任务加了一点小奖励:在它本就能解决的任务上,模型现在的调用次数减少了 31%,在所有 harness 中都如此,在 Codex 下大约减少一半。
在 @liquidai 的 LFM2.5-2.6B 上测试:
→ 在单个 harness 中训练:主要在该 harness 中变好(OpenCode 34% → 58%)。
→ 同时在 4 个 harness 中训练:4 个全部变好(42% → 54%)。
→ 改用 Qwen3.8-27B 的 3,189 条 rollout 做 SFT:停在 47.5%,低于两次 RL 训练。
一切都开放且可复现:OpenEnv 中的捕获代理、TRL 中的训练器、任务集、SFT 数据、训练代码以及全部 7 个训练好的模型。接下来是更大的模型和更大规模的训练。
完整指南:https://t.co/sKZURuOcza