ラボの設定手順と要件
アカウントと進行状況を保護します。このラボを実行するには、常にシークレット ブラウジング ウィンドウとラボの認証情報を使用してください。

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

ラボ 1時間 30分 universal_currency_alt クレジット: 5 show_chart 上級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
このコンテンツはまだモバイル デバイス向けに最適化されていません。
快適にご利用いただくには、メールで送信されたリンクを使用して、デスクトップ パソコンでアクセスしてください。

GENAI106

概要

このラボでは、Google Agent Development Kit(Google ADK)内でマルチエージェント システムをオーケストレーションする方法について説明します。

このラボは、以下のラボで取り上げた ADK の基本とツールの使い方を理解していることを前提としています。

  • Google Agent Development Kit(ADK)を使ってみる
  • ツールで ADK エージェントを強化する

目標

このラボでは、次の作業を行います。

  • 複数のエージェントを作成し、それらを親エージェントとサブエージェントの関係で関係付ける。
  • 複数の会話ターンと複数のエージェントに及ぶコンテンツを、セッションの状態辞書に書き込むことで構築する。
  • セッションの状態から値を読み取り、応答のコンテキストとして使用するようエージェントに指示する。
  • ワークフロー エージェントを使用して、エージェント間で会話を直接受け渡す。

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は制限されており、一時停止することはできません。[ラボを開始] ボタンをクリックするとタイマーが開始され、Cloud リソースを利用できる時間が表示されます。

この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。一時的な認証情報が新しく提供されるため、ラボ受講中の Google Cloud Platform へのログインおよびアクセスにはその認証情報を使用してください。

前提条件

このラボを完了するには、次のものが必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)。
  • ラボを完了するために必要な時間。

