コンテンツにスキップ

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

オーケストレーションとは、アプリ内でのエージェントの流れを指します。どのエージェントが、どの順序で実行され、次に何をするかをどのように決定するのでしょうか。エージェントをオーケストレーションする主な方法は 2 つあります。

このページは、クイックスタートまたはエージェントを読んだ後に参照してください。このページでは、Agent コンストラクター自体ではなく、複数のエージェントにまたがるワークフロー設計について説明します。

  1. LLM に判断を任せる方法:LLM の知能を利用して計画と推論を行い、それに基づいて実行するステップを決定します。
  2. コードでオーケストレーションする方法:コードによってエージェントの流れを決定します。

これらのパターンは組み合わせて使用できます。それぞれにトレードオフがあり、以下で説明します。

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

Section titled “LLM によるオーケストレーション”

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

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

Agents SDK では、主に次の 2 つのオーケストレーションパターンが使用されます。

パターン仕組み適している場合
Agents as toolsマネージャーエージェントが会話を制御し続け、agent.asTool() を通じて専門エージェントを呼び出します。1 つのエージェントに最終回答を担当させる場合、複数の専門エージェントからの出力を組み合わせる場合、または共通のガードレールを一元的に適用する場合に適しています。
ハンドオフトリアージエージェントが会話を専門エージェントにルーティングし、その専門エージェントがターンの残りでアクティブなエージェントになります。専門エージェントからユーザーに直接応答させる場合、プロンプトの焦点を絞る場合、または専門エージェントごとに異なる指示やモデルを使用する場合に適しています。

専門エージェントがサブタスクを支援する一方で、ユーザー向けの会話を引き継ぐべきではない場合は、 agents as tools を使用します。どのツールを呼び出すか、最終的な応答をどのように提示するかについては、引き続きマネージャーが責任を持ちます。API の詳細についてはツールを、比較形式の例についてはエージェントを参照してください。

ルーティング自体がワークフローの一部であり、選択された専門エージェントに会話の次の部分を担当させる場合は、 ハンドオフ を使用します。ハンドオフでは、会話コンテキストを保持しながら、アクティブな指示を専門エージェント向けに絞り込みます。API についてはハンドオフを、最小限のエンドツーエンドの例についてはクイックスタートを参照してください。

この 2 つのパターンは組み合わせることもできます。トリアージエージェントが専門エージェントにハンドオフし、その専門エージェントが範囲の限定されたサブタスクのために、さらに別のエージェントをツールとして使用することもできます。

このパターンは、タスクの自由度が高く、LLM の知能を活用したい場合に適しています。特に重要なポイントは次のとおりです。

  1. 優れたプロンプトの作成に注力します。利用可能なツール、その使用方法、従うべき制約を明確にします。
  2. アプリを監視し、反復的に改善します。問題が発生する箇所を確認し、プロンプトを改善します。
  3. エージェントが自己分析し、改善できるようにします。たとえば、ループ内で実行して自己評価させたり、エラーメッセージを提供して改善させたりします。
  4. あらゆるタスクをこなすことを期待する汎用エージェントではなく、1 つのタスクに特化した専門エージェントを用意します。
  5. 評価に注力します。これにより、エージェントを訓練して改善し、タスクの実行能力を高められます。

このオーケストレーション方式を支える SDK の基本コンポーネントについては、まずツールハンドオフエージェントの実行を参照してください。

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

Section titled “コードによるオーケストレーション”

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

  • structured outputsを使用して、コードで検査できる適切な形式のデータを生成します。たとえば、エージェントにタスクをいくつかのカテゴリーに分類させ、そのカテゴリーに基づいて次のエージェントを選択できます。
  • あるエージェントの出力を次のエージェントの入力に変換して、複数のエージェントを連結します。ブログ記事の作成などのタスクを、調査、構成案の作成、ブログ記事の執筆、批評、改善という一連のステップに分解できます。
  • タスクを実行するエージェントを、評価とフィードバックを行うエージェントとともに while ループ内で実行し、評価エージェントが出力は特定の基準を満たしていると判断するまで繰り返します。
  • Promise.all などの JavaScript の基本コンポーネントを使用して、複数のエージェントを並列実行します。互いに依存しない複数のタスクがある場合に、処理を高速化するうえで役立ちます。

examples/agent-patternsには、複数のコード例があります。

  • エージェントでは、構成パターンとエージェントの設定について説明しています。
  • ツールでは、agent.asTool() とマネージャー方式のオーケストレーションについて説明しています。
  • ハンドオフでは、専門エージェント間の委任について説明しています。
  • エージェントの実行では、Runner と実行単位のオーケストレーション制御について説明しています。
  • クイックスタートでは、最小限のエンドツーエンドのハンドオフ例を紹介しています。