前回のマルチエージェントとは?で「複数AIの協調」の概念を押さえたら、次は実際にどう作るかだ。本記事は、2026年の事実上の標準であるスーパーバイザー型(司令塔型)を題材に、5ステップの実践手順を初心者向けに解説する。

難しいフレームワークの話に入る前に、最重要の原則を先に言う——「まず単一エージェントで作り、限界にぶつかってから最小構成で増やす」。最初から多人数で組むのは、たいてい過剰設計だ。後半では Claude Agent SDK と OpenAI Agents SDK の公式ドキュメントに沿った、そのまま読める最小構成のコードと、役割の分け方・よくある失敗例を示す。MCPで道具をつなぐ場合も、考え方は同じだ。

マルチエージェントの作り方 · 5ステップ

小さく作って、測ってから増やす

— スーパーバイザー型を最小構成から

1課題を分解する
2ワーカーを定義する(3〜5体まで)
3スーパーバイザーを設計する
4ハンドオフと文脈共有を決める
5計測し、上限を設けて運用する

※コードは Claude Agent SDK と OpenAI Agents SDK の公式ドキュメント(2026年10月4日に確認)に沿って書いた。SDK は更新が速いので、動かす前に引数名を各公式ドキュメントで確かめてほしい。数値は出典を本文に書いた。

1. 作る前に:本当にマルチが必要か

最初の関門は技術ではなく判断だ。マルチエージェントは強力だが、どの仕事にも効くわけではない。次のいずれにも当てはまらないなら、まずは単一エージェントで作るのが正解だ。

マルチにすべき3つのサイン

  • 専門性の分離:1つのプロンプトに知識を詰め込みきれない(調査・法務・コードなど領域がまたがる)
  • 並列性:複数の作業を同時に進めれば明らかに速くなる
  • 判断の分離:「実行役」と「検証役」を分けたほうが品質が上がる

逆に、前回も触れたとおり、一本道の処理にマルチを使うと損をする。Google Research の検証(2026年1月公開・180通りの構成を比較)では、計画のように厳密に順を追う課題(PlanCraft)で、試したマルチエージェント構成がすべて単一より39〜70%悪化した。費用も増える。Anthropic は自社の調査エージェントの解説で、エージェントはチャットの約4倍、マルチエージェントは約15倍のトークンを使うと書いている。「複数にすれば賢くなる」わけではない、を出発点に置こう。

2. 基本形=スーパーバイザー型(司令塔型)

どのパターンで作るか迷ったら、まずスーパーバイザー型(司令塔型)から始めるのが安全だ。主要な SDK はこの形を公式の基本パターンとして載せている。Claude Agent SDK ではメインのエージェントが Agent ツールでサブエージェントを呼び、OpenAI Agents SDK では「Agents as tools」(マネージャー役が専門エージェントを道具として呼ぶ形)がこれに当たる。

最終回答の持ち主が1人

司令塔が会話の主導権を持ち続け、ワーカーの結果をまとめて答える。OpenAI の文書も、1つのエージェントに最終回答を持たせたいときにこの形を勧める。

誤りが広がりにくい

Google Research の同じ検証では、互いに話さず並列に動く構成は誤りを17.2倍に増幅し、司令塔のある構成は4.4倍に抑えた。

監査しやすい

誰に・何を頼み・何が返ったかが司令塔の履歴に残る。ワーカーごとに道具を絞れるので、事故の範囲も読める。

仕組みはシンプルだ。スーパーバイザー(司令塔)が全体タスクを受け取り、サブタスクに分解し、専門ワーカーに委任し、結果を統合する。司令塔はワーカーの中身を知る必要はなく、「どのワーカーを・どんな出力フォーマットで呼ぶか」だけを判断する。専門知識はワーカー側が持つ。

なお、OpenAI Agents SDK でハンドオフと言うと、STEP 4 の「受け渡し」一般より狭い意味になる。受付役が専門役に会話そのものを引き渡し、以後は専門役が直接ユーザーに答える形だ。司令塔は残らないので、スーパーバイザー型とは別の型として扱う(使い分けは6章)。

3. 5ステップで作る

最小構成のスーパーバイザー型を、5つのステップで組み立てる。最初はワーカー2〜3体から始め、計測しながら必要に応じて増やすのが鉄則だ。

STEP 1. 課題を分解する

「最終ゴール」と「必要な専門役」を紙に書き出す。例:市場調査レポート作成なら「①情報収集→②分析→③執筆→④ファクトチェック」。分解は前もって明確に——ここが曖昧だと全体が崩れる。