注: すでに個人の GCP アカウントやプロジェクトをお持ちの場合でも、そのアカウントやプロジェクトはラボでは使用しないでください。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。 左側の [ラボの詳細] ペインには、以下が表示されます。

    • [Google Cloud コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。

    ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。

    {{{user_0.username | "Username"}}}

    [ラボの詳細] ペインでもユーザー名を確認できます。

  4. [次へ] をクリックします。

  5. 以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。

    {{{user_0.password | "Password"}}}

    [ラボの詳細] ペインでもパスワードを確認できます。

  6. [次へ] をクリックします。

    重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  7. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後、このタブで Google Cloud コンソールが開きます。

注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。 ナビゲーション メニュー アイコンと検索フィールド

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

Agent Development Kit は開発者をサポートし、生成モデルからより信頼性が高く洗練された、複数ステップの行動を導き出すことを可能にします。長く複雑なプロンプトを書いたものの期待する結果を確実に引き出せない、という状況に陥る代わりに、複数のシンプルなエージェントを作成し、タスクと責任を分担して連携させて、複雑な問題に協力して取り組めるフローを構築することができます。

このアーキテクチャ アプローチには重要なメリットがいくつかあります。

  • 設計が容易: 特定の仕事とスキルを持つエージェントという観点で考えることができます。
  • 信頼性の高いパフォーマンスを発揮することに機能を特化: 明確な例から学習したエージェントは、特定のタスクでより信頼性の高いパフォーマンスを発揮するよう特化されています。
  • 組織化: ワークフローを個別のエージェントに分割することで、体系的に考えやすいアプローチが可能になります。
  • 改善可能性と保守性: 複雑なエージェントの場合、1 つの動作を修正すると他の動作に影響する可能性があります。それよりも、特定のタスクに特化されたコンポーネントを改善または修正する方が簡単です。
  • モジュール性: 1 つのワークフローから個別のエージェントを簡単にコピーして、他の同様のワークフローに含めることができます。

階層エージェント ツリー

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

Agent Development Kit では、エージェントをツリーのような構造で編成します。これは、ツリー内の各エージェントの転送オプションを制限し、ツリー内で会話が通過する可能性のあるルートの制御と予測をしやすくするためです。階層構造には、次のようなメリットがあります。

  • 実際のコラボレーション チームからヒントを得て構成されるため、マルチエージェント システムの動作を簡単に設計、推論できます。
  • 一般的なソフトウェア開発パターンを模倣しているため、開発者にとって直感的です。
  • システム内の情報のフローとタスク委任をより細かく制御できるため、考えられる経路を把握しやすく、システムのデバッグも容易です。たとえば、システム フローの異なる部分に descriptions の似通った 2 つのレポート生成エージェントが存在する場合でも、ツリー構造によって間違わずに正しいエージェントを呼び出すことができます。

この構造は常に、root_agent 変数で定義されるエージェントから始まります(ただし、ユーザー向けの名前は異なる場合があります)。root_agent は、1 つ以上のサブエージェントとして機能する場合があります。各サブエージェント エージェントは、独自のサブエージェントを持つことができます。

タスク 1. ADK をインストールして環境を設定する

このラボ環境では、Vertex AI API が有効になっています。ご自身のプロジェクトでこれらの手順を行う場合は、Vertex AI に移動し、プロンプトに従って有効にできます。

Cloud Shell エディタタブを準備する

  1. Google Cloud コンソール ウィンドウを選択した状態で、キーボードの G キーを押してから S キーを押して、Cloud Shell を開きます。または、Cloud コンソールの右上にある「Cloud Shell をアクティブにする」ボタン(Cloud Shell をアクティブにする)をクリックします。
  2. [続行] をクリックします。
  3. Cloud Shell を承認するよう求められたら、[承認] をクリックします。
  4. Cloud Shell ターミナル パネルの右上にある「新しいウィンドウで開く」ボタン(「新しいウィンドウで開く」ボタン)をクリックします。
  5. ペインの上部にある [エディタを開く](鉛筆アイコン 編集 鉛筆アイコン)をクリックしてファイルを表示します。
  6. 左側のナビゲーション メニューの上部にある Explorer アイコン(Explorer アイコン)をクリックして、ファイル エクスプローラを開きます。
  7. [Open Folder] ボタンをクリックします。
  8. 表示された [Open Folder] ダイアログで [OK] をクリックし、Qwiklabs 受講者アカウントのホームフォルダを選択します。
  9. 画面の右側に表示される追加のチュートリアルや Gemini のパネルを閉じると、コードエディタのウィンドウをより広く使用できます。
  10. このラボの残りの部分では、このウィンドウを Cloud Shell エディタと Cloud Shell ターミナルを備えた IDE として使用できます。

ADK とこのラボのコードサンプルをダウンロードしてインストールする

  1. 次のコマンドを Cloud Shell ターミナルに貼り付けて、このラボのコードファイルを Cloud Storage バケットからコピーします。

    gcloud storage cp -r gs://{{{project_0.project_id| YOUR_GCP_PROJECT_ID}}}-bucket/adk_multiagent_systems .
  2. Cloud Shell ターミナルで次のコマンドを実行して、PATH 環境変数を更新し、ADK とその他の要件をインストールします。

    export PATH=$PATH:"/home/${USER}/.local/bin" python3 -m pip install google-adk -r adk_multiagent_systems/requirements.txt

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

会話は常に、root_agent 変数として定義されたエージェントから始まります。

親エージェントのデフォルトの動作は、各サブエージェントの description を理解し、会話の制御をサブエージェントに転送する必要があるかどうかを判断することです。

親エージェントの instruction で、サブエージェントを名前(変数名ではなく、name パラメータの値)で参照することで、この転送をガイドできます。次に例を示します。

  1. Cloud Shell ターミナルで、次のコマンドを実行して .env ファイルを作成し、parent_and_subagents ディレクトリ内のエージェントを認証します。

    cd ~/adk_multiagent_systems cat << EOF > parent_and_subagents/.env GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT={{{project_0.project_id| YOUR_GCP_PROJECT_ID}}} GOOGLE_CLOUD_LOCATION=global MODEL={{{project_0.startup_script.gemini_flash_model_id | gemini_flash_model_id}}} EOF
  2. 次のコマンドを実行して、その .env ファイルを workflow_agents ディレクトリにコピーします。このディレクトリはラボの後半で使用します。

    cp parent_and_subagents/.env workflow_agents/.env
  3. Cloud Shell エディタのファイル エクスプローラ ペインで、adk_multiagent_systems/parent_and_subagents ディレクトリに移動します。

  4. agent.py ファイルをクリックして開きます。

ヒント: Python コードでは、サブエージェントを定義してからエージェントに追加する必要があります。そのため、会話の流れに沿って agent.py ファイルを読み取るには、一番下のエージェントから読み始めて、上に向かって読み進めることをおすすめします。
  1. 3 つのエージェントがあることに注目します。

    • root_agent。ADK の開発 UI とコマンドライン インターフェースでこのエージェントを識別するために steering という名前が付いています。ユーザーに質問をして(旅行先はもう決まっているか、それとも旅先選びのアドバイスが必要か)、ユーザーの回答に基づいて 2 つのサブエージェントのうちどちらに会話を誘導するかを判断します。このエージェントには簡単な instruction しかなく、サブエージェントには触れていませんが、サブエージェントの説明の存在は認識されています。
    • travel_brainstormer: 旅先を決めていないユーザーがブレインストーミングするのを手伝います。
    • attractions_planner: 訪ねたい国を決めたユーザーが、旅先でやりたいことのリストを作成するのを手伝います。
  2. root_agent の作成コードに次の行を追加して、travel_brainstormerattractions_plannerroot_agent のサブエージェントにします。

    sub_agents=[travel_brainstormer, attractions_planner]
  3. ファイルを保存します。

  4. サブエージェントには、対応する parent パラメータを追加しない点に注意してください。階層ツリーは、親エージェントを作成するときに sub_agents を指定するだけで定義されます。

  5. Cloud Shell ターミナルで次のコマンドを実行して、ADK コマンドライン インターフェースを使用してエージェントとチャットします。

    cd ~/adk_multiagent_systems adk run parent_and_subagents
  6. [user]: プロンプトが表示されたら、エージェントに次のように挨拶します。

    hello

    出力例(実際のものとは異なる場合があります):

    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?
  7. エージェントに次のように伝えます。

    I could use some help deciding.

    出力例(実際のものとは異なる場合があります):

    user: 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. ...
  8. 応答の角かっこ内の名前 [travel_brainstormer] から、root_agent(名前は [steering])が、サブエージェントの description のみに基づいて、会話を適切なサブエージェントに転送したことがわかります。

  9. user: プロンプトで「exit」と入力して会話を終了します。

  10. どのような場合にどのサブエージェントに転送するかについて、instruction に詳細な指示を含めてエージェントに提供することもできます。たとえば、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'.
  11. ファイルを保存します。

  12. Cloud Shell ターミナルで、次のコマンドを実行してコマンドライン インターフェースを再度起動します。

    adk run parent_and_subagents
  13. エージェントに次のように挨拶します。

    hello
  14. エージェントの挨拶に次のように返答します。

    I would like to go to Japan.

    出力例(実際のものとは異なる場合があります):

    user: I would like to go to Japan. [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan: * **Tokyo:** * Senso-ji Temple * Shibuya Crossing * Tokyo Skytree * **Kyoto:** ...
  15. 別のサブエージェント attractions_planner に転送されたことがわかります。

  16. 次のように返答します。

    Actually I don't know what country to visit.

    出力例(実際のものとは異なる場合があります):

    user: actually I don't know what country to visit [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
  17. 今度は travel_brainstormer エージェントに転送されたことがわかります。これは attractions_plannerピア エージェントで、ピア間の転送はデフォルトで許可されています。ピアへの転送を禁止する場合は、attractions_planner エージェントの disallow_transfer_to_peers パラメータを True に設定します。

  18. ユーザー プロンプトで「exit」と入力してセッションを終了します。

段階的な進行パターン: プロセスに沿って段階的にユーザーをガイドするエージェントに関心がある場合は、最初のステップを root_agent とし、2 番目のステップのエージェントをサブエージェント 1 つだけにして、後続のステップをすべて前のステップのエージェントの唯一のサブエージェントにするというパターンを利用できます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 親エージェント、サブエージェント、ピア エージェント間の転送について確認する

タスク 3. セッション状態を使用して特定の情報を保存および取得する

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]: """観光スポットのリストを state ["attractions"] に保存します。 Args: attractions [str]: 観光スポットのリストに追加する文字列のリスト Returns: None """ # 状態から既存の観光スポットを読み込む。存在しない場合は、空のリストから開始する existing_attractions = tool_context.state.get("attractions", []) #「attractions」キーを古いリストと新しいリストの両方で更新する。 # ツールが実行されると、ADK はイベントを作成し、 # それに応じてセッションの状態を更新する。 tool_context.state["attractions"] = existing_attractions + attractions # ツールのベストプラクティスとして、戻り値の辞書からステータス メッセージを返す return {"status": "success"}
  3. このコードでは、次の点に注意してください。

    • セッションはツール関数に ToolContext として渡されます。必要なのはセッションを受け取るパラメータを割り当てる作業で、それが tool_context という名前のパラメータで示されています。これにより、tool_context を使用して会話履歴(tool_context.events)やセッション状態辞書(tool_context.state)などのセッション情報にアクセスできます。ツール関数によって tool_context.state ディクショナリが変更されると、それらの変更はツールが実行を完了した後にセッションの状態に反映されます。
    • docstring には、引数と戻り値の明確な説明とセクションが記載されています。
    • 関数コードのコメントは、状態辞書を簡単に更新できることを説明しています。
  4. エージェントの作成時に tools パラメータを追加して、ツールを attractions_planner エージェントに追加します。

    tools=[save_attractions_to_state]
  5. 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.
  6. 中かっこで囲まれている { attractions? } に注目してください。これはキー テンプレートと呼ばれ、状態辞書から attractions キーの値を読み込む ADK 機能です。attractions キーの後の疑問符は、このフィールドがまだ存在しない場合にエラーが発生するのを防ぐためのものです。

  7. 次に、ウェブ インターフェースからエージェントを実行しましょう。このインターフェースには、セッション状態に加えられた変更を確認できるタブがあります。次のコマンドを使用して 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)
  8. ウェブ インターフェースを新しいタブで表示するには、ターミナルの出力にある http://127.0.0.1:8000 リンクをクリックします。

  9. 新しいブラウザタブが開き、ADK 開発 UI が表示されます。

  10. 左側の [Select an agent] プルダウンから、[parent_and_subagents] エージェントを選択します。

  11. hello」と挨拶して会話を始めます。

  12. エージェントが挨拶したら、次のように返答します。

    I'd like to go to Egypt.

    attractions_planner に転送され、観光スポットのリストが表示されます。

  13. たとえば、次の観光スポットを選択します。

    I'll go to the Sphinx
  14. 「Okay, I've saved The Sphinx to your list. Here are some other attractions...」のような確認応答が返されます。

  15. レスポンス ツールボックスをクリックして(チェックを入れます)、ツールの応答から作成されたイベントを確認します。actions フィールドに、状態の変化を示す state_delta が含まれているはずです。

  16. エージェントから他にも観光スポットを選ぶよう促されるので、選択肢のいずれかを名前で指定してエージェントに返信します。

  17. 左側のナビゲーション メニューで [X] をクリックして、先ほど確認したイベントのフォーカスを解除します。

  18. サイドバーに、イベントのリストとタブがいくつか表示されます。[State] タブを選択します。これは現在の状態を確認できるタブで、attractions 配列にはリクエストした 2 つの値が含まれています。

    ウェブ UI でのセッション状態のプレビュー

  19. エージェントに次のメッセージを送ります。

    What is on my list?
  20. instruction に従って、箇条書きリストの形でリストが返されます。

  21. エージェントのテストが完了したら、ウェブブラウザのタブを閉じ、Cloud Shell ターミナルで Ctrl+C キーを押してサーバーを停止します。

    このラボの後半では、状態を使用してエージェント間で通信する方法を説明します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 セッションの状態を使用して、特定の情報を保存および取得する

