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。

核心结论(来自官方发布)

  1. Harness 是环境的一部分:相同权重在不同 harness 下分数可以差近一倍(33% vs 62%)
  2. 多 Harness 训练比单 Harness 更泛化:OpenCode-only 训练在 OpenCode 里达到 58%,但在 Claude Code 和 Codex 上不如多 Harness 版本
  3. 工具效率显著提升:训练后 tool call 减少 31%(同样的成功率,减少了 31% 调用数)
  4. 完整开源: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 同步训练是当前最完整的开源方案。


核验来源(按优先级):

  1. HuggingFace 模型卡 FineEnvs/LFM2.5-2.6B-multiharness-RL(训练超参数、评测数字)— https://huggingface.co/FineEnvs/LFM2.5-2.6B-multiharness-RL ✅
  2. X @adithya_s_k 推文 2105684965891703141(官方 guide 发布)— https://x.com/adithya_s_k/status/2105684965891703141 ✅
  3. X @maximelabonne 推文 2105796335584858466(Labonne 转发背书)— https://x.com/maximelabonne/status/2105796335584858466 ✅
  4. Liquid AI 官方博客(Agentic RL 阶段 capture proxy 架构)— https://www.liquid.ai/blog/lfm2-5-2-6b ✅
  5. TRL + OpenEnv 集成教程(sandbox / transparent_proxy 模式代码)— https://huggingface.co/blog/sergiopaniego/trl-openenv-harness-training ✅
  6. 第三方验证: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 原始数字,原帖主张