Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Google Agent Development Kit (ADK) 入門 🚀

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for MIKIO KUBO MIKIO KUBO
June 02, 2025

Google Agent Development Kit (ADK) 入門 🚀

# Google Agent Development Kit (ADK) 入門 🚀

LLM搭載エージェント構築のための強力なフレームワーク

ネタ元:
https://github.com/bhancockio/agent-development-kit-crash-course

Avatar for MIKIO KUBO

MIKIO KUBO

June 02, 2025
Tweet

More Decks by MIKIO KUBO

Other Decks in Research

Transcript

  1. 開発環境の準備 (1/2) ADKを使い始めるための最初のステップは、開発環境のセットアップです。 1. 仮想環境の作成 (全てのサンプルで共通) # ルートディレクトリで仮想環境を作成 python -m

    venv .venv 2. 仮想環境の有効化 (ターミナルを開くたびに実行) macOS/Linux: source .venv/bin/activate Windows CMD: .venvScriptsactivate.bat Windows PowerShell: .venvScriptsActivate.ps1 3
  2. 開発環境の準備 (2/2) 3. 必要なライブラリのインストール pip install -r requirements.txt (通常、プロジェクトのルートに requirements.txt

    ファイルがあります) 4. API キーの設定 Google AI Studio https://aistudio.google.com/apikey でAPIキーを作成 Gemini APIキーが無料で登録でできる。 カード情報などがは入れないこと キーは 決して公開しないこと 4
  3. uv を用いた開発環境の準備 (1/2) ADKを使い始めるための最初のステップは、開発環境のセットアップです。 1. 仮想環境の作成 (全てのサンプルで共通) # ルートディレクトリで仮想環境を作成 uv

    init . uv python install 3.12 (3.9未満の場合は動かない) uv python pin 3.12 uv venv 2. 仮想環境の有効化 (ターミナルを開くたびに実行) macOS/Linux: source .venv/bin/activate Windows CMD: .venvScriptsactivate.bat Windows PowerShell: .venvScriptsActivate.ps1 5
  4. uv を用いた開発環境の準備 (2/2) 3. 必要なライブラリのインストール uv pip install -r requirements.txt

    もしくは uv add google-adk yfinance google-generativeai python-dotenv (通常、プロジェクトのルートに requirements.txt ファイルがあります) 4. API キーの設定 Google AI Studio https://aistudio.google.com/apikey でAPIキーを作成 Gemini APIキーが無料で登録でできる。 カード情報などがは入れないこと キーは 決して公開しないこと 6
  5. API キーの適用方法 各サンプルプロジェクトを実行するには、APIキーを環境変数ファイルに設定します。 1. 各サンプルフォルダに移動します。 2. .env.example という名前のファイルを .env に変更します。

    3. .env ファイルを開き、あなたのAPIキーを記述します: GOOGLE_API_KEY=your_api_key_here この作業は、実行したい各サンプルプロジェクトで行う必要があります。 7
  6. ADK でできること:サンプル概要 (1/2) ADKを使うと、様々なタイプのAIエージェントを構築できます(一部抜かします)。 1. 基本的なエージェント (Basic Agent) ユーザーの質問に応答する最もシンプルなエージェント。 2.

    ツールエージェント (Tool Agent) テキスト生成だけでなく、外部ツールを使って特定のアクションを実行。 5. セッションと状態管理 (Sessions and State) 複数回のやり取りで状態や記憶を維持。 7. マルチエージェント (Multi-Agent) 複数の専門エージェントが協力して複雑なタスクを解決。 8. ステートフル・マルチエージェント (Stateful Multi-Agent) 複雑な会話全体で状態を維持・更新。 8
  7. ADK でできること:サンプル概要 (2/2) 10. 逐次エージェント (Sequential Agent) 定義された順序でエージェントが情報を処理するパイプラインを作成。 11. 並列エージェント

    (Parallel Agent) 並行操作で効率とパフォーマンスを向上。 12. ループエージェント (Loop Agent) フィードバックループを通じて出力を反復的に改善。 9
  8. 基本的なADK エージェントとは? ADKの中心的なコンポーネントは LlmAgent (または単に Agent ) です。これはアプリケーションの「思考」部分 を担当します。 LLM

    ( 大規模言語モデル) の力を活用して以下を行います: 推論 自然言語の理解 意思決定 応答の生成 ツールとの連携 LlmAgent は、指示や文脈を解釈し、動的に次の行動や使用するツールを決定します。 11
  9. エージェントの必須プロジェクト構造 ADK ( adk web コマンド) がエージェントを正しく認識し実行するためには、特定のフォルダ構造に従う必要があ ります。 親フォルダ/ エージェントフォルダ/

    # エージェントのパッケージディレクトリ __init__.py # agent.py をインポートする必要がある agent.py # root_agent を定義する必要がある .env # 環境変数ファイル (APIキーなど) ポイント: adk コマンドは、エージェントフォルダを含む親フォルダで実行します。 例: adk web はエージェントフォルダを含む親フォルダで実行。 12
  10. エージェントの主要コンポーネント エージェントを定義する際の主要な要素です。 1. アイデンティティ ( name , description ) name

    (必須): エージェントの一意な名前 (文字列)。 description (任意だが推奨): エージェントの能力を簡潔に説明。他のエージェントがタスクを委任する かどうかの判断材料になります。 2. モデル ( model ) エージェントが使用するLLMを指定 (例: "gemini-1.5-flash")。 能力、コスト、パフォーマンスに影響します。 3. 指示 ( instruction ) エージェントの振る舞いを形成する最も重要なパラメータ。 コアタスクや目標、性格、行動制約、ツールの使用方法、望ましい出力形式などを定義します。 4. ツール ( tools ) LLMの知識だけでは対応できないタスクを実行するための追加機能。 13
  11. 基本的なエージェントの実行例 (2/2) 実行方法: 1. 1-basic-agent ディレクトリ (エージェントフォルダの親) に移動します。 2. インタラクティブなウェブUIを起動します:

    adk web 3. ターミナルに表示されるURL (通常 http://localhost:8000 ) をブラウザで開きます。 4. UIの左上にあるドロップダウンメニューから自分のエージェントを選択します。 5. 画面下部のテキストボックスでエージェントとチャットを開始します。 試してみるプロンプト例: 「スペイン語でこんにちはは何ですか?」 「日本語でのフォーマルな挨拶は?」 15
  12. トラブルシューティングと他の実行方法 エージェントがドロップダウンに表示されない場合: adk web を親ディレクトリから実行しているか確認。 __init__.py が agent.py を正しくインポートしているか確認。 agent.py

    が root_agent 変数を定義しているか確認。 他の実行方法: adk run [エージェント名] : ターミナルで直接エージェントを実行。 adk api_server : FastAPIサーバーを起動し、APIリクエストをテスト。 16
  13. コード例:基本的な挨拶エージェント ( agent.py ) from google.adk.agents import Agent root_agent =

    Agent( name="greeting_agent", model="gemini-2.0-flash", # または "gemini-2.5-pro" など description="挨拶をするエージェント", instruction=""" あなたはユーザーに挨拶をする親切なアシスタントです。 ユーザーの名前を尋ね、名前で挨拶してください。 """ ) このエージェントは、ユーザーの名前を尋ねて挨拶を返します。 17
  14. ツールエージェントの主要コンポーネント 1. 組み込みツール ADKはいくつかの便利な組み込みツールを提供しています: Google 検索 (google_search): Webで情報を検索。 コード実行 (built_in_code_execution):

    コードスニペットを実行。 Vertex AI Search: 独自のデータ内を検索。 重要: 現在、各ルートエージェントまたは単一エージェントでは、1 つの組み込みツールのみサポートされてい ます。 19
  15. ツールエージェントの主要コンポーネント 2. カスタム関数ツール Python関数を定義することで、独自のツールを作成できます。 カスタム関数ツールのベストプラクティス: 引数: 標準的なJSONシリアライズ可能な型 (文字列, 数値, リスト,

    辞書) を使用。 デフォルト値なし: 現在、デフォルト値はサポートされていません。 戻り値の型: 辞書型が推奨されます ( {"status": "success", "result": "..."} )。 Docstring ( 説明文): 関数のDocstringがツールの説明としてLLMに送られます。LLMがツールを効果的に使え るよう明確に記述しましょう。 20
  16. ツール使用時の制限事項 組み込みツールとカスタムツールの混在不可 同じエージェント内で組み込みツールとカスタム関数ツールを混在させることは できません。 例: # 非サポート def get_current_time() ->

    dict: # カスタムツール """ Get the current time in the format YYYY-MM-DD HH:MM:SS """ return {"current_time": ...} root_agent = Agent( tools=[google_search, get_current_time], # 組み込み + カスタム ) 両方使いたい場合は、後述のマルチエージェントでの「Agent as a Tool」アプローチが必要です。 22
  17. ツールエージェントの実行例 この例では、Google検索ツールを使って情報を検索するエージェントを作成します。 準備: 1. 仮想環境を有効化します。 2. 2-tool-agent フォルダ内の .env.example を

    .env にリネームし、APIキーを設定します。 実行方法: 1. 2-tool-agent ディレクトリに移動します。 2. adk web を実行し、ブラウザでUIを開きます。 3. tool_agent を選択し、チャットを開始します。 試してみるプロンプト例: 「人工知能に関する最近のニュースを検索して」 「GoogleのAgent Development Kitについて調べて」 23
  18. コード例:検索ツールエージェント ( agent.py ) from google.adk.agents import Agent from google.adk.tools

    import google_search # Google検索ツールをインポート root_agent = Agent( name="tool_agent", model="gemini-2.0-flash", description="ツールを使って情報を検索するエージェント", instruction=""" あなたは親切なアシスタントで、以下のツールを使用できます: - google_search """, tools=[google_search], # Google検索ツールをエージェントに渡す ) 24
  19. コード例:カスタムツールエージェント ( agent.py ) from google.adk.agents import Agent from datetime

    import datetime def get_current_time() -> dict: """現在の時刻を YYYY-MM-DD HH:MM:SS 形式で取得します""" return { "current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), } root_agent = Agent( name="tool_agent", model="gemini-2.0-flash", description="ツールを使って現在時刻を得るエージェント", instruction=""" あなたは親切なアシスタントで、以下のツールを使用できます: - get_current_time """, tools=[get_current_time], # カスタムツールを使う場合 # tools=[google_search, get_current_time], # 混在は非サポート ) 25
  20. ADK におけるセッションと状態管理 セッションを利用すると、エージェントが複数回の対話を通じてコンテキストを維持し、ユーザー情報を記憶でき るようになります。 ADK のセッションでできること: 1. 状態(State) の維持: ユーザーデータ、好みなどを対話間で保存・アクセス。

    2. 会話履歴の追跡: メッセージ履歴を自動的に記録・取得。 3. 応答のパーソナライズ: 保存された情報を使って、より文脈に沿ったパーソナルな体験を提供。 これにより、エージェントは以前のやり取りを「覚えて」いるため、ユーザーとの関係を時間とともに構築できま す。 26
  21. セッションと状態管理の実行例 この例では、ユーザーの好みを記憶し、それに基づいて応答するエージェントを作成します。 準備: 1. 仮想環境を有効化します。 2. 5-sessions-and-state フォルダ内に .env ファイルを作成し、APIキーを設定します。

    実行方法 ( basic_stateful_session.py を実行): python basic_stateful_session.py これにより、 1. ユーザー情報を含む新しいセッションが作成されます。 2. そのセッションにアクセスできるエージェントが初期化されます。 3. 保存された好みに関するユーザーの質問が処理されます。 4. セッションデータに基づいたエージェントの応答が表示されます。 27
  22. コードの主要部分:セッションと状態管理 セッションサービスの利用 ( InMemorySessionService ): from google.adk.sessions import InMemorySessionService session_service

    = InMemorySessionService() 初期状態の定義: initial_state = { "user_name": "ブランドン・ハンコック", "user_preferences": """ ピックルボール、ディスクゴルフ、テニスが好きです。好きな食べ物はメキシコ料理です。 好きなテレビ番組はゲーム・オブ・スローンズです。 """, } セッションの作成: stateful_session = session_service.create_session( app_name="BrandonBot", # アプリ名 user_id="brandon_hancock", # ユーザーID session_id=str(uuid.uuid4()), # セッションID state=initial_state, # 初期状態 ) 28
  23. コードの主要部分:エージェントの指示と実行 エージェントの指示で状態にアクセス: agent.py 内の Agent 定義で、指示 ( instruction ) に

    {user_name} や {user_preferences} (状態のキー) のようにテンプレート変数を使います。これらはセッション状態から自動的に置き換えられます。 # question_answering_agent/agent.py より question_answering_agent = Agent( name="question_answering_agent", model="gemini-2.0-flash", description="Question answering agent", instruction=""" ユーザーの好みに関する質問に答える親切なアシスタントです。 ユーザーに関する情報は、以下のとおりです。 名前: {user_name} 好み: {user_preferences} """, ) """ 29
  24. セッションを使ったエージェントの実行: Runner に session_service を渡します。 from google.adk.runners import Runner runner

    = Runner( agent=question_answering_agent, # エージェントのインスタンス app_name="BrandonBot", session_service=session_service, # セッションサービス ) => 好みを状態から読み取り、答えられるようになる! 30
  25. マルチエージェントのプロジェクト構造要件 マルチエージェントシステムがADKで正しく動作するためには、特定のフォルダ構造が必要です。 親フォルダ/ ├── ルートエージェントフォルダ/ (例: "manager") │ ├── __init__.py

    # agent.py をインポート │ ├── agent.py # root_agent を定義 │ ├── .env # 環境変数 │ └── sub_agents/ # 全てのサブエージェント用ディレクトリ │ ├── __init__.py # 空かサブエージェントをインポート │ ├── エージェント1フォルダ/ # サブエージェントパッケージ │ │ ├── __init__.py # agent.py をインポート │ │ └── agent.py # エージェント変数を定義 │ ├── エージェント2フォルダ/ │ │ └── ... │ └── ... ルートエージェント: 全体を管理し、タスクをサブエージェントに振り分けます。 サブエージェント: 特定の機能を持つ専門家です。 32
  26. マルチエージェントのアーキテクチャオプション ADKでは主に2つのアプローチでマルチエージェントシステムを構築できます。 1. サブエージェント委任モデル ( sub_agents パラメータ) ルートエージェントがタスクを専門エージェントに完全に委任します。 root_agent =

    Agent( name="manager", # ... 他のパラメータ sub_agents=[stock_analyst, funny_nerd], # サブエージェントのリスト ) 特徴: 完全な委任。サブエージェントが応答全体を担当。ルートエージェントは「ルーター」として機能。 33
  27. 2. Agent-as-a-Tool モデル ( AgentTool ラッパー) エージェントを他のエージェントのツールとして使用します。 from google.adk.tools.agent_tool import

    AgentTool root_agent = Agent( name="manager", # ... 他のパラメータ tools=[ AgentTool(news_analyst), # エージェントをツールとしてラップ get_current_time, # 通常のカスタムツール ], ) 特徴: サブエージェントは結果をルートエージェントに返す。ルートエージェントは制御を維持し、応答を柔 軟に組み合わせられる。 34
  28. マルチエージェント使用時の制限事項 サブエージェントの制限 サブエージェント内で組み込みツールは使用できません。 例:サブエージェント内で google_search や built_in_code_execution のような組み込みツールを使うことは 非サポートです。 回避策:

    AgentTool の利用 複数の組み込みツールを使いたい場合や、組み込みツールと他のツールを組み合わせたい場合は、 AgentTool ア プローチを使います。 各組み込みツールを持つエージェントを作成し、それらを AgentTool でラップしてルートエージェントのツール として使用します。 from google.adk.tools import agent_tool, google_search, built_in_code_execution search_agent = Agent(name='SearchAgent', tools=[google_search]) coding_agent = Agent(name='CodeAgent', tools=[built_in_code_execution]) root_agent = Agent( name="RootAgent", tools=[ agent_tool.AgentTool(agent=search_agent), agent_tool.AgentTool(agent=coding_agent) ], ) 35
  29. マルチエージェントの実行例 この例では、マネージャーエージェントが3つの専門エージェントと連携します。 1. 株価アナリスト (サブエージェント): 金融情報や株価の洞察を提供。 2. ファニーナード (サブエージェント): 技術的なトピックに関する面白いジョークを作成。

    3. ニュースアナリスト (AgentTool): 最新テクノロジーニュースの要約を提供。 準備: 1. 仮想環境を有効化します。 2. 6-multi-agent/manager フォルダ内の .env.example を .env にリネームし、APIキーを設定します。 実行方法: 1. 6-multi-agent ディレクトリに移動します。 2. adk web を実行し、UIで manager エージェントを選択します。 試してみるプロンプト例: 「今日の株式市場について教えて」 「プログラミングに関する面白いジョークを言って」 36
  30. コード例:マルチエージェント ( manager/agent.py ) from google.adk.agents import Agent from google.adk.tools.agent_tool

    import AgentTool # サブエージェントとツールをインポート from .sub_agents.funny_nerd.agent import funny_nerd from .sub_agents.news_analyst.agent import news_analyst # AgentToolとして使用 from .sub_agents.stock_analyst.agent import stock_analyst from .tools.tools import get_current_time # カスタムツール root_agent = Agent( name="manager", model="gemini-1.5-flash", description="マネージャーエージェント", instruction=""" あなたは他のエージェントの作業を監督するマネージャーエージェントです。 常に適切なエージェントにタスクを委任してください。 以下のエージェントにタスクを委任する責任があります: - stock_analyst - funny_nerd また、以下のツールにアクセスできます: - news_analyst (AgentTool経由) - get_current_time """, sub_agents=[stock_analyst, funny_nerd], # 委任モデルのサブエージェント tools=[ AgentTool(news_analyst), # Agent-as-a-Toolモデル get_current_time, ], ) 37
  31. news_analyst/agant.pyで は、 google_search ツールを使っているので、AgentToolとして登録! from google.adk.agents import Agent from google.adk.tools

    import google_search news_analyst = Agent( name="news_analyst", model="gemini-2.0-flash", description="News analyst agent", instruction=""" You are a helpful assistant that can analyze news articles and provide a summary of the news. When asked about news, you should use the google_search tool to search for the news. If the user ask for news using a relative time, you should use the get_current_time tool to get the current time to use in the search query. """, tools=[google_search], ) 38
  32. プロジェクト構成 以下のようなフォルダ構成でプロジェクトが進められます。 7-stateful-multi-agent/ ├── customer_service_agent/ # メインエージェントパッケージ │ ├── __init__.py

    # ADKが発見するために必要 │ ├── agent.py # ルートエージェントの定義 │ └── sub_agents/ # 専門エージェント │ ├── course_support_agent/ # コース内容に関する質問を処理 │ ├── order_agent/ # 注文履歴と払い戻しを管理 │ ├── policy_agent/ # ポリシーに関する質問に回答 │ └── sales_agent/ # コースの購入を処理 ├── main.py # セッション設定を含むアプリケーションのエントリーポイント ├── utils.py # 状態管理のためのヘルパー関数 ├── .env # 環境変数 43
  33. 主要コンポーネント (1/2) 1. セッション管理 InMemorySessionService を使用してセッションの状態を保存します。 初期状態の定義とセッションの作成: session_service = InMemorySessionService()

    def initialize_state(): """初期状態でセッションの状態を初期化します。""" return { "user_name": "ブランドン・ハンコック", "purchased_courses": [""], "interaction_history": [], } # 初期状態で新しいセッションを作成 session_service.create_session( app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID, state=initialize_state(), ) 44
  34. 3. マルチエージェント委任 顧客サービスエージェントは、クエリを専門のサブエージェントにルーティングします。 customer_service_agent = Agent( name="customer_service", model="gemini-2.0-flash", description="AI Developer

    Acceleratorコミュニティのカスタマーサービスエージェント", instruction=""" あなたはAI Developer Acceleratorコミュニティの主要なカスタマーサービスエージェントです。 あなたの役割は、ユーザーの質問を支援し、適切な専門エージェントに案内することです。 # ... 詳細な指示 ... <クエリを適切にルーティング>, <状態と履歴を管理・利用> """, sub_agents=[policy_agent, sales_agent, course_support_agent, order_agent], tools=[get_current_time], ) 46
  35. どのように動作するのか 1. 初期セッションの作成: ユーザー情報と空の対話履歴で新しいセッションが作成されます。 セッションの状態はデフォルト値で初期化されます。 2. 会話の追跡: 各ユーザーメッセージは、状態の interaction_history に追加されます。

    エージェントは過去の対話を確認してコンテキストを維持できます。 3. クエリルーティング: ルートエージェントはユーザーのクエリを分析し、どの専門家が処理すべきかを決定します。 専門エージェントは、委任される際に完全な状態コンテキストを受け取ります。 47
  36. カスタムツール内で状態を読む方法 (ToolContext) sub_agents/sales_agent/agent.py で、tool_contextで呼び出し側の状態 state を参照 from google.adk.tools.tool_context import ToolContext

    def purchase_course(tool_context: ToolContext) -> dict: """ AI マーケティングプラットフォームコースの購入をシミュレートします。 購入情報で状態を更新します。 """ course_id = "ai_marketing_platform" current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 現在のコース購入状態を得る current_purchased_courses = tool_context.state.get("purchased_courses", []) ... 49
  37. 高度な機能 1. 対話履歴の追跡 システムは、コンテキストを提供するために対話の履歴を保持します。 # ユーザーのクエリで対話履歴を更新 add_user_query_to_history( session_service, APP_NAME, USER_ID,

    SESSION_ID, user_input ) 2. 動的なアクセス制御 システムは、特定のエージェントへの条件付きアクセスを実装しています。 3. コースサポートエージェント - コース内容に関する質問に対応 - ユーザーが購入したコースでのみ利用可能 - "ai_marketing_platform" が購入済みコースにあるかどうかを確認してからルーティング 53
  38. 本番環境での考慮事項 本番環境での実装では、以下を検討してください。 1. 永続ストレージ: アプリケーションの再起動を超えて状態を永続化するために、 InMemorySessionService を DatabaseSessionService に置き換えます。 2.

    ユーザー認証: ユーザーを安全に識別するための適切なユーザー認証を実装します。 3. エラー処理: エージェントの失敗や状態の破損に対する堅牢なエラー処理を追加します。 4. モニタリング: システムのパフォーマンスを追跡するためのロギングとモニタリングを実装します。 55
  39. 1. Sequential Agent ( 逐次エージェント) Sequential Agent とは? サブエージェントを 決められた順番

    で一つずつ実行するワークフローエージェントです。 特徴1: 決まった順序で実行 サブエージェントは定義された通りの順番で実行されます。 特徴2: エージェント間でデータを引き継ぐ 前のエージェントの出力を、次のエージェントの入力として使えます(状態管理)。 特徴3: 処理パイプラインを作成 各ステップが前のステップの出力に依存する処理の流れを作るのに最適です。 どんな時に使う? 処理の順番が重要な、ステップバイステップのワークフローを作りたいとき。 例: 料理のレシピ、組み立てラインなど 56
  40. Sequential Agent 具体例: リード評価パイプライン 目的: 営業チームが見込み顧客(リード)の情報を評価し、次のアクションを決めるパイプラインです。 lead_qualification_agent がSequential Agentとして、以下のサブエージェントを順番に実行します。 1.

    リード検証エージェント (Lead Validator Agent) リード情報が評価に十分かチェック(連絡先、興味など)。 出力: 「有効」または「無効」(理由付き)。 2. リードスコアリングエージェント (Lead Scorer Agent) 有効なリードを1~10点で評価(緊急度、予算、決裁権など)。 出力: 数値スコア(簡単な理由付き)。 3. アクション推奨エージェント (Action Recommender Agent) 検証結果とスコアに基づき、次の行動を提案。 出力: 具体的なアクション提案。 57
  41. Sequential Agent: プロジェクト構成 ( 例) lead_qualification_agent/ # メインのSequential Agent ├──

    agent.py # Sequential Agentの定義 └── subagents/ # サブエージェント群 ├── validator/ │ └── agent.py # 検証エージェント lead_validator_agent ├── scorer/ │ └── agent.py # スコアリングエージェント lead_scorer_agent └── recommender/ └── agent.py # 推奨エージェント action_recommender_agent 58
  42. Sequential Agent の定義 lead_qualification_agent/agent.py でSequentialAgentを作る root_agent = SequentialAgent( name="LeadQualificationPipeline", sub_agents=[lead_validator_agent,

    lead_scorer_agent, action_recommender_agent], description="A pipeline that validates, scores, and recommends actions for sales leads", ) 59
  43. サブエージェント (1) 検証エージェント subagents の中に validiator, scorer, recommenderフォルダがあり、 各々にagent.pyが入っている lead_validator_agent

    = LlmAgent( name="LeadValidatorAgent", model="gemini-2.0-flash", instruction=""" 省略 : 検証状態を「有効」か「無効」かで返すように指示""", description="リード情報が妥当化どうかの判定をする.", output_key="検証状態", ) 各サブエージェントの出力は output_key を使ってセッション状態に保存され、後続のエージェントが利用でき ます。 60
  44. サブエージェント (2) スコアエージェント lead_scoreer_agent = LlmAgent( name="LeadScorerAgent", model="gemini-2.0-flash", instruction=""" 省略

    : スコアを数値で返すように指示""", description="そこあを1-10の数値で返す.", output_key="リードスコア", ) 61
  45. サブエージェント (3) 推薦エージェント action_recommender_agent = LlmAgent( name="ActionRecommenderAgent", model="gemini-2.0-flash", instruction="""リードスコアと検証状態をもとに推奨行動を作る Lead

    Score: {リードスコア} Lead Validation Status: {検証状態} """, description="リードの質から推奨行動を返す.", output_key="推奨行動", ) 62
  46. Sequential Agent: 実行例 例1: 十分な情報があるリード リード情報: 名前: 山田 花子 メール:

    [email protected] 電話: 090-xxxx-xxxx 会社: テックイノベート株式会社 役職: CTO 興味: カスタマーサポート自動化のためのAIソリューションを探している 予算: 500万~1000万円 導入時期: 次の四半期以内 期待される出力 ( 概要): 検証: 有効 スコア: 高い (例: 9/10) 推奨: 営業担当者がすぐに連絡 63
  47. Sequential Agent: 実行例 ( つづき) 例2: 情報が不十分なリード リード情報: 名前: 佐藤

    太郎 メール: [email protected] 興味: AIで何かできれば 備考: 展示会で会った。ニーズは曖昧。 期待される出力 ( 概要): 検証: 無効 (理由: 連絡先不足、具体的なニーズ不明) スコア: (スコアリング対象外) 推奨: 追加情報を収集する 64
  48. 2. Parallel Agent ( 並列エージェント) Parallel Agent とは? 複数のサブエージェントを 同時に実行

    するワークフローエージェントです。 特徴1: 同時に実行 サブエージェントは逐次的ではなく、並行して動作します。 特徴2: 独立して動作 各サブエージェントは、実行中は互いに状態を共有せず、独立して作業します。 特徴3: パフォーマンス向上 互いに依存しないタスクを並列化することで、ワークフロー全体の処理時間を大幅に短縮できます。 どんな時に使う? 複数の独立したタスクを効率的に実行し、時間を節約したいとき。 例: 複数の情報源から同時にデータを収集する、複数の画像を一度に処理するなど。 65
  49. Parallel Agent 具体例: システム監視エージェント 目的: システムの様々な情報(CPU、メモリ、ディスク)を同時に収集し、総合的な健康状態レポートを作成しま す。 system_monitor_agent は、Parallel AgentとSequential

    Agentを組み合わせて使用します。 処理の構成: 1. 並列でのシステム情報収集 ( ParallelAgent を使用) CPU使用状況と統計 メモリ使用量 ディスク容量と使用状況 2. 逐次でのレポート統合 (収集後に SequentialAgent 内の別エージェントが実行) 集めた全情報をまとめて総合レポートを作成 66
  50. Parallel Agent 具体例: システム監視エージェント サブエージェントと処理の流れ 情報収集サブエージェント ( 並列実行): CPU 情報エージェント:

    CPUコア数、使用率などを収集。 メモリ情報エージェント: 総メモリ量、使用量、空き容量を収集。 ディスク情報エージェント: ディスク総容量、使用量、空き容量を収集。 レポート統合サブエージェント ( 逐次実行): システムレポート統合エージェント: 上記3つのエージェントの出力をまとめ、総合レポートを生成。 ポイント: 情報収集は並列で高速に、その後のレポート作成は逐次的に行います。 67
  51. Parallel Agent: コード例 ( 抜粋) system_monitor_agent/agent.py より: # --- 1.

    並列エージェントを作成し、情報収集を同時に行う --- system_info_gatherer = ParallelAgent( name="system_info_gatherer", sub_agents=[cpu_info_agent, memory_info_agent, disk_info_agent], ) # --- 2. 逐次パイプラインを作成: 並列で情報収集後、統合する --- root_agent = SequentialAgent( name="system_monitor_agent", sub_agents=[system_info_gatherer, system_report_synthesizer], ) この例では、 ParallelAgent (情報収集) が SequentialAgent の一部として使われています。 重要なポイント: 独立した実行 Parallel Agent内のサブエージェントは、実行中は互いに影響し合うことなく独立して動作します。 各エージェントの結果は、全ての並列処理が完了した後に集められます。 その後、統合エージェントがこれらの結果を利用します。 68
  52. Parallel Agent: プロジェクト構成 ( 例) system_monitor_agent/ # メインエージェント ├── agent.py

    # Parallel/Sequential Agent定義 └── subagents/ # サブエージェント群 ├── cpu_info_agent/ │ └── agent.py # CPU情報エージェント cpu_infoを出力 ├── memory_info_agent/ │ └── agent.py # メモリ情報エージェント memory_infoを出力 ├── disk_info_agent/ │ └── agent.py # ディスク情報エージェント disk_infoを出力 └── synthesizer_agent/ └── agent.py # レポート統合エージェント cpu, memory, disk状態からレポート出力 動かしてみよう ( セットアップは後述) 1. cd 10-parallel-agent 2. adk web 3. Web UIで system_monitor_agent を選択し、プロンプトを入力。 例: システムヘルスをチェックして 69
  53. 3. Loop Agent ( ループエージェント) Loop Agent とは? 1つまたは複数のサブエージェントを、特定の 条件が満たされるまで繰り返し実行

    するワークフローエージェン トです。 特徴1: 反復実行 サブエージェント群を何度も実行します。 特徴2: 条件に基づく制御 ループを続けるか終了するかの条件を設定できます。 最大反復回数を指定することも可能です。 特徴3: 段階的な改善 何かを生成し、評価し、フィードバックに基づいて改善する、といった反復的なプロセスに適していま す。 どんな時に使う? 品質が目標に達するまでコンテンツを改善し続けたいとき。 特定の条件が満たされるまで試行錯誤を繰り返したいとき。 70
  54. Loop Agent 具体例: LinkedIn 投稿生成ループエージェント 目的: LinkedInの投稿を生成し、品質要件(文字数など)を満たすまで繰り返し改善します。 アーキテクチャ: LinkedInPostGenerationPipeline (SequentialAgent

    - ルートエージェント) 1. 初期投稿ジェネレーター ( InitialPostGenerator ): 最初の投稿ドラフトを作成。 2. 改善ループ ( PostRefinementLoop ) (LoopAgent): i. 投稿レビューア ( PostReviewer ): 投稿を評価。品質OKならループ終了。NGならフィードバック。 ii. 投稿リファイナー ( PostRefiner ): フィードバックに基づき投稿を改善。 この処理は、レビューアが「OK」を出すか、最大反復回数に達するまで繰り返されます。 71
  55. Loop Agent 具体例: LinkedIn 投稿生成 処理の流れ 入力: "ADKチュートリアルで学んだことについてLinkedIn投稿を生成して" │ ▼

    (SequentialAgent) ┌────────────────────────────┐ │ 1. 初期投稿ジェネレーター  │ └────────────────────────────┘ │ 生成された投稿 ▼ (LoopAgent: PostRefinementLoop - 最大10回) ┌────────────────────────────┐ │ 2.a. 投稿レビューア │ │ - 品質チェック (文字数など) │ │ - OKならループ終了? │ └────────────────────────────┘ │ YES (ループ終了) ▼ NO (フィードバックと共に次へ) │ │ │ ▼ │ ┌────────────────────────────┐ │ │ 2.b. 投稿リファイナー │ │ │ - フィードバックに基づき改善 │ │ └────────────────────────────┘ │ │ (改善された投稿) └────────────────────── (ループの先頭へ) ▼ 最終的な投稿 ループ制御の鍵: exit_loop ツール 72
  56. Loop Agent: コード例 ( 抜粋) linkedin_post_generator/agent.py より: # --- 改善ループエージェントを作成

    --- refinement_loop = LoopAgent( name="PostRefinementLoop", max_iterations=10, # 最大10回繰り返す sub_agents=[ post_reviewer, # 1. レビュー post_refiner, # 2. 改善 (レビュー結果がNGの場合) ], ) # --- 全体の逐次パイプラインを作成 --- root_agent = SequentialAgent( name="LinkedInPostGenerationPipeline", sub_agents=[ initial_post_generator, # ステップ1: 初期投稿を生成 refinement_loop, # ステップ2: ループでレビューと改善 ], ) この例では、 LoopAgent が SequentialAgent の一部として使われています。 73
  57. Loop Agent: プロジェクト構成 ( 例) linkedin_post_generator/ # メインエージェント ├── agent.py

    # Loop/Sequential Agent定義 └── subagents/ # サブエージェント群 ├── post_generator.py # 初期投稿生成 current_postを出力 ├── post_reviewer.py # 投稿レビュー (ループ制御ツール含む) current_postを入力、review_feedbackを出力 └── post_refiner.py # 投稿改善 current_postとreview_feedbackを入力、current_postを出力 動かしてみよう ( セットアップは後述) 1. cd 11-loop-agent 2. adk web 3. Web UIで LinkedInPostGenerationPipeline を選択し、プロンプトを入力。 例: 「AI with Brandon の ADK チュートリアルから学んだこと」についてLinkedIn投稿を生成して。 ループの終了条件 1. 投稿が品質要件を満たした時(レビューアが exit_loop ツールを呼び出す) 2. 最大反復回数(この例では10回)に達した時 74
  58. ワークフローエージェントの比較まとめ 特徴 Sequential Agent ( 逐次) Parallel Agent ( 並列)

    Loop Agent ( ループ) 実行順序 厳密に定義された順序 同時に実行 繰り返し実行 サブエージェント 前の出力に依存可能 独立して動作 (実行中は) 条件に基づき反復 主な用途 ステップバイステップの処理 独立タスクの高速化 反復的な改善、試行錯誤 データ共有 状態管理で引き継ぎ 実行完了後に結果を収集 ループ内で状態を更新・参照 例 リード評価パイプライン システム情報収集 LinkedIn投稿生成・改善 ポイント: これらを組み合わせて、より複雑で効率的なAIアプリケーションを構築できます! (例: Parallel Agentの結果をSequential Agentで処理、Sequential Agentの一部でLoop Agentを使用) 75