断片的な情報を保存する代わりに、エージェントのテキスト応答全体を状態辞書に保存したい場合は、エージェントを定義するときに output_key パラメータを設定すると、出力全体がそのフィールド名で状態辞書に保存されます。

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

親エージェントからサブエージェントへの転送は、特定の分野に特化したサブエージェントが複数存在し、ユーザーにそれぞれとやり取りしてもらいたい場合には最適ですが、

ユーザーの順番を待たずにエージェントが次々と行動できるようにしたい場合は、ワークフロー エージェントを使用できます。たとえば、以下のようなシナリオでエージェントに任せたいタスクが決まっている場合は、ワークフロー エージェントを利用できます。

  • 計画と実行: アイテムのリストを作成するエージェントと、そのリストを使用してフォローアップ タスク(ドキュメントのセクションの作成など)を実行するエージェントを 1 つずつ作成する場合。
  • 調査と執筆: 関数を呼び出して Google 検索やその他のデータソースからコンテキスト情報を収集するエージェントと、その情報を使用してなんらかの出力を生成するエージェントを 1 つずつ作成する場合。
  • 下書きと修正: ドキュメントの下書きを作成するエージェントと、その作業を確認して反復するエージェントを 1 つずつ作成する場合。

このようなタスクを遂行するために、ワークフロー エージェントにはサブエージェントがあり、各サブエージェントは動作することが保証されています。Agent Development Kit には 3 つの組み込みワークフロー エージェントが用意されており、独自のエージェントを定義することもできます。

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

