递归语言模型 (RLM)
完整论文 •
博客文章 •
文档 •
RLM Minimal
## 概述
递归语言模型 (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](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 Sandboxes](https://modal.com/docs/guide/sandboxes) 用作 REPL 环境,你需要安装并验证你的 Modal 账户。
```
uv add modal # add modal library
modal setup # authenticate account
```
#### Prime Intellect Sandboxes

要使用 [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.RLM](https://github.com/stanfordnlp/dspy)

*

[Ax](https://github.com/ax-llm/ax)

*

[context-labs/HALO: **基于 RLM 的自动 Agent 优化循环**](https://github.com/context-labs/halo)

* [viplismism/rlm-cli: **用于递归语言模型的 CLI**](https://github.com/viplismism/rlm-cli)

*

[alphaXiv 官方博客。**强化递归语言模型**](https://www.alphaxiv.org/blog/reinforcement-learning-for-rlms#training)
*

[Daytona。**构建深度递归语言模型**](https://www.daytona.io/docs/en/guides/rlm/recursive-language-models/)
*

[Symbolica。**使用 REPL Agents 取得的 SotA ARC-AGI-2 结果**](https://www.symbolica.ai/blog/arcgentica)
*

[Google Cloud 社区文章。**ADK 中的 RLM**](https://discuss.google.dev/t/recursive-language-models-in-adk/)
*

[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
```