Polar: Agentic RL on Any Harness at Scale

发表时间: 2026-05 · arXiv:2605.24220 (NVIDIA)

Binfeng Xu, Hao Zhang, Shaokun Zhang, Songyang Han, Mingjie Liu, Jian Hu, Shizhe Diao, Zhenghui Jin, Yunheng Zou, Michael Demoret, Jan Kautz, Yi Dong

A1 主要贡献

核心问题与研究目标

用于语言智能体的强化学习(RL)正从简短的单步任务转向需要与外部环境(如代码库、网页浏览器、操作系统)进行持续交互的智能体(agentic)场景。这些场景通常会产生包含数十个交互步骤和数万个词元(token)的长时程轨迹。在这种转变中,训练目标本身——通常是一个复杂的软件系统,被称为“harness”——成为了一个核心的系统挑战。将这些复杂的、异构的、有时甚至是闭源的 harness 集成到传统的 RL 框架中非常困难,不仅集成负担重、灵活性差,而且常常导致重要训练信号的丢失。现有系统如 SkyRL-Agent、PRIME-RL、Agent Lightning 和 rLLM 等,虽然尝试降低集成成本,但仍要求用户修改其智能体或 harness 以适应 RL 框架。

鉴于这些问题,本文的核心研究问题是:我们能否在不“打开黑盒”的情况下,即不修改智能体 harness 或强迫其遵循特定 RL 框架的情况下,使用强化学习来训练智能体?

核心观察与创新思路

本文的关键观察是,尽管智能体的内部实现千差万别,但所有基于大型语言模型(LLM)的智能体都必须与模型进行通信。这个模型 API 边界提供了一个存在于智能体外部的通用接口。因此,本文提出不与智能体 harness 本身集成,而是通过监听智能体的 LLM API 调用来实施训练。通过捕获智能体的提示(prompt)、采样词元、对数概率和响应,并将它们转换为 RL 轨迹,可以将任何智能体 harness 视为一个可训练的“黑盒”。

基于此,本文提出了 Polar,一个智能体 RL 基础框架,它能够将任何智能体作为黑盒进行训练。Polar 的核心思想是将智能体的 LLM API 流量用作 RL 接口,通过模型 API 代理来监听和记录交互,从而在不改变 harness 的情况下重构出用于训练的轨迹。

主要贡献

图1:Polar 架构概览。Polar 在一个隔离的运行时中运行现有的智能体 harness,并在 harness 和推理服务器之间放置一个模型 API 代理。该代理转发模型调用,记录词元级的请求和响应数据,并重构 RL 轨迹。同时,rollout 网关异步地处理运行时预热、harness 执行、评估和训练器回调。这种解耦设计使得 Polar 对智能体 harness、训练基础设施和 RL 算法都是不可知的,同时提高了长时程智能体工作负载的计算利用率。
图1:Polar 架构概览。Polar 在一个隔离的运行时中运行现有的智能体 harness,并在 harness 和推理服务器之间放置一个模型 API 代理。该代理转发模型调用,记录词元级的请求和响应数据,并重构 RL 轨迹。同时,rollout 网关异步地处理运行时预热、harness 执行、评估和训练器回调。这种解耦设计使得 Polar 对智能体 harness、训练基础设施和 RL 算法都是不可知的,同时提高了长时程智能体工作负载的计算利用率。

A3 背景知识

本节内容对应论文的“Related Work”章节,对相关工作进行了定性比较。

2.1. 智能体 RL 系统

与 ProRL Agent 的比较:第一波 LLM RL 基础设施大多假设 rollout 生成是训练器拥有的一个 Python 函数,但这在多轮智能体中变得捉襟见肘。ProRL Agent【20, Prorl agent: Rollout-as-a-service for rl training of multi-turn llm agents, 2026a, https://arxiv.org/abs/2603.18815】为多轮智能 体 rollout 引入了服务边界,将沙箱设置、智能体执行和奖励计算与训练过程分离。Polar 继承了“rollout 应为一种服务”这一高层思想,但改变了集成契约。用户不再是在 rollout 服务内部实现一个智能体处理器,而是提供一个 harness 适配器来准备配置并启动原生可执行文件。然后,模型代理从外部观察该 harness。

