ADK を使用してマルチエージェント システムを構築する

1. はじめに

概要

このラボでは、Google Agent Development Kit(Google ADK)を使用して、複雑なマルチエージェント システムをオーケストレーションする方法を学びます。シンプルなエージェント階層から、自動化されたコラボレーション ワークフローの構築へと進みます。

作成するアプリの概要

次の 2 つの異なるマルチエージェント システムを構築します。

  • 「ブレインストーミング」エージェントと「観光スポット計画」エージェントの間で会話を転送することを学習するシンプルな旅行計画エージェント
  • 自動化されたエージェント(リサーチャー、脚本家、批評家など)の「ライターズ ルーム」を使用して、ループ内で連携して映画のプロット全体を作成する、より高度な映画のピッチ ジェネレータ

学習内容

  • 親エージェントとサブエージェントの関係を作成する方法。
  • ツールからセッション state にデータを書き込む方法。
  • キー テンプレート(state{my_key?})。
  • ステップバイステップのワークフローに SequentialAgent を使用する方法。
  • LoopAgent を使用して反復的な改善サイクルを作成する方法。
  • ParallelAgent を使用して独立したタスクを同時に実行する方法。

2. マルチエージェント システム

Agent Development Kit(ADK)を使用すると、開発者は生成モデルからより信頼性が高く洗練された、複数ステップの動作を導き出すことができます。ADK を使用すると、1 つの複雑なプロンプトではなく、複数のシンプルな エージェントのフローを構築して、作業を分担して問題に取り組むことができます。

このアプローチには、単一のモノリシック プロンプトを使用するよりもいくつかのメリットがあります。

  • シンプルな設計: 大規模で複雑なプロンプトを設計するよりも、小規模で特殊なエージェントのフローを設計して整理する方が簡単です。
  • 信頼性: 専門分野に特化したエージェントは、大規模で複雑なエージェントよりも特定のタスクで信頼性が高くなります。
  • 保守性: 小さな専用エージェントは、システムの他の部分を壊すことなく修正または改善できます。
  • モジュール性: 1 つのワークフロー用に構築されたエージェントを他のワークフローで簡単に再利用できます。

階層エージェント ツリー

階層エージェントを示すツリー構造

ADK では、エージェントをツリー構造で編成します。この階層は、会話のフローを制御するうえで重要です。どのエージェントがどのエージェントに会話を「渡す」ことができるかを制限するためです。これにより、システムの動作が予測しやすくなり、デバッグも容易になります。利点:

  • 直感的な設計: 実際のチームからヒントを得た構造になっているため、推論が容易です。
  • 制御されたフロー: 階層により、タスクの委任を正確に制御できるため、デバッグに役立ちます。たとえば、ツリー構造により、説明が似たレポート作成エージェントが 2 つある場合でも、正しいエージェントが呼び出されます。

構造全体は root_agent で始まります。このエージェントはとして機能し、1 つ以上のサブエージェントを持つことができます。サブエージェントは、独自のサブエージェントの親になることもでき、ツリーを形成します。

3. プロジェクトの設定

Google アカウント

個人の Google アカウントをお持ちでない場合は、Google アカウントを作成する必要があります。

仕事用または学校用アカウントではなく、個人アカウントを使用します。

Google Cloud コンソールにログインする

個人の Google アカウントを使用して Google Cloud コンソールにログインします。

課金を有効にする

5 ドル分の Google Cloud クレジットを利用する(省略可)

このワークショップを実施するには、クレジットが設定された請求先アカウントが必要です。独自の請求を使用する予定の場合は、この手順をスキップできます。

  1. このリンクをクリックして、個人の Google アカウントでログインします。次のような画面が表示されます。クレジットのページはこちらをクリック
  2. [クレジットにアクセスするにはこちらをクリック] ボタンをクリックします。お支払いプロファイルを設定するページが表示されます。お支払い情報の設定ページ
  3. [確認] をクリックします。

これで、Google Cloud Platform 無料トライアルの請求先アカウントに接続されました。

請求の概要のスクリーンショット

個人用の請求先アカウントを設定する

Google Cloud クレジットを使用して課金を設定した場合は、この手順をスキップできます。

