rLLM:用于LLM Agent RL后训练的创新框架

本文介绍了rLLM,一个用于语言智能体后训练的可扩展框架。它能让用户轻松构建自定义智能体与环境,通过强化学习进行训练并部署。文中还展示了用其训练的DeepSWE等智能体的出色表现,以及rLLM未来的发展方向,值得关注。

📄 标题: [rLLM: A Framework for Post-Training Language Agents]
🌐 来源: [Notion Blog] + https://pretty-radio-b75.notion.site/rLLM-A-Framework-for-Post-Training-Language-Agents-21b81902c146819db63cd98a54ba5f31

PS: 整理了LLM、量化投资、机器学习方向的学习资料,关注同名公众号 「 亚里随笔」 即刻免费解锁

背景

rLLM团队发布了rLLM-v0.1,这是一个用于语言智能体后训练的可扩展框架,支持用户构建自定义智能体和环境,通过强化学习进行训练并部署到实际工作负载中。此前,Agentica团队开源了两个模型:DeepScaleR和DeepCoder,推动了推理模型的强化学习训练民主化。但推理模型只是起点,真正的语言智能体需要在复杂、不确定的环境中进行推理、行动和交互。2025年下半年,团队进入语言智能体时代,发布了rLLM框架和基于其训练的DeepSWE模型,后者在SWEBench-Verified上取得了42.2%的Pass@1(测试时缩放为59.0%)的SOTA成绩。

rLLM框架

设计目标与理念

rLLM旨在支持智能体从经验中学习,即通过与动态环境的持续交互进行学习。现有大多数智能体框架仅关注编排和推理,对部署后学习支持不足。rLLM提供了灵活的框架来构建自定义智能体工作流,支持在实际环境中部署智能体以生成交互数据,并内置了基于强化学习的后训练支持。它采用分层模块化设计,既方便智能体构建者快速开发,又便于算法开发者进行定制研究。同时,rLLM作为一个前端层,可与不同的分布式强化学习训练引擎集成,目前使用verl作为训练后端。

快速上手示例

文档提供了一个约30行代码的示例,展示了如何训练一个使用Python解释器解决数学问题的工具智能体。通过使用rLLM的相关模块和函数,用户可以轻松完成训练任务。

import hydrafrom rllm.agents import ToolAgent
from rllm.data.dataset import DatasetRegistry
from rllm.environments.tools.tool_env import ToolEnvironment
from rllm.rewards.reward_fn import math_reward_fn
from rllm.trainer.agent_trainer import AgentTrainer@hydra.main(config_path="pkg://rllm.trainer.config", config_name="ppo_trainer", version_base=None)
def main(config):train_dataset = DatasetRegistry.load_dataset("deepscaler_math", "train")test_dataset = DatasetRegistry.load_dataset("aime2024", "test")agent_args = {"tools": ["python"], "parser_name": "qwen", "system_prompt": "You are a math assistant that can write python to solve math problems."}env_args = {"tools": ["python"],"reward_fn": math_reward_fn,}trainer = AgentTrainer(agent_class=ToolAgent,env_class=ToolEnvironment,agent_args=agent_args,env_args=env_args,config=config,train_dataset=train_dataset,val_dataset=test_dataset,)trainer.train()if __name__ == "__main__":main()

架构与主要组件

  • 智能体和环境抽象:rLLM提供了简单的模块化接口,用户可以继承BaseAgentBaseEnv类来构建自定义智能体和环境。文档中给出了一个数学智能体和基础环境类的示例代码。
