AIエージェント入門

Google ADKでAIエージェントを構築する実践ガイド

Google ADKでAIエージェントを構築する実践ガイド

この記事の結論

Google ADK(Agent Development Kit)を使ったAIエージェント構築を、環境構築からマルチエージェントまでコード付きで解説。Python関数をそのままツールに変える開発体験を体験しよう。

「AIエージェントを作りたいけど、どのフレームワークから始めればいいか分からない…」

正直、この悩みは本当によく聞く。LangChain、CrewAI、OpenAI Agents SDK、Microsoft Agent Framework——選択肢が多すぎて逆に動けなくなるパターンだ。そんな中で、実はかなり筋がいいのに見過ごされがちなのが、Googleが開発したオープンソースフレームワーク「ADK(Agent Development Kit)」。

ADKの最大の強みは「コードファースト」を掲げている点にある。ノーコードツールのように制約に縛られることなく、かといってゼロからすべてを書く必要もない。Pythonの関数をそのままツールとして渡せるシンプルな設計で、既存のコードベースに自然に組み込める。さらにGeminiに最適化されつつも、GPT-4oやClaudeなどのモデルも使えるモデル非依存の設計だ。

この記事では、Google ADKを使ってAIエージェントを構築する手順を、実際に動くコード付きで一から解説する。環境構築から、マルチエージェントシステムの構築まで、今日中に手を動かせる内容にまとめた。

環境構築 — 5分でADKを動かす準備

まずは開発環境の準備から。ADKはPython 3.10以上が必要だ。仮想環境を作ってインストールするのが推奨される。

# 動作環境: Python 3.10+, pip
# 必要パッケージ: google-adk

# 仮想環境を作成・有効化
python -m venv .venv
source .venv/bin/activate  # macOS/Linux
# Windows: .venvScriptsactivate.bat

# ADKをインストール
pip install google-adk

# バージョン確認
pip show google-adk | grep Version
# Version: 1.26.0(2026年2月26日リリース時点)

ポイント: ADKはGemini APIキーが必要。Google AI Studioから無料で取得できる。無料枠ではモデルにより1日50〜1,000リクエスト程度使える(Gemini 2.0 Flashは約250リクエスト/日)ので、開発・検証には十分だ。

プロジェクトのディレクトリ構成はこうなる:

my_agent_project/
  my_agent/
    __init__.py    # エージェントモジュールの初期化
    agent.py       # エージェントの定義
    .env           # APIキーの設定

.envファイルにAPIキーを設定する:

# .envファイル
GOOGLE_GENAI_USE_VERTEXAI=FALSE
GOOGLE_API_KEY=your-api-key-here

# 注意: 本番環境ではAPIキーをハードコードせず、
# シークレットマネージャー(GCP Secret Manager等)を使うこと

最初のエージェントを作る — 天気+時刻ボット

いきなり複雑なことをやろうとすると挫折する。まずは公式クイックスタートをベースに、「ツールを使えるエージェント」の基本パターンを押さえよう。

# 動作環境: Python 3.10+, google-adk>=1.26.0
# ファイル: my_agent/agent.py

import datetime
from zoneinfo import ZoneInfo
from google.adk.agents import Agent

def get_weather(city: str) -> dict:
    """指定された都市の天気を取得する。

    Args:
        city: 天気を取得したい都市名(英語)

    Returns:
        dict: ステータスと天気レポート
    """
    # 実際のプロジェクトではOpenWeatherMap API等を呼び出す
    weather_data = {
        "tokyo": "晴れ、気温18℃、湿度45%",
        "osaka": "曇り、気温16℃、湿度55%",
        "new york": "雨、気温12℃、湿度70%",
    }
    city_lower = city.lower()
    if city_lower in weather_data:
        return {"status": "success", "report": weather_data[city_lower]}
    return {"status": "error", "error_message": f"'{city}'の天気情報は取得できません"}


