PR

GoogleのAgent Development Kit(ADK)とは?100行以下のコードでAIエージェントを開発する方法

AIエージェント

はじめに

 2025年4月、GoogleはGoogle Cloud NEXT 2025でAgent Development Kit (ADK)をオープンソースで公開しました。このフレームワークは100行以下のコードで高度なAIエージェントを開発することを可能にし、企業のAI導入を大幅に加速させるものです。この記事では、ADKの概要と基本的な使い方を初心者向けに解説します。

Agent Development Kit
Build powerful multi-agent systems with Agent Development Kit

Agent Development Kit(ADK)とは?

 Agent Development Kit (ADK) は、AIエージェントを開発し、デプロイするための柔軟でモジュラーなフレームワークです。GeminiなどのLLM(Large Language Model)や各種生成AIツールと連携し、特にGoogleエコシステムとの統合に焦点を当てています。

 ADKの最大の特徴は、シンプルなエージェントから始めて、より複雑なエージェントアーキテクチャとオーケストレーションへとスケールできる設計にあります。同フレームワークは、GoogleのAgentspaceやCustomer Engagement Suite(CES)などのGoogle製品内のエージェントを動かしているのと同じものです。

Agent Development Kitのロゴ

なぜADKが重要なのか?

 AIの世界は急速に単一目的のモデルから、インテリジェントで自律的なマルチエージェントシステムへと移行しています。しかし、これらのマルチエージェントシステムの構築には新たな課題が伴います。ADKはそうした課題を解決するために設計されたフレームワークなのです。

ADKの主な特徴

マルチエージェント設計

 複数の特化したエージェントを階層的に構成し、モジュラーでスケーラブルなアプリケーションを構築。複雑な調整や委任が可能に。

豊富なツールエコシステム

 検索やコード実行などの組み込みツール、カスタム関数、サードパーティライブラリ(LangChain、CrewAIなど)を統合可能。

柔軟なオーケストレーション

 ワークフローエージェント(Sequential、Parallel、Loop)で予測可能なパイプラインを定義、またはLLM駆動の動的ルーティングで適応的な振る舞いを実現。

デプロイ対応

 エージェントをコンテナ化し、どこにでもデプロイ可能。ローカル実行、Vertex AI Agent Engineでのスケーリング、またはCloud RunやDockerを使ったカスタムインフラへの統合も。

組み込み評価機能

 事前定義されたテストケースに対して、最終レスポンスの品質とステップバイステップの実行軌跡の両方を体系的に評価。

責任あるAIの構築

 責任あるAIパターンとベストプラクティスをエージェント設計に実装し、強力で信頼性の高いエージェントの構築をサポート。

マルチエージェントシステムの構築を示すADKフレームワーク

ADKを始めるには

1. インストール

ADKはPythonパッケージとして提供されており、pipを使って簡単にインストールできます:

pip install google-adk

2. 基本的なエージェントの作成

ADKでは、Pythonの簡潔なコードでエージェントを定義します。以下は基本的なエージェントの例です:

from google.adk.agents import Agent

def get_weather(city: str) -> dict:
    """Retrieves the current weather report for a specified city.
    
    Args:
        city (str): The name of the city for which to retrieve the weather report.
        
    Returns:
        dict: status and result or error msg.
    """
    if city.lower() == "new york":
        return {
            "status": "success",
            "report": (
                "The weather in New York is sunny with a temperature of 25 degrees"
                " Celsius (41 degrees Fahrenheit)."
            ),
        }
    else:
        return {
            "status": "error",
            "error_message": f"Weather information for '{city}' is not available.",
        }

# エージェントの定義
root_agent = Agent(
    name="weather_agent",
    model="gemini-2.0-flash", # 使用するモデル
    description=(
        "Agent to answer questions about the weather in a city."
    ),
    instruction=(
        "You are a helpful agent who can answer user questions about the weather in a city."
    ),
    tools=[get_weather], # エージェントが使用できるツール
)

上記のコードでは:

  • ツール(関数)の定義get_weather関数はエージェントに天気情報を取得する能力を与えます。
  • エージェントの作成Agentクラスを使って、名前、使用するモデル、説明、指示、使用するツールを指定しています。

3. エージェントの実行

ADKは複数の方法でエージェントと対話することができます:

  • 開発UI (adk web): adk web – ブラウザベースのインターフェースでエージェントをテスト
  • ターミナル (adk run): adk run – コマンドラインでエージェントと直接対話
  • APIサーバー (adk api_server): adk api_server – FastAPIサーバーとしてエージェントを公開
