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