「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エージェント導入パターンをもとに構成した典型的なシナリオです。
あわせて読みたい
- Vite 8.0正式リリース|Rust製Rolldownで本番ビルド最大87%削減 — ADKプロジェクトのビルドパイプラインにVite 8.0を活用
参考・出典
- Google ADK 公式ドキュメント — Google(参照日: 2026-03-12)
- ADK Quickstart: Build a multi-tool agent — Google ADK Docs(参照日: 2026-03-12)
- Agent Development Kit: easy to build multi-agent applications — Google Developers Blog(参照日: 2026-03-12)
- google/adk-python — GitHub(参照日: 2026-03-12)
- Google ADK Is Not a Toolkit — It Is an Agent Execution Framework — Futurum Group(参照日: 2026-03-12)
まとめ:今日から始める3つのアクション
- 今日やること:
pip install google-adkして、上記の天気+時刻エージェントをadk webで動かしてみる。5分で終わる - 今週中: 自分の業務に合ったツール関数を1つ書いて、エージェントに組み込む。FAQ検索、社内Wiki検索、Slack通知など、普段手動でやっていることから始めるのが良い
- 今月中: SequentialAgentで2段階のパイプラインを組み、チームメンバーにデモする。「入力分析→対応生成」のパターンは、ほぼすべての業務に応用できる
あわせて読みたい:
- CrewAI vs LangGraph vs OpenAI Agents SDK徹底比較 — 他のフレームワークとの違いを詳しく知りたい方に
- AIエージェントのメモリとは?記憶の仕組みと実装法 — エージェントに記憶を持たせる方法を深掘り
- AIエージェントフレームワーク勢力図【2026年最新】 — ADKを含む主要フレームワークの最新勢力図
AIエージェントの導入・構築でお困りの方は、お問い合わせフォームからお気軽にご相談ください。
この記事はAIgent Lab編集部がお届けしました。
あわせて読みたい: MCPプロトコル完全ガイド / JetBrains Junieの使い方