「Google ADKのQuickstartは動いた。でも複数エージェントを組み合わせようとしたら、どのクラスを使えばいいか分からなくなった」
これは多くのADK開発者が最初にぶつかる壁です。LlmAgentでシングルエージェントは作れても、SequentialAgent・ParallelAgent・LoopAgentの使い分けや、Supervisorパターンの組み方が公式ドキュメントだけでは分かりにくい。
この記事では、Google ADKのマルチエージェント実装パターンを5つ、コピペ可能なコード付きで全部解説します。ADK 2.0 Alpha(2026年3月26日リリース)の新機能も含めて網羅しているので、ここを読めば迷わず実装できるはずです。
AIエージェントの基本構造については AIエージェント構築完全ガイド で体系的にまとめています。
まず試したい:ADKのインストールと最小構成
パターンを学ぶ前に、環境を整えましょう。ADKのインストールは2ステップです。
# 動作環境: Python 3.10+(ADK 2.0はPython 3.11+が必要)
# 仮想環境の作成を推奨
python -m venv .venv
source .venv/bin/activate # macOS/Linux
# ADKのインストール
pip install google-adk
# ADK 2.0 Alpha(新機能を使う場合)
pip install "google-adk[alpha]" # または pip install google-adk==2.0.0a1
動作環境: Python 3.10+、google-adk 1.x 系(2.0 Alphaは実験的)
APIキー: .env ファイルに GOOGLE_API_KEY=your_key を設定
最小構成のシングルエージェントで動作確認してから、以下のマルチエージェントパターンに進みましょう。
# agent.py
import os
from google.adk.agents import LlmAgent
root_agent = LlmAgent(
model='gemini-3-flash-preview',
name='hello_agent',
description="質問に答えるシンプルなエージェント",
instruction="ユーザーの質問に丁寧に日本語で回答してください。",
)
# ターミナルで実行: adk run .
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ADKのマルチエージェント:5つのパターン早見表
| パターン | クラス / 手法 | 制御タイプ | 適した用途 | 難易度 |
|---|---|---|---|---|
| Sequential | SequentialAgent |
クローズド(決定的) | データパイプライン、段階処理 | ★☆☆☆☆ |
| Parallel | ParallelAgent |
クローズド(決定的) | 並列リサーチ、複数API同時取得 | ★★☆☆☆ |
| Loop | LoopAgent |
クローズド(反復) | 品質改善ループ、再試行処理 | ★★☆☆☆ |
| Supervisor | LlmAgent + transfer_to_agent |
オープン(LLM駆動) | 問い合わせルーティング、CS対応 | ★★★☆☆ |
| AgentTool | AgentTool |
オープン(明示的) | ネストした処理、専門エージェント呼出 | ★★★★☆ |
クローズド vs オープン: クローズド型はコードで実行順序を定義する決定的な制御。オープン型はLLMがどのエージェントに委任するかを判断する動的な制御。用途に応じて使い分けるのがADKの設計思想です。
パターン1:SequentialAgent(直列パイプライン)
最もシンプルなパターン。エージェントAの出力をエージェントBが受け取り、さらにエージェントCへと流れる直列処理です。データパイプラインやコードレビュー→修正→テストのような順序が決まったワークフローに最適です。
ポイントは output_key。各エージェントの出力を session.state の特定キーに保存し、後続エージェントが参照できるようにする仕組みです。
# 動作環境: Python 3.10+, google-adk>=1.0.0
# pip install google-adk
import asyncio
from google.adk.agents import SequentialAgent, LlmAgent
from google.adk.sessions import InMemorySessionService
from google.adk.runners import Runner
MODEL = "gemini-3-flash-preview"
# ステップ1: 要件を分析するエージェント
analyzer = LlmAgent(
name="Analyzer",
model=MODEL,
instruction="ユーザーの要件を分析し、実装すべき機能を箇条書きで列挙してください。",
output_key="requirements" # session.state["requirements"] に保存
)
# ステップ2: コードを生成するエージェント
coder = LlmAgent(
name="Coder",
model=MODEL,
instruction="""
以下の要件に基づいてPythonコードを書いてください:
要件: {requirements}
""",
output_key="code" # session.state["code"] に保存
)
# ステップ3: コードレビューするエージェント
reviewer = LlmAgent(
name="Reviewer",
model=MODEL,
instruction="""
以下のコードをレビューしてください:
{code}
セキュリティ、可読性、パフォーマンスの観点でフィードバックを提供してください。
"""
)
# Sequential パイプラインの構成
pipeline = SequentialAgent(
name="CodePipeline",
sub_agents=[analyzer, coder, reviewer],
description="要件分析→コード生成→レビューの直列パイプライン"
)
async def main():
session_service = InMemorySessionService()
runner = Runner(agent=pipeline, app_name="code_pipeline", session_service=session_service)
session = await session_service.create_session(app_name="code_pipeline", user_id="user1")
from google.adk.types import Content, Part
message = Content(parts=[Part(text="ファイルをCSVに変換するPythonスクリプトを作成してください")])
async for event in runner.run_async(user_id="user1", session_id=session.id, new_message=message):
if event.is_final_response():
print(event.content.parts[0].text)
if __name__ == "__main__":
asyncio.run(main())
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイント:
output_key="requirements"を指定すると、LLMの応答が自動的にsession.state["requirements"]に保存される- 後続エージェントのinstructionで
{requirements}と書くだけで前のエージェントの出力を参照できる - 3つ以上のエージェントも
sub_agentsリストに追加するだけで拡張可能
パターン2:ParallelAgent(並列実行)
複数のエージェントを同時に走らせるパターン。複数のAPIから情報を並行取得したり、同じトピックを異なる視点から同時に調査したりする場合に、処理時間を大幅に短縮できます。
注意点として、ParallelAgentは各エージェントが独立している必要があります。エージェントAの出力をエージェントBが必要とする場合は、ParallelAgentではなくSequentialAgentを使いましょう。
# 動作環境: Python 3.10+, google-adk>=1.0.0
from google.adk.agents import SequentialAgent, ParallelAgent, LlmAgent
MODEL = "gemini-3-flash-preview"
# 並列で動く3つのリサーチャー
market_researcher = LlmAgent(
name="MarketResearcher",
model=MODEL,
instruction="AIエージェントの市場規模と成長率について調査・分析してください。",
output_key="market_data"
)
tech_researcher = LlmAgent(
name="TechResearcher",
model=MODEL,
instruction="AIエージェントフレームワークの技術動向(2026年最新)を調査してください。",
output_key="tech_data"
)
competitor_researcher = LlmAgent(
name="CompetitorResearcher",
model=MODEL,
instruction="主要AIエージェントプラットフォームの競合比較をまとめてください。",
output_key="competitor_data"
)
# 3エージェントを並列実行
parallel_research = ParallelAgent(
name="ParallelResearch",
sub_agents=[market_researcher, tech_researcher, competitor_researcher]
)
# 並列結果を統合するエージェント
synthesizer = LlmAgent(
name="Synthesizer",
model=MODEL,
instruction="""
以下の3つのリサーチ結果を統合して、包括的なレポートを作成してください:
市場データ: {market_data}
技術動向: {tech_data}
競合分析: {competitor_data}
"""
)
# Parallel → Sequential で統合
research_workflow = SequentialAgent(
name="ResearchAndSynthesize",
sub_agents=[parallel_research, synthesizer]
)
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイント:
- 3つのリサーチャーが同時に実行され、完了後にSynthesizerが統合する
- 各エージェントに
output_keyを設定して、後段のSynthesizerが参照できるようにする - 実測では直列実行の約3倍の速度改善が見込める(エージェント数に比例)
パターン3:LoopAgent(反復改善)
同じ処理を繰り返すパターン。ドキュメントの品質が一定基準を超えるまで改善し続けたり、エラーが解消されるまで自動リトライしたりするユースケースに使います。
終了条件は max_iterations(上限回数)または、エージェントが escalate=True を返すことで制御します。
# 動作環境: Python 3.10+, google-adk>=1.0.0
from google.adk.agents import LoopAgent, LlmAgent
MODEL = "gemini-3-flash-preview"
# ドキュメントの品質をチェックして改善するループ
draft_improver = LlmAgent(
name="DraftImprover",
model=MODEL,
instruction="""
現在のドラフトを確認し、以下の基準で改善してください:
- 明確さ: 技術的な説明が読者に伝わるか
- 具体性: 抽象的な表現を具体的な例に置き換えているか
- 完全性: 重要な情報が欠けていないか
現在のドラフト: {draft}
品質基準を全て満たした場合は、レスポンスの最初に "DONE" と記載してください。
""",
output_key="draft"
)
quality_checker = LlmAgent(
name="QualityChecker",
model=MODEL,
instruction="""
以下のドラフトが品質基準を満たすかチェックしてください:
{draft}
全基準クリアなら "escalate" とだけ答えてください。
改善が必要なら具体的なフィードバックを提供してください。
""",
# escalate=True を返すとループが終了する
)
# 最大3回ループして品質を改善
improvement_loop = LoopAgent(
name="ImprovementLoop",
sub_agents=[draft_improver, quality_checker],
max_iterations=3 # 上限回数を設定しないと無限ループのリスクあり
)
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 注意: max_iterations は必ず設定すること。設定しないと無限ループになる可能性があります。
ポイント:
max_iterations=3は必ず設定する — 設定なしは無限ループのリスクありoutput_key="draft"でループを通じてドラフトが引き継がれる- 終了条件をLLMの判断に任せる場合は、プロンプトで明確な判定基準を指示する
パターン4:Supervisor(LLM駆動ルーティング)
最もADKらしいパターン。スーパーバイザーエージェントがユーザーの意図を解析し、適切なサブエージェントに自動でルーティングします。LangGraphのSupervisorパターンに似ていますが、ADKは transfer_to_agent() ツールによる宣言的な委任が特徴です。
# 動作環境: Python 3.10+, google-adk>=1.0.0
from google.adk.agents import LlmAgent
MODEL = "gemini-3-flash-preview"
# 専門エージェント群
billing_agent = LlmAgent(
name="billing_agent",
model=MODEL,
description="請求・支払い・返金に関する問い合わせを処理します。",
instruction="""
請求に関する問い合わせに対応してください。
- 請求書の確認方法
- 支払い方法の変更
- 返金手続き
解決できない場合は人間のサポートへのエスカレーションを提案してください。
"""
)
technical_agent = LlmAgent(
name="technical_agent",
model=MODEL,
description="技術的なトラブルシューティングと製品の使い方を担当します。",
instruction="""
技術的な問い合わせに対応してください。
- エラーメッセージの解説
- 設定手順の案内
- バグレポートの受付
"""
)
general_agent = LlmAgent(
name="general_agent",
model=MODEL,
description="一般的な問い合わせと製品情報を案内します。",
instruction="""
一般的な問い合わせに対応してください。
- 製品情報の提供
- 利用規約の説明
- FAQ対応
"""
)
# スーパーバイザー:LLMが適切なエージェントに自動ルーティング
supervisor = LlmAgent(
name="CustomerSupportSupervisor",
model=MODEL,
description="カスタマーサポートの総合窓口",
instruction="""
ユーザーの問い合わせを分析し、最適な専門エージェントに転送してください。
- 請求・支払い関連 → billing_agent
- 技術的な問題 → technical_agent
- その他一般的な問い合わせ → general_agent
不明な場合は、どのような問い合わせか確認してから転送してください。
""",
sub_agents=[billing_agent, technical_agent, general_agent]
# LLMが transfer_to_agent("billing_agent") を自動生成してルーティング
)
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイント:
sub_agentsに登録されたエージェントのdescriptionをLLMが読んで、最適な転送先を判断する- 各専門エージェントの
descriptionは明確・具体的に書く — これがルーティング精度に直結する - クローズドパターン(Sequential等)より柔軟だが、LLMの判断に依存するため予期しない挙動に注意
パターン5:AgentTool(エージェントをツールとして呼び出す)
エージェントをツールとしてラップし、親エージェントが明示的に呼び出すパターン。Supervisorパターンと似ていますが、AgentToolは同期的に結果を返すため、結果を使って次のロジックを組みやすいのが特徴です。
# 動作環境: Python 3.10+, google-adk>=1.0.0
from google.adk.agents import LlmAgent
from google.adk.tools.agent_tool import AgentTool
MODEL = "gemini-3-flash-preview"
# 専門エージェントをツールとして定義
summarizer_agent = LlmAgent(
name="summarizer",
model=MODEL,
description="長いテキストを200文字以内に要約します",
instruction="与えられたテキストを200文字以内の日本語で要約してください。"
)
translator_agent = LlmAgent(
name="translator",
model=MODEL,
description="日本語テキストを英語に翻訳します",
instruction="与えられた日本語テキストを自然な英語に翻訳してください。"
)
# エージェントをツールとしてラップ
summarize_tool = AgentTool(agent=summarizer_agent)
translate_tool = AgentTool(agent=translator_agent)
# 親エージェント:ツールを組み合わせてワークフローを実行
content_processor = LlmAgent(
name="ContentProcessor",
model=MODEL,
instruction="""
ユーザーから受け取ったテキストを処理してください。
1. まず summarizer ツールで要約する
2. 次に translator ツールで英訳する
3. 日本語要約と英語訳の両方を提示する
""",
tools=[summarize_tool, translate_tool]
)
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイント:
- AgentToolは呼び出し結果を同期的に返すため、結果を使った条件分岐がしやすい
- Supervisorパターンとの最大の違い:AgentToolは親エージェントが「ツールとして明示的に呼ぶ」のに対し、Supervisorは「転送して完全委任する」
- ネストした処理(要約→翻訳→評価のような連鎖)に特に有効
ADK 2.0 Alpha の新機能:グラフベースワークフロー
2026年3月26日にリリースされたADK 2.0 Alphaは、グラフベースのワークフロー実行エンジンを搭載しています。LangGraphに近い概念で、より細かい制御ができるようになりました。
| 機能 | ADK 1.x | ADK 2.0 Alpha |
|---|---|---|
| ワークフロー定義 | SequentialAgent等のクラス | グラフノード+エッジ定義 |
| ルーティング | LLM判断 or 固定順 | 条件付きエッジ、動的ルーティング |
| ループ制御 | max_iterations | 反復ループ、複雑な分岐も可 |
| Human-in-the-Loop | 非サポート | ネイティブサポート |
| 本番利用 | 安定版(推奨) | Alpha(破壊的変更あり) |
実際にADK 2.0 Alphaを試す場合は、本番環境では使わずに実験用の環境で評価することを推奨します。APIが大きく変わっているため、1.xのコードとの互換性はありません。
【要注意】ADKマルチエージェントでよくある失敗パターン
失敗1:output_keyを設定せずに状態を引き渡そうとする
❌ output_key なしでSequentialAgentを使い、後続エージェントがデータを参照できない
⭕ 各エージェントに output_key="key_name" を設定し、後続のinstructionで {key_name} として参照
なぜ重要か: ADKのエージェント間通信は session.state を介して行われます。output_keyがなければ前のエージェントの出力は消えてしまいます。
失敗2:LoopAgentでmax_iterationsを設定しない
❌ max_iterations なしで品質チェックループを組み、終了条件が機能せずに無限ループ
⭕ 必ず max_iterations=N を設定する(推奨は3-5回)
なぜ重要か: LLMの判断は決定的ではないため、escalateシグナルが返されない場合があります。
失敗3:Supervisorのdescriptionが曖昧でルーティングが不正確
❌ description="何でも対応するエージェント" のような曖昧な説明
⭕ description="請求・支払い・返金に関する問い合わせを処理します" のように具体的に範囲を定義
なぜ重要か: Supervisorはdescriptionを読んでルーティング先を決めます。曖昧だと誤ったエージェントに転送されます。
失敗4:ParallelAgentでエージェント間に依存関係がある
❌ エージェントBがエージェントAの出力を必要とするのに、両者をParallelAgentに入れる
⭕ 依存関係がある場合はSequentialAgent。並列実行は独立したタスクのみ
フレームワーク別の使い分けガイド
| シナリオ | おすすめ | 理由 |
|---|---|---|
| Google Cloud / Vertex AI環境 | Google ADK | ネイティブ統合、Geminiとの相性最良 |
| 複雑なステートフルワークフロー | LangGraph | チェックポイント、タイムトラベル機能が強力 |
| 役割分担型のマルチエージェント | CrewAI | Crew×Flow二重モデルで柔軟性が高い |
| OpenAI APIを中心に使う | OpenAI Agents SDK | 最速の実行速度、シンプルなAPI |
| Claude Code自動化 | Claude Agent SDK | 並列サブエージェント、独立コンテキスト管理 |
参考・出典
- Multi-agent systems – Agent Development Kit (ADK) — Google(参照日: 2026-03-27)
- Agent Development Kit: Making it easy to build multi-agent applications — Google Developers Blog(参照日: 2026-03-27)
- Releases · google/adk-python — GitHub(ADK 2.0 Alpha 2026-03-26リリース確認)
- ADK 2.0 Google: Deterministic Multi-Agent Workflows — SFEIR Institute(参照日: 2026-03-27)
- AutoGen vs CrewAI vs LangGraph vs PydanticAI vs Google ADK — Victor Dibia(参照日: 2026-03-27)
まとめ:今日から始める3つのアクション
- 今日やること:
pip install google-adkをして、SequentialAgentでコード生成パイプラインを動かしてみる(コピペで動く) - 今週中: Supervisorパターンで、問い合わせを自動振り分けするCSボットのプロトタイプを作成する
- 今月中: ADK 2.0 Alphaをステージング環境で評価し、グラフベースワークフローへの移行計画を立てる
あわせて読みたい:
- AIエージェント開発フレームワーク7選|2026年版完全比較ガイド — ADKを含む主要フレームワークの比較
- マルチエージェントAI設計パターン4選|Python実装ガイド — LangGraphベースのパターン解説
AIエージェントの導入・研修について相談したい場合は、Uravation株式会社のお問い合わせフォーム からお気軽にどうぞ。
この記事はAIgent Lab編集部がお届けしました。