开源项目

rlm

rlm

递归语言模型(RLM)推理库,提供超长上下文处理的即插即用方案,支持通过递归子调用拓展LLM上下文窗口。亮点在于其灵活的REPL沙箱设计(本地/Docker/Modal等)和与DSPy、Ax等生态的集成,同时内置RL训练环境,方便用户定制RLM模型。

README


递归语言模型 (RLMs)

完整论文 • 博客文章 • 文档 • RLM 最小实现

代码风格 测试

论文预览

概述

递归语言模型 (Recursive Language Models, RLMs) 是一种与任务无关的推理范式,它通过让语言模型 编程式地 检查、分解并递归地调用自身来处理其输入,从而使语言模型能够处理接近无限长度的上下文。RLMs 用 rlm.completion(prompt, model) 调用取代了传统的 llm.completion(prompt, model) 调用,其本身也扮演着"语言模型"的角色。RLMs 将上下文作为变量卸载到 REPL 环境中,语言模型可以与该环境进行交互,并在其中启动子 LM 调用。

RLMs 是对未来"语言模型"设计选择的一次押注。我们主张采用 CodeAct 风格的管控框架(即所有语言模型都应能访问代码环境),并在代码中将子 (R)LM 调用作为函数,将上下文/提示作为对象。RLMs 明确地将带有子调用的代码执行决策委托给语言模型本身,这种做法极其灵活,并且如果训练得当,可以很好地规模化。我们希望摆脱子代理和通用工具调用中的 JSON tool-calling 标准。该命名源于这样一个事实:这样的系统本身就是一个"语言模型"(文本到文本的概率映射),它以递归的子 LLM 调用为基础并依赖于它们。

本仓库提供了一个可扩展的推理引擎和训练环境,用于在标准 API 端模型和本地 LLM 上使用 RLMs。最初的实验和想法于 2025 年在一篇 博客文章 中提出,更详尽的结果见 arXiv 预印本。

我们现在还在 training/ 文件夹中提供了基于 Prime Intellect 的 prime-rl 的 verifiers 训练环境。训练你自己的 RLMs,并直接接入我们的推理引擎!

[!NOTE] 本仓库包含支持多种沙箱环境的 RLM 推理代码。欢迎开源贡献。本仓库由 MIT OASYS 实验室的论文作者维护。

快速设置

[!NOTE] rlms 需要 Python 3.11 或更高版本。

你可以通过从 PyPi 安装来快速尝试 RLMs:

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,  # 使用 rich 打印到控制台,默认关闭。
)

print(rlm.completion("打印前100个2的幂,每个一行。").response)
手动设置

使用 uv(或你喜欢的虚拟环境)安装依赖:

curl -LsSf https://astral.sh/uv/install.sh | sh
uv init && uv venv --python 3.12  # 根据需要更改版本
uv pip install -e .

本项目包含一个 Makefile 以简化常见任务。

  • make install:安装基础依赖。
  • make check:运行 linter、格式化器和测试。

要快速测试,以下命令将使用环境变量 OPENAI_API_KEY 运行一个基于 OpenAI 客户端的 RLM 查询(可自由更改)。这将生成控制台输出以及一个日志文件,你可以使用可视化工具来探索轨迹。

make quickstart

REPL 环境

我们支持两种类型的 REPL 环境——隔离式和非隔离式。非隔离环境(默认)在与 RLM 相同的机器上执行代码(例如通过 exec),这对于一些本地的低风险任务(如简单基准测试)来说相当合理,但如果提示或工具调用可能与恶意用户交互,则可能存在问题。完全隔离环境基于云沙箱(例如 Prime Sandboxes、Modal Sandboxes)运行 RLM 生成的代码,确保与宿主进程完全隔离。环境可以添加,但我们原生支持以下类型:local(默认)、ipython、docker、modal、prime、daytona、e2b。