与 SkyRL-Agent 的比较:SkyRL-Agent【4, Skyrl-agent: Efficient rl training for multi-turn llm agent, 2025, https://arxiv.org/abs/2511.16108】是一个用于高 效 RL 训练和评估多轮、长时程智能体的全栈系统。其优势在于,一旦任务被表示为其环境和智能体抽象,训练就会非常高效。Polar 是其补充:它针对的是更早期的系统问题,即如何运行一个预先存在的 harness,并保持其内部事件循环、工具格式化和上下文策略不变。

与 PRIME-RL 和 Slime 的比较:PRIME-RL【15, Prime-rl: Async rl training at scale, 2026, GitHub repository, https://github.com/PrimeIntellect-ai/prime-rl】专注于大规模异 步 RL,具有训练器-推理分离、陈旧策略步语义以及对验证器环境的支持。Slime【25, slime: An llm post-training framework for rl scaling, 2025, GitHub repository, https://github.com/THUDM/slime】类似地连接 了 Megatron 训练与 SGLang rollout 引擎,并暴露了可定制的数据生成接口。这些系统解决了流水线的策略优化和推理扩展方面的问题。Polar 不是一个替代训练器,而是一个 rollout 基底,可以为异步训练器提供来自比典型可验证奖励函数更重的 harness 的轨迹。

2.2. 低侵入式智能体工具化

与 Agent Lightning 和 rLLM 的比较:Agent Lightning【9, Agent lightning: Train any ai agents with reinforcement learning, 2025, https://arxiv.org/abs/2508.03680】提出了训练-智能体解耦架构和统一的数据接口,用于将智能体执行转换为可训练的转换。rLLM 【17, rllm: A framework for post-training language agents, 2025, GitHub repository, https://github.com/rllm-org/rllm】同样旨在以最少的代码更改来跨框架训练智能体。这两个系统都认识到研究人员不应为了训练而重写整个应用程序 。

Polar 的差异点:Polar 的不同之处在于选择了最小的集成点。对于许多编码和终端智能体而言,最可靠的接口不是 SDK 回调图,而是 harness 已经使用的供应商 API 端点。因此,网关代理成为了观察设备:它接受 Anthropic、OpenAI Chat、OpenAI Responses 和 Google 风格的请求;将它们转换为本地推理后端;并记录训练器所需的词元级字段。这种选择比通用的可观察性工具化更窄,但对于以命令行程序、包管理工具或二进制文件形式实现的 harness 来说,它非常健壮。

2.3. SWE 任务评估与基准

与 Harbor 的比较:Harbor【7, Harbor: A framework for evaluating and optimizing agents and models in container environments, 2026, GitHub repository, https://github.com/harbor-framework/harbor】在容器化环境中评 估 Claude Code、OpenHands 等智能体,并支持并行执行。这种“评估优先”的设计与 Polar 的“harness 原生”动机高度一致。区别在于模型边界和训练数据契约。Harbor 使用特定于供应商的配置启动每个 harness,不提供转换模型协议或调解 harness 模型流量的网关。因此,模型替换受限于原生 harness 和外部端点已支持的功能。而 Polar 在此边界放置了一个代理,因此同样风格的 harness 执行可以产生可直接被 RL 训练器使用的词元 ID、对数概率、损失掩码和奖励。

SWE-bench 和 SWE-Gym 的作用:SWE-bench【8, Swe-bench: Can language models resolve real-world github issues?, 2024, International Conference on Learning Representations, https://arxiv.org/abs/2310.06770】将解决真 实 GitHub 问题作为基准,需要代码库理解、编辑和可执行验证。SWE-Gym【13, Training software engineering agents and verifiers with swe-gym, 2024, https://arxiv.org/abs/2412.21139】通过提供训练环境、验证器和轨迹扩展了这一方向。这些工作负载是 对 rollout 基础设施的天然压力测试,因为它们结合了昂贵的运行时设置、稀疏的补丁级奖励、长尾的执行时间以及 harness 侧状态偏离干净评估器状态的多种可能性。

