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提供了簡單的模塊化接口,用戶可以繼承
BaseAgent
和BaseEnv
類來構建自定義智能體和環境。文檔中給出了一個數學智能體和基礎環境類的示例代碼。
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社區。