このラボの残りの部分では、複数の LLM エージェント、ワークフロー エージェント、ツールを使用してエージェントのフローを制御するマルチエージェント システムを構築します。

具体的には、歴史上の人物の生涯をモチーフにした新作の伝記映画の企画書を作成するエージェントを構築します。サブエージェントが調査を実施し、脚本家と批評家の間の反復的な執筆ループを処理し、最後に、別のサブエージェントがキャスティングのアイデアをブレインストーミングし、過去の興行収入データを使用して興行収入の結果を予測します。

マルチエージェント システムは最終的に次のようになります(画像をクリックすると拡大表示されます)。

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

まず、シンプルなバージョンから始めましょう。

タスク 4. SequentialAgent を使用してマルチエージェント システムの構築を開始する

SequentialAgent は、サブエージェントを線形シーケンスで実行します。sub_agents リスト内の各サブエージェントは、定義された順に 1 つずつ実行されます。

このエージェントは、特定の順序でタスクを実行する必要があり、あるタスクの出力が次のタスクの入力として使用されるワークフローに最適です。

このタスクでは、SequentialAgent を実行して、映画の企画書作成マルチエージェント システムの最初のバージョンを構築します。エージェントの最初のドラフトは、次のような構造になります。

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

  • root_agentgreeter): ユーザーに挨拶してから、映画の主人公にする歴史上の人物をリクエストします

  • SequentialAgentfilm_concept_team という名前で、次のサブエージェントで構成されています。

    • researcher: ラボ「ツールで ADK エージェントを強化する」で取り上げた LangChain ツールを使用して、リクエストされた歴史上の人物について Wikipedia で詳しく調べます。エージェントは、ツールを連続して複数回呼び出すことができるため、さらに調査が必要だと判断した場合、researcher は連続して複数回ターンを行うことができます。
    • screenwriter: 調査結果をまとめて映画の筋書きに変えます。
    • file_writer: 企画された映画にタイトルを付け、シーケンスの結果をファイルに書き込みます。
  1. Cloud Shell エディタで、ディレクトリ adk_multiagent_systems/workflow_agents に移動します。

  2. workflow_agents ディレクトリの agent.py ファイルをクリックします。

  3. このエージェント定義ファイルに目を通してください。サブエージェントを先に定義してから親エージェントに割り当てる必要があるため、会話の流れに沿ってファイルを読み取るには、ファイルの下から上に向かってエージェントを読み取ります。

  4. また、関数ツール append_to_state もあります。これは、エージェントがツールを使って状態の辞書値にコンテンツを追加できるようにする関数です。ツールを複数回呼び出す可能性があるエージェントや、LoopAgent を複数回パスして動作するエージェントにこの関数を使うと、エージェントが動作するたびに出力が保存されるため、特に便利です。

  5. Cloud Shell ターミナルからウェブ インターフェースを起動して、エージェントの現在のバージョンを試してみます。--reload_agents 引数を含めて、エージェントの変更に基づいてエージェントがライブで再読み込みされるようにします。

    cd ~/adk_multiagent_systems adk web --reload_agents 注: 前回の adk web セッションをシャットダウンしていない場合、デフォルトのポート 8000 がブロックされますが、adk web --port 8001 などを使用して新しいポートで開発 UI を起動できます。
  6. ウェブ インターフェースを新しいタブで表示するには、ターミナルの出力にある http://127.0.0.1:8000 リンクをクリックします。

  7. 新しいブラウザタブが開き、ADK 開発 UI が表示されます。

  8. 左側の [Select an agent] プルダウンから、[workflow_agents] を選択します。

  9. hello」と挨拶して会話を始めます。エージェントが応答するまでにしばらく時間がかかる場合があります。その後、映画のプロット生成を開始するために、歴史上の人物を入力するよう求められます。

  10. 歴史上の人物を入力するよう求められたら、任意の人物を入力するか、次の例を使用します。

    • Zhang Zhongjing(張仲景)- 紀元 2 世紀の有名な中国の医師。
    • Ada Lovelace(エイダ ラブレス)- 初期のコンピュータに関する研究で知られるイギリスの数学者、作家
    • Marcus Aurelius(マルクス・アウレリウス)- 哲学的な著作で知られるローマ皇帝。
  11. このワークフロー エージェントはワークフローを実行しながらエージェントを次々と呼び出し、~/adk_multiagent_systems/movie_pitches ディレクトリにプロット ファイルを書き込んでいきます。ファイルがディスクに書き込まれたら、ユーザーに知らせます。

    ファイルが生成されたことを報告するメッセージが表示されない場合や、別の人物を試したい場合は、右上の [+ New Session] をクリックしてもう一度お試しください。

  12. Cloud Shell エディタでエージェントの出力を確認します(横方向に何度もスクロールせずにテキスト全文を表示するには、Cloud Shell エディタのメニューで [View] > [Word Wrap] を選択して有効にすることをおすすめします)。

  13. ADK 開発 UI で、会話のターンを表すエージェント アイコン(エージェント アイコン)のいずれかをクリックし、イベントビューを表示します。

  14. イベントビューには、このセッションで使用されたエージェントとツールのツリーが視覚的に表示されます。プロット全体を表示するために、イベントパネルをスクロールしなければならない場合があります。

