mcpField
D
dspy-rlm-module

dspy-rlm-module

github.com/intertwineエージェントワークフロー27876 回インストール7 週間前に更新
リポジトリ

dspy-rlm-module について

1 回のプロンプトに収まらないコンテキストを扱う開発者向けに、DSPy の `dspy.RLM` の使い方を説明します。サンドボックス内の Python による探索、再帰的なサブクエリ、大きな DSPy プログラムへの組み込みを扱います。

主な機能

  1. 01サンドボックス内の Python REPL 探索
  2. 02再帰的な分割とサブクエリ
  3. 03反復回数と呼び出し数の上限設定
  4. 04カスタム呼び出し可能ツール
  5. 05DSPy モジュールとの組み合わせ

活用シーン

  1. 01単一プロンプトに収まらないコンテキストの調査
  2. 02カスタムツールによるファイル検索や読み取り
  3. 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。

コメント