def get_current_time(city: str) -> dict:
    """指定された都市の現在時刻を返す。

    Args:
        city: 時刻を取得したい都市名(英語)

    Returns:
        dict: ステータスと時刻レポート
    """
    timezones = {
        "tokyo": "Asia/Tokyo",
        "new york": "America/New_York",
        "london": "Europe/London",
        "osaka": "Asia/Tokyo",
    }
    city_lower = city.lower()
    if city_lower not in timezones:
        return {"status": "error", "error_message": f"'{city}'のタイムゾーン情報がありません"}

    tz = ZoneInfo(timezones[city_lower])
    now = datetime.datetime.now(tz)
    return {"status": "success", "report": f"{city}の現在時刻: {now.strftime('%Y-%m-%d %H:%M:%S %Z')}"}


# エージェントの定義
root_agent = Agent(
    name="weather_time_agent",
    model="gemini-2.0-flash",        # Gemini 2.0 Flashを使用
    description="天気と時刻を教えてくれるエージェント",
    instruction=(
        "あなたは天気と時刻に詳しいアシスタントです。"
        "ユーザーが都市の天気や時刻を聞いたら、適切なツールを使って回答してください。"
        "日本語で回答してください。"
    ),
    tools=[get_weather, get_current_time],  # Python関数をそのまま渡せる
)

ここが良い: ADKのツール定義が本当にシンプルだ。普通のPython関数を書いて、docstringを付けて、toolsリストに渡すだけ。LangChainの@toolデコレータすら不要。docstringがそのままツールの説明としてLLMに渡される仕組みになっている。

__init__.pyはこれだけ:

# my_agent/__init__.py
from . import agent

実行方法は2つある:

# 方法1: ターミナルで対話モード
adk run my_agent

# 方法2: ブラウザUIで実行(デバッグに便利)
adk web
# → http://localhost:8000 でブラウザUIが開く

adk webは特におすすめ。ツール呼び出しのログがリアルタイムで見えるので、エージェントが「なぜそのツールを選んだか」を確認しながらデバッグできる。

実践:業務で使えるカスタマーサポートエージェント

天気ボットで基本が分かったら、次は実際の業務に近いものを作ってみよう。ここではカスタマーサポートの一次対応を自動化するエージェントの例を紹介する。

# 動作環境: Python 3.10+, google-adk>=1.26.0
# ファイル: support_agent/agent.py

from google.adk.agents import Agent

# FAQデータベース(実際にはベクトルDBやナレッジベースを使う)
FAQ_DATABASE = {
    "返品": "商品到着後14日以内であれば返品可能です。マイページから返品申請を行ってください。",
    "配送": "通常配送は注文から3-5営業日でお届けします。お急ぎ便は翌日配送です。",
    "支払い": "クレジットカード、銀行振込、コンビニ払い、PayPayに対応しています。",
    "キャンセル": "発送前であればマイページからキャンセル可能です。発送後は返品手続きをご利用ください。",
}

def search_faq(query: str) -> dict:
    """顧客の質問に対してFAQデータベースを検索する。

    Args:
        query: 顧客の質問キーワード

    Returns:
        dict: 検索結果
    """
    for keyword, answer in FAQ_DATABASE.items():
        if keyword in query:
            return {"status": "found", "answer": answer, "category": keyword}
    return {"status": "not_found", "message": "該当するFAQが見つかりませんでした"}


def escalate_to_human(reason: str, customer_message: str) -> dict:
    """人間のオペレーターにエスカレーションする。

    Args:
        reason: エスカレーション理由
        customer_message: 顧客の元のメッセージ

    Returns:
        dict: エスカレーション結果
    """
    # 実際にはチケットシステムのAPIを呼び出す
    return {
        "status": "escalated",
        "ticket_id": "TK-20260312-001",
        "message": f"担当者にお繋ぎします。理由: {reason}",
    }


root_agent = Agent(
    name="cs_support_agent",
    model="gemini-2.0-flash",
    description="カスタマーサポートの一次対応エージェント",
    instruction="""あなたはECサイトのカスタマーサポート担当です。以下のルールに従ってください:

1. まずsearch_faqツールで回答を探す
2. FAQで解決できる場合は、丁寧に回答する
3. FAQで解決できない場合、またはクレームや複雑な問題の場合は、
   escalate_to_humanツールで人間のオペレーターに引き継ぐ
4. 個人情報(クレジットカード番号等)は絶対に聞かない
5. 回答は日本語で、丁寧語を使う

重要: 分からないことを推測で回答しないこと。確信がなければエスカレーションする。""",
    tools=[search_faq, escalate_to_human],
)

