GoogleのAgent Development Kit (ADK)は、タスクを管理するための主に2つの方法を提供しています。
動的なマルチエージェント・ルーティング
ルーティングモデルでは、中央のコーディネーターがユーザーのリクエストを受け取り、それを専門のエージェント(specialist agents)に割り当てます。コーディネーターはどの専門エージェントが実行すべきかを決定し、専門エージェントはその役割を果たした後、制御は親エージェントに戻ります。
- 仕組み – コーディネーターが専門エージェントを選択してタスクを転送し、次のステップに進む前にレスポンスを待ちます。
- メリット – 柔軟性が際立ちます。LLMが実行時にパスを選択するため、フローを書き換えることなく、新しい入力や予期しない入力に適応できます。
- デメリット – ホップ(経由)が増えるたびにネットワークと処理のオーバーヘッドが加わるため、直線的なパイプラインと比較してレイテンシが増大します。
シーケンシャル・ワークフロー・ループ
ループモデルでは、コーディネーターの代わりに単一のLoopAgentが、変更可能なセッション状態を共有しながら、あらかじめ決められた一連の手順を実行します。
- 仕組み – エージェントが共有キーを読み取り、それを更新し、シーケンスが終了するまで次のステップに制御を渡していきます。
- メリット – 予測可能性。順序が常に一定であるため、デバッグやパフォーマンスのチューニングが容易です。
- デメリット – 硬直性。固定された順序から外れる必要が生じた場合、ループの再設計が必要になります。
ハンズオン・テスト:数式パーサー
これらのパターンを実際に確認するために、4つの専門エージェント(adder、subtracter、multiplier、divider)を使用して算術式を評価するシンプルなパーサーを作成しました。
ワークフロー・ループからの教訓
- 無限ループの防止 – 各エージェントに対し、共有状態を更新した直後にテキストを出力してターンを終了するように指示しました。このガードがなければ、ループが永遠に回り続けてしまう可能性があります。
- 数学的ロジックの維持 – adderに対して演算順序を遵守するよう明示的なガイダンスを与え、引き算のルールを壊さないようにしました。
- サイレント終了の回避 – エージェントが終了ツールを呼び出す前に最終結果を必ず出力するように強制しました。これにより、ユーザーは唐突な終了ではなく、結果を確認できます。
エラーハンドリング
divider専門エージェントの前に、ゼロ除算ガードを追加しました。このガードはまず除数を確認し、もしゼロであればプロセスを停止させることで、システム全体が実行時例外(runtime exception)に陥るのを防ぎます。
どちらのパターンがプロジェクトに適しているか?
- マルチエージェント・ルーティングを選択する場合:タスクが動的に変化する場合、入力が多岐にわたる場合、または実行時にLLMに最適な専門エージェントを判断させたい場合に適しています。トレードオフとしてレイテンシは高くなりますが、コードを変更することなく予期せぬシナリオに対処できます。
- ワークフロー・ループを選択する場合:データクリーニング、変換、集計など、各ステップが厳格な順序で行われる必要がある、明確に定義されたパイプラインがある場合に適しています。メリットはレイテンシが低くデバッグが容易なことですが、動的な分岐ができないという制約があります。