class MathAgent(BaseAgent):def __init__(self, accumulate_thinking=True):self.instruction = "Let's think step by step, and put your final answer within \\boxed{}."self._trajectory = Trajectory()self.messages = []self.accumulate_thinking = accumulate_thinkingdef update_from_env(self, observation, reward, done, info, **kwargs):if not self.trajectory.steps:question = observation["question"]formatted_observation = f"{question} {self.instruction}"else:formatted_observation = "Your previous answer may contain a mistake. Please review it."self.messages.append({"role": "user", "content": formatted_observation})def update_from_model(self, response, **kwargs):self.messages.append({"role": "assistant", "content": response})new_step = Step(chat_completions=copy.deepcopy(self.chat_completions))self.trajectory.steps.append(new_step)return Action(action=response)def reset(self):self._trajectory = Trajectory()self.messages = []@propertydef chat_completions(self):messages = copy.deepcopy(self.messages)if not self.accumulate_thinking:for msg in messages[:-1]:if msg["role"] == "assistant":_, sep, after = msg["content"].partition("</think>")if sep:msg["content"] = afterreturn messages@propertydef trajectory(self):return self._trajectorydef get_current_state(self):assert self._trajectory.stepsreturn self._trajectory.steps[-1]class BaseEnv(ABC):@abstractmethoddef reset(self) -> tuple[dict, dict]:pass@abstractmethoddef step(self, action: Any) -> tuple[Any, float, bool, dict]:passdef close(self):return@staticmethod@abstractmethoddef from_dict(info: dict) -> "BaseEnv":raise NotImplementedError("Subclasses must implement 'from_dict'")
  • AgentExecutionEngine:这是一个高性能的采样器,负责协调智能体和环境之间的交互,支持全异步、并行的轨迹滚动。在强化学习训练过程中,它与训练器无缝集成,支持多种强化学习算法。文档展示了如何使用它进行轨迹收集的示例。
engine = AgentExecutionEngine(agent_class=ToolAgent,agent_args={"tools": ["python"], "parser_name": "qwen"},env_class=ToolEnvironment,env_args={"tools": ["python"], "reward_fn": math_reward_fn},engine_name="openai",rollout_engine_args={"base_url": "http://localhost:30000/v1"},tokenizer=AutoTokenizer.from_pretrained("Qwen/Qwen3-4B"),sampling_params={"temperature": 0.6, "top_p": 0.95, "model": "Qwen/Qwen3-4B"},max_response_length=16384,max_prompt_length=2048,n_parallel_agents=64,
)test_dataset = DatasetRegistry.load_dataset("aime2024", "test")
tasks = test_dataset.repeat(n=8)  # For pass@k evaluationresults = asyncio.run(engine.execute_tasks(tasks))
compute_pass_at_k(results)
  • AgentTrainer:提供了一个简单的高级接口,用户可以指定训练工作负载和配置,调用train()方法即可使用强化学习训练智能体。它使用AgentExecutionEngine作为轨迹采样器,verl作为模型训练器,并使用Ray来协调采样器和训练器之间的控制流。文档中给出了使用AgentTrainer进行强化学习训练的示例。
@hydra.main(config_path="pkg://rllm.trainer.config", config_name="ppo_trainer", version_base=None)
def main(config):train_dataset = DatasetRegistry.load_dataset("hotpotqa_combined", "train")val_dataset = DatasetRegistry.load_dataset("hotpotqa_combined", "test")tool_map = {"local_search": LocalRetrievalTool}env_args = {"max_steps": 20,"tool_map": tool_map,"reward_fn": search_reward_fn,}agent_args = {"system_prompt": SEARCH_SYSTEM_PROMPT, "tool_map": tool_map, "parser_name": "qwen"}trainer = AgentTrainer(agent_class=ToolAgent,env_class=ToolEnvironment,config=config,train_dataset=train_dataset,val_dataset=val_dataset,agent_args=agent_args,env_args=env_args,)trainer.train()

强化学习算法

根据智能体随时间累积上下文的方式,rLLM将智能体分为累积智能体和非累积智能体,并为它们分别提供了不同的强化学习算法。

  • 累积智能体:使用GRPO with Observation Masking算法,在训练时屏蔽非模型生成的标记,仅对模型生成的标记计算损失。该方法已用于训练DeepSWE等模型。

  • 非累积智能体:支持两种方法,即Stepwise GRPO with Advantage Broadcasting和Stepwise GRPO with Per-Step Grouping。前者将最终步骤的优势广播到所有先前步骤,适用于早期行动对最终结果有重要贡献但缺乏细粒度奖励的情况;后者为每个步骤分配独立的奖励,并按步骤位置分组计算优势,适用于轨迹对称的情况。

内置语言智能体

