【GCP ADK徹底解説シリーズ③】LoopAgentを活用したワークフローのループ処理

2025年9月29日掲載

キービジュアル

皆さん、こんにちは。ソリューションアーキテクトの長岡です。

本記事はADK解説シリーズの最終回として、自律的に回答を改善するをマルチエージェントワークフローをテーマに、ADKの LoopAgent について解説します。

目次

1. はじめに:AI Agentの提案が要件を満たしてくれないケース

第1部、第2部を通じて、安定性(Sequantial)が高く、効率的(Parallel)なワークフローを構築しました。しかし、実際の業務では「AIが提案した出張プランが、会社の経費規定(予算)を超えてしまう」ような、要件を満たさないアウトプットを出してくる可能性はゼロではないでしょう。

従来のケースでは、人が手動でプロンプトを改善して再実行をしていました。しかし、AIエージェント自身が「予算オーバーだ。もっと安いプランを再検索しよう」と判断し、試行錯誤してくれたらとても便利になると思いませんか?

逐次処理と並列処理の違いを明示した図

このようなケースに対し、ADKは`LoopAgent`(ループエージェント)を準備しています。これは、ワークフローに「フィードバックループ」の概念をもたらし、AIが自らの実行結果を評価し、目標を達成するまで試行錯誤と改善を繰り返すことを可能にするADKの専用の組み込みのワークフローエージェントです。

2. LoopAgentによる反復処理の実装

LoopAgent のアーキテクチャは、「提案→検証→改善(Propose-Validate-Refine)」というフィードバックループに基づいています。ADKでは、このループの終了条件を常に検証し、条件をクリアした場合にループを脱します。

逐次処理と並列処理の違いを明示した図
実装例:予算内で最適な出張プランを提案する「自己改善プランナー」

「ユーザーの要望に対し、AIが予算内に収まる最適な出張プランを自ら試行錯誤して提案する」ワークフローを構築します。

ステップ1:各役割の専門エージェントとツールを定義

予算チェックのような明確な要件がある場合、再利用可能な`FunctionTool`として定義するのがADKのプラクティスです。ループを正常に終了させるために、`tool_context.actions.escalate = True` を呼び出します。

from google.adk.agents import LlmAgent, LoopAgent, SequentialAgent
from google.adk.tools import FunctionTool, ToolContext
import json

# 役割1: 出張プラン提案エージェント
proposer_agent = LlmAgent(
    name="trip_proposer",
    instruction="""あなたは出張手配のプロです。目的地、日程、予算、そして改善ヒント「{refinement_hint}」を基に、具体的な出張プラン(交通手段、ホテル)とその合計金額を見積もってください。
    出力は必ず以下のJSON形式で返してください:
    {"plan_details": "ひかり500号, 東横INN新大阪中央口", "total_cost": 45000}""",
    model="gemini-2.5-flash",
    output_key="proposal"
)

# 役割2: プラン検証(予算チェック)のためのツール
def validate_business_trip_plan(tool_context: ToolContext, proposal: str, budget: int) -> str:
    """提案された出張プランを経費規定(予算)内で検証し、成功ならループを停止、失敗なら理由を返す。"""
    try:
        proposal_data = json.loads(proposal)
        cost = proposal_data.get("total_cost", float('inf'))
        if cost <= budget:
            # 検証成功: エスカレーションを発生させてループを正常終了させる
            tool_context.actions.escalate = True
            return f"検証成功: 予算内に収まりました。最終プラン: {proposal}"
        else:
            # 検証失敗: 失敗理由を返す
            return f"検証失敗: 予算オーバーです。規定額{budget}円に対し、{cost}円でした。"
    except (json.JSONDecodeError, AttributeError):
        return "検証失敗: 提案のJSON形式が正しくありません。"

validator_tool = FunctionTool(name="plan_validator", func=validate_business_trip_plan)

# 検証ツールを呼び出すエージェント
validator_agent = LlmAgent(
    name="validator",
    instruction="提案されたプラン「{proposal}」を経費規定「{budget}」で検証ツールを呼び出してチェックしてください。",
    tools=[validator_tool],
    model="gemini-2.5-flash",
    output_key="validation_result"
)

