複数エージェントのオーケストレーション
オーケストレーションとは、アプリ内でのエージェントの流れのことです。どのエージェントをどの順番で実行し、その後何をするかをどう決めるのか。エージェントをオーケストレーションする主な方法は 2 つあります。
- LLM に意思決定を任せる: これは、 LLM の知性を用いて計画・推論し、それに基づいて次に取るべきステップを決めます。
- コードでオーケストレーションする: コードでエージェントの流れを決定します。
これらのパターンは組み合わせ可能です。以下にそれぞれのトレードオフを説明します。
LLM によるオーケストレーション
エージェントは、指示、ツール、ハンドオフを備えた LLM です。つまり、オープンエンドなタスクが与えられたとき、 LLM はタスクへの取り組み方を自律的に計画し、ツールを使って行動やデータ取得を行い、ハンドオフでサブエージェントにタスクを委譲できます。例えば、リサーチ用のエージェントには次のようなツールを持たせられます。
- Web 検索によるオンライン情報の収集
- ファイル検索と取得による独自データや接続先の探索
- コンピュータ操作による PC 上でのアクション実行
- データ分析のためのコード実行
- 計画立案、レポート作成などに長けた専門エージェントへのハンドオフ
このパターンは、タスクがオープンエンドで LLM の知性に依存したい場合に有効です。ここで重要な戦術は次のとおりです。
- 良いプロンプトに投資する。利用可能なツール、その使い方、動作すべきパラメーター範囲を明確にする。
- アプリを監視し、反復改善する。問題の発生箇所を把握し、プロンプトを改善する。
- エージェントに内省と改善を許可する。例: ループで実行し自己批評させる、あるいはエラーメッセージを与えて改善させる。
- 何でもできる汎用エージェントではなく、特定タスクに秀でた専門エージェントを用意する。
- evals に投資する。これによりエージェントを訓練して、タスク遂行能力を高められます。
コードによるオーケストレーション
LLM によるオーケストレーションは強力ですが、コードによるオーケストレーションは速度・コスト・性能の面でタスクをより決定的かつ予測可能にします。一般的なパターンは次のとおりです。
- structured outputs を使って、コードで検査できる適切な形式のデータを生成する。例えば、エージェントにタスクをいくつかのカテゴリーに分類させ、カテゴリーに基づいて次のエージェントを選ぶ。
- 複数のエージェントを、前の出力を次の入力に変換して連結する。ブログ記事執筆のようなタスクを、リサーチ → アウトライン作成 → 本文執筆 → 批評 → 改善という一連のステップに分解する。
- 評価とフィードバックを行うエージェントと、タスクを実行するエージェントを
whileループで回し、評価者が基準を満たしたと判断するまで繰り返す。 - 複数のエージェントを並列実行する(例:
asyncio.gatherのような Python の基本コンポーネントを使用)。相互依存しない複数タスクがある場合の高速化に有効。
examples/agent_patterns に複数のコード例があります。