2.4. 词元保真度与重分词漂移

问题的核心:在智能体 RL 中,训练信号只有附着在行为策略采样的词元上才是正确的。这在智能体 harness 中很难实现,因为供应商 API 可能返回文本、工具调用 JSON 或流式事件,而不是推理后端使用的确切词元 ID 和对数概率。vLLM 和 Agent Lightning【1, No more retokenization drift: Returning token ids via the openai compatible api matters in agent rl., 2025, vLLM blog, https://blog.vllm.ai/2025/10/22/agent-lightning.html】的讨论强调,解码和重新编码一个转录本可能会产生与原始生成不同的词 元 ID。

Polar 的解决方案:Polar 遵循相同的词元保真度原则,但将其应用于任意的 harness rollout:生成的助手(assistant)词元从推理响应中复制,非生成的中间词元取自规范的提示分词,损失掩码仅将行为策略的词元标记为可训练。

图2:Polar 使用模型 API 代理作为 rollout 边界。传统的 rollout 框架通常要求智能体或 harness 逻辑在框架拥有的环境 API 后面重写。这使得训练器依赖于特定于 harness 的集成代码,并且可能错过原生执行路径的细节。Polar 则保持 harness 不变,在 LLM API 边界放置一个与供应商兼容的代理;该代理记录提示、采样的词元、对数概率和响应,然后在 harness 外部重构出可供训练器使用的轨迹。
图2:Polar 使用模型 API 代理作为 rollout 边界。传统的 rollout 框架通常要求智能体或 harness 逻辑在框架拥有的环境 API 后面重写。这使得训练器依赖于特定于 harness 的集成代码,并且可能错过原生执行路径的细节。Polar 则保持 harness 不变,在 LLM API 边界放置一个与供应商兼容的代理;该代理记录提示、采样的词元、对数概率和响应,然后在 harness 外部重构出可供训练器使用的轨迹。

A2 方法细节

本节详细阐述 Polar 的设计与实现,对应论文的“Polar”章节。我们旨在解决这样一类智能体 RL 任务:策略通过一个现有的 harness 而不是自定义的 rollout 循环来执行。任务从一个指令和一个运行时开始;harness 在使用工具、编辑文件、派生子智能体或管理上下文的同时调用模型端点。执行后,一个评估器会给出一个结果或轨迹级别的奖励。Rollout 系统必须将原生的模型交互保存为可供训练器使用的轨迹,包括:提示上下文、采样的助手词元、可选的行为策略对数概率、损失掩码、奖励和来源信息。

3.1. 架构

Polar 的核心组件:Polar 有两个核心组件:一个 rollout 服务器和多个网关节点。Rollout 服务负责协调任务和全局调度。网关节点执行会话、托管模型代理、构建轨迹并运行评估。这种划分将持久的任务管理与每个会话的执行和捕获分离开来。

Rollout 服务器:Rollout 服务接受一个 TaskRequest 并将其扩展为 num_samples 个独立的会话。会话是调度的基本单位,它包含会话 ID、任务 ID、超时预算、运行时规范、智能体规范、轨迹构建器、评估器和回调 URL。该服务将会话分派到网关节点,持久化存储精简的终端结果,通过轮询暴露任务状态,并在会话完成时接受网关的回调。

网关节点:网关节点负责每个会话的生命周期。它启动运行时、准备 harness、运行 harness 命令、从捕获的补全中构建轨迹、评估输出、拆除资源并返回结果。同一个网关还托管 harness 用于模型调用的代理端点。这种同地部署将补全捕获与会话注册表绑定,避免了独立的轨迹收集服务。

与训练框架的解耦:训练框架独立于 Polar 服务器。服务边界原生支持大规模高效的异步 RL。图 5a 展示了与 Slime 结合的一个例子:一个后台工作进程提交 Polar 任务,接收任务完成回调,将轨迹转换为 Slime 的 Sample 对象,并应用轨迹感知的奖励后处理。

