alexzhang13/rlm

GitHub: alexzhang13/rlm

一个面向递归语言模型的通用推理库,支持通过沙箱隔离执行复杂任务,解决长上下文与自洽推理难题。

Stars: 5294 | Forks: 858

递归语言模型 (RLM)

完整论文博客文章文档RLM Minimal

Style Test

Paper Preview

## 概述 递归语言模型 (RLM) 是一种与任务无关的语言模型 (LM) 推理范式,它通过使 LM 能够以*编程方式*检查、分解并在其输入上递归调用自身,从而处理近乎无限长度的上下文。RLM 使用 `rlm.completion(prompt, model)` 调用取代了标准的 `llm.completion(prompt, model)` 调用,充当“语言模型”。RLM 将上下文卸载到 REPL 环境中的一个变量中,LM 可以与其交互并在其中发起 sub-LM 调用。 RLM 是对未来“语言模型”设计选择的一次押注。我们主张采用 [CodeAct](https://arxiv.org/abs/2402.01030)-风格的框架(即所有语言模型都应能访问代码环境),将子 (R)LM 调用作为代码中的函数,并将上下文 / prompt 作为代码中的对象。RLM 明确将带有子调用的代码执行作为函数推迟给语言模型本身,这具有极强的灵活性,并且如果训练得当,非常适合规模化。我们希望摆脱用于 sub-agents 和通用工具调用的 JSON tool-calling 标准。其命名源于这样一个事实:这样的系统本身就是一个“语言模型”(从文本到文本的概率映射),它围绕递归 sub-LLM 调用构建并依赖于此。 此仓库提供了一个可扩展的推理引擎和训练环境,可在基于标准 API 和本地 LLM 周围使用 RLM。最初的实验和想法在 2025 年的一篇[博客文章](https://alexzhang13.github.io/blog/2025/rlm/)中提出,并在 [arXiv 预印本](https://arxiv.org/abs/2512.24601)中展示了扩展的结果。 我们现在还在 `training/` 文件夹中提供了一个基于 Prime Intellect 的 [prime-rl](https://github.com/PrimeIntellect-ai/prime-rl) 的 [verifiers](https://github.com/PrimeIntellect-ai/verifiers) 训练环境。训练你自己的 RLM,它们可以直接插入到我们的推理引擎中! ## 快速设置 你可以通过从 PyPi 安装来快速体验 RLM: ``` pip install rlms ``` 默认的 RLM 客户端使用通过 Python `exec` 调用在宿主进程中运行的 REPL 环境。它使用与宿主进程相同的虚拟环境(即它可以访问相同的依赖项),但在其可用的全局模块中有一些限制。例如,我们可以使用 GPT-5-nano 调用 RLM 补全: ``` from rlm import RLM rlm = RLM( backend="openai", backend_kwargs={"model_name": "gpt-5-nano"}, verbose=True, # For printing to console with rich, disabled by default. ) print(rlm.completion("Print me the first 100 powers of two, each on a newline.").response) ```
手动设置 使用 `uv`(或你选择的虚拟环境)设置依赖项: ``` curl -LsSf https://astral.sh/uv/install.sh | sh uv init && uv venv --python 3.12 # change version as needed uv pip install -e . ``` 本项目包含一个 `Makefile` 以简化常见任务。 - `make install`:安装基础依赖项。 - `make check`:运行 linter、格式化工具和测试。 要运行快速测试,以下命令将使用 OpenAI 客户端在你的环境变量 `OPENAI_API_KEY` 下运行 RLM 查询(可随意更改)。这将生成控制台输出以及一个日志,你可以将其与可视化工具一起使用来探索运行轨迹。 ``` make quickstart ```
## REPL 环境 我们支持两种类型的 REPL 环境——隔离和非隔离。非隔离环境(默认)在与 RLM 相同的机器上运行代码执行(例如通过 `exec`),这对于一些本地的低风险任务(如简单的基准测试)来说相当合理,但如果 prompt 或工具调用可能与恶意用户交互,则可能会出现问题。完全隔离的环境使用基于云的沙箱(例如 Prime Sandboxes、[Modal Sandboxes](https://modal.com/docs/guide/sandboxes))来运行由 RLM 生成的代码,确保与宿主进程完全隔离。可以添加环境,但我们原生支持以下环境:`local`(默认)、`ipython`、`docker`、`modal`、`prime`、`daytona`、`e2b`。 ``` rlm = RLM( environment="...", # "local", "ipython", "docker", "modal", "prime", "daytona", "e2b" environment_kwargs={...}, ) ``` ### 本地环境 默认的 `local` 环境 `LocalREPL` 在与 RLM 本身相同的进程中运行,具有指定的全局和本地 namespace,以确保最低限度的安全性。使用此 REPL 通常是安全的,但不应在生产环境中使用。它还与宿主进程共享相同的虚拟环境(例如 Conda 或 uv)。 #### IPython (*需要 `pip install 'rlms[ipython]'`*) `IPythonREPL` 在真实的 IPython 会话中运行 cell——可以在进程内(默认)或单独的 `ipykernel` 子进程中运行。子进程模式增加了严格的 `cell_timeout` 强制执行,并与 RLM 宿主实现了完全的 namespace 隔离。详情请参阅 [IPythonREPL 文档](https://alexzhang13.github.io/rlm/environments/ipython)。 #### Docker Docker (*需要[安装 Docker](https://docs.docker.com/desktop/setup/install/)*) 我们还支持一个名为 `DockerREPL` 的基于 Docker 的环境,它将 REPL 环境作为 Docker 镜像启动。默认情况下,我们使用 `python:3.11-slim` 镜像,但用户也可以指定自定义镜像。容器完全与宿主隔离运行;一个轻量级的宿主端代理将 LM 访问桥接回容器。 `DockerREPL` 支持本地环境的完整功能集:单次 LM 调用(`llm_query` / `llm_query_batched`)、递归 sub-RLM 调用(`rlm_query` / `rlm_query_batched`,包括受 `max_concurrent_subcalls` 限制的并行批量子调用)、`custom_tools` / `custom_sub_tools`、`persistent=True` 多轮会话(在 `completion()` 调用中重用带版本的 `context_N` / `history_N`),以及 `compaction=True` 对正在运行的 `history` 的自动摘要。对于隔离环境,自定义工具应作为 Python 代码字符串或可 JSON 序列化的值传递(宿主可调用对象无法跨越进程边界)。 ### 隔离环境 我们支持几种运行在独立的、基于云的机器上的不同 REPL 环境。每当在这些实例中进行递归子调用时,都会向宿主进程发送请求。 #### Modal Sandboxes Modal 要将 [Modal Sandboxes](https://modal.com/docs/guide/sandboxes) 用作 REPL 环境,你需要安装并验证你的 Modal 账户。 ``` uv add modal # add modal library modal setup # authenticate account ``` #### Prime Intellect Sandboxes Prime Intellect 要使用 [Prime Sandboxes](https://docs.primeintellect.ai/sandboxes/sdk),请安装 SDK 并设置你的 API 密钥: ``` uv pip install -e ".[prime]" export PRIME_API_KEY=... ``` ### 模型提供商 我们目前支持大多数主流客户端(OpenAI、Anthropic),以及路由平台(OpenRouter、Portkey)。对于本地模型,我们建议使用 vLLM(它与 [OpenAI 客户端](https://github.com/alexzhang13/rlm/blob/main/rlm/clients/openai.py)进行交互)。要查看或添加对更多客户端的支持,请从查看 [`rlm/clients/`](https://github.com/alexzhang13/rlm/tree/main/rlm/clients) 开始。 ## 训练 我们提供了一个简单的 RL 训练框架,用于训练本仓库(特别是 `local` REPL)中使用的 RLM。为了简单起见,该实现未使用沙箱,并且可以轻松适应你的用例,但理想的设置应使用沙箱以确保安全。训练逻辑被隔离在 [`training/`](https://github.com/alexzhang13/rlm/tree/main/training) 文件夹中,该文件夹将 `rlm.RLM` 暴露为 [`verifiers`](https://github.com/willccbb/verifiers) `Environment` 并直接接入 [`prime-rl`](https://github.com/PrimeIntellect-ai/prime-rl)。启动命令请参阅[训练 README](https://github.com/alexzhang13/rlm/tree/main/training#readme)。该框架使用子进程隔离的本地 REPL 执行(无云沙箱),与上面的 `local` 环境相匹配。 一个带有示例 `.toml` 的实战示例位于 [`training/environments/oolong/`](https://github.com/alexzhang13/rlm/tree/main/training/environments/oolong) 中(OOLONG 长上下文 QA)。可以以相同的方式添加新的训练环境——编写一个封装你任务的 `verifiers` 环境(参见 [verifiers 文档](https://verifiers.readthedocs.io/)),然后从配置中引用它。 ## 相关阅读 * **[2025年12月]** [递归语言模型 arXiv](https://arxiv.org/abs/2512.24601) * **[2025年10月]** [递归语言模型博客文章](https://alexzhang13.github.io/blog/2025/rlm/) 如果你在你的研究中使用了此代码或仓库,请引用: ``` @misc{zhang2026recursivelanguagemodels, title={Recursive Language Models}, author={Alex L. Zhang and Tim Kraska and Omar Khattab}, year={2026}, eprint={2512.24601}, archivePrefix={arXiv}, primaryClass={cs.AI}, url={https://arxiv.org/abs/2512.24601}, } ``` ## 实际应用中的 RLM RLM 有许多令人惊叹的演示和可用于生产环境的用例。我们提供了一份明确将 RLM 作为其设计核心的值得关注的示例列表。 * DSPy [DSPy.RLM](https://github.com/stanfordnlp/dspy) GitHub stars * Ax [Ax](https://github.com/ax-llm/ax) GitHub stars * context-labs [context-labs/HALO: **基于 RLM 的自动 Agent 优化循环**](https://github.com/context-labs/halo) GitHub stars * [viplismism/rlm-cli: **用于递归语言模型的 CLI**](https://github.com/viplismism/rlm-cli) GitHub stars * alphaXiv [alphaXiv 官方博客。**强化递归语言模型**](https://www.alphaxiv.org/blog/reinforcement-learning-for-rlms#training) * Daytona [Daytona。**构建深度递归语言模型**](https://www.daytona.io/docs/en/guides/rlm/recursive-language-models/) * Symbolica [Symbolica。**使用 REPL Agents 取得的 SotA ARC-AGI-2 结果**](https://www.symbolica.ai/blog/arcgentica) * Google Cloud [Google Cloud 社区文章。**ADK 中的 RLM**](https://discuss.google.dev/t/recursive-language-models-in-adk/) * Prime Intellect [Prime Intellect 博客。**递归语言模型:2026年*的*范式**](https://www.primeintellect.ai/blog/rlm) ## 可选:轨迹元数据、日志和调试 `RLMChatCompletion` 有一个可选的 `metadata` 字段(默认为 `None`),它保存完整的轨迹(运行配置 + 所有迭代和子调用),以便你可以重建运行过程。传入一个 `RLMLogger` 来捕获它: - **仅内存中**(轨迹位于 `completion.metadata` 上):`logger=RLMLogger()`(无 `log_dir`)。 - **同时保存到磁盘**(用于可视化工具 JSONL):`logger=RLMLogger(log_dir="./logs")`。 **可视化日志。** 我们还提供了一个简单的可视化工具来检查代码、sub-LM 和 root-LM 调用。使用 `RLMLogger(log_dir="./logs")`,这样每次补全都会写入一个 `.jsonl` 文件: ``` from rlm.logger import RLMLogger from rlm import RLM logger = RLMLogger(log_dir="./logs") rlm = RLM(..., logger=logger) ``` 要在本地运行可视化工具,我们使用 Node.js 和 shadcn/ui: ``` cd visualizer/ npm run dev # default localhost:3001 ```
标签:DLL 劫持, 代码执行环境, 大语言模型, 推理框架, 自然语言处理, 长上下文