複数エージェントのオーケストレーション
オーケストレーションとは、アプリ内でエージェントがどのように流れるかを指します。どのエージェントを実行するか、順序はどうするか、そして次に何を行うかを決定します。エージェントをオーケストレーションする方法は大きく 2 つあります。
- LLM に意思決定させる: これは LLM の知性を利用して計画・推論を行い、その結果に基づいて次のステップを決定します。
- コードでオーケストレーションする: コードによってエージェントのフローを決定します。
これらのパターンは組み合わせて利用できます。それぞれにトレードオフがあります。
LLM によるオーケストレーション
エージェントとは、 instructions、 tools、 handoffs を備えた LLM です。つまり、オープンエンドなタスクが与えられた場合、 LLM は自律的にタスクの進め方を計画し、ツールを使ってアクションを実行してデータを取得し、 handoffs を使ってサブエージェントへタスクを委任できます。たとえば、リサーチ用のエージェントには次のようなツールを持たせられます。
- Web 検索でオンライン情報を収集
- ファイル検索と取得で社内データや接続先を探索
- コンピュータ操作でコンピュータ上の操作を実行
- コード実行でデータ分析を実施
- ハンドオフで、計画策定やレポート作成に特化したエージェントへ委任
このパターンはタスクがオープンエンドで、 LLM の知性に頼りたい場合に特に有効です。以下の戦略が重要です:
- 良いプロンプトに投資する。利用可能なツール、その使い方、および守るべきパラメーターを明確に伝えます。
- アプリをモニタリングし、イテレーションを重ねる。問題が起きる箇所を確認し、プロンプトを改良します。
- エージェント自身に内省させて改善させる。たとえばループで実行し、自分で批評させる、あるいはエラーメッセージを提供して改善させます。
- 何でもこなす汎用エージェントを期待するのではなく、 1 つのタスクに特化したエージェントを用意する。
- evals に投資する。これによりエージェントを訓練してタスク遂行能力を向上できます。
コードによるオーケストレーション
LLM によるオーケストレーションは強力ですが、コードでオーケストレーションすると速度・コスト・パフォーマンスの面でより決定論的かつ予測可能になります。一般的なパターンは次のとおりです:
- structured outputs を使用して、コードで検査できる適切な形式のデータを生成する。たとえば、エージェントにタスクをいくつかのカテゴリーに分類させ、そのカテゴリーに応じて次のエージェントを選択できます。
- 1 つのエージェントの出力を次のエージェントの入力に変換して複数のエージェントをチェーンする。ブログ記事の執筆を「リサーチ→アウトライン作成→本文執筆→批評→改善」の一連のステップに分割するなどが可能です。
- タスクを実行するエージェントを
while
ループで回し、評価とフィードバックを行うエージェントと組み合わせ、評価者が所定の基準を満たしたと判断するまで繰り返します。 - Python の基本コンポーネントである
asyncio.gather
などを使い、複数エージェントを並列で実行する。相互に依存しない複数のタスクを高速化したい場合に便利です。
examples/agent_patterns
には多数のコード例があります。