rLLM包含一系列内置的智能体和环境,涵盖多个领域,如通用工具使用智能体、DeepSWE(SOTA编码/软件工程智能体)、DeepScaleR和DeepCoder(数学/编码推理模型)、FrozenLake智能体和WebAgent等。用户还可以使用rLLM的模块化API和训练引擎构建和训练自己的自定义智能体和环境,并欢迎贡献回rLLM社区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914760.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914760.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914760.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

软件说明&#xff1a; 所有软件包下载地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 打开页面后选择对应的组件及版本即可&#xff01; 所有软件包名称如下&#xff1a; 架构拓扑&#xff1a; 集群模式&#xff1a; 单机模式 架构规划&#xff1a…

【JVM】内存分配与回收原则

在 Java 开发中&#xff0c;自动内存管理是 JVM 的核心能力之一&#xff0c;而内存分配与回收的策略直接影响程序的性能和稳定性。本文将详细解析 JVM 的内存分配机制、对象回收规则以及背后的设计思想&#xff0c;帮助开发者更好地理解 JVM 的 "自动化" 内存管理逻辑…

Qt获取hid设备信息

Qt 中通过 HID&#xff08;Human Interface Device&#xff09;接口获取指定的 USB 设备&#xff0c;并读取其数据。资源文件中包含了 hidapi.h、hidapi.dll 和 hidapi.lib。通过这些文件&#xff0c;您可以在 Qt 项目中实现对 USB 设备的 HID 接口调用。#include <QObject&…

Anaconda Jupyter 使用注意事项

Anaconda Jupyter 使用注意事项 1.将cell转换为markdown。 First, select the cell you want to convertPress Esc to enter command mode (the cell border should turn blue)Press M to convert the cell to Markdown在编辑模式下按下ESC键&#xff0c;使单元块&#xff08;c…

[硬件电路-20]:模拟信号处理运算与数字信号处理运算的相同点与不同点

模拟信号处理运算与数字信号处理运算是信号处理领域的两大核心方法&#xff0c;二者在信号形式、处理机制、性能特点和应用场景上存在显著差异&#xff0c;但也共享一些基础目标与理论支撑。以下从多个维度进行系统对比分析&#xff1a;一、相同点1. 核心目标一致信号变换与分析…

Redis 高频面试题

1. 缓存穿透 1.1 描述 用户想要查询某个数据,在 Redis 中查询不到,即没有缓存命中,这时就会直接访问数据库进行查询。当请求量超出数据库最大承载量时,就会导致数据库崩溃。这种情况一般发生在非正常 URL 访问,目的不是为了获取数据,而是进行恶意攻击。 1.2 现象 1、应…

OWASP Top 10 攻击场景实战

OWASP (开放式Web应用程序安全项目) Top 10 榜单是全球公认的、针对Web应用最关键安全风险的权威指南。它不是一份详尽无遗的清单&#xff0c;而是一份凝聚了安全专家共识的“高危预警”。本文将不止于罗列这些风险&#xff0c;而是深入每个风险的核心&#xff0c;通过生动的比…

Three.js 实战:使用 PBR 贴图打造真实地面材质

在 Three.js 中&#xff0c;我们可以通过 MeshStandardMaterial 材质配合多张贴图来实现真实的地面效果。这种方式模拟了物理世界中光照与表面材质的复杂交互&#xff0c;常用于构建高质量场景&#xff0c;如数字孪生、建筑可视化、游戏等。 本文将以一个完整示例为基础&#x…

Java基础的总结问题(第一篇)

JDK和JRE的区别&#xff1f;JRE是Java运行环境&#xff08;Java Runtime Environment&#xff09;&#xff0c;包含了JVM和Java核心类库JDK是Java开发工具包&#xff08;Java Developers Kit&#xff09;,包含了JRE和Java常见的开发工具与equals的区别&#xff1f;可以用来比较…

[智能算法]MOEA/D算法的Python实现

一、初始化不同于NSGA-II&#xff0c;MOEA/D在进行迭代之前需要先进行初始化&#xff0c;初始化的主要内容是计算个体向量权重之间的欧氏距离&#xff0c;并得出其邻域集合。# 计算T个邻居 def cpt_W_Bi_T(moead):# 设置的邻居个数错误(自己不能是自己的邻居)if moead.T_size &…