3.2. Harness 与代理捕获

通过代理进行观察:Polar 通过将其模型调用路由到网关代理来观察原生 harness。通过 harness 通常的环境变量或配置文件,将其模型基础 URL 指向网关。

代理处理流程:对于每个传入的模型请求,网关执行四个步骤:
1. 检测供应商 API:使用请求路径和头部信息来区分 Anthropic Messages、OpenAI Chat Completions、OpenAI Responses 和 Google generateContent 风格的调用。
2. 规范化请求:一个供应商转换器将角色、内容部分、工具定义、工具选择、停止控制和生成参数转换为本地推理服务器所使用的 OpenAI Chat Completions 格式。转换器还会添加训练所需的字段,如 logprobs=true
3. 捕获词元级数据:网关将规范化后的请求转发给推理服务器,并存储一个补全记录,其中包含请求消息、响应消息、提示词元 ID、采样的响应词元 ID、结束原因以及来自推理后端的对数概率。
4. 返回供应商格式:响应被转换回 harness 所期望的模式。对于流式请求,我们的实现会获取一个非流式的上游响应,并生成一个合成的、符合供应商格式的流。这在简化词元忠实捕获的同时,保持了与期望服务器发送事件(SSE)的 harness 的兼容性。

代理边界的设计:代理边界被有意地设计在智能体框架之下。它不需要理解 harness 如何规划、管理工具或决定何时停止。它只需要保持 API 兼容性,并记录足够的信息来重构训练样本。

3.2.1. Harness 适配器

适配器的轻量化设计:Polar 中的 harness 适配器在设计上非常小。它可能安装配置、注册 MCP 服务器或技能、写入供应商设置,并返回运行智能体的 shell 命令。一个通用的 shell 命令 harness 可用于包装智能体执行。我们还集成了流行的智能体 harness 作为快捷方式,如 claude_codecodexgemini_cliqwen_codeopencodepi

3.2.2. 运行时接口

通用接口与后端支持:运行时实现了一个用于启动、停止、执行、上传、下载和取消的通用接口。我们的首个版本支持用于 HPC 设置的 Docker 和无根的 Apptainer。由于网关代码仅依赖于运行时接口,任务可以无缝地更换隔离后端。

3.3. 异步 Rollout 分段

解决混合成本问题:长时程的 harness rollout 混合了多种不同的成本:运行时启动、依赖准备、harness 执行、评估器设置、测试执行、补丁应用和拆除。Polar 通过在每个网关内部进行阶段隔离的执行,防止这些成本相互阻塞(如图 3 所示)。

图3:Polar 中的网关级异步分段。一个网关将运行时初始化、就绪缓冲、harness 执行以及运行后的轨迹和评估工作分离到隔离的工作池中。运行时准备和评估器预热在关键路径之外进行,因此 CPU 密集型的运行时设置和长尾的评估不会阻塞活跃的、受 GPU 限制的智能体运行。
图3:Polar 中的网关级异步分段。一个网关将运行时初始化、就绪缓冲、harness 执行以及运行后的轨迹和评估工作分离到隔离的工作池中。运行时准备和评估器预热在关键路径之外进行,因此 CPU 密集型的运行时设置和长尾的评估不会阻塞活跃的、受 GPU 限制的智能体运行。

3.3.1. 节点内工作池

工作池的分工:每个网关为 INIT、RUNNING 和 POSTRUN 使用隔离的工作池,外加一个有界限的 READY 缓冲区。
- INIT:启动运行时并执行准备操作。
- READY:保存已初始化的运行时,直到有可用的运行槽位。
- RUNNING:执行 harness。
- POSTRUN:构建轨迹、运行评估器、执行运行后钩子、发送回调并拆除资源。
就绪缓冲区允许 CPU 密集型的运行时准备在后台进行,而不会阻塞受 GPU 限制的智能体执行。

3.3.2. 评估器预热与超时