STEP 2. ワーカーを定義する(3〜5体まで)

各ワーカーに1つの役割・必要なツール・出力フォーマットを与える。最初は欲張らず最大3〜5体。各ワーカーは独立し、自分のツール(検索・コード実行など)だけを持つ。

STEP 3. スーパーバイザーを設計する

司令塔のプロンプトに「呼び出してよいワーカー名」を明示的に列挙(ハードキャップ)。個々のワーカーより司令塔の設計に最も時間をかけるのがコツ。ここが全体の質を決める。

STEP 4. ハンドオフと文脈共有を決める

ワーカー間で何を・どの形式で受け渡すかを定義。全文脈を全員に渡すとトークンが膨張するので、必要な情報だけを選んで渡す。エージェント間連携の標準規約がA2Aだ。

STEP 5. 計測し、上限を設けて運用する

エージェントを増やす前に、すべてのハンドオフを計測する(可観測性は必須)。反復回数・トークン・コストに上限を設定。評価(Evals)とガードレールも同時に整える。

4. 最小コード例①:Claude Agent SDK(Python)

まず Anthropic の Claude Agent SDK で、司令塔1体+ワーカー2体(調査役・確認役)を組む。準備は pip install claude-agent-sdk と、環境変数 ANTHROPIC_API_KEY の設定だけだ(公式クイックスタート。SDK は .env を自動では読まない)。書き方は公式のSubagents のページに沿っている。SDK 全体の使い方はClaude Agent SDK の解説にまとめた。

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage

options = ClaudeAgentOptions(
    model="claude-opus-5-5",  # 司令塔(メインのエージェント)
    system_prompt=(
        "あなたは調査レポートの司令塔。調査は researcher、事実確認は reviewer に任せ、"
        "最終的な文章はあなたがまとめる。頼むときは目的・返す形式・範囲を必ず書く。"
    ),
    allowed_tools=["Agent", "WebSearch", "WebFetch"],  # 確認なしで使ってよい道具
    agents={
        "researcher": AgentDefinition(
            description="一次情報を集める調査役。事実や数値が必要なときに使う。",
            prompt="与えられた問いの一次情報を探し、出典URLつきの箇条書きで返す。推測で補わない。",
            tools=["WebSearch", "WebFetch"],  # この役が持てる道具はこれだけ
            model="sonnet",
            maxTurns=15,
        ),
        "reviewer": AgentDefinition(
            description="下書きの事実確認役。文章を仕上げる前に必ず使う。",
            prompt="下書きの各主張を出典と突き合わせ、裏づけの無い文を一覧で返す。",
            tools=["WebFetch"],
            model="sonnet",
            maxTurns=10,
        ),
    },
    max_turns=30,         # 全体の往復の上限
    max_budget_usd=5.0,   # 費用の上限(SDK の見積もり)
    env={"CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": "1"},  # ワーカーに子を作らせない
)


async def main():
    try:
        async for message in query(
            prompt="生成AIの業務利用について、公的な統計を3つ集めて短い報告にまとめて",
            options=options,
        ):
            if isinstance(message, ResultMessage):
                print(message.subtype, message.total_cost_usd)
                print(message.result)
    except Exception as error:
        print(f"途中で止まった: {error}")  # 上限に達したときもここに来る


asyncio.run(main())

押さえどころは5つある。

  • ワーカーは agents に AgentDefinition で並べる。司令塔はワーカーの description を読んで、いつ誰を呼ぶかを決める。だから description には「何をする役か・いつ使うか」を具体的に書く。
  • tools を列挙すると、その役はその道具しか持たない。確認役に書き込みの道具を渡さないのはこのためだ。一方 allowed_tools は「確認なしで使ってよい道具」の一覧で、道具を制限する設定ではない(公式の Python リファレンス)。
  • 上限は3重に置く。役ごとの maxTurns、全体の max_turns、費用の max_budget_usd。全体の上限に達すると、結果の種類が error_max_turns や error_max_budget_usd になって止まる(エージェントループの解説)。
  • 入れ子を止める。サブエージェントはさらに子を作れる。環境変数 CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH を 1 にすると、ワーカーは自分で作業する。同時実行数は CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS(既定20)で絞れる。
  • AgentDefinition の項目名はキャメルケース。maxTurns を max_turns と書くと、作る時点で TypeError になる(公式の注記)。モデルは司令塔に現行の claude-opus-5-5、ワーカーに別名 "sonnet" を指定した。別名なら版が上がってもコードを書き換えずに済む。

