递归语言模型服务器

RLM是一个实现递归语言模型模式的MCP服务器,通过外部变量处理大容量上下文,避免上下文窗口溢出,适用于代码分析、日志审查和大规模文本处理。

  • by arkaigrowth
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 arkaigrowth/rlm

使用说明

德意志帝国航空部

你的LLM看到20万个代币。你的代码库有1000万。
答案不是更大的上下文窗口。

快速开始 · 演示 · 运作原理 · 工具 · 提供商 · 鸣谢


核心理念

RLM是一个MCP服务器,它实现 递归语言模型 图案从 麻省理工学院研究 由Tian Jin等人撰写。RLM将上下文视为一种 外部变量,在保持主上下文窗口干净的同时,递归地加载、分块和查询它。

You say:  "Analyze this 2MB log file for errors"
Claude:    Uses RLM tools behind the scenes
You get:  "Found 3 error patterns: database timeouts (47), auth failures (23)..."

你永远不会直接调用RLM工具。克劳德在需要的时候伸手去拿。


为什么不直接阅读文件?

方法 发生了什么
将2MB粘贴到提示符 上下文窗口溢出。截断结果。成本高。
阅读前2000行 忽略第2000行之后的所有内容。
总结然后查询 有损压缩。细节消失了。
德意志帝国航空部 完整内容保留在外部。查询任何零件。子LLM并行分析块。没什么损失。

关键见解来自 纸: 上下文是数据,不是提示.把它当作数据库,而不是对话。


快速开始

安装

git clone https://github.com/arkaigrowth/rlm.git
cd rlm
uv sync

设置(推荐)

安装脚本在一个步骤中配置Claude Code、Claude Desktop或两者:

./scripts/setup.sh --all      # both Claude Code and Claude Desktop
./scripts/setup.sh --code     # Claude Code only
./scripts/setup.sh --desktop  # Claude Desktop only
./scripts/setup.sh --check    # show current status

脚本:

  • 将RLM MCP服务器条目添加到每个平台的配置中
  • 将技能与 ~/.claude/skills/rlm (防止全局技能和回购之间的漂移)
  • 确保 run_rlm.sh 可执行,venv已就绪

手动配置

Claude Code

安装脚本将此添加到 ~/.claude/settings.json:

{
  "mcpServers": {
    "rlm": {
      "command": "/path/to/rlm/run_rlm.sh",
      "args": []
    }
  }
}

或者使用CLI手动添加:

claude mcp add rlm /path/to/rlm/run_rlm.sh
Claude Desktop

安装脚本将此添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "rlm": {
      "command": "/path/to/rlm/run_rlm.sh",
      "args": []
    }
  }
}

添加后重新启动Claude Desktop。

run_rlm.sh 通过macOS密钥链处理API密钥加载(项 rlm-openrouter 或 openclaw-openrouter),回到环境变量。看 docs/keychain-env-contract.md 了解详情。

验证

让克劳德分析任何大文件。如果RLM已连接,它将自动使用工具。


运作原理

Architecture
flowchart TB
    CC["Claude Code<br/>(orchestrator)"] --> RLM["RLM MCP Server"]
    RLM --> CS["Claude SDK<br/>Haiku 4.5"]
    RLM --> OA["OpenAI<br/>gpt-5.4-mini"]
    RLM --> OR["OpenRouter<br/>multi-model"]
    RLM --> OL["Ollama<br/>local / free"]

    RLM --- CTX[("Contexts<br/>& Chunks")]
    RLM --- RES[("Results<br/>Store")]

    style CC fill:#1a1a2e,stroke:#e94560,color:#fff
    style RLM fill:#16213e,stroke:#0f3460,color:#fff
    style CS fill:#0f3460,stroke:#533483,color:#fff
    style OA fill:#0f3460,stroke:#533483,color:#fff
    style OR fill:#0f3460,stroke:#533483,color:#fff
    style OL fill:#0f3460,stroke:#533483,color:#fff