adk ウェブグラフ

  1. グラフビューに加えて、イベントの [Request] タブをクリックすると、会話履歴など、このエージェントがリクエストの一部として受け取った情報が表示されます。
  2. イベントの [Response] タブでは、エージェントが返した内容を確認することもできます。
注: このシステムで生成される結果は十分示唆に富むものですが、指示をこの程度まで簡略化したり、例の追加を省略したりしても構わないという意味ではありません。各エージェントにより詳細な指示を与え、明確な例を追加することで、システムの信頼性が大幅に向上します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 SequentialAgent を使用してマルチエージェント システムの構築を開始する

タスク 5. 反復作業のために LoopAgent を追加する

LoopAgent は、定義されたシーケンスでサブエージェントを実行し、ユーザー入力を待つために動作を中断することなく、シーケンスの最初に戻って再び実行します。ループは、反復回数に達するか、サブエージェントの 1 つがループを終了する呼び出しを行うまで(通常は組み込みの exit_loop ツールを呼び出します)繰り返されます。

LoopAgent は、継続的な改良、モニタリング、または周期的なワークフローが必要なタスクを実行する場合に役立ちます。たとえば次のような場合です。

  • 反復的な改良: エージェントのサイクルを繰り返すことで、ドキュメントや計画を継続的に改善します。
  • 継続的なモニタリング: エージェントのシーケンスを使用して、データソースまたは条件を定期的にチェックします。
  • 議論または交渉: エージェント間で発言の往復をシミュレートして、より良い結果を導き出します。

