目次
前回のマルチエージェントとは?で「複数AIの協調」の概念を押さえたら、次は実際にどう作るかだ。本記事は、2026年の事実上の標準であるスーパーバイザー型(司令塔型)を題材に、5ステップの実践手順を初心者向けに解説する。
難しいフレームワークの話に入る前に、最重要の原則を先に言う——「まず単一エージェントで作り、限界にぶつかってから最小構成で増やす」。最初から多人数で組むのは、たいてい過剰設計だ。後半では Claude Agent SDK と OpenAI Agents SDK の公式ドキュメントに沿った、そのまま読める最小構成のコードと、役割の分け方・よくある失敗例を示す。MCPで道具をつなぐ場合も、考え方は同じだ。
小さく作って、測ってから増やす
— スーパーバイザー型を最小構成から
※コードは 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だ。
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倍のトークンを使いました。上限は最初から入れましょう。