公式ドキュメントは、Opus 5 が以前のモデルより進んでサブエージェントに任せることを挙げ、プロンプトで頼むだけでなく、深さ・同時実行数・費用の上限も置くよう勧めている。指示は「頼み方」を変えるだけで、上限だけが実行を確実に止める。

5. 最小コード例②:OpenAI Agents SDK(Python)

同じ形を OpenAI の Agents SDK で書くと、専門エージェントを as_tool() で道具に変え、司令塔の tools に渡す(公式の Agents as tools)。準備は pip install openai-agents と環境変数 OPENAI_API_KEY だ(公式クイックスタート)。model を省くと SDK の既定モデルで動く。既定は SDK の版で変わるので、Models のページで確かめる。

import asyncio
from agents import Agent, Runner, WebSearchTool

researcher = Agent(
    name="Researcher",
    instructions="与えられた問いの一次情報を探し、出典URLつきの箇条書きで返す。推測で補わない。",
    tools=[WebSearchTool()],
)
reviewer = Agent(
    name="Reviewer",
    instructions="渡された下書きの各主張を出典と突き合わせ、裏づけの無い文を一覧で返す。",
)

manager = Agent(
    name="Manager",
    instructions=(
        "あなたは調査レポートの司令塔。調査は research、事実確認は review に任せ、"
        "最終的な文章はあなたがまとめる。"
    ),
    tools=[
        researcher.as_tool(
            tool_name="research",
            tool_description="一次情報を出典つきで集める",
            max_turns=10,  # この役の往復の上限
        ),
        reviewer.as_tool(
            tool_name="review",
            tool_description="下書きの事実確認をする",
        ),
    ],
)


async def main():
    result = await Runner.run(
        manager,
        input="生成AIの業務利用について、公的な統計を3つ集めて短い報告にまとめて",
        max_turns=10,  # 超えると MaxTurnsExceeded
    )
    print(result.final_output)


asyncio.run(main())

2つの SDK で共通する注意と、違うところを挙げる。

  • ワーカーは親の会話を知らない。as_tool() で呼ばれた側は、親の会話の状態を自動では引き継がない(公式)。Claude Agent SDK も同じで、サブエージェントに渡るのは Agent ツールの指示文だけだ。ファイルのパス・エラー文・決めたことは、頼む文に書き込む。
  • 上限は Runner.run(..., max_turns=)。超えると MaxTurnsExceeded が上がる。error_handlers={"max_turns": ...} を渡すと、例外の代わりに決まった返答を返せる(Running agents)。
  • ハンドオフで書くなら Agent(..., handoffs=[billing_agent, refund_agent])。引き渡された側が会話を引き継ぎ、既定ではそれまでの会話の履歴をすべて見る。渡したくない情報があるなら input_filter で絞る。

6. 役割の分け方:良い分割・悪い分割

コードより難しいのが分け方だ。Anthropic は、各サブエージェントに目的・出力の形式・使う道具と情報源・作業の境界の4つを渡す必要があると書いている(同じ解説)。これを満たす分け方と、満たさない分け方を並べる。

分け方 判定 理由
専門と道具で分ける(調査・執筆・事実確認) 良い 役ごとに道具と権限を絞れる。確認役を読み取り専用にできる。
独立した対象ごとに分ける(3社の製品を1社ずつ調べる) 良い 互いを待たずに並列で走り、司令塔が最後に比べる。
一本道の工程を細切れにする(要約→整形→翻訳を別々の役に) 避ける 前の結果を待つだけで並列にならず、受け渡しのたびに文脈が落ちる。単一エージェントで足りる。
同じ問いを範囲を決めずに複数の役へ配る 避ける Anthropic の初期版では、半導体不足の調査で1体が2021年の車載チップ危機を、2体が2025年の供給網を重複して調べた。
実行役と検証役を1つの役にまとめる 避ける 自分の出力を自分で確かめる形になり、検証を分ける意味が消える。

何体にするかの目安も同じ解説にある。Anthropic は調査エージェントの司令塔に、単純な事実確認は1体で道具の呼び出し3〜10回、比較は2〜4体で各10〜15回、複雑な調査は10体を超えることもあるという規模の目安を書き込んだ。これは調査という仕事での数字なので、自分の仕事では小さい側から始め、計測してから増やす。

