ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #69 - Recursive Language Models (RLMs)」という勉強会を開催しました。
https://generative-agents.connpass.com/event/386420/generative-agents.connpass.com
アーカイブ動画はこちらです。
Recursive Language Models(RLMs)
今回は、言語モデルが入力を分解し自身を再帰的に呼び出す「Recursive Language Models(RLMs)」をキャッチアップしました。
RLMsのGitHubリポジトリはこちらです。
ブログ記事はこちらです。
今回のポイント
Recursive Language Model(RLM)とは
Recursive Language Model(RLM)は、言語モデルが言語モデルを呼び出すことで、実質的に無限の入力・出力を可能にするしくみです。
ルートの言語モデルは入力全体を読み取ることなく、PythonのREPL環境を使ってサブの言語モデルを呼び出すことで処理を進めます。
長い入力・出力に対応するため、ある程度の単位で分割して言語モデルを呼び出すこと自体はよくある手法ですが、その分割のサイズや方法を言語モデルが動的に決めるのが特徴です。
実際に動かしてみた
実際にRLMを動かしてみました。
RLMはuv add rlmsでインストールして、通常のLLM呼び出し(llm.completion(prompt, model))をrlm.completion(prompt, model)に置き換えるだけで使うことができます。
計算タスク
まずは、READMEに記載されている計算タスクを試しました。 ルートの言語モデルがまずコンテキスト(入力)を確認するコードを実行します。 入力が変数に格納されているため、Pythonコードで必要な長さだけ確認するのは面白いですね。

その後Pythonコードで計算を行い、FINAL_ANSWER関数で最終回答を返すという流れで処理が進みました。


ブログ記事の要約タスク
次に、長文を処理する様子を確認するため、ブログ記事の要約を試しました。
ルートの言語モデルはまずコンテキスト(入力)の長さと先頭1500文字を確認しました。

その後、コンテキストを複数のチャンクに分割し、llm_query_batchedで各セクションの要約を並列に実行し、アグリゲート用のプロンプトでサブの言語モデルを呼び出して要約結果を結合しました。

RLMのシステムプロンプト
RLMの実装が気になったので、システムプロンプトがどこにあるか確認したところ、以下にありました。
https://github.com/alexzhang13/rlm/blob/413c3730/rlm/utils/prompts.py#L7-L116
PythonのREPL環境を使えることや、特有の変数・関数が用意されていること、サブの言語モデルを使えることなどが説明されています。
コーディングエージェントとの類似性
RLMの動作を見ていて、コーディングエージェントの動き方と似ていると感じました。
コーディングエージェント(Claude Codeなど)への指示をファイルに書いておくと、エージェントはそのファイルを適宜読み込んで内容を確認し、必要に応じてサブエージェントに処理を委譲します。
RLMにおいて、入力が変数としてREPL環境に格納され、ルートの言語モデルがサブの言語モデルを呼び出して処理を進める様子と似ています。
一方で違いとして、RLMではルートの言語モデルは入力の先頭以外はあまり読まないことは特徴的だと思います。
次回のご案内
以上、今回は「Recursive Language Models(RLMs)」をキャッチアップしました。
次回は「AIエージェントキャッチアップ #70 - tree-sitter」ということで、AIエージェントの実装でよく使われるパーサージェネレーター「tree-sitter」がテーマです!
https://generative-agents.connpass.com/event/387534/generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!