個人用の請求先アカウントを設定するには、Cloud コンソールでこちらに移動して課金を有効にします

注意事項:

  • このラボを完了するのにかかる Cloud リソースの費用は 1 米ドル未満です。
  • このラボの最後の手順に沿ってリソースを削除すると、それ以上の料金は発生しません。
  • 新規ユーザーは、300 米ドル分の無料トライアルをご利用いただけます。

プロジェクトの作成(省略可)

このラボで使用する現在のプロジェクトがない場合は、こちらで新しいプロジェクトを作成します。

4. Cloud Shell エディタを開く

  1. このリンクをクリックすると、Cloud Shell エディタに直接移動します。
  2. 本日、承認を求めるメッセージがどこかの時点で表示された場合は、[承認] をクリックして続行します。Cloud Shell を承認する
  3. ターミナルが画面の下部に表示されない場合は、ターミナルを開きます。
    • [表示] をクリックします。
    • [ターミナル] をクリックします。Cloud Shell エディタで新しいターミナルを開く
  4. ターミナルで、次のコマンドを使用してプロジェクトを設定します。
    gcloud config set project [PROJECT_ID]
    
    • 例:
      gcloud config set project lab-project-id-example
      
    • プロジェクト ID が思い出せない場合は、次のコマンドでプロジェクト ID をすべて一覧表示できます。
      gcloud projects list
      
      Cloud Shell エディタのターミナルでプロジェクト ID を設定する
  5. 次のようなメッセージが表示されます。
    Updated property [core/project].
    

5. API を有効にする

Vertex AI API を使用して Gemini モデルを操作するには、Google Cloud プロジェクトで Vertex AI API を有効にする必要があります。

  1. ターミナルで API を有効にします。
    gcloud services enable aiplatform.googleapis.com
    

更新されたセクションは次のとおりです。手動でのファイル作成を、GitHub リポジトリのクローンを作成して依存関係をインストールする手順に置き換えています。

Vertex AI SDK for Python の概要

Python アプリケーションから Vertex AI でホストされているモデルを操作するには、Vertex AI SDK for Python を使用します。この SDK を使用すると、基盤となる API 呼び出しの複雑さを直接処理することなく、プロンプトの送信、モデル パラメータの指定、レスポンスの受信のプロセスを簡素化できます。

Vertex AI SDK for Python の包括的なドキュメントについては、Vertex AI SDK for Python の概要 | Google Cloud をご覧ください。

6. プロジェクト環境を設定する

リポジトリのクローンを作成する

  1. ターミナルで、スターター ファイルを含むリポジトリのクローンを作成します。
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git
    
    --depth 1 フラグは最新バージョンのみを複製するため、より高速です。
  2. ターミナルで、このラボの正しい作業ディレクトリに移動します。
    cd devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    

仮想環境をアクティブにする

  1. ターミナルで、uv を使用して仮想環境を作成して有効にします。
    uv venv
    source .venv/bin/activate
    
  2. ターミナルで、requirements.txt ファイルから google-adk とその他の依存関係をインストールします。
    uv pip install -r requirements.txt
    

ファイル構造を確認する

すべてのファイルが作成されたら、エクスプローラで adk_multiagent_systems フォルダを開いて、完全な構造を確認します。

  1. Cloud Shell エディタのメニューで、[File] > [Open Folder...] を選択します。
    [Open Folder] が選択されている Cloud Shell エディタの [File] メニュー
  2. ポップアップ表示されたボックスで、ユーザー名の後に devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems/ というフォルダ情報を追加します。[OK] をクリックします。
    次のようになります。
    プロジェクト パスを含む [フォルダを開く] ダイアログ ボックス
  3. 左側のエクスプローラ パネルが更新されます。これで、parent_and_subagents サブディレクトリと workflow_agents サブディレクトリを含む完全なプロジェクト構造が表示され、次のステップに進む準備が整いました。
    開いている adk_multiagent_systems フォルダが表示されているエクスプローラ パネル