Processing Pipeline
flowchart LR
    A["Load Context<br/>10M tokens"] --> B["Inspect<br/>structure"]
    B --> C["Filter<br/>regex / lexical"]
    C --> D["Chunk<br/>lines · chars · paragraphs"]
    D --> E["Sub-Query<br/>parallel batch"]
    E --> F["Store Results"]
    F --> G{"Confident?"}
    G -->|Yes| H["Aggregate<br/>& Return"]
    G -->|"No, recurse"| D

    style A fill:#e94560,stroke:#1a1a2e,color:#fff
    style H fill:#2ecc71,stroke:#1a1a2e,color:#fff

模式总是相同的:

  1. 负载:content成为外部变量(不在提示中)
  2. 检查:无需阅读所有内容即可理解结构
  3. 过滤器:在使用令牌之前,使用正则表达式缩小搜索空间
  4. 块:按行、字符或段落进行策略性拆分
  5. 子查询:通过子LLM对每个块提出有针对性的问题
  6. 聚合:结合结果,解决冲突,报告差距

工具

这些是克劳德在内部使用的。你不给他们打电话,你只是让克劳德分析大文件。

工具 目的
rlm_auto_analyze 一步分析:自动检测类型、块和查询
rlm_load_context 将内容作为外部变量加载
rlm_inspect_context 无需加载到提示符中即可获取结构信息
rlm_chunk_context 按行、字符或段落拆分
rlm_get_chunk 检索特定块
rlm_filter_context 正则表达式过滤(保留或删除匹配行)
rlm_exec 在加载的上下文中运行Python(沙盒)
rlm_sub_query 块上的子LLM调用
rlm_sub_query_batch 并行处理多个块
rlm_store_result 存储结果以进行聚合
rlm_get_results 检索存储的结果
rlm_list_contexts 列出所有加载的上下文

一步分析

对于大多数使用情况, rlm_auto_analyze 处理一切:

rlm_auto_analyze(
    name="my_file",
    content=file_content,
    goal="find_bugs"  # or: summarize, extract_structure, security_audit, answer:<question>
)

它检测内容类型(Python、JSON、日志、散文),选择正确的分块策略,调整查询,运行并行子查询,并返回聚合结果。

程序分析

对于确定性提取(正则表达式、计数、解析), rlm_exec 直接在加载的上下文中运行Python:

rlm_exec(
    code="""
import re
amounts = re.findall(r'\\$[\\d,]+', context)
result = {'count': len(amounts), 'sample': amounts[:5]}
""",
    context_name="bill"
)

预进口: re, json, collections。在具有超时强制的子进程沙箱中运行。

何时使用哪个:

任务 工具 为什么
提取日期、ID、金额 rlm_exec 正则表达式具有确定性和快速性
查找安全漏洞 rlm_sub_query 需要推理
解析JSON/XML结构 rlm_exec 标准库工作
总结主题或基调 rlm_sub_query 需要语言理解
计数模式 rlm_exec 计算简单
回答“为什么会发生X?” rlm_sub_query 需要推理

提供商

子查询由轻量级子LLM处理。为您的用例选择正确的一个:

提供者 默认模型 成本 递归工具调用 最适合
openrouter openai/gpt-5.4分钟 API 是 推荐的托管默认值
openai gpt-5.4-mini API 是 直接OpenAI,递归
ollama 自动检测 免费 是 本地推理,零成本
claude-sdk 俳句4.5 订阅 不,仅单转 当没有可用的API密钥时,最后重新排序回退

provider="auto" 偏爱 openrouter那么 ollama那么 openai 无论是简单调用还是递归调用。 claude-sdk 仅用作非递归单圈作业的最后手段。它确实 不 支持递归工具调用(每次调用都会生成一个完整的CLI子流程,这使得递归速度太慢,成本太高)。

递归子查询

这个 max_depth 参数启用分层分解:

rlm_sub_query(
    query="Find all security vulnerabilities",
    context_name="codebase",
    chunk_index=0,
    provider="ollama",
    max_depth=1  # Sub-LLM gets RLM tools and can further decompose
)

