dspy-rlm-module について
1 回のプロンプトに収まらないコンテキストを扱う開発者向けに、DSPy の `dspy.RLM` の使い方を説明します。サンドボックス内の Python による探索、再帰的なサブクエリ、大きな DSPy プログラムへの組み込みを扱います。
主な機能
- 01サンドボックス内の Python REPL 探索
- 02再帰的な分割とサブクエリ
- 03反復回数と呼び出し数の上限設定
- 04カスタム呼び出し可能ツール
- 05DSPy モジュールとの組み合わせ
活用シーン
- 01単一プロンプトに収まらないコンテキストの調査
- 02カスタムツールによるファイル検索や読み取り
- 03リポジトリ分析プログラムの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ intertwine/ dspy-agent-skills --skill dspy-rlm-moduleインストール後、Claude Code で/dspy-rlm-moduleを入力して読み込まれたか確認します。
同梱ファイルexample_rlm.pyreference.md
詳細
dspy.RLM — 再帰型言語モデル
dspy.RLM は、完全なコンテキストを変数として利用できる、サンドボックス化された Python REPL(Deno 経由の Pyodide/WASM)で LLM を実行します。LLM はコードを記述してデータのスライス、grep、要約、再帰的なサブクエリを行い、回答できるまで処理を繰り返します。コンテキストが大きすぎて単一のプロンプトに収まらない場合に使用します。
前提条件
- Deno をインストール済みであること(デフォルトの
PythonInterpreterに必要です):brew install denoを実行するか、https://deno.land を参照してください。インタープリターは、Deno によって起動される Pyodide の WASM サンドボックスです。 - 内部呼び出し用のサブ LM。通常は外側の LM より低コストのモデルを使用します。デフォルトは
dspy.settings.lmです。
基本的な使い方
import dspy
dspy.configure(lm=dspy.LM("openai/gpt-4o"))
sub_lm = dspy.LM("openai/gpt-4o-mini") # cheap inner model
rlm = dspy.RLM(
"context, query -> answer",
max_iterations=20,
max_llm_calls=50,
max_output_chars=10_000,
sub_lm=sub_lm,
tools=[],
verbose=False,
)
result = rlm(
context=open("huge_log.txt").read(), # can be 500k+ tokens
query="Summarize every unique error class and how many times each appeared.",
)
print(result.answer)
コンストラクターの全引数
dspy.RLM(
signature: type[Signature] | str,
max_iterations: int = 20, # REPL loop cap
max_llm_calls: int = 50, # sub-LM call cap (stops runaway recursion)
max_output_chars: int = 10_000, # truncate REPL stdout per step
verbose: bool = False, # print the REPL trace
tools: list[Callable] | None = None,
sub_lm: dspy.LM | None = None,
interpreter: CodeInterpreter | None = None, # custom sandbox
)
RLM と他の方法の使い分け
| 状況 | 使用するもの |
|---|---|
| コンテキストが 100k 未満で、回答が 1 回の LM 呼び出しに収まる | dspy.Predict / dspy.ChainOfThought |
| 外部ツール(Web、DB)が必要 | dspy.ReAct(tools=[...]) |
| 実行する必要のある数学やコード | dspy.ProgramOfThought |
| 巨大なコンテキスト、再帰的なチャンク分割、またはデータ探索ループ | dspy.RLM |
| LM にファイルを grep/読み込みさせるコードベース全体の推論 | ファイル読み込み用の tools=[...] を指定した dspy.RLM |
組み合わせ — 大規模なプログラム内のモジュールとしての RLM
RLM を独自の dspy.Module でラップし、GEPA を使ってその外側のプログラムを最適化します。GEPA は、RLM の外側のシグネチャの指示と、周囲の予測器の両方を調整できます。
class RepoAuditor(dspy.Module):
def __init__(self):
super().__init__()
self.explore = dspy.RLM("repo_tree, question -> findings",
max_iterations=30, sub_lm=dspy.LM("openai/gpt-4o-mini"))
self.synth = dspy.ChainOfThought("findings, question -> report")
def forward(self, repo_tree, question):
f = self.explore(repo_tree=repo_tree, question=question).findings
return self.synth(findings=f, question=question)
続いて、dspy.GEPA(metric=..., ...).compile(student=RepoAuditor(), trainset=..., valset=...) を実行します。
実践的なヒント
- 予算を慎重に設定してください。 1 回の RLM 呼び出しで、数十回のサブ LM 呼び出しが行われることがあります。本番環境では
max_llm_callsを控えめ(20~50)に設定し、研究用途では必要に応じて増やしてください。 - デフォルトの標準出力上限は DSPy 3.2.x で小さくなっています。
max_output_charsのデフォルト値は10_000です。REPL ツールが大きなテーブルやドキュメントのスライスを出力する場合は、意図的に値を増やしてください。 - 低コストの
sub_lmを使用してください。 外側の LM が処理を調整します。内部呼び出し(要約、フィルタリング、スコア付け)に最高性能のモデルは必要ありません。 - 指示ではなく kwargs としてデータを渡してください。
rlm(context=huge_string, query="...")とすると、REPL でcontextを Python 変数として扱えます。コンテキストをプロンプトに連結するのは避けてください。 - デバッグ中は
verbose=Trueを指定してください。 REPL の各ステップが出力されます。RLM が停止したりループしたりしているように見えるときに非常に役立ちます。 - カスタムツールには、
tools=[...]で渡す通常の Python 呼び出し可能オブジェクトを使用します。これらはサンドボックス内で利用できます。read_file、grep、vector_searchなどに便利です。DSPy 3.2.x ではキーワード引数で呼び出されるため、位置専用のシグネチャではなく、名前付きの型付きパラメーターを指定してください。 - Deno のインストールが必要です。 Deno が見つからないことは、RLM エラーの最大の原因です。バグを報告する前に
which denoを確認してください。
セキュリティに関する注意
デフォルトのインタープリターは、Deno のサンドボックス内で動作する Pyodide WASM ランタイムで、デフォルトではファイルシステム、ネットワーク、サブプロセスにアクセスできません。I/O を行うカスタムの tools を渡す場合、そのツールのセキュリティ対策は利用者の責任です。生の subprocess.run を RLM に渡してはいけません。
避けるべきパターン
- 32k トークンのプロンプトに収まる場合に RLM を使うこと。オーバーヘッドに見合いません。
- Deno がない状態で実行すること。原因を特定しにくい失敗につながります。Deno をインストールしてください。
- 本番環境で
max_llm_callsをデフォルトのままにすること。コストが際限なく増加するおそれがあります。 context文字列にシークレットを渡すこと。REPL の状態に出力されます。
次のステップ
- GEPA を使ってラップおよび最適化する →
dspy-gepa-optimizer。 - 全リファレンス → reference.md。