AI News HubLIVE
サイト内リライト4 分で読了

コンテキストウィンドウの壁を打破:Amazon Bedrock AgentCore で再帰的言語モデルを実装する

本記事では、Amazon Bedrock AgentCore Code Interpreter と Strands Agents SDK を使用して再帰的言語モデル(RLM)を実装し、任意の長さのドキュメントを処理する方法を紹介します。コンテキストウィンドウの制限から解放され、モデルはコードを使って反復的にドキュメントを分析し、サブLLMを呼び出して意味理解を行います。

ソースAWS Machine Learning Blog著者: Yuan Tian

数百万文字に及ぶドキュメントを分析する際、コンテキストウィンドウの壁に直面し、最大のコンテキストウィンドウでも不十分です。モデルが入力を拒否するか、不完全な情報に基づいて回答を生成します。では、コンテキストウィンドウに収まらないドキュメントをどのように推論すればよいのでしょうか。本記事では、Amazon Bedrock AgentCore Code Interpreter と Strands Agents SDK を使用して再帰的言語モデル(RLM)を実装し、任意の長さのドキュメントを処理する方法を説明します。

コンテキストウィンドウが不十分な理由

典型的な財務分析タスクとして、企業の年次報告書2年分の指標を比較する場合を考えます。各報告書は300〜500ページあり、アナリストレポートやSEC提出書類などを加えると、数百万文字に達します。これらのドキュメントを直接モデルに送信すると、入力がコンテキストウィンドウ制限を超えてリクエストが失敗するか、または入力が収まってもモデルが長い入力の中間部分に注意を向けるのが難しくなり、「中間に迷い込む」問題が発生します。これらの障害は、コンテキストウィンドウサイズがハードリミットであり、プロンプトエンジニアリングだけでは解決できないために発生します。ドキュメントサイズをモデルのコンテキストウィンドウから切り離すアプローチが必要です。

RLM:コンテキストを環境として扱う

RLMは、ZhangらによるarXiv:2512.24601で導入され、問題の枠組みを変えました。RLMは、ドキュメント全体をモデルのコンテキストウィンドウに詰め込む代わりに、入力をモデルがプログラム的に操作できる外部環境として扱います。モデルはクエリと利用可能な環境の説明のみを受け取り、コードを記述して反復的にドキュメントを検索、スライス、分析します。特定のセクションの意味理解が必要な場合、その分析をサブLLM呼び出しに委任し、結果はPython変数としてワーキングメモリに保持され、コンテキストウィンドウのスペースを消費しません。これにより再帰的構造が生まれます:ルートLLMがコードを通じて分析を指揮し、必要に応じてサブLLMを呼び出してセマンティックタスクを実行する一方、ドキュメント全体はモデルのコンテキストウィンドウに入りません。

アーキテクチャ

以下に、Amazon Bedrock AgentCore Code Interpreter を実行環境として使用してRLMを実装する方法を示します。アーキテクチャは3つのコンポーネントで構成されます。

  • ルートLLMエージェント:Strands Agents SDKで構築され、ユーザーのクエリを受け取り、実行するコードを決定します。
  • Code Interpreter セッション:PUBLICネットワークモードで実行され、ドキュメント全体がPython変数として事前にロードされます。
  • llm_query() 関数:サンドボックスに注入され、Code Interpreter 内部から直接Amazon Bedrockを呼び出し、サブLLMの結果はPython変数に保持され、ルートLLMのコンテキストウィンドウに戻りません。

Amazon Bedrock AgentCore Code Interpreter のPUBLICネットワークモードにより、サンドボックスは外部API呼び出し(Amazon Bedrockへの)が可能になり、永続的なセッション状態により変数や中間結果が複数のコード実行にわたって蓄積され、分析全体を通じてモデルにワーキングメモリを提供します。

実装手順

前提条件:AWSアカウントとAmazon Bedrock基盤モデルへのアクセス、Python 3.10以降、AWS CLIの設定、PythonとBoto3の基礎知識、PUBLICネットワークモードで構成されたBedrock AgentCore Code Interpreter、適切なIAM権限。

ステップ1:Code Interpreter セッションを開始し、ドキュメントをロード Bedrock AgentCore Code Interpreter セッションを作成し、ドキュメントをサンドボックスに書き込みます。

import boto3
client = boto3.client('bedrock-agentcore', region_name='us-east-1')
response = client.start_code_interpreter_session(
    codeInterpreterIdentifier=code_interpreter_id,
    name="rlm-session",
    sessionTimeoutSeconds=3600
)
session_id = response["sessionId"]
client.invoke_code_interpreter(
    codeInterpreterIdentifier=code_interpreter_id,
    sessionId=session_id,
    name="writeFiles",
    arguments={"content": [{"path": "_context.txt", "text": document}]}
)

ステップ2:サンドボックス内でドキュメントを初期化し、llm_query() ヘルパー関数を定義

with open('_context.txt', 'r') as f:
    context = f.read()

def llm_query(prompt: str) -> str:
    response = bedrock_client.invoke_model(
        modelId=sub_model_id,
        body=json.dumps({
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 4096,
            "messages": [{"role": "user", "content": prompt}]
        })
    )
    result = json.loads(response['body'].read())
    return result['content'][0]['text']

ステップ3:Strands Agent を作成し、クエリを実行 Strands Agents SDKを使用してエージェントを作成し、execute_python ツールを装備した後、質問を送信します。エージェントは反復的にPythonコードを記述して実行し、ドキュメントを探索し、関連セクションを抽出し、必要に応じて llm_query() を呼び出します。

評価結果

LongBench v2の金融マルチドキュメントQAサブセット(15問の多肢選択問題、各問題は複数の財務報告書を分析、コンテキスト長は約200万文字)で評価しました。以下の3つのアプローチを比較しました:Base(ドキュメントを直接送信、200Kトークンウィンドウ)、Long Context(Claudeの100万トークン拡張ウィンドウを使用)、RLM。

主な結果:

  • RLMはコンテキスト長の失敗を解消:Baseの成功率は46.7%、Long Contextは93.3%だったのに対し、RLMはすべての設定で100%を達成。
  • RLMはほとんどのモデルで精度を向上:Claude Sonnet 4.6とOpus 4.6では、RLMにより精度が60.0%と66.7%から73.3%と80.0%に向上。Claude Haiku 4.5は33.3%から66.7%に向上。ただし、Claude Sonnet 4.5では改善なし(両方66.7%)。これはRLMの利得がルートモデルのタスク分解能力に依存することを示唆します。
  • サブLLMの選択は限定的な影響:Haiku 4.5をサブLLMとして使用する場合と、ルートとサブに同じモデルを使用する場合で、精度に有意差は見られませんでした。

さらに、コードリポジトリ理解サブセット(50問)でのテストでも、RLMがコードベースのナビゲーションや関数依存関係の解決に有効であることが確認されました。

結論

再帰的言語モデルは、ドキュメントを外部環境として扱い、プログラム的な操作を利用することで、コンテキストウィンドウの制限をうまく回避します。Amazon Bedrock AgentCore Code Interpreter の永続的なサンドボックスとサブLLM呼び出し機能と組み合わせることで、RLMは任意の長さのドキュメントを100%の成功率で処理し、精度も向上させます。このアプローチは、大規模ドキュメント分析やコードベース理解のシナリオに実用的なソリューションを提供します。