環境変数を設定する

  1. すでに adk_multiagent_systems ディレクトリにいます。ターミナルで、環境変数を保存する .env ファイルを作成します。
    cloudshell edit .env
    
  2. エディタで開いた .env ファイルに次の内容を貼り付けます。
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. [YOUR-PROJECT-ID] は、実際の Google Cloud プロジェクト ID に置き換えます。(例: PROJECT_ID = "google-cloud-labs"
    プロジェクト ID を忘れた場合は、ターミナルで次のコマンドを実行します。すべてのプロジェクトとその ID のリストが表示されます。
    gcloud projects list
    
  4. ターミナルで、この .env ファイルをサブエージェント ディレクトリにコピーして、サブエージェントも変数にアクセスできるようにします。
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    ファイル構造は次のようになります。
    開いている adk_multiagent_systems フォルダが表示されているエクスプローラ パネル

7. 親エージェント、サブエージェント、ピア エージェント間の転送について確認する

会話は常に root_agent で始まります。デフォルトでは、親エージェントはサブエージェントの description を使用して、会話を転送するタイミングを決定します。サブエージェントの name を使用して、親エージェントの instruction でこれらの転送を明示的にガイドすることもできます。

これをテストしてみましょう。

  1. Cloud Shell エディタで adk_multiagent_systems/parent_and_subagents/agent.py を開きます。agent.py ファイルに 3 つのエージェントがあることに注目します。
    • root_agentsteering という名前): ユーザーに質問して、転送先のサブエージェントを決定します。最初は、サブエージェントの description のみに依存します。
    • travel_brainstormer: ユーザーが目的地をブレインストーミングするのに役立ちます。
    • attractions_planner: 特定の国でやるべきことをユーザーがリストアップするのを支援します。
  2. root_agent の作成コードに次の行を追加して、travel_brainstormerattractions_plannerroot_agent のサブエージェントにします。
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. ターミナルで、エージェントとチャットします。
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. ターミナル[user]: プロンプトで、次のように入力します。
    hello
    
    出力例(実際のものとは異なる場合があります):
    [steering]: Hi there! Do you already have a country in mind for your trip, or would you like some help deciding where to go?
    
  5. ターミナルでエージェントに次のように伝えます。
    I could use some help deciding.
    
    出力例(実際のものとは異なる場合があります):
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    [travel_brainstormer] タグに注目してください。root_agent は、サブエージェントの description のみに基づいて制御を転送しました。
  6. ターミナルuser: プロンプトで、「exit」と入力して Enter キーを押し、会話を終了します。
  7. では、より明示的にしてみましょう。agent.py で、root_agentinstruction に以下を追加します。
            If they need help deciding, send them to 'travel_brainstormer'.
            If they know what country they'd like to visit, send them to the 'attractions_planner'.
    
  8. ターミナルで、エージェントをもう一度実行します。
    adk run parent_and_subagents
    
  9. ターミナル[user]: プロンプトで、次のように入力します。
    hello
    
  10. 次のように回答します。
    I would like to go to Japan.
    
    出力例(実際のものとは異なる場合があります):
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    新しい手順に沿って、attractions_planner への転送に気づきます。
  11. 次のように返信します。
    Actually I don't know what country to visit.
    
    出力例(実際のものとは異なる場合があります):
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    attractions_plannerピアである travel_brainstormer に転送されたことがわかります。ピア間の転送はデフォルトで許可されています。
  12. ユーザー プロンプトで「exit」と入力してセッションを終了します。

内容のまとめ

このセクションでは、エージェントの階層と会話フローの基礎を学びました。

  • 会話は常に root_agent で始まります。
  • 親エージェントは、description に基づいてサブエージェントに自動的に転送できます。
  • instructionname でサブエージェントに転送するよう指示することで、このフローを明示的に制御できます。
  • デフォルトでは、エージェントは peer エージェント(階層内の兄弟)に転送できます。

8. セッション状態を使用して情報を保存および取得する

すべての ADK 会話には Session があり、セッション状態辞書が含まれています。この状態にはすべてのエージェントがアクセスできるため、エージェント間で情報を渡したり、会話全体を通してデータ(リストなど)を維持したりするのに最適です。