当 max_depth > 0,子LLM在其自己的上下文中接收RLM工具,并可以递归地分块、过滤和子查询。每个级别都会减小深度,直到达到极限。响应包括递归元数据: depth_reached 和 call_trace.

保持 max_depth 浅(0或1)。更深的树很少能改善结果,反而会增加成本。

提供商设置

Ollama (free local inference)
# Install Ollama and pull a model
ollama pull gemma3:27b

添加到MCP配置环境中:

"env": {
    "RLM_DATA_DIR": "/Users/you/.rlm-data",
    "OLLAMA_URL": "http://localhost:11434"
}
rlm_sub_query_batch(
    query="Extract key points",
    context_name="my_doc",
    chunk_indices=[0, 1, 2, 3],
    provider="ollama",
    concurrency=4
)
OpenAI (direct)
export OPENAI_API_KEY="your_key"
rlm_sub_query_batch(
    query="Extract key findings",
    context_name="my_doc",
    chunk_indices=[0, 1, 2, 3],
    provider="openai",
    model="gpt-5.4-mini",
    max_depth=1
)
OpenRouter (multi-model)
export OPENROUTER_API_KEY="your_key"
rlm_sub_query(
    query="Find security issues",
    context_name="codebase",
    chunk_index=0,
    provider="openrouter",
    model="google/gemini-2.5-flash"  # or any OpenRouter model
)

自动检测

教Claude自动获取RLM工具,无需手动调用。

1.CLAUDE.md集成:复制 CLAUDE.md.example 到你的项目 CLAUDE.md (或 ~/.claude/CLAUDE.md 全球)。

2.吊钩安装:读取大于25KB的文件时,自动建议RLM:

cp -r .claude/hooks/ /path/to/your-project/.claude/hooks/

3.技能参考:全面的业务指导:

cp -r skills/ /path/to/your-project/skills/

技能体系包括 预算、护栏、查询模式和快速失败合同,递归分析的显式控制。看 skills/rlm/SKILL.md 以获取完整的操作配置文件。


测试语料库

该存储库支持使用 大英百科全书,第11版 (1910-1911)来自古腾堡项目,11MB和约2M代币。

# Download the test corpus
./scripts/download-encyclopedia.sh
content = open("docs/encyclopedia/merged_encyclopedia.txt").read()
rlm_load_context(name="encyclopedia", content=content)
rlm_inspect_context(name="encyclopedia")
# → 11MB, 184K lines, ~2M tokens

rlm_chunk_context(name="encyclopedia", strategy="paragraphs", size=30)
rlm_sub_query_batch(
    query="Summarize the main topics in this section",
    context_name="encyclopedia",
    chunk_indices=[0, 50, 100, 150],
    provider="ollama"  # Free
)
度量 值
文件大小 11 MB
线路 184000
代币 ~2M
成本 0美元(奥利玛)或约1.60美元(俳句)

数据存储

$RLM_DATA_DIR/
├── contexts/     # Raw contexts (.txt + .meta.json)
├── chunks/       # Chunked versions (cached by context)
└── results/      # Stored sub-call results (.jsonl)

上下文在会话中持续存在。分块数据被缓存以供重用。


贡献

git clone https://github.com/arkaigrowth/rlm.git
cd rlm
uv sync --dev
pytest

使用Claude Code探索代码库:

Read src/rlm_mcp_server.py and list all RLM tools with their parameters.
How does the recursive sub-query system work? Walk me through _call_ollama.
How would I add a new provider (e.g., Gemini direct API)?

鸣谢

建立在 理查德·怀特的RLM,一个实现递归语言模型模式的早期MCP服务器。

根据研究 田进等。 在麻省理工学院:

递归语言模型 (2025).引入了将LLM上下文视为外部变量并使用递归子模型调用进行无界上下文处理的范式。

大英百科全书测试语料库 古腾堡计划.公共领域。


许可证

麻省理工学院使用它,用叉子叉,用船运。


阿肯色州增长 · 报告问题 · 读报