powered by TechFeed
表示モード
ハウツー

Google ADKでマルチエージェントを作る — 「普通のPython関数をそのまま渡す」だけでReddit/Web検索を束ねるAIが動く

9月4日、Google AIが「Your First Multi-agent system: A Beginner's Guide to Building an AI Trend finder with ADK」と題した記事を公開した。この記事では、Google ADK(Agent Development Kit)を使い、マネージャーエージェントが複数のスペシャリストエージェントを指揮するマルチエージェントシステムを初心者向けに構築する手順について詳しく紹介されている。

9月4日、Google AIが「Your First Multi-agent system: A Beginner's Guide to Building an AI Trend finder with ADK」と題した記事を公開した。この記事では、Google ADK(Agent Development Kit)を使い、マネージャーエージェントが複数のスペシャリストエージェントを指揮するマルチエージェントシステムを初心者向けに構築する手順について詳しく紹介されている。


Google ADK とは

ADK(Agent Development Kit)は、Googleが2025年にオープンソースとして公開したエージェント開発フレームワークだ。Geminiモデルとのネイティブ統合を前提に設計されており、ツール登録・マルチエージェント構成・デバッグ支援などエージェント開発に必要な機能をひとまとめに提供する、Google公式のエージェント開発基盤として位置づけられている。


シングルエージェントの限界とマルチエージェントへの移行

本記事は2回シリーズの第2回にあたる。第1回Your First AI Agent: A Beginner's Guide to Building an AI Trend finder with ADK)では、Web検索でAIエージェント関連ニュースを収集する単一エージェントをゼロから構築した。今回はそこから一歩進み、オーケストレーター(管理者)エージェントがスペシャリスト(専門家)エージェントたちに仕事を割り振るマルチエージェント構成へとリファクタリングする。第1回を読んでいると構成の変化がより追いやすいが、本記事単体でも内容は完結している。

具体的には、以下2つのスペシャリストエージェントを用意する:

  • Google Search エージェント:Webニュースや技術記事を検索
  • Reddit エージェント:開発者コミュニティのホット投稿を収集(prawライブラリを使ったカスタムツール)

この構成の面白さは、Pythonの関数を1本書くだけでカスタムツールが作れ、それをそのままエージェントに渡せる点にある。ADKがツールのインターフェースを自動的に解釈するため、追加のグルーコードはほとんど不要だ。


ポイント①:Redditカスタムツールの作り方

マルチエージェント構成の中で最も実践的なのが、PythonでReddit APIを叩く関数をそのままADKのツールとして登録する部分だ。

まずRedditのAPIキーを取得し(Reddit Apps設定ページから無料で作成可能)、環境変数に設定する:

export REDDIT_CLIENT_ID="YOUR_CLIENT_ID"
export REDDIT_CLIENT_SECRET="YOUR_CLIENT_SECRET"
export REDDIT_USER_AGENT="TrendSpotterAgent/0.1 by u/YourUsername"

次にpraw(Python Reddit API Wrapper)をインストールする:

# requirements.txt
google-adk
praw

そしてtools.pyにカスタムツール関数を実装する:

import os
import praw

def search_hot_reddit_posts(subreddit_names: list[str], limit_per_subreddit: int = 5) -> str:
    """
    Searches a list of subreddits for their current hot posts and returns their titles and URLs.
    Args:
        subreddit_names: A list of subreddit names to search (e.g., ["LocalLLaMA", "MachineLearning"]).
        limit_per_subreddit: The number of top posts to retrieve from each subreddit.
    Returns:
        A string of formatted post titles and URLs joined by separators.
    """
    try:
        print(f"\n🔎 Searching Reddit for hot posts in: {', '.join(subreddit_names)}...")
        reddit = praw.Reddit(
            client_id=os.environ["REDDIT_CLIENT_ID"],
            client_secret=os.environ["REDDIT_CLIENT_SECRET"],
            user_agent=os.environ["REDDIT_USER_AGENT"],
            read_only=True,
        )
        all_posts = []
        for sub_name in subreddit_names:
            print(f"  - Fetching from r/{sub_name}...")
            subreddit = reddit.subreddit(sub_name)
            for post in subreddit.hot(limit=limit_per_subreddit):
                if post.score > 5:
                    all_posts.append(f"Title: {post.title}\nLink: {post.url}")
        if not all_posts:
            return "No hot posts found meeting the criteria in the specified subreddits."
        print(f"✅ Reddit search complete. Found {len(all_posts)} qualifying posts.")
        return "\n---\n".join(all_posts)
    except Exception as e:
        return f"Error searching Reddit: {e}"

※ 元記事のdocstringには Returns: A dictionary containing... と記載されているが、実装ではstr型を返している。上記はコードの実際の動作に合わせてdocstringを修正した版を掲載している。

この関数をtools引数に渡すだけでADKが自動的にツールとして認識する:

from google.adk.agents import Agent
from trend_spotter.tools import search_hot_reddit_posts

reddit_agent = Agent(
    name="reddit_agent",
    model="gemini-2.5-pro-preview-05-06",
    description="An expert at finding hot posts on specific Reddit subreddits using its tool.",
    tools=[search_hot_reddit_posts]
)

Pythonの型ヒントとdocstringがそのままツールの仕様書になるため、関数を丁寧に書く習慣がそのままエージェントの品質向上につながる。


ポイント②:オーケストレーターのプロンプト設計

マルチエージェント構成で最も設計コストがかかるのが、管理者エージェントへの指示(プロンプト)だ。記事では以下のような多段階タスクをオーケストレーターに与えている:

  1. まずGoogle Searchエージェントに「今日の日付」を取得させる
  2. 日付から過去7日間の範囲を算出し、after:YYYY-MM-DDbefore:YYYY-MM-DD演算子付きで技術ニュースを検索させる
  3. Redditエージェントにr/LocalLLaMAr/MachineLearningr/LangChainなど主要サブレディットのホット投稿を取得させる
  4. 両エージェントの結果を統合し、「開発者への影響が大きいもの」だけを抽出してレポートを生成する

最終レポートのフォーマットも厳密に指定されており、各トピックに「情報源URL」「開発者への影響」「優先度の根拠」を必ず添付するよう指示している。複数ソースに登場した話題は重要度が高いとみなすというロジックも、プロンプト内で明示的に定義している。


ポイント③:プロジェクト構成

trend-spotter/
├── trend_spotter/
│   ├── __init__.py
│   ├── agent.py          # オーケストレーターエージェント
│   ├── prompt.py         # オーケストレーター用プロンプト
│   ├── tools.py          # Redditカスタムツール
│   └── sub_agents/
│       ├── __init__.py
│       ├── google_search_agent.py
│       └── reddit_agent.py
├── pyproject.toml
└── requirements.txt

サブエージェントをsub_agents/ディレクトリに分離することで、エージェントを追加・差し替えしやすい構造になっている。


ポイント④:デバッグはTrace viewで

ADKにはTrace viewと呼ばれるデバッグ機能が付属しており、どのエージェントがどのツールをどの順序で呼び出したかを視覚的に確認できる。マルチエージェント構成になると実行フローが複雑になるため、このトレース機能の有無が開発効率に直結する。


まとめ

この記事が示す設計パターン——「普通のPython関数をツール化し、スペシャリストエージェントに渡し、オーケストレーターが束ねる」——は、ADKを使ったエージェント開発の基本形として再利用しやすい。情報収集の対象(Reddit、Slack、GitHub Issues等)を変えるだけで、さまざまなドメインに応用できる構造だ。

詳細はYour First Multi-agent system: A Beginner's Guide to Building an AI Trend finder with ADKを参照していただきたい。