状態への追加と読み取りを試してみましょう。

  1. ファイル adk_multiagent_systems/parent_and_subagents/agent.py に戻ります。
  2. # Tools ヘッダーの後に次の関数定義を貼り付けます。
    def save_attractions_to_state(
    tool_context: ToolContext,
    attractions: List[str]
    ) -> dict[str, str]:
        """Saves the list of attractions to state["attractions"].
    
        Args:
            attractions [str]: a list of strings to add to the list of attractions
    
        Returns:
            None
        """
        # Load existing attractions from state. If none exist, start an empty list
        existing_attractions = tool_context.state.get("attractions", [])
    
        # Update the 'attractions' key with a combo of old and new lists.
        # When the tool is run, ADK will create an event and make
        # corresponding updates in the session's state.
        tool_context.state["attractions"] = existing_attractions + attractions
    
        # A best practice for tools is to return a status message in a return dict
        return {"status": "success"}
    
    このコードでは、次の点に注意してください。
    • この関数は tool_context: ToolContext を受け取ります。このオブジェクトはセッションへのゲートウェイです。
    • tool_context.state["attractions"] = ... 行は、セッションの状態辞書から直接読み取り、書き込みを行います。残りの処理は ADK が行います。
  3. tools パラメータを追加して、ツールを attractions_planner エージェントに追加します。
        tools=[save_attractions_to_state]
    
  4. attractions_planner エージェントの既存の instruction に、次の箇条書きを追加します。
            - When they reply, use your tool to save their selected attraction and then provide more possible attractions.
            - If they ask to view the list, provide a bulleted list of { attractions? } and then suggest some more.
    
  5. ターミナルで次のコマンドを使用して、Agent Development Kit ウェブ UI を起動します。
    adk web
    
    出力
    INFO:     Started server process [2434]
    INFO:     Waiting for application startup.
    +-------------------------------------------------------+
    | ADK Web Server started                                |
    |                                                       |
    | For local testing, access at http://localhost:8000.   |
    +-------------------------------------------------------+
    
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    
  6. Cloud Shell ターミナルで、[ウェブ インターフェースを新しいタブで表示するには、[ウェブでプレビュー] ボタンをクリックして [ポートを変更] を選択します] をクリックします。
    [ウェブでプレビュー] メニュー
  7. ポート番号「8000」を入力し、[変更してプレビュー] をクリックします。新しいブラウザタブが開き、ADK 開発 UI が表示されます。
    テキスト ボックスに 8000 が入力されたポート ポップアップ ボックスを変更する
  8. 左側の [エージェントを選択] プルダウンから、parent_and_subagents を選択します。
  9. hello」と挨拶して会話を始めます。
  10. エージェントが挨拶したら、次のように返答します。
    I'd like to go to Egypt.
    
    attractions_planner に転送され、観光スポットのリストが表示されます。
  11. たとえば、次の観光スポットを選択します。
    I'll go to the Sphinx
    
  12. 「Okay, I've saved The Sphinx to your list...」のようなレスポンスが返されます。
  13. レスポンス ツールボックスをクリックして(チェックを入れます)、ツールの応答から作成されたイベントを確認します。
    actions フィールドに、状態の変化を示す stateDelta が含まれているはずです。
  14. エージェントのリストにある別の観光スポットを返信します。
  15. 左側のナビゲーション メニューで [X] をクリックして、先ほど確認したイベントのフォーカスを解除します。
  16. 左側のサイドバーで、[状態] タブをクリックします。セッションの状態に attractions 配列が表示され、選択した両方のアイテムが含まれているはずです。ウェブ UI でのセッション状態のプレビュー
  17. エージェントに次のメッセージを送ります。
    What is on my list?
    
    エージェントは状態から読み取り、リストを返します。
  18. エージェントのテストが完了したら、ウェブブラウザのタブを閉じ、Cloud Shell ターミナルで Ctrl+C キーを押してサーバーを停止します。

セクションのまとめ

このセクションでは、Session 状態を使用してデータを共有する方法を学習しました。

  • 状態を書き込むには: ツール内から tool_context.state オブジェクト(例: tool_context.state["my_list"] = [...])を指定できます。
  • 状態を読み取る: キー テンプレート(instructionHere is your list: {my_list?})を指定できます。
  • 状態を検査する: [State] タブを使用すると、ADK Dev UI でセッションの状態をリアルタイムでモニタリングできます。

