Agent Lightning v1.0: 把 Agent Harness 直接拉进 RL 训练循环

Microsoft · arXiv:2608.17528 · 2026-08-18
核心观点:Agent 的 RL 训练应该通过部署时使用的 harness 进行,而非训练框架内的简化 ReAct 循环。这篇论文首次系统刻画了这一范式(Harnessed Agentic RL)带来的四个工程挑战,并用 3,500 行代码的轻量框架 + 仅 6K 样本在 SWE-bench Verified 上提升 14.6%。

核心洞察:Harnessed Agentic RL

传统 agentic RL 里,训练引擎拥有完整的环境交互循环——自己构造 prompt、调模型、拿 action、执行、获取 observation,形成标准马尔可夫过程。但现实中的 Agent 运行在 harness 里——harness 管理上下文拼接、工具调用、控制流、子 agent 分发。部署时 harness 是能力的核心,训练时却被绕开了。

Agent Lightning 提出的 Harnessed Agentic RL 让部署时的 harness 直接参与后训练。方法是通过 LLM endpoint proxy,让任意 harness 无需修改就能接入 RL 训练。verl Uni-Agent、AReaL 2.0、slime v0.3.0、Polar 都沿用了这个思路。

Agent Lightning v1.0 框架
图 1:Agent Lightning v1.0 整体架构。API Gateway 充当训练集群和 Agent 执行集群之间的桥梁。
传统 vs Harnessed Agentic RL 对比
图 2:传统 agentic RL(左)vs Harnessed Agentic RL(右)。后者将控制流交给 harness,训练引擎只能观察到一系列 LLM 请求-响应对。

被忽视的四个真实挑战

这篇论文最大的贡献不在框架本身,而在于首次系统刻画 harnessed agentic RL 带来的工程挑战。这些挑战在现有框架中要么被忽略,要么做了矛盾的设计选择。

挑战一:Retokenization 断裂

Harness 构造每次 LLM 调用时会重新渲染完整消息历史并 tokenize,导致之前采样的 token 序列在新 prompt 中边界完全不同。例如 "having" 第一次被切成 "h" + "aving",下次可能变成 "hav" + "ing"。三个原因:chat template 非组合性、decode-retokenize 漂移、推理时输出变换。

Retokenization 示例
图 3:Retokenization 示例。同一文本在不同上下文中被切分为不同的 token 边界,破坏了 token 级别的前缀连续性。

挑战二:Advantage 归属问题

一个 rollout 可能产生动态数量的训练样本(平均 2.41 个,仅 36% 保持为单样本)。计算 advantage baseline 时,sample 级别还是 rollout 级别?论文认为 retokenization 是偶然现象,不应改变 advantage 计算,rollout 级别更合理。

Rollout 与 Sample 对应关系
图 4:传统 agentic RL 每个 rollout 对应一个训练样本(左),而 harnessed agentic RL 中一个 rollout 可展开为动态数量的样本(右)。

挑战三:Loss 归一化

动态样本数量让 loss 归一化变得微妙。seq-mean-token-mean(GRPO 风格)会给产生更多样本的 rollout 更大权重,而这是 retokenization 等偶然因素驱动的。论文实验验证 rollout-mean 最稳定。

Loss 归一化示例
图 5:一个包含三个 rollout 的 batch 示例,各 rollout 产生不同数量的样本和不同长度的响应。

挑战四:后端调度

GPU 数量固定,但每个 batch 的样本数量和长度执行前未知。后端需要把动态 workload 映射到固定 worker 上,同时保证同一 rollout 的所有样本在同一个 optimizer update 中,避免 within-rollout policy skew。

系统设计亮点

全部代码约 3,500 行,三个核心组件:API Gateway(rollout 生命周期管理)、Rollout Controller(K8s 上管理 agent 执行)、Customized Trainer(基于 VERL)。

Collocated Async RL 是一个巧妙的设计:rollout 和 update 共享同一 GPU 池,通过 API Gateway 控制阶段切换。相比同步 RL(等最慢 rollout)和纯异步 RL(双倍 GPU),用更少资源实现约 2x 端到端加速。

三种 RL 调度策略对比
图 6:同步 RL(GPU 空闲多)、异步 RL(GPU 需求翻倍)与 Collocated Async RL(少量 GPU + 高效率)的对比。

实验结果

场景基座模型提升
Search Agent (HotpotQA)Llama-3.2-3B25.1% → 41.7% (+16.6%)
通用指令跟随Qwen3-4B51.9% → 70.2% (+18.3%)
Coding Agent (SWE-bench)Qwen3.5-9B41.8% → 56.4% (+14.6%)

Coding Agent 仅用 6K 训练样本和适中算力,纯 RL 在 SWE-bench Verified 上拿到 14.6 个百分点绝对提升。论文还发现并阻止了四种 reward hacking 行为(git history 泄露、wget 下载上游代码等)。

Search Agent 训练动态
图 7:Search Agent 训练动态。训练 reward 和验证 reward 均稳步上升。
通用指令跟随训练动态
图 8:通用指令跟随 Agent 训练动态。
Coding Agent 消融实验
图 9:Coding Agent 消融实验。Rollout-level Advantage + Rollout-level Norm(右)表现最优,验证 reward 达 38.2%。
Rollout 合并行为统计
图 10:Rollout 合并行为统计。仅 36% 的 rollout 保持为单个训练样本,平均每个 rollout 产生 2.41 个样本。

为什么这篇重要

价值不在 SOTA 数字,在于把被各框架回避的设计问题摆到台面上。当训练范式从「训练引擎控制一切」变成「harness 控制交互、训练引擎只看到 API 对」,很多理所当然的假设都碎了——token 连续性、样本-奖励一一对应、固定 batch 大小。

对正在构建 agent 系统的人,这篇论文提供了清晰的工程指南:retokenization 怎么处理、advantage 怎么算、loss 怎么归一化、后端怎么调度。而且全部代码开源,3,500 行,可以逐行审查。