Java设计模式之-组合模式

什么是组合模式&#xff1f; 组合模式允许你将对象组合成树形结构来表示"部分-整体"的层次结构。它让客户端能够以统一的方式处理单个对象和对象组合。 简单来说&#xff0c;就像公司的组织结构&#xff1a; 公司有部门部门有小组小组有员工但无论是对公司、部门还是…

2021-10-29 C++与反转数的和

缘由输入一个三位数 与它倒过来的数相加&#xff0c;输出和-编程语言-CSDN问答 直接写 int n0,nn0,nnn0; cin>>n;nnn; while(nn)nnn*10,nnnnn%10,nn/10; cout<<nnnn<<endl; 缘由https://ask.csdn.net/questions/7552128 int 反转数(int n) { int nn 0…

论安全架构设计(威胁与措施)

安全架构威胁与措施摘要2021年4月&#xff0c;我有幸参与了某保险公司的“优车险”项目的建设开发工作&#xff0c;该系统以车险报价、车险投保和报案理赔为核心功能&#xff0c;同时实现了年检代办、道路救援、一键挪车等增值服务功能。在本项目中&#xff0c;我被安排担任架构…

022_提示缓存与性能优化

提示缓存与性能优化 目录 缓存技术概述缓存工作原理实现方法详解成本优化策略性能优化实践高级应用场景最佳实践指南 缓存技术概述 什么是提示缓存 提示缓存是Claude API的一项优化功能&#xff0c;允许缓存提示的特定部分以便重复使用&#xff0c;从而显著减少处理时间和…

【AI交叉】地理:人工智能如何推动地理科学的智能转型?

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的传统学科开始与之融合&#xff0c;催生出一系列跨学科的新研究方向和应用场景。地理科学作为研究地球表层自然与人文现象的综合性学科&#xff0c;也在这一浪潮中迎来转型契机。 AI与地理学的交叉正…

iOS高级开发工程师面试——关于网络

iOS高级开发工程师面试——关于网络 一、谈谈对 HTTP、HTTPS 的理解1. HTTP协议:2. HTTPS 协议二、TCP、UDP 和 SocketTCPUDPTCP 和 UDP 的区别?Socket一、谈谈对 HTTP、HTTPS 的理解 1. HTTP协议: 超文本传输协议,他是基于TCP应用层协议。 是无连接 无状态 的,需要通过…

跟着Nature正刊学作图:回归曲线+散点图

&#x1f4cb;文章目录复现目标图片绘图前期准备绘制左侧回归线图绘制右侧散点图组合拼图 (关键步骤&#xff01;)跟着「Nature」正刊学作图&#xff0c;今天挑战复现Nature文章中的一张组合图–左边为 回归曲线、右边为 散点图。这种组合图在展示相关性和分组效应时非常清晰有…

LVS集群调度器

目录 集群和分布式 LVS运行原理 LVS概念 LVS的集群类型 实验配置 安装LVS ipvsadm命令参数 1.管理集群服务中的增删改 2.管理集群服务中的RS增删改 3.lvs调度策略的备份与恢复 4.lvs调度策略的开机启动 LVS-NAT模式 LVS-DR模式 集群和分布式 集群&#xff08;Clu…

【React Natve】NetworkError 和 TouchableOpacity 组件

NetworkError公共组件 import SimpleLineIcons from "expo/vector-icons/SimpleLineIcons"; import { StyleSheet, Text, View } from "react-native";export default function NetworkError() {return (<View style{styles.container}><SimpleL…

Linux 驱动中 Timer / Tasklet / Workqueue 的作用与对比

Linux 驱动中 Timer / Tasklet / Workqueue 的作用与对比 &#x1f9e9; 1. 使用场景概览&#xff08;对比表&#xff09;机制执行上下文是否可睡眠使用场景常用接口Timer中断上下文❌ 不可睡眠延迟执行&#xff08;如防抖、超时处理&#xff09;add_timer() 等Tasklet软中断上…