ADK Web UIインターフェース

マルチエージェントシステムの構築

 ADKの真の強みは、複数のエージェントを連携させた「マルチエージェントシステム」を構築できる点にあります。以下は、天気情報を扱うメインエージェントと、挨拶を担当する専門エージェントで構成される簡単な例です:

from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm

# 挨拶専用エージェント
greeting_agent = Agent(
    model="gemini-2.0-flash",
    name="greeting_agent",
    instruction="You are the Greeting Agent. Your ONLY task is to provide a friendly greeting to the user.",
    description="Handles simple greetings and hellos.",
)

# 天気情報を取得する関数
def get_weather(city: str) -> dict:
    """Retrieves weather information for a specified city."""
    # 実装は省略(前の例と同様)
    mock_weather_db = {
        "newyork": {"status": "success", "report": "The weather in New York is sunny with a temperature of 25C."},
        "london": {"status": "success", "report": "It's cloudy in London with a temperature of 15C."},
        "tokyo": {"status": "success", "report": "Tokyo is experiencing light rain and a temperature of 18C."},
    }
    
    city_normalized = city.lower().replace(" ", "")
    if city_normalized in mock_weather_db:
        return mock_weather_db[city_normalized]
    else:
        return {"status": "error", "error_message": f"Sorry, I don't have weather information for '{city}'."}

# ルートエージェント(調整役)
root_agent = Agent(
    name="weather_agent_team", 
    model="gemini-2.0-flash",
    description="The main coordinator agent. Handles weather requests and delegates greetings to specialists.",
    instruction="""You are the main Weather Agent coordinating a team. Your primary responsibility is to provide weather information.
    Use the 'get_weather' tool ONLY for specific weather requests (e.g., 'weather in London').
    You have a specialized sub-agent: 'greeting_agent' that handles simple greetings like 'Hi', 'Hello'. Delegate to it for these.
    Analyze the user's query. If it's a greeting, delegate to 'greeting_agent'. If it's a weather request, handle it yourself using 'get_weather'.
    For anything else, respond appropriately or state you cannot handle it.""",
    tools=[get_weather],
    sub_agents=[greeting_agent]  # サブエージェントを指定
)

このマルチエージェントシステムでは:

  • 専門エージェントgreeting_agentは挨拶だけを担当する特化型エージェント
  • ルートエージェントroot_agentはユーザーからの入力を最初に受け取り、適切なサブエージェントに委任するか自身で処理
  • 自動委任:ルートエージェントは、指示とサブエージェントの説明に基づいて、適切な担当者に自動的にタスクを委任

委任の仕組み

ADKでは、エージェントのdescription(説明)フィールドとルートエージェントのinstruction(指示)が委任の決定に重要な役割を果たします。例えば:

  • ユーザーが「こんにちは」と言うと、ルートエージェントはこれが挨拶だと認識し、greeting_agentの説明と一致すると判断して委任
  • ユーザーが「東京の天気は?」と聞くと、ルートエージェントはこれが天気の質問だと認識し、自身のget_weatherツールを使用

セッション状態とガードレールの実装

ADKでは、エージェントに「記憶」を与えたり、安全なインタラクションを確保するための機能も提供しています。

セッション状態(状態管理)

 特定のユーザーセッション内で情報を保持するためのPythonディクショナリです。これにより、エージェントが会話の文脈を記憶したり、ユーザーの設定を保存したりできます。

def get_weather_stateful(city: str, tool_context: ToolContext) -> dict:
    """天気情報を取得し、セッション状態に基づいて温度単位を変換する"""
    
    # --- 状態から設定を読み取る ---
    preferred_unit = tool_context.state.get("user_preference_temperature_unit", "Celsius") # デフォルトはセルシウス
    print(f"--- Tool: Reading state 'user_preference_temperature_unit': {preferred_unit} ---")
    
    # 天気データの取得処理(省略)
    
    # 状態に最後にチェックした都市を保存
    tool_context.state["last_city_checked"] = city
    
    return result

コールバックによるガードレール

 ADKは、モデル呼び出しの前やツール実行の前などに実行される「コールバック」機能を提供しており、これを使って安全性を確保できます。

