メインコンテンツへ移動
,

【設計パターン】マルチエージェントシステム入門:Planner-Builder-Evaluator完全解説

※この記事にはアフィリエイトリンクが含まれる場合があります。

SupervisorとWorkerが連携するマルチエージェントの全体像

単一エージェントでも十分に動くシステムは多いものの、規模が大きくなったり、品質と速度を両立させたい場面では「複数のエージェントを協調させる」設計に踏み込む価値があります。2026年5月時点では、Claude Agent SDKのサブエージェント機能、LangGraph、AutoGenなどが整い、マルチエージェント開発のハードルは大きく下がりました。

一方で、安易に複数エージェント化すると、コンテキストロス、無限ループ、コスト爆発という3大事故が必ず起きます。本記事では、主要5パターンの使い分けと、通信モード、失敗モード対策までを実装目線で整理します。

マルチエージェントとは:単一エージェントと何が違うか

マルチエージェントシステムは、複数のLLMエージェントがそれぞれ異なる役割・コンテキスト・ツールセットを持ち、協調して1つの目標を達成するアーキテクチャです。単一エージェントが「1人で全部やる職人」だとすると、マルチエージェントは「役割の違う複数人で進めるプロジェクトチーム」に近い構造になります。

本質的な違いは、コンテキストの分離にあります。1つのエージェントに全部詰めると、システムプロンプトや過去履歴が膨らみ、注意散漫になります。複数エージェントに分割すれば、それぞれが自分のスコープに集中でき、品質と長時間運用の安定性が上がります。代償として、エージェント間の通信設計やオーケストレーションの複雑さが増えます。

マルチが単一を超える条件

マルチエージェント化が効くのは、次のいずれかが当てはまるときです。それ以外の場合は、まず単一エージェントで素直に書く方が安く速いです。

  • タスクが明確に分業可能(例:計画/実装/レビュー)。
  • 独立して並列実行できるサブタスクがある(例:複数ファイルの分析)。
  • 自己評価バイアスを避けたい(書いた本人が採点しない)。
  • 役割ごとに異なるモデル・コスト帯を使い分けたい(例:計画はOpus、量産はHaiku)。
  • 1Mコンテキストでも収まらない、長期・大規模ワークフロー。

逆に、ターン数が3〜5回で完結する単機能タスク(メール下書き、CSV要約、コード変換など)は、単一エージェントで十分です。マルチ化のコストを正当化するには、複雑さの絶対量が一定以上必要になります。

5つの主要設計パターン

マルチエージェント設計パターンの概念図

Supervisor/Worker

最も実用的で、最初に学ぶべきパターンです。1人のSupervisor(指揮者)がタスクを分解し、複数のWorkerに割り振り、結果を集約します。Claude Agent SDKの「サブエージェント呼び出し」もこの形を採用しています。Supervisorに高品質モデル(Opus 4.7やSonnet 4.6)、Workerに軽量モデル(Haiku 4.5)を割り当てると、品質とコストのバランスが取りやすくなります。

Planner/Executor

計画フェーズと実行フェーズを明確に分けるパターンです。Plannerが詳細なステップを設計し、Executorがそれを忠実に実行します。長時間タスクや、計画の妥当性を人手でレビューしたいケースに向いています。Plannerの出力をJSON/Markdownでファイル化しておくと、再利用やデバッグが楽になります。

Debate/Consensus

同じ問題に対して2つ以上のエージェントを独立に走らせ、互いの回答を批評・統合して最終回答を決めるパターンです。コードレビュー、設計判断、リスク評価のように「異なる視点が品質を上げる」場面で効きます。コストはほぼN倍になるので、重要意思決定だけに絞るのがコツです。

Hierarchical

Supervisor/Workerを多段化したパターンです。トップのSupervisorが中間Supervisorを呼び、その下にWorkerが並ぶ、組織図のような構造になります。大規模なドキュメント分析や、多段の品質ゲートが必要な業務プロセスに合いますが、デバッグ難度は急上昇するので、必要になるまで採用を避けるのが無難です。

Swarm

中央指揮者を置かず、フラットな複数エージェントが共有メモリやメッセージバスを通じて自律的に協調するパターンです。研究領域では盛んですが、本番運用では制御が難しく、2026年5月時点では実用例はまだ限定的です。学習用としては面白い領域です。

エージェント間通信の3モード

エージェント同士をどうつなぐかで、システムの性格は大きく変わります。実務では次の3モードのどれかか、その組み合わせになります。

  • Shared Scratchpad:全エージェントが読み書きできる共有ノート。Markdownファイル1枚で実装することも多い。シンプルだが、エージェントが増えると衝突しやすい。
  • Message Bus:エージェント間で名前付きメッセージをやり取りする方式。LangGraphやAutoGenが採用。並列処理に強い一方、デバッグはやや難。
  • Structured Handoff:呼び出し元が引数を構造化して渡し、戻り値で結果を受け取る関数呼び出し型。Claude Agent SDKのサブエージェント呼び出しはこの形に近い。型が明確で扱いやすい。