司令塔型とハンドオフの使い分けは、OpenAI の文書の基準がわかりやすい。1つのエージェントに最終回答を持たせたい・複数の専門役の結果を合わせたいなら司令塔型(Agents as tools)。振り分けそのものが仕事で、選ばれた専門役が直接ユーザーに答えればよいなら(問い合わせ窓口の振り分けなど)ハンドオフ。両者は組み合わせてもよい。

7. よくある失敗例と対策

つまずく場所はほぼ決まっている。Anthropic が自社の調査エージェントで実際に起きたと書いている失敗と、両 SDK の公式ドキュメントが注意している点をまとめた。

失敗例 対策
簡単な問いに大量のワーカーを出す(Anthropic の初期版は単純な質問に50体のサブエージェントを出した) 規模の目安を司令塔のプロンプトに書く。同時実行数と費用の上限を置く。
存在しない情報源を延々と探し続ける(同じく初期版の失敗) 役ごとの maxTurns と全体の max_turns で打ち切る。
ワーカー同士が同じ仕事を重複してやる 頼む文に目的・返す形式・範囲(どこまでやらないか)を書く。
ワーカーが前提を知らずに的外れな答えを返す 親の会話は渡らない。必要な事実を頼む文に書き込む。
司令塔が委任せずに自分でやってしまう description を具体的にする。名前を指定して呼ばせる(Claude Agent SDK の公式トラブルシューティング)。
トークンが膨らむ(マルチはチャットの約15倍) 全文脈を渡さず必要分だけ渡す。ワーカーには安いモデルを使う。
逐次タスクで精度が落ちる(39〜70%悪化の検証あり) 一本道なら単一エージェントに戻す。
どこで失敗したか分からない 呼び出しを記録する。Claude Agent SDK では name が Agent の tool_use ブロックと parent_tool_use_id で、どの役の発言かを見分けられる。

共通する教訓は「フレームワークより、プロンプト・道具の設計・評価が成否を決める」。OpenAI の文書も、良いプロンプト・監視しての改善・専門に絞った役・評価への投資を挙げている。派手な構成より、小さく作って計測し、割に合うときだけ増やす規律が、結局いちばん速い。

まとめ

マルチエージェントの構築は、スーパーバイザー型を最小構成から始めれば怖くない。要点を振り返ろう。

この記事の要点

  • 🚦 まず単一で。 順を追う課題では、マルチが39〜70%悪化した検証もある。
  • 🧠 基本形はスーパーバイザー型。 Claude Agent SDK ならサブエージェント、OpenAI Agents SDK なら Agents as tools。
  • 🔢 5ステップ:分解→ワーカー定義→司令塔設計→受け渡し→計測。
  • 🧩 分け方:専門・道具・独立した対象で分ける。一本道の工程は細切れにしない。
  • ⚠️ 上限は3重(役ごと・全体・費用)。ワーカーには目的・形式・範囲を書いて渡す。

「小さく作って、測ってから増やす」。この規律さえ守れば、マルチエージェントは複雑な仕事を任せられる強力な相棒になる。概念の整理はマルチエージェントとは?、単体の作り方はAIエージェントの作り方へ。

FAQ

Q. どのパターンから作ればいい?

A. スーパーバイザー型(司令塔型)一択で問題ありません。主要フレームワークが対応し、失敗モードも既知で、参考実装が最も豊富です。慣れてから他パターンを検討しましょう。

Q. ワーカーは何体くらいから始める?

A. 最初は2〜3体、多くても3〜5体までに抑えましょう。数が増えるほど不安定になり、トークンも膨らみます。計測しながら、必要が証明できたときだけ増やすのが定石です。

Q. フレームワーク(SDK)は必須ですか?

A. 必須ではありません。OpenAI の文書も、構造化出力で仕事を分類して次の役を決める、ループで実行役と評価役を交互に回すといった「コードで順番を決める」方法を挙げ、速さ・費用・結果が読みやすくなると書いています。順番が決まっている仕事はこちらが向きます。会話の保存・道具の権限・上限を自分で書きたくないなら、SDK を使うのが近道です。

Q. コスト爆発を防ぐには?

A. ①全体と役ごとの往復回数に上限を置く ②費用の上限を置く(Claude Agent SDK の max_budget_usd)③全文脈を渡さず必要分だけ渡す ④ワーカーには安いモデルを使う、の4点が効きます。Anthropic によれば、マルチエージェントはチャットの約15倍のトークンを使いました。上限は最初から入れましょう。