9. ワークフロー エージェント

これまでは、親エージェントがサブエージェントに転送してからユーザーを待機する様子を見てきました。ワークフロー エージェントは異なります。ユーザー入力を待たずに、自動フローでサブエージェントを次々と実行します。

これは、「計画と実行」や「下書きと修正」のパイプラインなど、自動化された複数ステップのタスクに最適です。ADK には、これを管理するための 3 つの組み込みワークフロー エージェントが用意されています。

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

このラボの残りの部分では、これらの 3 つのワークフロー エージェントを使用してマルチエージェント システムを構築します。

歴史上の人物をモチーフにした新作映画の企画書を作成するエージェントを構築します。エージェントが調査、反復的な執筆、レポートの生成を行います。

最終的に、システムは次のようになります。

film_concept_team のマルチエージェント システムの図

このシステムは、最もシンプルなワークフローから始めて、段階的に構築していきます。

10. SequentialAgent を使用してマルチエージェント システムを構築する

SequentialAgent は、サブエージェントを単純な線形シーケンスで実行するワークフロー エージェントです。sub_agents リスト内の各エージェントは、順番に 1 つずつ実行されます。これは、これから作成する映画の売り込みエージェントのように、特定の順序でタスクを実行する必要があるパイプラインに最適です。

この最初のバージョンは、次のような構造になります。

Film_concept_team マルチエージェント システム: ステップ 1

  • root_agentgreeterがユーザーを歓迎し、映画のテーマを取得します。
  • その後、film_concept_team という名前の SequentialAgent に転送されます。この SequentialAgent は次の処理を行います。
    1. researcher エージェントを実行して、Wikipedia から事実を取得します。
    2. screenwriter エージェントを実行して、これらの事実を使用してプロットを作成します。
    3. file_writer エージェントを実行して、最終的なプロットをファイルに保存します。

実行してみましょう。

  1. Cloud Shell エディタで、adk_multiagent_systems/workflow_agents/agent.py を開きます。
    このエージェント定義ファイルに目を通してください。サブエージェントを先に定義してから親エージェントに割り当てる必要があるため、会話の流れに沿ってファイルを読み取るには、ファイルの下から上に向かってエージェントを読み取ります。
  2. append_to_state ツールに注目してください。このヘルパー関数を使用すると、エージェントはセッション状態のリストにデータを追加できます。これは、researcherscreenwriter が作業を渡す方法です。
  3. エージェントを試してみます。ターミナルで、ライブ リロードを有効にしてウェブ インターフェースを起動します。
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk web --reload_agents
    
  4. Cloud Shell ターミナルで、[ウェブ インターフェースを新しいタブで表示するには、[ウェブでプレビュー] ボタンをクリックして [ポートを変更] を選択します] をクリックします。
    [ウェブでプレビュー] メニュー
  5. ポート番号「8000」を入力し、[変更してプレビュー] をクリックします。新しいブラウザタブが開き、ADK 開発 UI が表示されます。
    テキスト ボックスに 8000 が入力されたポート ポップアップ ボックスを変更する
  6. [エージェントを選択] プルダウンから、workflow_agents を選択します。
  7. hello」と挨拶して会話を始めます。greeter エージェントが応答します。
  8. プロンプトが表示されたら、歴史上の人物を入力します。これらのいずれかを使用することも、独自のものを指定することもできます。
    • 張仲景
    • エイダ ラブレス
    • マルクス・アウレリウス
  9. SequentialAgent が引き継ぎます。中間メッセージは表示されません。researcherscreenwriterfile_writer が順に実行されます。エージェントは、シーケンス全体が完了した場合にのみ応答します。
    失敗した場合は、右上の [+ New Session] をクリックしてもう一度試してください。
  10. エージェントがファイルの書き込みを確認したら、Cloud Shell エディタの movie_pitches ディレクトリで新しい .txt ファイルを見つけて開き、出力を確認します。
  11. ADK 開発 UI で、チャット履歴の最後のエージェント アイコンをクリックして、イベントビューを開きます。
  12. イベントビューには、エージェント ツリーのグラフが視覚的に表示されます。greeterfilm_concept_team を呼び出し、film_concept_team が各サブエージェントを順番に呼び出していることがわかります。adk ウェブグラフ
  13. グラフ内の任意のエージェントの [Request] タブと [Response] タブをクリックすると、セッションの状態など、渡された正確なデータを調べることができます。