后台准备与部分轨迹恢复:当评估器请求一个干净的运行时,网关会在智能体运行期间开始准备该运行时。每个会话也带有一个共享的截止时间;如果一个 harness 在模型调用被捕获后超时,网关仍然会进入 post-run 阶段,以便可以恢复带有终端超时状态的部分轨迹。

3.4. 轨迹重构

接口与策略:轨迹构建器接口将一个有序的 CompletionSession 转换为一个 TrajectoryCompletionSession 是为一个 harness 会话存储的、由代理捕获的模型调用序列。Trajectory 包含一个或多个 Trace 对象,每个对象都包含提示词元 ID、响应词元 ID、损失掩码、提示消息、响应消息、工具定义、对数概率、奖励和元数据。可以无缝地向注册表中添加自定义的轨迹策略,我们提供了两种策略:逐请求(per request)和前缀合并(prefix merging),如图 4 所示。

图4:轨迹重构示例。可视化的会话包含一个三轮的主智能体,该智能体经历了一次 harness 级别的上下文压缩并派生了一个子智能体。“逐请求”构建器将每个捕获的模型调用作为独立的轨迹。而“前缀合并”则在有效时恢复仅追加的对话链,而上下文压缩和子智能体边界自然形成独立的链。在每个合并的轨迹中,Polar 的前缀合并算法仅将采样的助手词元复制为可训练词元,并掩盖规范的中间词元,在保持行为策略保真度的同时减少了面向训练器的样本数量。
图4:轨迹重构示例。可视化的会话包含一个三轮的主智能体,该智能体经历了一次 harness 级别的上下文压缩并派生了一个子智能体。“逐请求”构建器将每个捕获的模型调用作为独立的轨迹。而“前缀合并”则在有效时恢复仅追加的对话链,而上下文压缩和子智能体边界自然形成独立的链。在每个合并的轨迹中,Polar 的前缀合并算法仅将采样的助手词元复制为可训练词元,并掩盖规范的中间词元,在保持行为策略保真度的同时减少了面向训练器的样本数量。

3.4.1. 逐请求(Per Request)

保守的基线策略per_request 构建器是保守的基线,如图 4 左下角所示:每个补全都成为一个轨迹。这对于单个调用是无损的,但它可能将一个连贯的多轮智能体会话 fragmented 成许多短样本。对于复杂的编码 harness,解决一个编码问题可能会产生数百个这样的轨迹,这增加了下游训练器的负担。

3.4.2. 词元忠实的前缀合并

重构长轨迹的策略prefix_merging 构建器在 harness 会话的某些部分保留仅追加的对话历史时,会重构更长的轨迹,如图 4 右下角所示。它不假设整个会话是单个对话。相反,对于一个包含补全 $C_1, \dots, C_N$ 的会话,其中补全 $C_i$ 具有提示词元序列 $P_i$、原始采样响应词元序列 $R'i$、响应对数概率 $\ell$ 以及提示/响应消息 $M_i$,Polar 将这些补全划分为有序的链:

其中 $t_{C_1} < t_{C_2} < \dots < t_{C_k}$。一个新的补全只有在规范化的消息级分组键将其识别为候选延续,并且与该链中最后一个提示满足严格的词元前缀关系时,才能加入现有链。对于一个链内相邻的补全 $C_i$ 和 $C_{i+1}$,这个检查是:

因此,子智能体、并行的智能体分支、上下文压缩、提示重写或独立的工具中介对话会自然地形成额外的链,而不是被强制合并到一个全局轨迹中。

链内合并过程:合并随后独立地应用于每个链。考虑一个链 $C = (C_1, \dots, C_k)$,并记 $P_i = P_{C_i}$,$R'i = R'$,以及 $\ell_{R'i} = \ell{R'{C_i}}$。主要挑战是 $P$ 包含了前一个助手轮次的规范化服务器渲染,以及在下一次生成提示之前由 harness 插入的中间上下文。前一个助手的主体不能从这个规范化渲染中复制,因为行为策略的词元是原始采样的词元 $R'_i$。设 EOT 表示回合结束词元 ID。对于链中两个相邻的补全,定义规范化尾部:

我们在 $P_{i+1}$ 中定位第一个 $P_i$。如果 $P_i$ 已经以 EOT 结尾,则中间部分 $T_i$ 是该 EOT 之后的后缀;否则 $T_i$ 从该 EOT 开始,这样助手轮次在下一个提示上下文之前仍然是闭合的。这个链所代表的词元序列是:

最终轨迹与损失掩码:因此,发出的轨迹每个链包含一个轨迹 $Tr(C)$,其中第一个提示 $P_1$ 作为轨迹提示存储,剩余的后缀 $R'_1 || T_1 || \dots || R'_k$ 作为轨迹响应存储。显式的损失掩码在从采样响应 $R'_i$ 复制的词元上为 1,在从规范化中间部分 $T_i$ 复制的词元上为 0。真实的响应对数概率条目被复制用于 $R'_i$ 的词元。中间部分的位置会收到合成的对数概率条目,以使 response_logprobsresponse_ids 保持对齐;可训练性由 loss_mask 控制。

正确性不变式:这种构造在每个发出的轨迹中给出了一个简单的正确性不变式:

<blockquote>

每个可训练的词元都与 rollout 期间的行为策略相匹配,任何非生成的词元都被掩码掉。

</blockquote>

图 5b 比较了上述两种策略在相同配置下的 GPU 利用率。


图5:Polar 提高了 rollout-训练边界的 GPU 利用率。(a) 展示了由 Polar 服务启用的异步 RL 流水线。Rollout 服务器使用现有策略持续进行推理,而训练器仅在收到足够批量的已评估轨迹组后才进行步骤更新。(b) 展示了在相同工作负载和拓扑下 3 个训练步骤的时间跨度,前缀合并比逐请求重构发出更少的训练器更新,并显著加速了训练过程。

3.5. 评估与奖励传播

评估器机制:评估器是基于注册表的自定义策略,在轨迹构建之后运行。它们接收轨迹、会话产物,以及可选的刷新后的运行时上下文。内置的评估器包括会话完成奖励、可配置的基于输出的测试评估器,以及一个 SWE-Bench/SWE-Gym harness 评估器。

奖励传播方式:结果奖励可以广播到每个轨迹,而带有过程奖励的任务可能需要逐轨迹分配。评估器注册表允许直接扩展到自定义的基于规则的验证、智能体即裁判(agent-as-judge)评分和特定于任务的奖励塑造。

A4 实验环境

A4 实验结果

4.1. 在编码 Harness 上的 SWE-Gym GRPO 训练

实验内容
使用 Polar 和 Slime,从同一个 Qwen3.5-4B 基础模型检查点开始,对四种不同的编码 harness(Codex, Claude Code, Qwen Code, Pi)进行标准的 GRPO 训练。训练使用 SWE-Gym 数据集,评估在 SWE-Bench Verified 上进行。所有实验均使用 prefix_merging 策略重构轨迹。

实验结果

分析结论


图6:SWE-Gym GRPO 训练曲线。每个面板显示了四种被评估的编码 harness 之一的每步结果奖励,相当于 rollout pass@1。RL 提高了所有 harness 的奖励,在涉及复杂提示、编排或不熟悉工具模式的执行路径上,增益尤为明显。


表1:SWE-Bench Verified 评估。所有行都从相同的 Qwen3.5-4B 基础模型开始,并在列出的 harness 上进行训练。分数是在完整基准测试上的 pass@1,在相应的 harness 上运行。

轨迹构建器消融实验
- 实验内容:在相同配置下,仅改变轨迹构建策略,比较 per_requestprefix_merging
- 实验结果(图 5b):在三个训练步骤内,prefix_merging 策略将训练器更新数量从 1,185 次(逐请求)减少到 218 次(合并轨迹),总耗时从 189.5 分钟降至 35.2 分钟(5.39倍加速)。Rollout GPU 的平均利用率也从 20.4% 提升到 87.7%。
- 分析结论per_request 策略由于信誉分配噪声问题,可能导致“奖励黑客”(reward hacking)现象,即轨迹因获得与自身贡献不符的会话级奖励而看似表现良好。prefix_merging 显著提高了训练效率和资源利用率。