# 役割3: 改善案の策定エージェント
refiner_agent = LlmAgent(
    name="cost_reduction_advisor",
    instruction="""出張コスト削減アドバイザーです。元の要望と失敗理由を基に、次の提案で試すべき具体的な改善ヒント(例:『LCCの利用を検討』、『ホテルのランクを一つ下げる』など)を生成してください。
    - 元の要望: {prompt}
    - 失敗理由: {validation_result}""",
    model="gemini-2.5-flash",
    output_key="refinement_hint" # 次のループのproposer_agentがこれを参照する
)
ステップ2:LoopAgentで反復実行サイクルを制御

`LoopAgent`の sub_agents に、1回のループで実行するエージェント(提案→検証→改善)を定義します。この際、オプションの max_iterations 必ず設定して無限ループを防ぎましょう。(最大値=10)

self_improving_cycle = LoopAgent(
    name="self_improving_cycle",
    sub_agents=[
        proposer_agent,  # 改善ヒントを基に再提案
        validator_agent, # 検証
        refiner_agent    # 次の改善ヒントを生成
    ],
    max_iterations=5 # 無限ループを避けるための安全装置
)
ステップ3:自己改善ワークフローの実行

Runner で実行します。最初のループで proposer_agent が利用できるよう、共有ステートに初期値の refinement_hint を設定しておくのがポイントです。

from google.adk.runtime import Runner, Session
from google.adk.runtime.types import Content, Part

runner = Runner(agent=self_improving_cycle, session_service=SessionService())
session = Session(user_id="user_nagaoka")

# 共有ステートに初期値を設定
session.state = {
    "prompt": "大阪への2泊3日の出張", 
    "budget": 50000, 
    "refinement_hint": "まずは標準的な新幹線とビジネスホテルで見積もってください。"
}

final_result = runner.run(
    session_id=session.id,
    new_message=Content(parts=[Part(text=session.state["prompt"])])
)

# 最終結果の確認
final_state = session.state
validation_result = final_state.get("validation_result", "")

if "検証成功" in validation_result:
    print("予算内での最適なプランが見つかりました!")
    print(validation_result)
else:
    print(f"予算内で最適なプランを見つけられませんでした。最終試行の結果: {validation_result}")

3. まとめ

3部作を通じて、ADKの主要な組み込みのワークフローエージェントを解説しました。

  • SequentialAgent:

    逐次処理専用のAIエージェントを組み込める機能。実現させたいワークフローの安定性を高める(1. 稟議起案 → 2. 承認 →  3. 通知など)

  • ParallelAgent:

    並列処理専用のAIエージェントを組み込める機能。ワークフローの効率性を高める(「ホテル検索」 と 「出張の経路検索」は互いに依存しないので、並列実行させるなど)

  • LoopAgent:

    反復専用のAIエージェントを組み込める機能。ワークフローにフィードバックループ機能を与え、自律的に要件をクリアさせる(予算10万以下を満たさない場合、再度検索のワークフローを実施させるなど)

 

これらを組み合わせることで、単にタスクをこなすだけの自動化ではなく、様々な変化に強く、自律的に問題を解決していく、真に「堅牢な(Robust)」マルチエージェントシステムを構築できるでしょう。

そして、Google Cloud の ADKのマルチエージェントアーキテクチャは極めて実践的なフレームワーク ということが伝わったのではないでしょうか。

ここまで拝読いただき、ありがとうございました!

本シリーズが、皆様のAIエージェントを活用したビジネスやプロジェクトに役立てることを願っています。

Vertex AI DIYプランについて

Vertex AI Search を使って社内文書検索環境(RAG)を構築してみませんか?ソフトバンクのエンジニアが構築をサポートします。

Vertex AI DIY プランでは、以下の3つのことをご体験いただけます。詳細は、関連サービスにある「Vertex AI DIYプラン」をご確認ください。

SoftBank Vertex AI Search DIYプランのご紹介

Google Cloud 関連サービス

Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。
Google の生成AIの導入を考えている方はもちろん、どのようなものか確認したいという方でもご活用いただけます。

Looker は定義から集計、可視化の一連のデータ分析プロセスをカバーする BI ツールを超えるデータプラットフォームです。ソフトバンクは、顧客のニーズに合わせて柔軟なサポートを提供し、Looker を活用したデータドリブンな企業変革を支援しています。

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません