マルチエージェントとハンドオフ

1. マルチエージェントシステムの導入意義

単一のエージェントには限界があり、複雑なタスクや複数の専門領域にまたがる問題に対処するためには、人間がチームで働くように、専門化された複数のエージェントを連携させる必要がある。これにより、スケーラビリティ、精度、回復性の向上が期待できる。

2. オーケストレーションの方法

エージェント間の情報の流れとタスクの管理(オーケストレーション)には、大別して以下の2つの方法がある。

  • 確定的オーケストレーション (Deterministic orchestration):
    • 特徴: if/else文など、ハードコードされたロジックでエージェントを切り替える。
    • メリット: 予測可能性が高く、テストやデバッグが容易。
    • デメリット: 柔軟性に欠ける。例えば、特定の単語という言葉が含まれていないだけで正しくルーティングできないなど、ユーザーの曖昧な表現に弱い側面がある。
  • 動的オーケストレーション (Dynamic orchestration):
    • 特徴: LLM(Triageエージェント等)がユーザーの意図を判断し、次にどのエージェントに任せるかを動的に決定する。
    • メリット: 非常に柔軟で、複雑な入力や曖昧な要求にも対応可能。
    • デメリット: 予測可能性が低くなり、コストや実行時間の管理が難しくなる場合がある。

3. エージェント連携のメカニズム

OpenAI Agents SDKにおけるエージェント間の連携には、以下の2つのパターンがある。

  • Agent-as-tool
    • メインエージェントが、サブエージェントを「ツール(関数)」のように呼び出す形式。メインエージェントが制御権を保持したまま、特定のサブタスクだけを任せる。
  • Handoff(ハンドオフ)
    • 制御権を完全に別のエージェントに委譲する。委譲された側のエージェントが、その後の対話の全責任を負う。

4. ハンドオフのカスタマイズと制御

ハンドオフをより高度に管理するために、以下の機能がある。

  • ハンドオフオブジェクトのカスタマイズ:handoff()関数を使用することで、エージェントを直接渡すだけでなく、遷移時の振る舞いを細かく設定できる。
    • on_handoff: 遷移が発生した際に実行するコールバック関数(ロギングやアナリティクスに利用)。
    • input_type: Pydanticモデルを用いて、ハンドオフ時に渡されるデータの型を検証・制限する。
  • ステートの維持: 会話の履歴や文脈を維持したままエージェントを切り替えるため、SQLiteSessionなどの永続化層や、現在の担当エージェントを追跡する変数の管理が重要になる。

5. ハンドオフのためのプロンプティング

エージェントが適切に権限を委譲できるようにするためのガイドライン。

  • RECOMMENDED_PROMPT_PREFIX: SDKが提供する推奨プロフィックス。これを各エージェントのシステムプロンプトに追加することで、エージェント自身に「自分はマルチエージェント環境にいて、必要に応じてハンドオフを行う能力があること」を認識させる。
  • 明示的な指示: * どの条件でタスクを委譲すべきか(ハンドオフ指示)。
    • そのエージェントの目的は何か(エージェント指示)。これらを明確に定義することで、オーケストレーター(Triageエージェント)の精度が向上する。