エージェント設計パターン

2026年9月21日

🐧 要するにどういう話か

LLMを用いてエージェントを構築する際の設計パターンについて。主にAnthropicの記事を参考にしている。

1. はじめに

LLMの文脈で「エージェント」と言ったとき、人によって指すものが違う。完全に自律的に長時間動作し、自らの判断でツールを選択して複雑なタスクをこなすシステムを指す人もいれば、開発者が事前に定義したコードパスに従って動作するシステムを指す人もいる。

この記事では、両方を「エージェント系システム」という総称で扱う。ただし、アーキテクチャ上の区別は明確にする。

  • ワークフロー — LLMとツールを、事前に定義されたコードパスで制御するシステム。制御の流れは開発者が決める。
  • エージェント — LLMが自らのプロセスとツール使用を動的に指揮するシステム。制御の流れは実行時にモデルが決める。

使用タイミング

第一の原則は単純さである。最もシンプルな方式から始め、複雑さは成果が明確に改善される場合のみ追加する。エージェント系システムは、タスク性能を高める代わりにレイテンシとコストが増える。そのため、追加の複雑さには測定的な改善が求められる。多くのアプリケーションでは、検索とコンテキスト内例を備えた単一のLLM呼び出しで十分である。

複雑さが必要と判断された場合:

  • タスクが明確に定義されており、予測可能性が求められる場合はワークフローを選ぶ。
  • 柔軟性とモデル主導の意思決定が必要で、コストと誤りの蓄積のリスクを許容できる場合はエージェントを選ぶ。

この記事では、基本構成要素から始め、複雑さが増す順にワークフローパターンを紹介し、最後にエージェントについて述べる。

2. 拡張LLM

エージェント系システムの基本的な構成要素は、外部能力で拡張されたLLMである。

  • 検索 — 外部ナレッジベースやドキュメントへのアクセス。
  • ツール — 外部システム(API、コード実行、データベース)と対話するための関数。
  • メモリ — 対話を通じて情報を保持し、呼び戻す能力。

現代のLLMはこれらの能力を能動的に使える。自ら検索クエリを生成し、適切なツールを選択し、保持する情報を判断する。実装上重視すべきは2点である。

  • 拡張機能を具体的なユースケースに適合させる。
  • LLMに対して、各能力のインターフェースを明確に、十分にドキュメント化して提供する。

ツールの統合としてModel Context Protocol(MCP)という方式がある。サードパーティ製ツールをモデルに公開する方法を標準化するものである。具体的な機構よりも、モデルが必要とする情報や操作に確実にアクセスできることを担保することが本質である。

以降の記事では、各LLM呼び出しがこれらの拡張能力にアクセスできる前提で記述する。

3. ReAct:推論と行動の統合

問題

ReActの登場前まで、推論と行動は別々に研究されてきた。

  • 推論(Chain-of-Thought, CoT) — モデルが中間の思考を連鎖させて回答を導く方式。これは静的なブラックボックスであり、モデルは内部表現だけに依存する。外部証拠に根拠を置けず、ハルシネーションや誤りの伝播が生じやすい。
  • 行動のみ — モデルが環境と対話する行動を生成する方式。明示的な推論がないため、計画を立てたり、進捗を追跡したり、例外に対処したりできない。

どちらか一方だけでは、計画と外部情報源との対話の両方が必要なタスクには不十分である。

ReActのアイデア

ReActは、エージェントの行動空間に言語空間を追加する。モデルが推論トレース(思考)とタスク固有の行動を交互に生成する。

  • 推論トレースは環境に影響しない。現在のコンテキストを推論して有用な情報を構成する。目標の分解、進捗の追跡、例外の処理、常識知識の注入などがこれにあたる。
  • 行動は環境に影響し、観察(observation)を返す。その観察は推論のコンテキストにフィードバックされる。

これにより相乗効果が生まれる。推論が「どの行動を取り、その結果をどう解釈するか」を導き、行動が推論を根拠づける外部情報を提供する。

効果

  • ハルシネーションの軽減。 外部ソース(Wikipedia APIなど)から情報を取得し、結論を出す前に検証することで、純粋なCoT推論に固有の事実ハルシネーション問題を克服する。
  • 意思決定の向上。 対話型ベンチマーク(ALFWorld、WebShop)において、1,000〜100,000件のタスクインスタンスで訓練された模倣学習や強化学習の手法を、コンテキスト内例を1〜2個のみで使用しながら上回る。
  • 解釈可能性の向上。 推論トレースを検査することで、各行動の根拠を人間が理解できる。モデルの内部知識と外部から取得した情報を区別できる。

ReActは、思考→行動→観察のループをタスク完了まで繰り返すパターンであり、多くのLLMエージェントの基盤となる。

4. Reflexion:言語による強化学習

問題

