はじめに

Google の Agent Development Kit (ADK) は、大規模言語モデル (LLM) を活用したエージェントアプリケーションを効率的に開発するためのフレームワークです。今回は、ADK のチュートリアルを参考に、特定の都市にあるポケモンセンターの情報を検索する簡単なエージェントを作成してみました。この記事では、その開発プロセスと技術的なポイントを紹介します。

ソース

プロジェクト概要

作成したエージェント (location_info_agent) は、ユーザーから都市名を指定されると、その都市にあるポケモンセンターのリストを返します。例えば、「札幌市のポケモンセンターは?」と尋ねると、「ポケモンセンターサッポロ」と「ポケモンストア 新千歳空港店」の情報を返すような動作を想定しています。

使用技術

  • フレームワーク: Google Agent Development Kit (ADK)
  • 言語: Python
  • LLM モデル: Gemini Flash (gemini-2.0-flash-exp) ※設定で変更可能
  • 主なライブラリ: google-adk

実装の詳細

1. エージェントの定義 (location_info_agent/agent.py)

ADK の中心となるのは Agent クラスです。以下のようにエージェントを定義しました。

from google.adk.agents import Agent

# ... (ポケモンセンターデータと get_pokemon_center 関数の定義) ...

# Agent 定義
root_agent = Agent(
    name="location_info_agent",
    model="gemini-2.0-flash-exp", # 使用するLLMモデル
    description=(
        "Agent to answer questions about Pokemon Centers in a city."
    ),
    instruction=(
        "I can answer your questions about Pokemon Centers in various cities."
    ),
    tools=[get_pokemon_center], # エージェントが利用するツール
)
  • name: エージェントの一意な名前。
  • model: エージェントが思考や応答生成に利用する LLM モデルを指定します。
  • description, instruction: エージェントの能力や役割を示す説明文です。LLM がエージェント自身の機能を理解するのに役立ちます。
  • tools: エージェントが利用可能なツール(関数)のリスト。LLM はユーザーのリクエストに応じて、これらのツールを呼び出す計画を立て、実行します。

2. ツールの実装 (get_pokemon_center 関数)

エージェントが実際にポケモンセンター情報を検索するためのツールとして、get_pokemon_center 関数を実装しました。

# ポケモンセンターデータのリスト (一部抜粋)
ALL_POKEMON_CENTERS = [
    {"name": "ポケモンセンターサッポロ", "city": "札幌市", "prefecture": "hokkaido"},
    {"name": "ポケモンストア 新千歳空港店", "city": "千歳市", "prefecture": "hokkaido"},
    # ... 他のデータ ...
]

def get_pokemon_center(city: str) -> dict:
    """指定された都市のポケモンセンター情報を返す"""
    found_centers = [
        center for center in ALL_POKEMON_CENTERS if center["city"] == city
    ]

    if found_centers:
        return {
            "status": "success",
            "centers": found_centers,
        }
    else:
        return {
            "status": "error",
            "error_message": f"Sorry, I don't have Pokemon Center information for {city}.",
        }
  • ポケモンセンターのデータは、現時点では agent.py 内にリスト (ALL_POKEMON_CENTERS) としてハードコーディングされています。(将来的には外部DBやAPIから取得する形も考えられます)
  • 関数は引数 city を受け取り、リスト内を検索して一致する都市のセンター情報を返します。
  • 検索結果の有無に応じて、status が “success” または “error” の辞書を返します。ADK はこの形式の戻り値を受け取って処理を進めます。

3. 動作の流れ

  1. ユーザーが ADK フレームワークを通じてエージェントに「〇〇市のポケモンセンターは?」のように質問します。
  2. LLM (Gemini Flash) は質問内容とエージェントの定義 (description, instruction, tools) を理解します。
  3. LLM は、この質問に答えるためには get_pokemon_center ツールを使う必要があると判断し、引数 city にユーザー指定の都市名を設定してツール呼び出しを計画します。
  4. ADK フレームワークが get_pokemon_center("〇〇市") を実行します。
  5. 関数が実行され、結果の辞書 (成功またはエラー) が返されます。
  6. LLM はツールの実行結果を受け取り、最終的な応答を生成してユーザーに返します。

まとめ

Google ADK を利用することで、LLM に外部ツール(今回は Python 関数)を使わせるエージェントを比較的簡単に構築できることがわかりました。エージェントの定義とツールの実装を分離することで、関心の分離が図られ、開発が進めやすくなっています。

今回は静的なデータリストを使いましたが、外部 API を呼び出すツールを実装すれば、より動的で複雑なタスクを実行するエージェントも作成できそうです。ADK はまだ新しいフレームワークですが、今後の発展が楽しみです。


この記事は Google の ADK チュートリアルを参考に作成されました。