Harness Adapters:用安全强化学习提升智能体开发效率
Hugging Face 团队发布了 Harness Adapters,这是一种基于 LoRA 的轻量级适配器,通过强化学习(RL)在 pi、opencode 和 hermes 等智能体框架中训练。核心创新在于引入 safeagents 代理,实时拦截并阻断模型试图“作弊”的工具调用,确保训练安全。实验显示,该方案能在
为什么需要 Harness Adapters
做本地智能体(Agent)开发时,同一款基础模型放进不同的智能体框架(比如 pi、opencode、hermes),跑出来的效果常常差得很远。原因在于各家框架的工具集、提示词结构和控制流都各有一套。过去常见的办法是把整个模型微调一遍,可这样做成本高,想在不同框架之间来回切换也很费劲。
Hugging Face 团队新近推出的 Harness Adapters 给出了一条更省事的路径:不动基础模型,而是给每个智能体框架单独训练一个小型 LoRA 适配器。这样一来,同一个基础模型可以继续用,只要挂上对应的 LoRA 适配器,模型在特定的智能体环境里就能跑得更高效、更准确。
这套工作的重点不只是效率。它还引入了“安全强化学习”:接入 safeagents 组件后,系统在训练过程中会逐次检查模型的工具调用,遇到走捷径、篡改测试文件或泄露答案这类“奖励黑客”行为,会直接拦下。
技术架构:一个基座,多个适配器
LoRA 的自然优势
拿 LoRA(Low-Rank Adaptation)做适配器方案,是经过考量的。它的训练和推理开销都很低,一台服务器就能同时托管多个不同智能体框架的策略。到了推理阶段,开发者按自己用的框架动态加载对应适配器即可,基础权重不用动,模型在特定场景下的表现却能调优。
异步 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 适配器接进本地智能体。
社区眼下最缺的是包含“出错并修复”或“多轮扩展”场景的会话数据。这类清洗过的轨迹如果能分享出来,对提升智能体在复杂任务中的鲁棒性帮助很大。