映画の企画書作成エージェントに LoopAgent を追加して、ストーリーの執筆中に調査と反復作業を複数回行えるようにしましょう。これにより台本が洗練されるだけでなく、ユーザーはより漠然とした入力から始められるようになります。たとえば、歴史上の人物を具体的に提案する代わりに、「古代の医者に関するストーリーが欲しい」とエージェントに伝えるだけで、調査と執筆の反復ループを通じて、適切な候補を見つけてストーリーを創り上げることができます。

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

修正されたエージェントは、次のように動作します。

  • root_agentgreeter)は同じままです。
  • film_concept_teamSequentialAgent)は、次の要素で構成されています。
    • writers_room: シーケンスを開始する LoopAgent。以下の要素で構成されます。
      • researcher: 前述したものと同じです。
      • screenwriter: 前述したものと同じです。
      • critic: 現在のドラフトについて批判的なフィードバックを提供し、ループを通じて次の調査と改善のラウンドに進むよう促します。
    • ループが終了すると、会話の制御は film_concept_teamSequentialAgent)にエスカレーションされて戻ってから、そのシーケンスの次のエージェントである file_writer に渡されます。このエージェントは前述と変わらず、映画のタイトルを付け、シーケンスの結果をファイルに書き込む役割を果たします。

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

  1. adk_multiagent_systems/workflow_agents/agent.py ファイルで import 文を記述してツールを指定し、必要に応じてエージェントがループを終了できるようにします。

    from google.adk.tools import exit_loop
  2. ループを終了するタイミングを判断するために critic を追加します。これは、プロットが完成したかどうかを判断するエージェントです。agent.py ファイルの # Agents セクション ヘッダーの下に、次の新しいエージェントを貼り付けます(既存のエージェントを上書きしないようにしてください)。ツールのひとつに exit_loop ツールが含まれていて、instructions にはその使い方に関する説明もあります。

    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 を作成します。このエージェントは、researcher、screenwriter、critic の反復ループを作成します。ループを通過するたびに、それまでの作業を批判的に検証し、次のラウンドに向けた改善点を導き出します。既存の film_concept_teamSequentialAgent)の上に次のコードを貼り付けます。

    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. LoopAgent の作成コードに max_iterations パラメータが含まれていることに注意してください。これは、ループが終了するまでに実行される回数を定義します。別の方法を実装してループを中断する場合でも、反復の合計数に上限を課すことをおすすめします。

  5. film_concept_teamSequentialAgent)を更新して、researcherscreenwriter を、先ほど作成した writers_roomLoopAgent)に置き換えます。file_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, file_writer ], )
  6. ADK 開発 UI タブに戻り、右上の [+ New Session] ボタンをクリックして新しいセッションを開始します。

  7. hello」と挨拶して新しい会話を始めます。

  8. 歴史上の人物のタイプを選択するよう求められたら、関心のある人物を選んでください。次のような人物のイメージを伝えてみましょう。

    • an industrial designer who made products for the masses(大衆向け製品を制作した工業デザイナー)
    • a cartographer (a map maker)(地図製作者)
    • that guy who made crops yield more food(作物の増収に成功した男性)
  9. 人物のタイプを選択したら、エージェントはループを反復してから、映画のタイトルを付け、筋書きをファイルに書き込みます。

  10. Cloud Shell エディタを使用して、生成されたファイルを確認します。このファイルは adk_multiagent_systems/movie_pitches ディレクトリに保存されているはずです(ここでも、横方向に何度もスクロールせずにテキスト全文を表示するには、Cloud Shell エディタのメニューで [View] > [Word Wrap] を選択して有効にすることをおすすめします)。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 反復作業のために LoopAgent を追加する