def block_keyword_guardrail(callback_context: CallbackContext, llm_request: LlmRequest) -> Optional[LlmResponse]:
    """
    ユーザーの最新メッセージに'BLOCK'があるか検査し、見つかった場合はLLM呼び出しをブロック
    して定義済みのLlmResponseを返します。見つからない場合はNoneを返して処理を続行します。
    """
    # 最新のユーザーメッセージからテキストを抽出
    last_user_message_text = ""
    if llm_request.contents:
        for content in reversed(llm_request.contents):
            if content.role == 'user' and content.parts:
                if content.parts[0].text:
                    last_user_message_text = content.parts[0].text
                    break
    
    # キーワードチェック
    keyword_to_block = "BLOCK"
    if keyword_to_block in last_user_message_text.upper(): # 大文字小文字を区別しない
        print(f"--- Callback: '{keyword_to_block}'を検出。LLM呼び出しをブロックします! ---")
        
        # ブロック発生を状態に記録(オプション)
        callback_context.state["guardrail_block_triggered"] = True
        
        # LlmResponseを返してLLM呼び出しを停止
        return LlmResponse(
            content=types.Content(
                role="model",
                parts=[types.Part(text=f"このリクエストにはブロックされたキーワード'{keyword_to_block}'が含まれているため処理できません。")],
            )
        )
    else:
        # キーワードが見つからないためLLM呼び出しを許可
        return None

コールバックの種類

  • before_model_callback:モデル呼び出し前に実行され、ユーザー入力を検査・修正できる
  • before_tool_callback:ツール実行前に実行され、ツール引数を検査・修正できる
  • after_model_callback:モデルレスポンス後に実行され、出力を後処理できる
  • after_tool_callback:ツール実行後に実行され、結果を処理・ログ記録できる

デプロイオプション

ADKで開発したエージェントは、様々な方法でデプロイできます:

ローカル実行

開発中や小規模な用途では、adk runadk webコマンドでローカルマシン上で実行できます。

コンテナ化(Docker)

エージェントをコンテナ化し、Dockerを使って任意の環境で実行できます。

Google Cloud Run

サーバーレスのデプロイオプションとして、Cloud Run上でスケーラブルに実行できます。

Vertex AI Agent Engine

 Google Cloudの完全管理型ランタイムを使用して、エンタープライズグレードのセキュリティとスケーラビリティでデプロイできます。

Agent Engine Architecture

Agent2Agent プロトコル

 GoogleはAgent Development Kitと併せて、Agent2Agent (A2A) プロトコルを発表しました。これは異なるフレームワークやベンダーで構築されたエージェント間の相互運用性を確保するためのオープンなプロトコルです。

 A2Aプロトコルにより、エージェントは使用するフレームワーク(ADK、LangGraph、Crew.aiなど)やベンダーに関係なく互いに通信できるようになります。エージェントは自身の機能を公開し、ユーザーとどのように対話するか(テキスト、フォーム、双方向音声/ビデオを介して)を交渉できます。

 現在、Box、Deloitte、Elastic、PayPal、Salesforce、ServiceNow、UiPathなど50以上のパートナーがこのプロトコルに参加しています。

初学者向けのADK学習ステップ

  1. 基本からスタート:単一エージェントと単純なツールから始める
  2. ステートを理解する:セッション状態を使って「記憶」を実装
  3. マルチエージェントへ:複数の特化したエージェントと委任を理解
  4. ガードレールの実装:コールバックを使って安全性を確保
  5. デプロイ方法を学ぶ:ローカルからクラウドへの移行を理解

初心者向けTips

ADKはかなり高度なフレームワークですが、以下の点に注意すると習得しやすくなります:

  • 常にシンプルな例から始め、徐々に機能を追加していく
  • 各ツール関数に明確なdocstringを書く(LLMはこれを読んでツールの使い方を理解します)
  • adk webを活用して実行フローを視覚的に確認する
  • マルチエージェントシステムを構築する際は、各エージェントのdescriptionを明確に区別する
  • 公式サンプル(adk-samples)を参考にする

まとめと参考リソース

 GoogleのAgent Development Kit(ADK)は、AI開発の次の段階を象徴するフレームワークです。単一のエージェントから複雑なマルチエージェントシステムまで、柔軟かつ制御可能な方法で構築できます。100行以下のコードでもMCPやガードレールを備えた実用的なエージェントを開発可能な点が特に注目されています。

 エージェントの構築、状態管理、安全性の確保、さらにはデプロイまで、ADKはエンドツーエンドのソリューションを提供します。Googleのエコシステムと緊密に統合されているものの、オープンなフレームワークであり、様々なモデルやツールと連携できる柔軟性も備えています。

参考リソース

コメント