従来の強化学習はモデルの重みを更新してエージェントの行動を改善するが、大量の学習サンプルと高コストなファインチューニングを必要とする。LLMベースのエージェントでは、多くのタスクでこれは現実的でない。

Reflexionのアイデア

Reflexionは、重みの更新の代わりに言語による強化を用いる。パラメータを調整する代わりに、エージェントが以下を行う。

  1. 軌跡(行動と観察の列)を実行する。
  2. 結果を評価する(成功/失敗、あるいはスカラー値)。
  3. 失敗を自然言語で自己省察し、何が間違えであったか、どうすればよかったかを記述する。
  4. その省察テキストを出来事記憶に保存する。
  5. 次のトライアルでは、出来事記憶が追加コンテキストとして提供され、より良い判断を導く。

これは、省察テキストが「意味的勾配」として機能するからである。不透明なスカラー報酬の代わりに、モデルが解釈可能な具体的な改善方向を与える。

構成要素

  • アクター — 行動を生成する(CoTやReActのポリシーを想定)。
  • 評価者 — 軌跡に採点する(完全一致、ヒューリスティック、LLMによる審査など)。
  • 自己省察モデル — 軌跡と評価信号から、言語的なフィードバックを生成する。
  • メモリ — 直近の1〜3件の自己省察を長期的コンテキストとして保持する。

効果

  • 軽量。 ファインチューニング不要。学習ループ全体がプロンプトベースである。
  • 解釈可能。 学習シグナルが自然言語なので、エージェントが何を学習したかを直接確認できる。
  • 有効。 HumanEvalで91% pass@1(GPT-4ベースラインの80%を上回る)、ALFWorldで成功率+22%、HotPotQAで正解率+20%の改善。

Reflexionが示すのは、フィードバックがモデルが理解する同一のモダリティ(言語)で表現される限り、LLMは勾配降下なしに自らの失敗から学習できるという洞察である。

5. ワークフローパターン

ワークフローは、制御の流れが事前に定義されているエージェント系システムである。以下のパターンを、複雑さが増す順に紹介する。

5.1 プロンプトチェイニング

パターン: タスクを固定の順序のステップに分解し、各LLM呼び出しが前ステップの出力を処理する。ステップ間にプログラムのチェック(ゲート)を挿入して、品質を確認してから進行できる。

flowchart LR A[LLM呼び出し1] --> G1{ゲート} G1 --> B[LLM呼び出し2] B --> G2{ゲート} G2 --> C[LLM呼び出し3]

使用場面: タスクが固定のサブタスクにきれいに分解でき、各LLM呼び出しを単純化することでレイテンシと引き換えに精度を上げたい場合。

例:

  • マーケティングコピーを生成し、それを別の言語に翻訳する。
  • アウトラインを作成し、基準を満たすか検証してから、アウトラインに基づいて本文を書く。

5.2 ルーティング

パターン: 入力を分類し、専用の後続処理へ振り分ける。関心の分離(separation of concerns)により、カテゴリごとに最適化されたプロンプトやツールを構築できる。各パスは独立したプロンプト、ツール、モデルを持てる。

flowchart LR I[入力] --> R{ルータ} R -->|種別A| A[処理A] R -->|種別B| B[処理B] R -->|種別C| C[処理C]

使用場面: 入力空間に明確なカテゴリがあり、カテゴリごとに異なる処理が有効な場合。分類がLLMや従来の分類器によって信頼性をもって行える場合。

例:

  • カスタマーサービスの問い合わせ(一般質問、返金リクエスト、技術サポート)をそれぞれ異なるプロンプトやツールに振り分ける。
  • 単純な質問は小規模で低コストなモデルに、複雑な質問は高性能なモデルに振り分ける。

5.3 並列化

パターン: 複数のLLM呼び出しを同時に実行し、出力をプログラムで集約する。2つの主要なバリエーションがある。

  • 分割(sectioning) — タスクを独立したサブタスクに分割し、並行実行する。各サブタスクに専念できる。
  • 投票(voting) — 同一のタスクを複数回実行し(プロンプトやシードを変えて)、出力の多様性から信頼性を高める。
flowchart LR T[タスク] --> A[LLM呼び出しA] T --> B[LLM呼び出しB] T --> C[LLM呼び出しC] A --> AGG[集約] B --> AGG C --> AGG

使用場面:

  • サブタスクが独立しており、並行実行で高速化できる場合。
  • 高信頼な結果のために複数の視点や試行が必要な場合。
  • 複雑なタスクに複数の考慮点があり、それぞれに専念したLLM呼び出しの方が良い場合。

例: - 分割: ユーザーのクエリを処理するモデルと、不適切なコンテンツをスクリーニングするモデルを別々に用意する。単一の呼び出しで両方を行うより性能が向上する。 - 投票: 複数のプロンプトでコードのスニペットを脆弱性の観点からレビューし、複数のレビュアーが合致したときにのみ指摘を確定する。

