Harness Adapters:用安全强化学习提升智能体开发效率
为什么我们需要 Harness Adapters
在本地进行智能体(Agent)开发时,同一个基础模型在不同的智能体框架(如 pi、opencode、hermes)中表现往往大相径庭。这是因为每个框架都有独特的工具集、提示词结构和控制流。以往的做法通常是微调整个模型,但这不仅成本高昂,而且难以针对不同框架进行灵活切换。
Hugging Face 团队最新推出的 Harness Adapters 提供了一种更高效的思路:为每个智能体框架训练一个小型的 LoRA 适配器,而不是修改基础模型本身。这意味着你可以保留同一个基础模型,只需加载对应的 LoRA 适配器,就能让模型在特定的智能体环境中表现得更加高效和准确。
这项工作的核心亮点不仅在于效率提升,更在于引入了“安全强化学习”的概念。通过集成 safeagents 组件,系统能够在训练过程中实时检查模型的每一次工具调用,坚决阻断那些试图走捷径、篡改测试文件或泄露答案的“奖励黑客”行为。
技术架构:一个基座,多个适配器
LoRA 的自然优势
选择 LoRA(Low-Rank Adaptation)作为适配器方案并非偶然。LoRA 的训练和推理成本极低,允许在一台服务器上同时托管多个不同智能体框架的策略。在推理阶段,开发者可以根据自己使用的智能体框架,动态加载相应的适配器,从而在不改变基础权重的情况下,优化模型在特定场景下的表现。
异步 GRPO 训练流程
训练过程采用了 TRL 库中的 AsyncGRPOTrainer,结合树状注意力机制以提高效率。整个训练架构设计得非常紧凑:
- 共享基座:每个基础模型由一个 vLLM 实例提供服务。三个不同的训练器(分别对应 pi、opencode 和 hermes)同时向这个 vLLM 发送请求,每个请求都会指定其对应的 LoRA 适配器名称。
- 无暂停更新:当某个训练器完成梯度步骤后,它会以新名称将更新后的适配器加载到 vLLM 中。正在运行的旧版本请求会继续完成,不会造成中断。
- 资源复用:对于较小的模型如 LFM3-1.7B,三个训练器甚至共享同一块 GPU。由于智能体的大部分时间花费在沙箱执行工具上,而非生成文本,GPU 的大部分时间处于等待状态。这种设计让三个训练器轮流使用 GPU,避免了资源闲置。
训练步骤详解
训练是异步进行的, rollout(滚动展开)和梯度更新互不阻塞。每个训练器同时维持多达 48 个智能体会话。当一个任务的 8 次 rollout 全部评分完毕后,它才会进入训练队列,因为 GRPO 算法需要对比同一任务下不同 rollout 的表现。
梯度步骤将完成的 rollout 打包成微批次。例如,LFM2.5-24B-A2B 的 token 预算为 131,072,而 LFM3-1.7B 和 TwIL-8B 为 65,536。这意味着每个步骤处理的任务数量是不固定的:短会话可以容纳更多任务,长会话则较少。为了防止模型从过时的策略中学习,系统会丢弃超过 4 个版本之前的 rollout。
这种架构极大地降低了评估成本。在一次测试中,LFM2.5-24B-A2B 的 9 个检查点(共 1,350 个智能体会话)在单个 H200 GPU 上不到一小时就完成了评估,成本仅约 5 美元。如果采用传统的合并权重并单独服务的方式,成本将高达 90 美元。
数据来源:从开源轨迹到验证环境
高质量的训练数据是强化学习成功的关键。团队并没有完全依赖合成数据,而是利用 Hugging Face Hub 上公开的开源智能体轨迹(Trajectories),通过 Repo2RLEnv 工具将其转化为可验证的强化学习环境。
四种任务类型
系统从原始轨迹中提取出四种主要任务类型:
- Repair(修复):修复现有代码库中的 bug。判断标准是某个检查命令(如 pytest)最初失败,经过编辑后通过,且期间没有新的安装操作。
- Build(构建):从零开始构建一个新项目。评分依据是隐藏测试通过的比率。
- Extend(扩展):对现有代码库进行后续更改。要求更改后所有检查通过。
- QA(问答):回答事实性问题。答案需与工具输出中的内容完全匹配。
严格的验证流程
为了确保任务的有效性,每个候选轨迹都要经过六步筛选:
- 扫描:使用
atif-scan剔除存在奖励篡改或基准泄露的轨迹。 - 重放:在虚拟文件系统中重放所有文件写入和编辑操作,确保每个 shell 命令执行时的文件状态与原始记录一致。
- 寻找工作单元:识别轨迹中的关键工作单元。对于 Build 和 Extend 任务,使用教师模型(Mistral-Large)生成接口契约、存根代码和隐藏测试。
- 构建与检查:将环境构建为 Docker 镜像,并在离线状态下进行检查。确保测试在参考实现上通过,在存根和空工作区上失败,并能捕获大多数注入的错误。
- 试验矩阵:原始解决方案必须获得满分奖励,而任何不做操作、使用存根或篡改测试的行为必须得零分。
- 发布与评分:运行预言机(Oracle)再次验证,并根据参考智能体(LFM2.5-24B-A2B)的解决率标记难度(困难、中等、简单)。
目前发布的 270 个 Repo2RLEnvs 任务中,有 253 个是 Build 任务。这主要是因为公开的轨迹大多是一次性的“构建 X”请求,而包含错误修复或多轮扩展的会话相对较少。这也解释了为什么训练混合了 SmolDataEnvs 数据集,以平衡中等和困难任务的比例。
安全强化学习:对“奖励黑客”说不
强化学习的一个固有风险是模型可能会找到“捷径”来最大化奖励,而不是真正解决问题。例如,模型可能会尝试读取测试文件、修改测试逻辑,或者直接从网络上抓取答案。为了应对这一问题,团队引入了 safeagents。
Safeagents 的工作原理
safeagents 是一个反向代理服务器,位于智能体框架和 vLLM 之间。智能体框架认为它在与 vLLM 直接通信,但实际上所有请求和响应都经过 safeagents 的检查。它支持 OpenAI Chat Completions 和 Anthropic Messages API,并且对模型完全透明。
每次工具调用都会经过三层检查:
- 请求合法性:调用的工具必须在请求中声明,访问的主机必须在对话中出现过。模型不能凭空捏造 URL 然后引用自己。
- Atif-scan 检测:将对话转换为 ATIF 轨迹并进行扫描。内置规则涵盖奖励篡改、测试编辑、基准查找、代理绕过等。高严重性的发现会直接阻断调用。
- 插件规则:针对特定数据集的自定义规则。例如,禁止访问 SmolDataEnvs 的答案源文件或 Hugging Face 凭证。
如果调用被阻断,safeagents 会在响应中替换为一条文本通知,如 [safeagents] blocked call to bash: ...,并将该次 rollout 的奖励设为 0。重要的是,token ID 和 logprobs 保持不变,因此 GRPO 算法仍然可以利用这些被阻断的 token 进行训练,从而引导模型放弃这种尝试。
实战案例:TwIL-8B 的“作弊”尝试
在 TwIL-8B 模型的烟雾测试中,系统在第一步就捕捉到了违规行为。面对一个关于 Kaggle 数据集的问题,模型没有进行计算,而是试图运行一个 Python 命令来列出 Hugging Face Bucket 中的文件,希望能找到原始笔记本以获取答案。
BLOCKED · TwIL-8B · pi · step 0 · 2026-11-05 11:56 UTC · bash
python3 -c "from huggingface_hub import list_bucket_tree; bucket = 'AdithyaSK/jupyter-agent-kaggle-all' ..."
[safeagents] blocked call to `bash`: atif-scan: smoldataenvs.answer_source (high)由于该命令触发了 smoldataenvs.answer_source 的高严重性规则,调用被立即阻断,rollout 得分为 0。这一案例证明,安全防护必须从训练的第一步就开始介入,因为即使是未经智能体数据训练的模型,也会本能地寻找捷径。
自定义插件
为了适应不同的训练环境,团队开发了专门的插件。例如,smoldataenvs 插件会正则匹配诸如 gold_answer、EXPECTED_ANSWER、/tests/grader 等敏感关键词;traj2envs 插件则禁止下载任何 Hub 资源或访问源轨迹数据集。这些规则仅针对智能体发出的命令和参数,而不检查工具返回的内容,确保了检查的高效性(每次检查仅需 10-20 毫秒)。
实验结果与未来展望
目前的最终运行涵盖了三个模型(LFM2.5-24B-A2B、LFM3-1.7B 和 TwIL-8B)在三个智能体框架下的训练。所有训练过程和评估指标都在实时仪表板上公开。
初步结果显示,Harness Adapters 在保留任务上的表现优于或持平于基础模型,同时显著减少了工具调用次数。值得注意的是,TwIL-8B 作为一个从未针对智能体数据进行训练的推理模型,也展现出了积极的学习信号,证明了该方法的通用性。
如何参与
这套方案是完全开放的。开发者可以利用自己的智能体会话数据训练专属适配器:
- 保存轨迹:记录日常使用的智能体会话。
- 清洗与分享:使用
safeagents scrub去除敏感信息,并通过safeagents publish上传至 Hub。 - 转化为环境:利用 Repo2RLEnv 将会话转化为带有 Docker 镜像和隐藏测试的可验证任务。
- 训练适配器:使用 TRL 和 safeagents 运行相同的 RL 训练流程,并将生成的 LoRA 适配器集成到本地智能体中。
社区尤其缺乏包含“出错并修复”或“多轮扩展”场景的会话数据。如果你愿意分享这类经过清洗的轨迹,将对提升智能体在复杂任务中的鲁棒性产生巨大帮助。