初学者にはStructured Handoffが圧倒的におすすめです。関数呼び出しと同じ感覚で書け、引数と戻り値の型を意識するだけでだいぶ事故が減ります。

主要フレームワーク

フレームワーク得意なパターン通信モード備考
Claude Agent SDKSupervisor/Worker, Planner/ExecutorStructured HandoffClaudeネイティブ、サブエージェント標準対応
LangGraphHierarchical, DebateMessage Bus状態遷移グラフが書きやすい
AutoGenDebate/Consensus, SwarmMessage Busエージェント同士の自由会話に強い
CrewAISupervisor/WorkerShared Scratchpad中心役割ベースで直感的だが細かい制御は弱い

Supervisor-Workerパターンの擬似コード

もっとも実用的なSupervisor/Workerを、Claude APIだけで書いた最小構造で示します。Supervisorはdelegate_to_workerツールでサブタスクをWorkerに渡し、結果を集約して最終出力を作ります。

from anthropic import Anthropic

client = Anthropic()

def run_worker(task: str) -> str:
    resp = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=1024,
        system="あなたは与えられたサブタスクだけを正確に遂行するWorkerです。",
        messages=[{"role": "user", "content": task}],
    )
    return resp.content[0].text

SUPERVISOR_TOOLS = [{
    "name": "delegate_to_worker",
    "description": "サブタスクをWorkerに委譲し結果を取得します。",
    "input_schema": {
        "type": "object",
        "properties": {"task": {"type": "string"}},
        "required": ["task"],
    },
}]

def run_supervisor(goal: str) -> str:
    messages = [{"role": "user", "content": goal}]
    for _ in range(8):  # ハードリミット
        resp = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=2048,
            system="あなたはSupervisorです。必要に応じてWorkerにサブタスクを委譲し、最終回答を作ります。",
            tools=SUPERVISOR_TOOLS,
            messages=messages,
        )
        if resp.stop_reason != "tool_use":
            return resp.content[0].text
        tool_results = []
        for block in resp.content:
            if block.type == "tool_use":
                out = run_worker(block.input["task"])
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": out,
                })
        messages.append({"role": "assistant", "content": resp.content})
        messages.append({"role": "user", "content": tool_results})
    raise RuntimeError("Supervisor turn limit exceeded")

ポイントは、(1) Supervisorに高品質モデル、Workerに軽量モデルを割り当てている点、(2) ループに必ずハードリミットを設けている点、(3) Worker呼び出しがClaude側からは「単なるツール呼び出し」に見える点です。この骨格を覚えれば、Workerを3〜5種類に増やしても、同じ構造で拡張できます。

失敗モードと対策

マルチエージェントの3大失敗モード

マルチエージェントの本番運用で必ず遭遇する3つの失敗モードと、その対策を整理します。

  • コンテキストロス:あるエージェントが知っている情報を、別のエージェントが知らないことで起こる矛盾。対策は、共有スクラッチパッドへの要点書き込み、Structured Handoffでの必須情報の明示渡し。
  • 無限ループ:Supervisor↔Workerの呼び出しがお互いに振り合ってしまう現象。対策は、ターン数のハードリミット、同じツール呼び出しの繰り返し検知、Workerの結果を「最終」扱いにして再委譲を禁じるなど。
  • コスト爆発:エージェント数×ターン数×トークン量が掛け算で膨らむ。対策は、Workerの軽量化、Prompt Cachingでの共通プロンプト圧縮、月次コスト上限の設定。

特にコスト面は侮れません。Supervisor1回・Worker3回・各2ターンの構造でも、単一エージェントの7〜10倍のトークンを消費することがあります。Prompt Cachingやモデル使い分けで初期から最適化しておくと、本番投入の判断が楽になります。詳細は「Claude API料金を最適化する方法」も参照してください。

パターン選択フローチャート

「どのパターンを選ぶか」で迷ったら、次の順で考えると整理しやすくなります。

  1. そもそも単一エージェントで足りないか? 足りるなら単一で書く。
  2. 並列実行できるサブタスクがあるなら → Supervisor/Worker。
  3. 計画段階を人手レビューしたいなら → Planner/Executor。
  4. 重要意思決定で複数視点が欲しいなら → Debate/Consensus。
  5. 3段以上の分業が必要なら → Hierarchical。
  6. 研究目的でなければ Swarm は当面避ける。

まとめ

マルチエージェント設計は強力ですが、「単一で済むなら単一」が大前提です。必要性が固まったら、Supervisor/Workerから始め、Structured Handoffで通信し、ハードリミットとコスト上限を必ず入れる。これだけで実用的なシステムになります。エージェント単体の入門は「AIエージェント入門」、セキュリティ面は「AIエージェントのセキュリティリスクと対策」を合わせて読むと、現場で必要な視点が一通り揃います。

マルチエージェント開発を実践で学ぶ

Claude APIとエージェント設計を体系的に学べる、筆者のUdemy講座一覧です。

あわせて読みたい

Next Action

AIエージェント開発を体系的に学ぶ

MCP、Claude Code、マルチエージェント設計を、概念で終わらせず実装と運用までつなげます。

AIエージェント開発を体系的に学ぶ 完全マスターを読む