AIエージェント入門

【2026年最新】Google ADK マルチエージェント5パターン実装ガイド

【2026年最新】Google ADK マルチエージェント5パターン実装ガイド

この記事の結論

Google ADKでマルチエージェントを構築する5パターンをコード付きで解説。Sequential・Parallel・Loop・Supervisor・Swarmの実装からADK 2.0の新機能まで網羅。

「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 並列サブエージェント、独立コンテキスト管理

参考・出典

まとめ:今日から始める3つのアクション

  1. 今日やること: pip install google-adk をして、SequentialAgentでコード生成パイプラインを動かしてみる(コピペで動く)
  2. 今週中: Supervisorパターンで、問い合わせを自動振り分けするCSボットのプロトタイプを作成する
  3. 今月中: ADK 2.0 Alphaをステージング環境で評価し、グラフベースワークフローへの移行計画を立てる

あわせて読みたい:


AIエージェントの導入・研修について相談したい場合は、Uravation株式会社のお問い合わせフォーム からお気軽にどうぞ。

この記事はAIgent Lab編集部がお届けしました。

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

Uravationでは、AIエージェントの要件整理、PoC設計、社内導入、研修まで一気通貫で支援しています。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年3月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事