セクションのまとめ

このセクションでは、ワークフロー エージェントの使用方法について説明しました。

  • SequentialAgent は、ステップ間のユーザー入力を待たずに、サブエージェントを順番に 1 つずつ実行します。
  • これは「ワークフロー」です。ユーザーが root_agent に話しかけ、root_agent作業SequentialAgent に渡して完了させるためです。
  • シーケンス内のサブエージェントは、セッションの状態{ PLOT_OUTLINE? })をクリックして、以前のエージェントの作業にアクセスします。
  • Dev UI のイベントグラフを使用すると、エージェント間のワークフロー全体を可視化してデバッグできます。

11. 反復作業のために LoopAgent を追加する

LoopAgent は、サブエージェントを順番に実行してから、最初から繰り返すワークフロー エージェントです。この「ループ」は、max_iterations カウントに達する、サブエージェントが組み込みの exit_loop ツールを呼び出すなどの条件が満たされるまで続きます。

これは、反復的な改善が必要なタスクに役立ちます。この LoopAgent を追加して、映画の企画書作成エージェントの「ライターズ ルーム」を作成します。これにより、researcherscreenwriter、新しい critic エージェントがループ内で動作し、critic が準備完了と判断するまで、各パスでプロットが改善されます。また、エージェントがアイデアを調査して洗練させることで、「古代の医者」のような曖昧なユーザー入力にも対応できるようになります。

Film_concept_team マルチエージェント システム: ステップ 2

これらの変更を行うには:

  1. adk_multiagent_systems/workflow_agents/agent.py で、exit_loop の import を追加します(他の google.adk の import の近く)。
    from google.adk.tools import exit_loop
    
  2. 新しい critic エージェントを追加します。このエージェントがプロットを審査します。正常な場合は exit_loop を呼び出します。そうでない場合は、次のループのためにフィードバックを状態に追加します。
    # Agents セクションに次のエージェント定義を貼り付けます。
    critic = Agent(
        name="critic",
        model=model_name,
        description="Reviews the outline so that it can be improved.",
        instruction="""
        INSTRUCTIONS:
        Consider these questions about the PLOT_OUTLINE:
        - Does it meet a satisfying three-act cinematic structure?
        - Do the characters' struggles seem engaging?
        - Does it feel grounded in a real time period in history?
        - Does it sufficiently incorporate historical details from the RESEARCH?
    
        If the PLOT_OUTLINE does a good job with these questions, exit the writing loop with your 'exit_loop' tool.
        If significant improvements can be made, use the 'append_to_state' tool to add your feedback to the field 'CRITICAL_FEEDBACK'.
        Explain your decision and briefly summarize the feedback you have provided.
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        RESEARCH:
        { research? }
        """,
        before_model_callback=log_query_to_model,
        after_model_callback=log_model_response,
        tools=[append_to_state, exit_loop]
    )
    
  3. writers_room LoopAgent を作成します。これには、ループ内で動作する 3 つのエージェントが含まれます。
    次のコードを film_concept_team エージェント定義の上に貼り付けます。
    writers_room = LoopAgent(
        name="writers_room",
        description="Iterates through research and writing to improve a movie plot outline.",
        sub_agents=[
            researcher,
            screenwriter,
            critic
        ],
        max_iterations=5,
    )
    
  4. 新しい writers_room ループを使用するように film_concept_team SequentialAgent を更新します。researcherscreenwriter を単一の writers_room エージェントに置き換えます。既存の film_concept_team 定義を次のように置き換えます。
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            file_writer
        ],
    )
    
  5. ADK 開発 UI タブに戻り、右上の [+ 新しいセッション] をクリックします。
  6. hello」と挨拶して新しい会話を始めます。
  7. メッセージが表示されたら、今回はより広範なトピックをエージェントに伝えます。以下にそのアイデアをご紹介します。
    • 大衆向け製品を制作した工業デザイナー
    • 地図製作者
    • that guy who made crops yield more food
    エージェントはループを処理します。ADK 開発 UI には、エージェントが複数回実行されたときのログが表示されます(例: 「[researcher]」、「[screenwriter]」、「[critic]」、「[researcher]」、「[screenwriter]」、「[critic]...」)。
  8. ループが完了すると、エージェントはファイルを書き込みます。adk_multiagent_systems/movie_pitches ディレクトリで生成されたファイルを確認します。
  9. Dev UI のイベントグラフを調べて、ループ構造を確認します。