タスク 6. ParallelAgent の「並列処理と収集」パターンを使用してレポートを生成する

ParallelAgent は、サブエージェントの同時実行を可能にします。各サブエージェントが独自のブランチで動作します。デフォルトでは、並列実行中のサブエージェントが会話履歴や状態を直接共有することはありません。

このエージェントは、タスクを同時処理できる独立したサブタスクに分担できる場合に有効です。このようなタスクに ParallelAgent を使用すると、全体的な実行時間を大幅に短縮できます。

このラボでは、新作映画に説得力を持たせるために、潜在的な興行収入に関する調査やキャスティングの初期案など、補足的なレポートを追加します。

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

修正されたエージェントは、次のように動作します。

  • greeter は同じです。
  • film_concept_teamSequentialAgent)は、次の要素で構成されています。
    • writers_roomLoopAgent): 変更はなく、以下の要素で構成されています。
      • researcher エージェント
      • screenwriter エージェント
      • critic エージェント
    • 新たに加えられる preproduction_teamParallelAgent)は、次の要素で構成されています。
      • box_office_researcher: 過去の興行収入データを使用して、この映画の潜在的な興行収入に関するレポートを生成するエージェント
      • casting_agent: 類似する映画に出演した俳優のデータを基に、キャスティングの初期案を生成するエージェント
    • file_writer は前述と変わらず、シーケンスの結果をファイルに書き込む役割を果たします。

