OpenEnv 多 Harness 同步 RL 训练:用 Capture Proxy 把任意 Agent Harness 变成训练场 · 干货攻略
- 链接: https://x.com/adithya_s_k/status/2105684965891703141
- 分类: x-tips
- 来源: X @adithya_s_k(转自 @maximelabonne)
- 作者: Jay
- 更新: 2026-10-04
- 仓库: huggingface/OpenEnv
这是什么
2026 年 10 月 1 日,Hugging Face 与 Liquid AI 联合发布了 OpenEnv 多 Harness 同步 RL 训练栈,核心方法论见"The ultimate guide to multi-harness RL"(Adithya S Kolavi 等 8 位作者)。该工作的核心洞察是:
同一个模型权重,在不同 Agent Harness 中跑出来的分数可能相差一倍。 以 LFM2.5-2.6B 在 SmolDataEnvs(1,000 个数据任务,250 个 held-out 测试)上的结果为例:
| Harness | 基础模型 pass@1 | 多 Harness RL 后 |
|---|---|---|
| OpenCode | 34.0% | 58.0% |
| Claude Code | 33.0% | 49.0% |
| Codex | — | — |
| Mini-SWE-Agent | 62.1% | 62.0% |
| 平均 | 42.2% | 54.2% |
多 Harness RL 后,平均 pass@1 提升 +12 个百分点,工具调用数减少 31%(在两者都解出的任务上横向比较)。全部代码、数据、7 个训练好的 checkpoint 均已开源。
为什么值得关注
谁分享的、解决了什么问题
@adithya_s_k(Adithya S Kolavi,Hugging Face RL 团队成员)于 2026 年 10 月 1 日发帖公布;@maximelabonne(Liquid AI 后训练工程师 Maxime Labonne)同日转发并评论"Such a cool collab"。该帖子获得 92.5K 综合浏览量。
解决的核心问题是:现有 RL 训练范式对 Harness 存在天然盲区。
传统 RL 训练通常由训练器自己驱动 rollout loop——采样、解析工具调用、执行、反馈。这种方式训练出来的"agent"其实是"训练环境里的 agent",而非"用户实际使用的 harness 里的 agent"。换句话说:你训的模型和用户装的模型,跑的不是同一个系统。
多 Harness RL 的解决思路是:让 Harness 自己跑 loop,用 capture proxy 把跑过的数据捕获回来用于训练——而不是让训练器去模拟 loop。
核心结论(来自官方发布)
- Harness 是环境的一部分:相同权重在不同 harness 下分数可以差近一倍(33% vs 62%)
- 多 Harness 训练比单 Harness 更泛化:OpenCode-only 训练在 OpenCode 里达到 58%,但在 Claude Code 和 Codex 上不如多 Harness 版本
- 工具效率显著提升:训练后 tool call 减少 31%(同样的成功率,减少了 31% 调用数)
- 完整开源:capture proxy、TRL trainer、SmolDataEnvs 任务集、SFT 数据、7 个 checkpoint 全部公开
核验过程
官方来源
| 来源 | 读取内容 | 核验结论 |
|---|---|---|
| HuggingFace 模型卡 FineEnvs/LFM2.5-2.6B-multiharness-RL | 训练超参数表:1,000 步、lr=3e-6、GRPO group=8/max staleness=4、paged AdamW 8-bit/bfloat16、temperature=0.8/top-p=1.0、4,096 token 输出预算;checkpoint 第 1,000 步 54.2% pass@1;全量权重非 LoRA | ✅ 确认 |
| X @adithya_s_k 推文(2105684965891703141) | 宣布"The ultimate guide to multi-harness RL"发布;8 位联合作者;HuggingFace + Liquid AI 联合署名 | ✅ 确认 |
| X @maximelabonne 推文(2105796335584858466) | "Train LFM2.5-2.6B on all the harnesses!";评论对合作表示认可 | ✅ 确认 |
| Liquid AI 官方博客(liquid.ai/blog/lfm2-5-2-6b) | Agentic RL 阶段使用 OpenEnv × Harbor capture proxy;Blackbox Harness + Harness Proxy 架构;OpenClaw / Hermes Agent 作为 RL harness | ✅ 确认(与 agentic RL 攻略交叉印证) |
交叉验证
| 说法 | 验证来源 | 结论 |
|---|---|---|
| 多 Harness RL 后平均 pass@1 从 42.2% → 54.2% | AlphaSignal、AI Socratic、Surf AI、Digg、fellipesoares.com.br、LinkedIn(Ben Burtenshaw) | ✅ 多源一致,确认 |
| 工具调用减少 31% | AlphaSignal、Surf AI、AI Socratic | ✅ 确认 |
| OpenCode-only: 58% / Claude Code: 49%(训练后) | AlphaSignal、Digg | ✅ 确认 |
| Capture proxy 记录 token IDs + logprobs | AlphaSignal、Surf AI、AI Socratic、fellipesoares.com.br | ✅ 确认 |
| 全部开源:proxy / trainer / tasks / data / 7 个模型 | AlphaSignal、Surf AI、LinkedIn | ✅ 确认 |
| SFT on 3,189 rollouts from 27B teacher plateaued at 47.5% | AlphaSignal | ⚠️ 单源,原帖主张 |
| LFM2.5-2.6B 基础模型参数 2.6B | 在 x-tip-20261002 攻略中已验证(Liquid AI 官方博客) | ✅ 复用确认 |
⚠️ 未核验 / 需注意
- OpenCode-only 训练在 OpenCode 内达到 58%:该数字来自 AlphaSignal 转述官方,未找到原始文章中的精确表格;已交叉确认 AlphaSignal、AI Socratic、Surf AI 多家一致,基本确认
- SFT plateau at 47.5% vs RL 54.6%:AlphaSignal 披露,该对比数字来自原 guide 未找到原始 URL;其他信源未提及此具体对比数字,原帖主张,参考性标注
- 各 harness 原始分数(Claude Code 33%、OpenCode 34%、Mini-SWE-Agent 62.1%):AlphaSignal 原文数字,原帖主张
上手步骤
架构概览:Capture Proxy 如何工作
┌─────────────────────────────────────────────────────┐
│ Agent Harness(OpenCode / Claude Code / Codex 等) │
│ 正常运行——prompts、tools、context、stop 规则都不变 │
└──────────────────┬──────────────────────────────────┘
│(API 调用,harness 原有 dialect)
▼
┌─────────────────────────────────────────────────────┐
│ OpenEnv × Harbor Capture Proxy │
│ · 接收 harness 的 API 请求 │
│ · 转发给 vLLM inference server │
│ · 捕获返回的 token IDs + log probabilities │
│ · 重构完整 trajectory(reward 从环境返回) │
└──────────────────┬──────────────────────────────────┘
│
┌────────┴────────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ TRL Async │ │ vLLM │
│ GRPO Trainer │◄──│ Inference │
└──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ LFM2.5-2.6B │
│ 权重更新 │
└─────────────┘
关键设计:proxy 对 harness 透明,harness 完全不知道自己在被训练。
核心三步(基于 OpenEnv × TRL 集成文档)
Step 1:安装 OpenEnv 并启动 OpenCode Harness Sandbox
pip install openenv
openenv init my-agent-env
# 拉取预制 OpenCode sandbox 镜像(harness + proxy 已内置)
docker pull ghcr.io/huggingface/openenv-opencode-sandbox:latest
# 或使用 HuggingFace Spaces 直接调用
# https://huggingface.co/spaces/FineEnvs/multi-harness-rl
Step 2:配置 Capture Proxy 模式启动
from opencode_env.sandbox import HFSandboxBackend
from opencode_env import OpenCodeSessionFactory
factory = OpenCodeSessionFactory(
config=config,
sandbox_backend=HFSandboxBackend(
image="ghcr.io/huggingface/openenv-opencode-sandbox:latest"
),
mode="transparent_proxy", # ← proxy 捕获 token IDs + logprobs
verifier=DeepCoderStdinVerifier(tests_by_id),
)
sandbox_backend 镜像已预装 harness 和 proxy,无需每次 rollout 重新安装。每个 rollout 运行在独立隔离容器中,并发执行。
Step 3:启动 TRL Async GRPO 训练
from trl import AsyncGRPOConfig, async_grpo_trainer
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("LiquidAI/LFM2.5-2.6B")
training_args = AsyncGRPOConfig(
output_dir="./lfm-multiharness-checkpoint",
learning_rate=3e-6,
num iterations=1000, # optimizer steps
per_device_train_batch_size=1,
gradient_accumulation_steps=8,
temperature=0.8,
top_p=1.0,
max_tokens=4096,
save_strategy="steps",
save_steps=100,
)
trainer = async_grpo_trainer(
model=model,
args=training_args,
dataset=train_dataset, # FineEnvs/SmolDataEnvs-harbor-train
reward_functions=[correctness_reward, efficiency_bonus],
)
trainer.train()
关键超参数(来自 FineEnvs/LFM2.5-2.6B-multiharness-RL 官方模型卡):
| 参数 | 值 |
|---|---|
| 训练任务池 | 1,000 任务(400 中等 / 600 困难) |
| Optimizer steps | 1,000 |
| Learning rate | 3e-6 |
| GRPO group 大小 / 最大 staleness | 8 / 4 optimizer steps |
| Optimizer / 精度 | paged AdamW 8-bit / bfloat16 |
| 采样 temperature / top-p | 0.8 / 1.0 |
| 每轮输出上限 | 4,096 tokens |
| 训练硬件 | 2 × H100 GPU |
Reward 设计
def correctness_reward(completion, target):
return 1.0 if completion["is_correct"] else -1.0
def efficiency_bonus(completion, target):
# 答对了 + 用的 tool call 更少 = 额外奖励
if completion["is_correct"] and completion["tool_calls"] < baseline_calls:
return 0.1 # 小额效率 bonus
return 0.0
多 Harness 同时训练的关键配置
训练时,每个 GRPO group 随机分配一个 harness(OpenCode / Claude Code / Codex / Mini-SWE-Agent 中随机抽一个)。这是"harness-agnostic"训练的核心——模型不知道自己在哪个 harness 里被评估,因此被迫学习更通用的行为。
# 在 HuggingFace Jobs 上运行完整 launcher
hf jobs uv run \
--flavor h200x2 \
--secrets HF_TOKEN \
--timeout 7200s \
launcher.py
评测(评测时不经过 proxy,直接 harness → vLLM)
# 在各 harness 上评测训练好的 checkpoint
results = evaluate_checkpoint(
checkpoint_path="./lfm-multiharness-checkpoint/checkpoint-1000",
harnesses=["opencode", "claude_code", "codex", "mini-swe-agent"],
dataset="FineEnvs/SmolDataEnvs-harbor-test", # 250 held-out tasks
)
# 预期结果: ~54.2% average pass@1
接入其他 Harness(扩展指南)
OpenEnv 的 Harbor 组件负责将各 harness 的 API 方言标准化。若要接入新的 harness,需要实现对应 Harbor adapter:
# Harbor adapter 伪代码(参考 OpenEnv 文档)
class YourHarnessAdapter(HarborAdapter):
def translate_request(self, harness_request):
# 将 harness 的 API 格式转为 OpenEnv 标准格式
return standardized_request
def translate_response(self, model_response):
# 将 model 输出转回 harness 期望的格式
return harness_response
def extract_tokens_and_logprobs(self, raw_response):
# 提取 token IDs + log probabilities 用于 RL 训练
return tokens, logprobs
坑与适用边界
| 维度 | 说明 |
|---|---|
| 任务类型 | 目前验证仅限 SmolDataEnvs(数据分析任务,源于 Kaggle notebooks);代码任务、软件工程大规模基准、Agent 任务等场景尚未验证 |
| Harness 版本依赖 | 训练与评测依赖特定 harness 版本;不同版本间 prompt 格式、工具 schema 可能变化,导致结果不可迁移 |
| 资源门槛 | 需要多卡 GPU(官方用 2×H100);并发 sandbox rollout 增加了内存和容器管理开销 |
| Staleness 机制 | GRPO group staleness 上限 4 optimizer steps——如果 rollout 超过 4 步还没返回,该组数据被丢弃;长程任务更容易触发 staleness,导致有效训练数据减少 |
| 单 Harness 特化 vs 多 Harness 泛化 | OpenCode-only 训练在 OpenCode 达到 58%(> 多 Harness 的 54%);多 Harness 换来的不是单项最强,而是全局最优——如果目标是某个特定 harness 最优,应该单 harness 训练 |
| 代理捕获的隐私问题 | Capture proxy 记录完整 token IDs + logprobs——如果 harness 传递了敏感 prompt 上下文,这些数据会被记录,需要注意数据治理 |
| 可复现性 | 所有 checkpoint 和训练数据已开源;smolagents/sandbox 提供了可复现的容器环境;多 run 之间的 variance 需关注(官方标注为单次运行结果) |
| 与 EvoHarness-RL 的关系 | EvoHarness-RL(x-tip-20260815 攻略)研究的是 Agent 学会"何时调用 harness";本文研究的是"同一模型如何在多个 harness 中同步 RL 训练",两者侧重点不同,可互补 |
| Benchmark 数字均为自报告 | 54.2% / 31% 等数字来自联合团队的实验报告,尚未在第三方独立榜单上验证 |
一句话结论
OpenEnv 的 Capture Proxy 让"在用户真实使用的 Harness 中训练模型"成为可能——LFM2.5-2.6B 多 Harness RL 后平均 pass@1 从 42.2% 升至 54.2%,工具调用减少 31%;如果你的目标是在某个特定 harness 上追求极致分数,用该 harness 单独训练效果更好;如果你的模型要跨 harness 泛化,多 Harness 同步训练是当前最完整的开源方案。
核验来源(按优先级):
- HuggingFace 模型卡 FineEnvs/LFM2.5-2.6B-multiharness-RL(训练超参数、评测数字)— https://huggingface.co/FineEnvs/LFM2.5-2.6B-multiharness-RL ✅
- X @adithya_s_k 推文 2105684965891703141(官方 guide 发布)— https://x.com/adithya_s_k/status/2105684965891703141 ✅
- X @maximelabonne 推文 2105796335584858466(Labonne 转发背书)— https://x.com/maximelabonne/status/2105796335584858466 ✅
- Liquid AI 官方博客(Agentic RL 阶段 capture proxy 架构)— https://www.liquid.ai/blog/lfm2-5-2-6b ✅
- TRL + OpenEnv 集成教程(sandbox / transparent_proxy 模式代码)— https://huggingface.co/blog/sergiopaniego/trl-openenv-harness-training ✅
- 第三方验证:AlphaSignal、AI Socratic、Surf AI、Digg、fellipesoares.com.br、LinkedIn(Ben Burtenshaw)— 交叉确认 54.2% / 31% / 58% 等核心数字 ✅
不确定处:
- OpenCode-only 58% / Claude Code 49% 的精确原始数据——AlphaSignal 转述,无直接原始 URL 交叉验证;多家第三方一致,基本确认
- SFT baseline 47.5% vs RL 54.6% 对比——AlphaSignal 披露,单源原帖主张
- 各 harness 基础模型分数(Claude Code 33%、OpenCode 34%)——AlphaSignal 原始数字,原帖主张