コンテンツにスキップ

複数エージェントのオーケストレーション

オーケストレーションとは、アプリ内でのエージェントの流れのことです。どのエージェントをどの順番で実行し、その後何をするかをどう決めるのか。エージェントをオーケストレーションする主な方法は 2 つあります。

  1. LLM に意思決定を任せる: これは、 LLM の知性を用いて計画・推論し、それに基づいて次に取るべきステップを決めます。
  2. コードでオーケストレーションする: コードでエージェントの流れを決定します。

これらのパターンは組み合わせ可能です。以下にそれぞれのトレードオフを説明します。

LLM によるオーケストレーション

エージェントは、指示、ツール、ハンドオフを備えた LLM です。つまり、オープンエンドなタスクが与えられたとき、 LLM はタスクへの取り組み方を自律的に計画し、ツールを使って行動やデータ取得を行い、ハンドオフでサブエージェントにタスクを委譲できます。例えば、リサーチ用のエージェントには次のようなツールを持たせられます。

  • Web 検索によるオンライン情報の収集
  • ファイル検索と取得による独自データや接続先の探索
  • コンピュータ操作による PC 上でのアクション実行
  • データ分析のためのコード実行
  • 計画立案、レポート作成などに長けた専門エージェントへのハンドオフ

このパターンは、タスクがオープンエンドで LLM の知性に依存したい場合に有効です。ここで重要な戦術は次のとおりです。

  1. 良いプロンプトに投資する。利用可能なツール、その使い方、動作すべきパラメーター範囲を明確にする。
  2. アプリを監視し、反復改善する。問題の発生箇所を把握し、プロンプトを改善する。
  3. エージェントに内省と改善を許可する。例: ループで実行し自己批評させる、あるいはエラーメッセージを与えて改善させる。
  4. 何でもできる汎用エージェントではなく、特定タスクに秀でた専門エージェントを用意する。
  5. evals に投資する。これによりエージェントを訓練して、タスク遂行能力を高められます。

コードによるオーケストレーション

LLM によるオーケストレーションは強力ですが、コードによるオーケストレーションは速度・コスト・性能の面でタスクをより決定的かつ予測可能にします。一般的なパターンは次のとおりです。

  • structured outputs を使って、コードで検査できる適切な形式のデータを生成する。例えば、エージェントにタスクをいくつかのカテゴリーに分類させ、カテゴリーに基づいて次のエージェントを選ぶ。
  • 複数のエージェントを、前の出力を次の入力に変換して連結する。ブログ記事執筆のようなタスクを、リサーチ → アウトライン作成 → 本文執筆 → 批評 → 改善という一連のステップに分解する。
  • 評価とフィードバックを行うエージェントと、タスクを実行するエージェントを while ループで回し、評価者が基準を満たしたと判断するまで繰り返す。
  • 複数のエージェントを並列実行する(例: asyncio.gather のような Python の基本コンポーネントを使用)。相互依存しない複数タスクがある場合の高速化に有効。

examples/agent_patterns に複数のコード例があります。