設計のポイント:

  • エスカレーション機能を必ず入れる — AIが答えられない問題は必ず発生する。人間への引き継ぎパスを最初から設計に含めること
  • instructionに制約を明記する — 「やってはいけないこと」を書くのが最も重要。特に個人情報の取り扱い
  • ツールの戻り値はdictで統一するstatusフィールドで成功/失敗を判別するパターンが堅実

マルチエージェントに挑戦 — SequentialAgentで処理を連鎖させる

ADKの本領はマルチエージェントにある。SequentialAgentを使えば、複数のエージェントを直列に連携させて、各ステップの出力を次のステップに渡せる。

# 動作環境: Python 3.10+, google-adk>=1.26.0
# ファイル: pipeline_agent/agent.py

from google.adk.agents import Agent, SequentialAgent

# Step 1: 入力を分析するエージェント
analyzer = Agent(
    name="input_analyzer",
    model="gemini-2.0-flash",
    description="ユーザー入力を分析して意図を分類する",
    instruction="""ユーザーの入力を分析し、以下のいずれかに分類してください:
    - question: 質問・問い合わせ
    - feedback: フィードバック・感想
    - complaint: クレーム・不満
    - other: その他
    分類結果と、入力の要約を出力してください。""",
)

# Step 2: 分類結果に基づいて対応するエージェント
responder = Agent(
    name="responder",
    model="gemini-2.0-flash",
    description="分析結果に基づいて適切な対応を生成する",
    instruction="""前のステップの分析結果を踏まえて、適切な返答を生成してください。
    - question → 簡潔で正確な回答
    - feedback → 感謝の言葉と改善への活用を伝える
    - complaint → 謝罪と具体的な対応策を提示
    - other → 適切なチームに案内する
    日本語で、丁寧に回答すること。""",
)

# パイプラインとして連結
root_agent = SequentialAgent(
    name="support_pipeline",
    description="入力分析→対応生成のパイプライン",
    sub_agents=[analyzer, responder],
)

SequentialAgent以外にも、ParallelAgent(並列実行)とLoopAgent(反復実行)がある。用途に応じて使い分けよう。

エージェントタイプ 用途 実行パターン
Agent(LlmAgent) LLMによる推論・ツール呼び出し 動的(LLMが判断)
SequentialAgent 複数エージェントの直列実行 決定的(順番通り)
ParallelAgent 複数エージェントの並列実行 決定的(同時実行)
LoopAgent 条件を満たすまで繰り返し実行 決定的(反復)

ADKと他フレームワークの比較

ADKは開発者が自分でエージェントを構築するフレームワークだが、EXLのように250以上のプリビルトエージェントを提供するプラットフォームも登場している。「Build vs Buy」の判断が今後ますます重要になる。

項目 Google ADK LangChain/LangGraph OpenAI Agents SDK CrewAI
言語サポート Python, TS, Go, Java Python, JS Python Python
ツール定義 関数+docstring @toolデコレータ function_tool @tool
マルチエージェント SequentialAgent等 LangGraph StateGraph Handoff Crew/Task
モデル非依存 ○(Gemini最適化) △(OpenAI中心)
ローカルUI adk web LangSmith(別途) なし なし
ライセンス Apache 2.0 MIT MIT MIT
料金の最終確認日 2026-03-12

ADKの独自の強みは「adk web」によるブラウザベースのデバッグUIと、Google Cloudとの深い統合だ。一方、コミュニティの規模ではLangChainに及ばず、日本語の情報もまだ少ない。

【要注意】よくある失敗パターンと回避策

失敗1: docstringを書かずにツールを渡す

❌ docstringなしの関数をツールに登録する

# ❌ これだとLLMがツールの使い方を理解できない
def fetch_data(url):
    return requests.get(url).json()

⭕ docstringに引数・戻り値・用途を明記する

