AIエージェント活用実践編単一エージェント実装 — ReAct ループの基本

Context window の管理

無料公開レッスン / 読了目安 7


学習のねらい

LLM エージェントが ReAct ループを繰り返す中で、これまでの会話履歴やツールの実行結果 (Observation) はどんどん増えていきます。 これらの情報は LLM の Context window (コンテキストウィンドウ) に格納されますが、このウィンドウには容量の制限があります。 本レッスンでは、Context window の制限がエージェントの動作にどのように影響するかを理解し、古い情報を効率的に管理するための基本的なパターンについて学びましょう。

トークン上限とエージェントループ

LLM は、入力として受け取れるテキストの量に上限があります。これを トークン上限 (Token Limit) または Context window サイズと呼びます。 例えば、Claude 3 Opus は最大 200,000 トークン、Claude 3 Sonnet は 200,000 トークン、Claude 3 Haiku は 200,000 トークンの Context window を持っています。 しかし、実際の利用では、これだけの長さを常に使えるわけではなく、コストやレイテンシー (応答速度) の観点から、より短い Context window で運用することが一般的です。

ReAct ループでは、「Thought → Action → Observation」の各ステップで生成されるテキストが Context window に追加されていきます。 特に Observation は、ツールの実行結果によっては非常に長くなることがあります。 もし Context window が上限に達すると、LLM は過去の情報の一部を「忘れて」しまったり、エラーが発生したりする可能性があります。 これにより、エージェントはタスクの文脈を見失い、期待通りの動作ができなくなるかもしれません。

古い Observation を圧縮する基本パターン

Context window の上限に達するのを防ぐため、エージェントのループが長くなってきたら、古い情報を圧縮したり、不要な情報を削除したりする戦略が必要になります。

1. 要約 (Summarization)

最も一般的な方法の一つは、古い Observation や会話履歴を LLM 自身に要約させることです。

  • 仕組み: ある程度のステップが経過したら、それまでの履歴を LLM に渡し、「これまでの会話の重要なポイントを簡潔に要約してください」と指示します。
  • 利点: 重要な情報を保持しつつ、トークン数を大幅に削減できます。
  • 欠点: 要約の過程で重要な詳細が失われるリスクがあります。

2. フィルタリング (Filtering)

特定の条件に基づいて、不要な情報を削除する方法です。

  • 仕組み: 例えば、エラーログやデバッグ情報など、タスクの進行に直接関係のない Observation は Context window から除外します。
  • 利点: 不要な情報を確実に削除し、Context window を清潔に保てます。
  • 欠点: どの情報が不要かを判断するロジックが必要になり、誤って重要な情報を削除してしまうリスクがあります。

3. スライディングウィンドウ (Sliding Window)

常に最新の N 個のターン (Thought-Action-Observation のセット) だけを保持し、古いものから順に捨てていく方法です。

  • 仕組み: Context window の上限に近づいたら、最も古いターンを削除し、新しいターンを追加します。
  • 利点: 実装が比較的シンプルで、常に最新の情報を LLM に提供できます。
  • 欠点: 重要な情報が古いターンに含まれていた場合、それが失われてしまう可能性があります。

これらのパターンは単独で使うだけでなく、組み合わせて使うこともできます。例えば、一定期間経過した Observation は要約し、さらに古いものは削除するといった戦略です。

max_iterations の設定

Context window の管理と密接に関わるのが、エージェントの max_iterations (最大繰り返し回数) の設定です。 これは、ReAct ループが実行できる最大回数を制限するもので、以下の目的で設定します。

  • 無限ループの防止: エージェントがタスクを完了できない場合に、永遠にループし続けるのを防ぎます。
  • コストの抑制: 無制限な API コールやトークン消費を防ぎ、コストを予測可能にします。
  • パフォーマンスの保証: 長すぎるループは応答速度の低下を招くため、適切なイテレーション回数でタスクを完了させることを促します。

max_iterations に到達した場合、エージェントは通常、タスクを中断し、これまでの結果をユーザーに報告するか、エラーとして処理します。 この値は、タスクの複雑さや許容される処理時間、コスト予算に応じて慎重に設定する必要があります。

まとめ

ReAct エージェントの Context window 管理は、安定した動作とコスト効率のために不可欠です。 トークン上限を意識し、要約、フィルタリング、スライディングウィンドウといった手法を組み合わせて古い Observation を効率的に管理しましょう。 また、max_iterations を設定することで、無限ループやコスト超過を防ぎ、エージェントの信頼性を高めることができます。

参考リンク


Context window の管理 | AIエージェント活用実践編 第1章 - AI研修