はじめに
Google Cloud Next ’25 で Agent Development Kit (ADK) が発表されました。
これは、エージェントおよびマルチエージェントシステムの開発を簡素化するために設計された、Googleの新しいオープンソースフレームワークです。
特徴として以下が挙げられます。
- マルチエージェント設計: 複数の専門化されたエージェントを階層的に構成し、複雑な連携と委任を可能にする、マルチエージェントシステム構築に最適化された設計。
- 豊富なモデルエコシステム: Gemini や Vertex AI Model Garden のモデルに加え、LiteLLM 連携により Anthropic、Meta、Mistral AI など多様なモデルを利用可能。
- 多様なツールエコシステム: 検索、コード実行などの事前構築済みツール、MCP ツール、LangChain や LlamaIndex などの外部ライブラリ、さらには他のエージェントをツールとして活用できる柔軟性。
- 組み込みのストリーミング機能: 双方向のオーディオおよびビデオストリーミングにより、テキストを超えた自然でリッチな対話をわずかなコードで実現。
- 統合された開発者体験: 強力な CLI と視覚的な Web UI により、ローカルでの開発、テスト、デバッグが容易。
ドキュメントは以下となります。
試してみた
今回は簡単なAIエージェントを構築します。
エージェント/Tool名 | 機能 |
---|---|
挨拶エージェント | 挨拶を返してくれる |
送別エージェント | 送別の言葉を返してくれる |
都市情報エージェント | 都市の情報を返してくれる(以下のToolを使用) |
天気情報を取得するTool | 都市の天気情報 |
人口情報を取得するTool | 都市の人口情報 |
環境構築
Agent Development Kit (ADK) をインストールします。
pip install google-adk
ディレクトリ構成を以下のようにします。
parent_folder/ └── multi_tool_agent/ ├── __init__.py ├── agent.py └── .env
__init__.py
には、以下を記載します。
from . import agent
.env
には、Google AI Studio か Vertex AI on Google Cloud の情報を記載します。
Google AI Studioの場合
GOOGLE_GENAI_USE_VERTEXAI="False" GOOGLE_API_KEY="paste-your-actual-key-here"
Vertex AI on Google Cloud の場合
GOOGLE_CLOUD_PROJECT="your-project-id" GOOGLE_CLOUD_LOCATION="your-location" GOOGLE_GENAI_USE_VERTEXAI="True"
Toolの定義
今回は簡易的に4つの都市に絞ったMockデータを使用します。
天気情報を取得するToolを定義します。
def get_weather(city: str): # Mock weather data mock_weather_db = { "東京": {"status": "success", "report": "東京は25°Cです"}, "大阪": {"status": "success", "report": "大阪は15°Cです"}, "ニューヨーク": {"status": "success", "report": "ニューヨークは10°Cです"}, "ロンドン": {"status": "success", "report": "ニューヨークは5°Cです"}, } if city in mock_weather_db: return mock_weather_db[city] else: return {"status": "error", "error_message": f"'{city}'に関する天気情報はありません。"}
人口情報を取得するToolを定義します。
def get_population(city: str): # Mock population data mock_population_db = { "東京": {"status": "success", "report": "東京の人口は、約1400万人です"}, "大阪": {"status": "success", "report": "大阪の人口は、約900万人です"}, "ニューヨーク": {"status": "success", "report": "ニューヨークの人口は、約800万人です"}, "ロンドン": {"status": "success", "report": "ニューヨークの人口は、約880万人です"}, } if city in mock_population_db: return mock_population_db[city] else: return {"status": "error", "error_message": f"'{city}'に関する人口情報はありません。"}
エージェントの定義
挨拶エージェントの定義をします。
greeting_agent = Agent( model="gemini-2.0-flash-exp", name="挨拶Agent", instruction="あなたは挨拶エージェントです。あなたの唯一のタスクは、ユーザーに友好的な挨拶をすることです。他の会話やタスクには一切関与しないでください。", description="簡単な挨拶や「こんにちは」に対応します。", )
送別エージェントの定義をします。
goodbye_agent = Agent( model="gemini-2.0-flash-exp", name="送別Agent", instruction="あなたは送別エージェントです。あなたの唯一のタスクは、丁寧な別れのメッセージを提供することです。他の行動は一切行わないでください。", description="簡単な挨拶や「さようなら」に対応します。", )
都市情報エージェントの定義をします。
root_agent = Agent( name="都市情報Agent", model="gemini-2.0-flash-exp", description="あなたは主要な都市情報エージェントであり、チームを統括しています。 - あなたの主なタスク:get_weatherツールを使って天気を提供することまたはget_populationツールを使って人口を提供すること。その'status'レスポンス('report'または'error_message')を処理してください。 - 委任ルール: - ユーザーが簡単な挨拶(「こんにちは」、「もしもし」など)をした場合、greeting_agentに委任してください。 - ユーザーが簡単な別れの挨拶(「さようなら」、「またね」など)をした場合、farewell_agentに委任してください。 - 天気のリクエストはget_weatherを使って自身で処理してください。 - 人口のリクエストはget_populationを使って自身で処理してください。- その他の問い合わせについては、対応できない場合は明確に伝えてください。", tools=[get_weather, get_population], sub_agents=[greeting_agent, goodbye_agent] )
今回の都市情報Agentは委任が許可されています。
委任の仕組み:
- デフォルトのエージェントの動作では、委任が許可されている。
- LLM は、ユーザー メッセージを処理する際に、クエリ、現在のエージェントの
description
、関連エージェントのdescription
フィールドを考慮する。 - LLM が
description
に基づいて別のエージェントの方が適していると判断した場合 (例: ユーザーが「こんにちは」と言った場合、挨拶Agent説明と一致)、転送が開始される。
動作確認
Agent Development Kit (ADK)でが、WenUIで動作確認することもできます。
adk web
http://localhost:8000/ にアクセスし、左上から該当のエージェントを選択します。
「こんにちわ」と入力すると、都市情報エージェントから挨拶エージェントに委任されて、挨拶エージェントが回答を返してくれました。
「大阪の天気は?」と聞くと、挨拶エージェントから都市情報エージェントに委任されて、Toolを使用して回答を返してくれました。
「ロンドンの人口は?」と聞くと、都市情報エージェントなのでそのままToolを使用して回答を返してくれました。
構成したエージェントの動きをしてくれました!
おわりに
今回、Agent Development Kit (ADK) を試してみました。
WebUIが使えるようになっていて、さらにどのエージェント、Toolを使用しているか視認もできて、開発しやすそうと感じました。
エージェント構築のコードも直感的に書くことができるので、より容易にエージェント開発が進みそうです。
他にも様々な機能(Vertex AI Agent Engine や Cloud Run へのデプロイ、高度なワークフローなど)があるので、使いこなして行きたいと思いました!