フォーム読み込み中
皆さん、こんにちは。ソリューションアーキテクトの長岡です。
本記事はADK解説シリーズの第2部として、マルチエージェント実行時の処理高速化をテーマに、並列処理に特化したADKの`ParallelAgent`について解説します。
第1部では、`SequentialAgent`を用いて、出張手配をテーマに、稟議→承認→通知といったような前の結果に依存するユースケースを取り上げ、SequentialAgentによって安定性の高いマルチエージェントワークフローを構築しました。しかし、出張手配のケースにおいて「交通手段の予約」と「ホテルの予約」を一つずつ順番に処理していたらどうでしょう? それぞれのAPIからの応答を待つ時間が足し算になり、全体のプロセスが遅くなってしまいます。
もし途中で処理が失敗してしまい、0からワークフローを動作させるとなると、それなりのタイムロスに繋がり、希望していたホテルが予約できない可能性も出てきます。そこで、このような逐次処理の非効率性を解消するのが、複数のタスクを同時に実行する ParallelAgent(並列エージェント)です。
`ParallelAgent`は、SequentialAgentと同じADKの組み込みのワークフローエージェントで、互いに依存しない複数のタスクを同時に実行するための機能です。これにより、各タスクの待ち時間が重複するため、全体の処理時間の削減が期待できます。
第1部で計画した出張のシナリオに基づき、「新幹線の座席確保」と「ホテルの部屋確保」を同時に実行してみましょう。これら2つのタスクは、それぞれ独立したAPIを呼び出すため、並列化に最適です。
各エージェントが、それぞれの結果を固有の`output_key`で共有ステートに保存します。(第1部で解説したように、ADKでは、エージェント間のデータ連携は共有ステート(Session State)を介して行われるため、各エージェントは、自身の処理結果を`output_key`で指定したキー名で共有ステートに書き込み、後続のエージェントが`{キー名}`の形式でその値を参照する)
from google.adk.agents import LlmAgent
# 新幹線予約エージェント
shinkansen_agent = LlmAgent(
name="shinkansen_booker",
instruction="出張先「{destination}」と日程「{schedule}」に基づき、新幹線の座席を確保し、予約結果を報告してください。",
model="gemini-2.5-flash",
output_key="shinkansen_result"
)
# ホテル予約エージェント
hotel_agent = LlmAgent(
name="hotel_booker",
instruction="出張先「{destination}」と日程「{schedule}」に基づき、指定ランク「{hotel_rank}」のホテルを確保し、予約結果を報告してください。",
model="gemini-2.5-flash",
output_key="hotel_result"
)
ParallelAgentのsub_agentsの配列に同時実行させたいエージェントのリストを渡します。シーケンシャルエージェントではこの配列は処理の順番を決定づけるものでしたが、パラレルエージェントでは配列に格納した順番は処理の順番に影響しません。
from google.adk.agents import ParallelAgent
# Fan-out: 新幹線とホテルの予約を並列実行
booking_coordinator = ParallelAgent(
name="booking_coordinator",
sub_agents=[
shinkansen_agent,
hotel_agent,
]
)
並列処理で共有ステートに保存された`shinkansen_result`と`hotel_result`の両方を参照し、出張申請システムに入力するための最終的な報告書を作成するエージェントを用意します。
# Gather: 並列処理の結果を統合して報告書を作成する
reporting_agent = LlmAgent(
name="reporting_agent",
instruction="""以下の予約結果を基に、経費申請システム用の正式な出張手配完了報告書を作成してください。
# 新幹線 予約結果
{shinkansen_result}
# ホテル 予約結果
{hotel_result}
""",
model="gemini-2.5-flash"
)
「並列予約」→「報告書作成」という一連の流れを SequentialAgent で定義し、Runnerで実行します。SequentialAgent を使う理由は、ParallelAgentで処理した結果を統合する際に、1. Parallel Agent自体の実行 → 2. 結果を統合 の連続処理が必要になるためです。
from google.adk.agents import SequentialAgent
from google.adk.runtime import Runner, Session
from google.adk.runtime.types import Content, Part
# Fan-out -> Gather のワークフローを定義
full_booking_workflow = SequentialAgent(
name="full_booking_workflow",
sub_agents=[
booking_coordinator, # 並列実行
reporting_agent # 結果の集約
]
)
runner = Runner(agent=full_booking_workflow, session_service=SessionService())
session = Session(user_id="user_nagaoka")
# 共有ステートに初期値を設定
session.state = {"destination": "大阪", "schedule": "来週月曜から2日間", "hotel_rank": "ビジネス"}
runner.run(
session_id=session.id,
new_message=Content(parts=[Part(text="大阪出張の手配をお願いします。")])
)
本稿では、`ParallelAgent`を用いて独立したタスクを同時実行し、業務プロセスを高速化・効率化する方法を解説しました。
`ParallelAgent`は、独立したタスクを同時実行し、処理時間を短縮できる
並列処理の結果は共有ステートを介して、後続のエージェントが安全に利用する
ParallelAgentの処理結果はSequentialAgentを使い、1. 並列処理の実行 2. 結果の統合 のワークフローを組み立てることで、並列処理の結果を整理する
ここまでで、ADKのワークフローは「安定性」 (Sequential) と 「効率性」 (Parallel) を両立しました。最終回となる【第3部】では、エラーからの自己回復や、条件に基づく反復処理を実現する`LoopAgent`について解説し、真に堅牢で自律的なマルチエージェントワークフローの完成を目指します。
お楽しみに!
Vertex AI Search を使って社内文書検索環境(RAG)を構築してみませんか?ソフトバンクのエンジニアが構築をサポートします。
Vertex AI DIY プランでは、以下の3つのことをご体験いただけます。詳細は、関連サービスにある「Vertex AI DIYプラン」をご確認ください。
Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。
Google の生成AIの導入を考えている方はもちろん、どのようなものか確認したいという方でもご活用いただけます。
Looker は定義から集計、可視化の一連のデータ分析プロセスをカバーする BI ツールを超えるデータプラットフォームです。ソフトバンクは、顧客のニーズに合わせて柔軟なサポートを提供し、Looker を活用したデータドリブンな企業変革を支援しています。
Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。
MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。
条件に該当するページがございません