この例のほとんどは、人間がチームで取り組むクリエイティブな作業になぞらえて定義されていますが、このワークフローは、複雑な一連のタスクを複数のサブエージェントに分担して、複雑な書類の下書きを生成する方法を示したものに過ぎず、人間のチームメンバーは下書きをさらに編集して改善することができます。

  1. workflow_agents/agent.py ファイルの # Agents ヘッダーの下に、次の新しいエージェントと ParallelAgent を貼り付けます。

    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 エージェントの sub_agents リストを更新して、writers_roomfile_writer の間に preproduction_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_writerinstruction を次のように更新します。

    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. ファイルを保存します。

  5. ADK 開発 UI で、右上の [+ New Session] をクリックします。

  6. hello」と挨拶して会話を始めます。

  7. プロンプトが表示されたら、興味のある別の登場人物のタイプを入力します。次のような人物のイメージを伝えてみましょう。

    • that actress who invented the technology for wifi(Wi-Fi の技術を発明した女優)
    • an exciting chef(カリスマ性のあるシェフ)
    • key players in the worlds fair exhibitions(万国博覧会の主要な出展者)
  8. エージェントが執筆とレポート生成を完了したら、adk_multiagent_systems/movie_pitches ディレクトリにあるファイルを確認します。プロセスのどこかで失敗した場合は、右上の [+ New Session] をクリックしてもう一度試してください。

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

SequentialAgentLoopAgentParallelAgent の事前定義されたワークフロー エージェントでニーズを満たせない場合は、CustomAgent を使用して新しいワークフロー ロジックを柔軟に実装することができます。サブエージェント間のフロー制御、条件付き実行、状態管理についてパターンを定義できます。このエージェントは、複雑なワークフローやステートフルなオーケストレーションに加えて、カスタム ビジネスロジックをフレームワークのオーケストレーション レイヤに統合したい場合にも有用です。

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

お疲れさまでした

このラボでは、複数のエージェントを作成し、それらを親エージェントとサブエージェントの関係で関連付ける方法、セッションの状態に書き込み、エージェントへの指示で読み取る方法、ワークフロー エージェントを使用して、エージェント間で会話を直接受け渡す方法を学習しました。

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2026 年 2 月 3 日

ラボの最終テスト日: 2026 年 2 月 3 日

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

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

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

Using an Incognito or private browser window is the best way to run this lab. This prevents any conflicts between your personal account and the Student account, which may cause extra charges incurred to your personal account.