セクションのまとめ

このセクションでは、LoopAgent の使用方法について説明しました。

  • LoopAgent は、サブエージェントのシーケンスを繰り返し、反復タスクの「内部ループ」を作成するワークフロー エージェントです。
  • ループ内のエージェントは、セッションの状態を使用して、作業(PLOT_OUTLINE)とフィードバック(例: CRITICAL_FEEDBACK)を相互に渡します。
  • ループは、max_iterations の上限に達するか、エージェントが exit_loop ツールを呼び出すことで停止できます。

12. 「並列処理と収集」に ParallelAgent を使用する

ParallelAgent は、すべてのサブエージェントを同時に(並行して)実行するワークフロー エージェントです。これは、2 つの異なる調査ジョブの実行など、タスクを独立したサブタスクに分割できる場合に有効です。

ParallelAgent を使用して、並行して動作する「プリプロダクション チーム」を作成します。1 人のエージェントが興行収入の可能性を調査し、もう 1 人のエージェントが同時にキャスティングのアイデアをブレインストーミングします。これは「ファンアウトと収集」パターンと呼ばれることがよくあります。ParallelAgent が作業を「ファンアウト」し、後続のエージェント(file_writer)が結果を「収集」します。

Film_concept_team マルチエージェント システム: ステップ 3

最終的なエージェント フローは次のようになります。

  1. greeter(ルート)がチャットを開始します。
  2. film_concept_teamSequentialAgent)に転送され、次の処理が実行されます。
    • プロットを作成する writers_roomLoopAgent)。
    • 新しい preproduction_teamParallelAgent)を使用して、興行収入とキャスティングを同時に調べることができます。
    • すべての結果を収集してファイルを保存する file_writer

これらの変更を行うには:

  1. adk_multiagent_systems/workflow_agents/agent.py で、新しい ParallelAgent とそのサブエージェントを # Agents ヘッダーの下に貼り付けます。
    box_office_researcher = Agent(
        name="box_office_researcher",
        model=model_name,
        description="Considers the box office potential of this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Write a report on the box office potential of a movie like that described in PLOT_OUTLINE based on the reported box office performance of other recent films.
        """,
        output_key="box_office_report"
    )
    
    casting_agent = Agent(
        name="casting_agent",
        model=model_name,
        description="Generates casting ideas for this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Generate ideas for casting for the characters described in PLOT_OUTLINE
        by suggesting actors who have received positive feedback from critics and/or
        fans when they have played similar roles.
        """,
        output_key="casting_report"
    )
    
    preproduction_team = ParallelAgent(
        name="preproduction_team",
        sub_agents=[
            box_office_researcher,
            casting_agent
        ]
    )
    
  2. film_concept_team SequentialAgentsub_agents リストを更新して、新しい preproduction_teamwriters_roomfile_writer の間)を含めます。既存の film_concept_team 定義を次の定義に置き換えます。
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            preproduction_team,
            file_writer
        ],
    )
    
  3. file_writer エージェントの instruction を更新して、状態から新しいレポートを「収集」し、ファイルに追加するようにします。
    file_writerinstruction 文字列を次のように置き換えます。
        instruction="""
        INSTRUCTIONS:
        - Create a marketable, contemporary movie title suggestion for the movie described in the PLOT_OUTLINE.
        If a title has been suggested in PLOT_OUTLINE, you can use it, or replace it with a better one.
        - Use your 'write_file' tool to create a new txt file with the following arguments:
        - for a filename, use the movie title
        - Write to the 'movie_pitches' directory.
        - For the 'content' to write, include:
        - The PLOT_OUTLINE
        - The BOX_OFFICE_REPORT
        - The CASTING_REPORT
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        BOX_OFFICE_REPORT:
        { box_office_report? }
    
        CASTING_REPORT:
        { casting_report? }
        """,
    
  4. ADK 開発 UI タブに戻り、[+ 新しいセッション] をクリックします。
  5. hello と入力して会話を開始します。
  6. プロンプトが表示されたら、新しいキャラクターのタイプを入力します。以下にそのアイデアをご紹介します。
    • Wi-Fi の技術を発明した女優
    • カリスマ性のあるシェフ
    • key players in the worlds fair exhibitions
  7. エージェントが作業を完了したら、adk_multiagent_systems/movie_pitches ディレクトリにある最終ファイルを確認します。これで、プロット、興行収入レポート、キャスティング レポートが 1 つのドキュメントにまとめられます。