4.2. 离线数据生成

实验内容
将 Polar 用于分布式离线数据生成服务。使用固定的 Qwen3.5-122B-A10B 模型和 pi harness,在 1,638 个 SWE-Gym 实例上生成 SFT(监督微调)轨迹。每个任务在独立的容器化环境中运行,超时设置为 3600 秒。

实验结果
- 数据产出:在 1,638 次尝试中,成功生成了 504 个“可接受”的轨迹(即通过了所有 FAIL_TO_PASS 和 PASS_TO_PASS 测试),总接受率为 30.8%,总成本约为 64 GPU 小时。
- 接受率分析(表 2):不同代码库的接受率差异很大,从低于 20% 到超过 50% 不等,这与任务难度相关。
- 数据特征:生成的轨迹很长,平均每个会话有 104 条消息和 51 个助手轮次。
- 数据发布:该语料库已作为 HuggingFace 数据集以 Apache-2.0 许可证发布。


表2:使用 Polar、Qwen3.5-122B-A10B 和 pi harness 在 SWE-Gym 上生成的 SFT 数据的各代码库接受率。“Accepted”意味着智能体的补丁通过了 SWE-Bench 评估器中的 FAIL_TO_PASS 和 PASS_TO_PASS 测试。

分析结论
- Polar 的核心原语(如会话级容器隔离、自动重试、网关调度)使其能被有效地改造为分布式离线数据生成服务。
- 该部署可以轻松扩展,用于更丰富的离线数据生成流程,如拒绝采样、验证器训练数据生成等,而无需更改编排代码。

A5 结论

Polar 将智能体在测试时的环境(harness)视为 RL 系统的一等公民,而非需要被移植到训练器中的实现细节。其核心设计选择是将集成边界移至模型端点:harness 正常运行,代理(proxy)观察词元级的模型流量,而 rollout 服务将完成的执行转化为可训练的轨迹和奖励。这种分离使得 rollout 能够独立于训练和推理进行扩展,同时保留了非标准 harness 的行为,这些 harness 的价值往往在于其工程细节。我们相信 Polar 为在现代扩展智能体 RL 基础设施开辟了一种新范式,并且我们正在积极开发和维护该框架,以适应生态系统的发展。

A6 附录

A.1. 框架对比


表3:对比 rollout 系统设计选择。我们发现现代 rollout 基础设施应满足以下标准:async RL support 意味着训练可以在生成继续的同时消费 rollout,并处理显式的策略版本或陈旧性;async rollout staging 意味着 rollout 执行被分解为独立调度的运行时准备、执行、后处理(重构/评估)和清理阶段;rollout as service 意味着一个持久的任务 API,可与特定的训练器循环分离;native-harness agnosticism 意味着 CLI、SDK 或应用程序 harness 可以在不被重写为框架环境的情况下进行训练。✓ 表示一流支持,● 表示部分或计划支持,✗ 表示我们在参考的代码或文档中未发现该属性作为主要设计契约。

对部分支持(●)的解释
- SkyRL【4, Skyrl-agent: Efficient rl training for multi-turn llm agent, 2025, https://arxiv.org/abs/2511.16108】暴露了自定义生成器 和 Harbor 集成,但原生 harness 并非其默认的 rollout 单元。
- Agent Lightning【9, Agent lightning: Train any ai agents with reinforcement learning, 2025, https://arxiv.org/abs/2508.03680】提供了一 个 rollout 存储、队列和运行器控制平面,并进行了广泛的框架工具化,但其主要边界是轨迹/工作流的可观察性,而不是对不透明 harness 进程的分段执行。
- rLLM【17, rllm: A framework for post-training language agents, 2025, GitHub repository, https://github.com/rllm-org/rllm】包括完全异步的训练和捕获词 元 ID 及对数概率的模型网关,但其 rollout 服务抽象比分布式运行时生命周期服务要窄。
- OpenClaw-RL【12, Openclaw-rl: Scalable rl in real-world agentic settings, 2026, https://arxiv.org/abs/2603.10165】为真实世界的智能体设置解耦了服务 、rollout 收集、评判和训练;其支持是围绕 OpenClaw 和特定的终端、GUI、SWE 及工具调用配方组织的,而不是任意的原生 harness 提交。