rlm = RLM(
    environment="...", # "local", "ipython", "docker", "modal", "prime", "daytona", "e2b"
    environment_kwargs={...},
)

本地环境

默认的 local 环境 LocalREPL 在 RLM 自身的进程内运行,具有指定的全局和局部命名空间以实现最低安全性。使用此 REPL 通常是安全的,但不应在生产环境中使用。它还与宿主进程共享相同的虚拟环境(例如 Conda 或 uv)。

IPython(需要 pip install 'rlms[ipython]')

IPythonREPL 在真实的 IPython 会话中运行单元格——可以是进程内(默认)或在独立的 ipykernel 子进程中。子进程模式增加了严格的 cell_timeout 强制,并与 RLM 宿主进程完全隔离了命名空间。详情请参见 IPythonREPL 文档。

Docker Docker(需要 已安装 Docker)

我们还支持一个基于 Docker 的环境 DockerREPL,它将 REPL 环境作为 Docker 镜像启动。默认使用 python:3.11-slim 镜像,但用户也可以指定自定义镜像。

隔离环境

我们支持几种在不同的云机器上运行的 REPL 环境。每当在这些实例中进行递归子调用时,都会从宿主进程发出请求。

Modal Sandboxes Modal

要使用 Modal Sandboxes 作为 REPL 环境,你需要安装并验证你的 Modal 账户。

uv add modal  # 添加 modal 库
modal setup   # 验证账户
Prime Intellect Sandboxes Prime Intellect

[!NOTE] Prime Intellect Sandboxes 目前是 beta 功能。更多信息请参阅 文档。我们注意到使用这些沙箱时运行速度较慢,这目前是一个已知问题。

要使用 Prime Sandboxes,安装 SDK 并设置你的 API 密钥:

uv pip install -e ".[prime]"
export PRIME_API_KEY=...

模型提供商

我们目前支持大多数主流客户端(OpenAI、Anthropic),以及路由平台(OpenRouter、Portkey)。对于本地模型,我们推荐使用 vLLM(它与 OpenAI 客户端 交互)。要查看或添加对更多客户端的支持,请从查看 rlm/clients/ 开始。

训练

我们提供了一个简单的强化学习训练框架,用于训练本仓库中使用的 RLMs(特别是 local REPL)。该实现为了简单起见没有使用沙箱,可以轻松适配你的用例,但理想设置应使用沙箱以确保安全。训练逻辑独立于 training/ 文件夹,其中将 rlm.RLM 作为 verifiers 的 Environment 暴露出来,并直接接入 prime-rl。启动命令请参见 训练 README。该框架使用子进程隔离的本地 REPL 执行(无云沙箱),与上面的 local 环境一致。

一个带有示例 .toml 文件的实践示例位于 training/environments/oolong/(OOLONG 长上下文 QA)。可以以相同方式添加新的训练环境——编写一个包装你任务的 verifiers 环境(参见 verifiers 文档),然后从配置中引用它。

相关阅读

如果在你的研究中使用了本代码或仓库,请引用:

@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},
}

现实世界中的 RLMs

有许多出色的演示和可供生产的 RLM 用例。我们列出了明确将 RLM 作为其设计核心的显著示例。

可选:轨迹元数据、日志记录与调试

RLMChatCompletion 有一个可选的 metadata 字段(默认为 None),其中包含完整的轨迹(运行配置 + 所有迭代和子调用),以便你可以重建运行过程。传递一个 RLMLogger 来捕获它:

  • 仅内存(轨迹在 completion.metadata 中):logger=RLMLogger()(无 log_dir)。
  • 同时保存到磁盘(用于可视化工具的 JSONL):logger=RLMLogger(log_dir="./logs")。

可视化日志。 我们还提供了一个简单的可视化工具来检查代码、子 LM 和根 LM 调用。使用 RLMLogger(log_dir="./logs"),这样每次 completion 会写入一个 .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        # 默认 localhost:3001
开源项目alexzhang132026-06-17原文

相关内容