# ⭕ LLMがいつ・どう使うべきか判断できる
def fetch_data(url: str) -> dict:
    """指定されたURLからJSONデータを取得する。

    Args:
        url: データを取得するAPIのURL

    Returns:
        dict: 取得したJSONデータ
    """
    return requests.get(url).json()

なぜ重要か: ADKはdocstringを解析してツールの説明を自動生成する。docstringがないと、LLMはそのツールをいつ使えばいいか分からず、呼び出しミスが頻発する。

失敗2: 最初からマルチエージェントにしてしまう

❌ いきなり5つのエージェントをSequentialAgentに詰め込む

⭕ まず単一エージェント+複数ツールで動かし、必要になってから分割する

なぜ重要か: OpenAIも公式ガイドで「適切にツールを備えた単一エージェントの方が、多くのケースでマルチエージェントより優れた結果を出す」と述べている。エージェント間の受け渡しでコンテキストが失われるリスクもある。

失敗3: エラーハンドリングを忘れる

❌ ツール内で例外が発生するとエージェント全体が止まる

⭕ ツール関数内でtry-exceptを書き、エラー情報をdictで返す

# ⭕ エラーを握りつぶさず、LLMが判断できる形で返す
def call_external_api(endpoint: str) -> dict:
    """外部APIを呼び出す。

    Args:
        endpoint: APIエンドポイントURL

    Returns:
        dict: ステータスと結果
    """
    try:
        response = requests.get(endpoint, timeout=10)
        response.raise_for_status()
        return {"status": "success", "data": response.json()}
    except requests.Timeout:
        return {"status": "error", "error_message": "APIがタイムアウトしました。後で再試行してください"}
    except requests.HTTPError as e:
        return {"status": "error", "error_message": f"APIエラー: {e.response.status_code}"}

失敗4: APIキーをコードにハードコードする

api_key="AIzaSy..." をagent.pyに直接書く

.envファイルか環境変数で管理する。本番環境ではGCP Secret ManagerやAWS Secrets Managerを使う

デプロイと運用 — 本番環境への道

ローカルで動いたら、次は本番デプロイだ。ADKはDockerコンテナ化をサポートしているので、Cloud RunやVertex AI Agent Engineにデプロイできる。

# Dockerfileの例
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# APIキーは環境変数で注入すること(Dockerfileに書かない)
CMD ["adk", "api_server", "--agent_dir", "my_agent", "--port", "8080"]

本番運用で押さえるべきポイント:

  • コスト管理: Gemini 2.0 Flashは入力$0.10/100万トークン、出力$0.40/100万トークンと非常に安い(料金の最終確認日: 2026-03-12)。無料枠を超えたら課金が発生する。API使用量のアラートを設定しておくこと
  • モニタリング: ADKはOpenTelemetryに対応。LangfuseやMLflowと連携してトレースを取得し、エージェントの動作を可視化する
  • レート制限: 無料枠はモデルにより1日50〜1,000リクエスト(Gemini 2.0 Flashは約250RPD)。本番では有料プランに切り替えるか、リクエストキューを実装する

事例区分: 想定シナリオ
上記の構成は、一般的なカスタマーサポートのAIエージェント導入パターンをもとに構成した典型的なシナリオです。

あわせて読みたい

参考・出典

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

  1. 今日やること: pip install google-adk して、上記の天気+時刻エージェントをadk webで動かしてみる。5分で終わる
  2. 今週中: 自分の業務に合ったツール関数を1つ書いて、エージェントに組み込む。FAQ検索、社内Wiki検索、Slack通知など、普段手動でやっていることから始めるのが良い
  3. 今月中: SequentialAgentで2段階のパイプラインを組み、チームメンバーにデモする。「入力分析→対応生成」のパターンは、ほぼすべての業務に応用できる

あわせて読みたい:


AIエージェントの導入・構築でお困りの方は、お問い合わせフォームからお気軽にご相談ください。

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

あわせて読みたい: MCPプロトコル完全ガイド / JetBrains Junieの使い方

Need help moving from reading to rollout?

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

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

この記事をシェア

X Facebook LINE

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

関連記事