5.4 オーケストレーター-ワーカー

パターン: 中央のLLM(オーケストレーター)がタスクを動的に分解し、ワーカーLLMに委譲し、その結果を統合して最終出力を生成する。

flowchart TB T[タスク] --> O[オーケストレーター] O -->|サブタスク1| W1[ワーカー1] O -->|サブタスク2| W2[ワーカー2] O -->|サブタスク3| W3[ワーカー3] W1 --> O W2 --> O W3 --> O O --> R[最終出力]

並列化との違い: 並列化ではサブタスクが開発者により事前定義される。オーケストレーター-ワーカーでは、オーケストレーターが入力に応じて実行時に必要なサブタスクを決定する。

使用場面: 必要なサブタスクを事前に予測できない場合。例えばコーディングでは、変更すべきファイルの数や各ファイルの変更内容がタスクに依存する。

例: - 複数ファイルにまたがる複雑な変更を行うコーディングエージェント。 - 複数の情報源から情報を収集・統合する検索エージェント。

5.5 評価者-最適化者

パターン: 1つのLLMが出力を生成し、別LLMがそれを評価してフィードバックを返す。生成側がフィードバックに基づいて修正し、基準を満たすまでループを繰り返す。

flowchart LR G[生成LLM] --> E[評価LLM] E -->|フィードバック| G E -->|合格| D[完了]

使用場面:

  • 明確な評価基準がある場合。
  • 反復的な改善が出力品質を測定的に向上させる場合。
  • LLMが作品の生成と批評の両方を行える場合(人間のライターの起草→修正サイクルに類する)。

例:

  • 文学翻訳で、翻訳LLMが捉えられなかったニュアンスを評価LLMが指摘する。
  • 複数ラウンドの検索で、評価者がさらなる検索が必要かを判断する。

Reflexionとの関係:Reflexionは、評価と自己省察をエージェント自身が行い、フィードバックを1回のループで捨てずトライアル間で保持する、評価者-最適化者の自己完結的なインスタンスである。

6. エージェント

エージェントは、LLMが自らのプロセスに対して動的な制御を持つエージェント系システムである。ワークフロー(開発者が制御の流れを定義する)とは異なり、エージェントは実行時に以下を決定する。

  • 次に何をやるか。
  • どのツールを使うか。
  • 人間に情報を求めるタイミング。
  • タスクが完了したか。

動作

エージェントは典型的に次のループで動作する。

  1. 計画 — 目標をステップに分解する。
  2. 実行 — ツールを呼び出し、APIを叩いて、ファイルを編集する。
  3. 観察 — 環境から正解(ツール実行結果、コードの出力、テスト結果)を得る。
  4. 評価 — 目標に対する進捗を判断する。
  5. 継続または停止 — 目標未達なら継続。完了または停止条件(最大反復回数など)に達したら停止する。

エージェントはチェックポイントで人間への確認を挟むこともできる。特に曖昧さや障害に遭遇したときである。

使用場面

  • 問題がオープンエンドで、ステップ数や解決への経路を予測できない。
  • 必要な行動が中間結果に依存するため、固定のワークフローにできない。
  • モデルの意思決定を一定程度信頼でき、適切なガードレールを提供できる。

リスク

  • コスト。 多くのターンが走り、各ターンでトークンを消費する。
  • 誤りの蓄積。 初期の誤りが後続の行動に連鎖し、ますます的外れな動作を生む。

対策:

  • 本番運用前にサンドボックス環境で十分なテストを行う。
  • ガードレール(入力検証、出力フィルタリング、支出上限)。
  • 停止条件(最大反復回数、タイムアウト)。
  • 重要な判断には人間によるチェックポイント。

例

  • SWE-benchのタスク(タスク記述に基づき複数ファイルを編集)を解決するコーディングエージェント。
  • GUIを操作してユーザー指定のタスクを達成するコンピュータ使用エージェント。

7. まとめ

最も洗練されたシステムを作るのが目標なのではない。必要な用途に適したシステムを作ることが目標である。シンプルに始め、測定し、成果が明確に改善される場合のみ複雑さを追加する。

エージェント系システムの設計における3つの原則:

  1. 単純性。 機能する最もシンプルなアーキテクチャを使う。良い検索を備えた単一のLLM呼び出しが、複雑なマルチエージェント構成を上回ることは珍しくない。
  2. 透明性。 エージェントの計画ステップを可視化し、検査可能にする。デバッグ、信頼性、改善のすべてに不可欠である。
  3. エージェント-コンピュータインターフェース(ACI)への投資。 ツールの定義、ドキュメント、エラーメッセージの品質が、プロンプトの品質と同程度の影響を与える。人間向けのAPIを設計するのと同じ水準の注意をツール設計に払う。

📚 参考文献