A.2. SWE-Gym GRPO 超参数


表4:SWE-Gym GRPO 实验的训练超参数。该表报告了来自 examples/swegym_slime_grpo 的常规策略优化和 rollout 参数;集群拓扑和工作进程放置被省略。

A.3. 代表性任务载荷

以下是一个代表性的 Polar 任务载荷 JSON 示例,展示了如何定义一个在 Docker 环境中运行 codex harness 的任务,并使用 swebench_harness 进行评估。

{
    "task_id": "polar-swegym-{rollout_id}-{group_index}",
    "instruction": "Fix the issue in /polar/session/workspace.",
    "num_samples": 8,
    "timeout_seconds": 1200,
    "runtime": {
        "backend": "docker",
        "image": "{sample.metadata.runtime_image}",
        "network": "host",
        "workdir": "/polar/session/workspace",
        "prepare": [
            {
                "type": "exec",
                "command": "prepare repository, harness, and dependencies"
            }
        ]
    },
    "agent": {
        "harness": "codex",
        "model_name": "{served_model_name}"
    },
    "builder": {
        "strategy": "prefix_merging"
    },
    "evaluator": {
        "strategy": "swebench_harness",
        "refresh_runtime": true,
        "config": {
            "repo_dir": "/testbed",
            "patch_command": "cd /polar/session/workspace && git add -A && git diff --cached --binary",
            "instance": "{sample.metadata.instance}"
        }
    },
    "callback_url": "http://{trainer_host}:{callback_port}/callback/task_result",
    "metadata": {
        "group_id": "{rollout_group_id}",
        "policy_version": "{policy_version}",
        "rollout_step": "{rollout_step}"
    }
}

A.4. 代表性轨迹

以下是一个由 Polar 生成并发送给训练器的代表性 Trace 对象片段,其中包含了词元 ID、对数概率、损失掩码、消息内容和奖励等关键信息。

{
    "prompt_ids": [151644, 872, 198, 48348, ...],
    "response_ids": [91, 10042, 151645],
    "loss_mask": [1.0, 1.0, 0.0],
    "response_logprobs": [
        {"token": "git", "token_id": 91, "logprob": -0.12},
        {"token": " patch", "token_id": 10042, "logprob": -0.44},
        {"token_id": 151645, "logprob": 0.0}
    ],
    "prompt_messages": [
        {"role": "system", "content": "agent harness system prompt"},
        {"role": "user", "content": "task instruction and current tool state"}
    ],
    "response_messages": [
        {"role": "assistant", "content": "sampled assistant turn"}
    ],
    "tools": null,
    "finish_reason": "stop",
    "reward": 1.0,
    "metadata": {
        "session_id": "session-123",
        "task_id": "polar-swegym-0001",
        "builder": "prefix_merging",
        "harness": "codex"
    }
}

A.5. 服务 API 摘要

Rollout 服务 API:Rollout 服务暴露了一个小型的异步 API:
- POST /rollout/task/submit:提交一个非阻塞的任务请求。
- GET /rollout/task/{task_id}:轮询任务状态、部分结果和最终结果。
- GET /rollout/status:检查任务状态、节点状态和待处理的会话。
- POST /callbacks/session_result:接收网关会话回调。
- POST /nodes/registerPOST /nodes/{node_id}/heartbeat:维护网关成员关系和调度指标。

网关 API:网关暴露了一个用于会话创建、状态查询和删除的控制接口,以及一个用于处理供应商风格模型请求的 catch-all 代理接口。会话删除被 rollout 流水线用作在持久化终端结果后的尽力而为的清理操作。