セクションのまとめ

このセクションでは、ParallelAgent の使用方法について説明しました。

  • ParallelAgent は、サブエージェントを順番に実行するのではなく、同時に実行して作業を「ファンアウト」します。
  • これは、相互に依存しないタスク(2 つの異なるトピックの調査など)に非常に効率的です。
  • 並列エージェントの結果は、後続のエージェントによって「収集」されます。これは、並列エージェントが作業をセッション状態output_key を使用)に保存し、最終エージェント(file_writer など)がそれらのキーを読み取ることで行われます。

13. カスタム ワークフロー エージェント

SequentialAgentLoopAgentParallelAgent の事前定義されたワークフロー エージェントでニーズを満たせない場合は、CustomAgent を使用して新しいワークフロー ロジックを柔軟に実装できます。

サブエージェント間のフロー制御、条件付き実行、状態管理についてパターンを定義できます。このエージェントは、複雑なワークフローやステートフルなオーケストレーションに加えて、カスタム ビジネスロジックをフレームワークのオーケストレーション レイヤに統合したい場合にも有用です。

このラボでは CustomAgent の作成は扱いませんが、必要になったときに思い出せるようにその存在を覚えておきましょう。

14. 完了

Google Agent Development Kit(ADK)を使用して、高度なマルチエージェント システムを正常に構築しました。単純な親子関係のエージェントから、クリエイティブ プロジェクトの調査、作成、改善を行う複雑な自動ワークフローのオーケストレーションへと進歩しました。

内容のまとめ

このラボでは次の作業を行いました。

  • 親エージェントとサブエージェントの関係で階層ツリーに整理されたエージェント。
  • 制御されたエージェント間の転送description を使用した自動転送と instruction を使用した明示的な転送の両方)。
  • ツールを使用して、データを tool_context.state ディクショナリに書き込みました。
  • キー テンプレートを使用しました(例: { PLOT_OUTLINE? })を使用して、セッションの状態から読み取り、エージェントのプロンプトをガイドします。
  • SequentialAgent を実装して、簡単なステップバイステップのワークフロー(調査 -> 作成 -> 保存)を作成しました。
  • critic エージェントと exit_loop ツールで LoopAgent を使用して、反復的な改善サイクルを作成しました。
  • ParallelAgent を使用して、独立したタスク(キャスティングや興行収入の調査など)を「ファンアウト」し、同時に実行しました。

継続的なテスト

学んだことを活かす方法はたくさんあります。以下のヒントをご覧ください。

  • エージェントを追加する: preproduction_team ParallelAgent に新しいエージェントを追加してみてください。たとえば、PLOT_OUTLINE に基づいて映画のキャッチコピーを作成する marketing_agent を作成できます。
  • ツールを追加する: researcher エージェントにツールを追加します。Google 検索 API を使用して、Wikipedia に掲載されていない情報を検索するツールを作成できます。
  • CustomAgent を確認する: このラボでは、標準テンプレートに適合しないワークフローの CustomAgent について説明しました。たとえば、セッション状態に特定のキーが存在する場合にのみエージェントを条件付きで実行するエージェントを構築してみます。