OpenAIのエージェント構築のための実践ガイド
(openai.com)- LLMの推論、マルチモーダル、ツール利用能力の向上に伴い、ユーザーに代わって 自律的にワークフローを実行 する新たなシステムカテゴリである エージェント が登場
- エージェントは、モデル(LLM)、ツール(API/外部関数)、指示(ガイドライン)の3つの中核コンポーネントで構成され、単一エージェントまたはマルチエージェントシステムとしてオーケストレーション可能
- 複雑な意思決定、保守が難しいルールシステム、非構造化データ処理 が必要なワークフローでは、エージェント導入が適している
- ガードレールは、データプライバシー、コンテンツ安全性、ブランド一貫性 を保護する多層防御メカニズムであり、エージェント配備の必須要素
- 単一エージェントから始め、実ユーザーによる検証を経て段階的に拡張する 反復的アプローチ が、成功する配備の鍵
エージェントの定義
- エージェントは、ユーザーに代わって自律的に作業を実行 するシステムであり、カスタマーサービスの問題解決、レストラン予約、コード変更のコミット、レポート生成などのワークフローを処理
- LLMを統合していても、ワークフロー実行を制御しないアプリケーション(単純なチャットボット、単一ターンのLLM、感情分類器など)はエージェントではない
- エージェントの中核的特性:
- LLMを活用して ワークフロー実行を管理 し、意思決定を行い、ワークフロー完了のタイミングを認識し、必要に応じて先回りして行動を修正
- 失敗時には実行を中断し、ユーザーに制御を返す
- 多様な ツールにアクセス して外部システムと相互作用し、ワークフローの現在状態に応じて適切なツールを動的に選択しつつ、明確なガードレールの範囲内で動作
エージェントを構築すべきタイミング
- 従来の自動化と異なり、エージェントは、伝統的な決定論的・ルールベースのアプローチが限界に達するワークフローに適している
- 決済不正分析の例: 従来のルールエンジンは事前設定された基準に従って取引をフラグする チェックリスト方式 である一方、LLMエージェントは文脈を評価し、微妙なパターンを考慮し、明確なルール違反がなくても不審な活動を特定する 熟練した調査員 の役割を果たす
- エージェント導入が価値をもたらす3つのタイプ:
- 複雑な意思決定: 微妙な判断、例外、文脈依存の判断が必要なワークフロー(例: カスタマーサービスでの返金承認)
- 保守が難しいルール: 巨大で複雑なルールセットのため、更新コストが高い、またはエラーが起きやすいシステム(例: ベンダーセキュリティレビュー)
- 非構造化データ依存度の高いシナリオ: 自然言語の解釈、文書からの意味抽出、対話型のユーザーインタラクション(例: 住宅保険請求処理)
- この基準を明確に満たさない場合は、決定論的なソリューションで十分なこともある
エージェント設計の基礎
-
3つの中核コンポーネント
- モデル(Model): エージェントの推論と意思決定を駆動するLLM
- ツール(Tools): エージェントが行動を起こすために使う外部関数またはAPI
- 指示(Instructions): エージェントの振る舞いを定義する明示的なガイドラインとガードレール
-
モデル選択
- すべてのタスクに最強のモデルが必要なわけではない — 単純な検索や意図分類は 小型で高速なモデル で処理でき、返金承認の判断のような難しい作業では、より強力なモデルが有利
- プロトタイプ段階で 最も強力なモデルで性能ベースラインを設定 し、その後より小さなモデルに置き換え、許容可能な結果が得られるか確認するアプローチが効果的
- モデル選択の原則:
- evalを設定して性能ベースラインを確立
- 最上位モデルで精度目標の達成に集中
- 可能な箇所ではより小さなモデルに置き換えて コストとレイテンシを最適化
-
ツール定義
- ツールは、基盤アプリケーションやシステムのAPIを使ってエージェントの能力を拡張
- レガシーシステムでAPIがない場合、computer-use モデル を活用してWebやアプリケーションUIを通じて直接操作可能
- 各ツールは 標準化された定義 を持つべきで、ツールとエージェント間の柔軟な多対多関係をサポート
- よく文書化され、十分にテストされた再利用可能なツールは、発見性の向上、バージョン管理の簡素化、重複定義の防止に寄与
- エージェントに必要な3種類のツール:
- データ(Data): ワークフロー実行に必要な文脈と情報を取得(例: トランザクションDBクエリ、CRMシステム、PDF読取り、Web検索)
- アクション(Action): システムと相互作用してDBへの情報追加、レコード更新、メッセージ送信などの行動を実行(例: メール/SMS送信、CRMレコード更新、カスタマーサービステicketの人手への引き継ぎ)
- オーケストレーション(Orchestration): エージェント自身が他のエージェントのツールとして機能(例: 返金エージェント、リサーチエージェント、作成エージェント)
-
指示の構成
- 高品質な指示はあらゆるLLMベースアプリに不可欠だが、エージェントでは 特に重要
- 明確な指示は曖昧さを減らし、エージェントの意思決定を改善し、より円滑なワークフロー実行とエラー削減につながる
- エージェント指示のベストプラクティス:
- 既存文書の活用: 既存の運用手順、サポートスクリプト、ポリシー文書を使ってLLM向けルーチンを作成(カスタマーサービスでは、ルーチンはナレッジベース内の個別文書におおむね対応)
- タスク分解プロンプト: 密度の高いリソースから、より小さく明確なステップを提供して曖昧さを最小化
- 明確なアクション定義: ルーチンの各ステップが特定のアクションまたは出力に対応するよう明示(例: 注文番号の要求、API呼び出しによるアカウント詳細取得)
- エッジケースの捕捉: ユーザーが不完全な情報を提供する場合や予期しない質問をする場合など、一般的な変種を想定し、条件付きステップや分岐で対処方法を含める
- o1やo3‑miniのような高度なモデルを用いて、既存文書から自動的に指示を生成することも可能
オーケストレーション
-
単一エージェントシステム
- 単一エージェントでもツールを段階的に追加することで多くの作業を処理でき、複雑性の管理 と評価・保守を簡素化できる
- すべてのオーケストレーション手法には 「run」 の概念が必要で、通常は終了条件に達するまでエージェントが動作するループとして実装される
- 一般的な終了条件: ツール呼び出し、特定の構造化出力、エラー、最大ターン数到達
- Agents SDKでは
Agents.run()メソッドでエージェントを開始し、最終出力ツール呼び出し または ツール呼び出しのないモデル応答 でループ終了 - プロンプトテンプレート 戦略: 多数の個別プロンプトの代わりに、ポリシー変数を受け取る単一の柔軟な基本プロンプトを使って多様な文脈に適応し、保守と評価を大幅に簡素化
-
マルチエージェントシステムへ移行するタイミング
- 一般的な推奨事項は、まず単一エージェントの能力を最大化する こと
- エージェントを増やすと直感的な概念分離は得られるが、追加の複雑性とオーバーヘッドを伴うため、多くの場合はツールを備えた単一エージェントで十分
- エージェント分割の実務指針:
- 複雑なロジック: プロンプトに多数の条件分岐(if-then-else)が含まれ、プロンプトテンプレートが拡張しにくくなったら、各ロジックセグメントを別エージェントに分離
- ツール過負荷: 問題はツール数そのものではなく、類似性や重複にある — 15個以上の明確に区別されたツールをうまく管理する実装がある一方、10個未満の重複ツールでも苦戦する場合がある
-
マネージャーパターン(エージェントをツールとして利用)
- 中央LLMである 「マネージャー」 が、ツール呼び出しを通じて専門化されたエージェントネットワークをオーケストレーション
- マネージャーは文脈や制御を失うことなく、適切なタイミングで適切なエージェントに作業を委任し、その結果を 統合されたインタラクション として合成
- 1つのエージェントだけがワークフロー実行を制御し、ユーザーにアクセスすべきワークフローに適している
- 例: 翻訳エージェントがスペイン語、フランス語、イタリア語エージェントをツールとして呼び出す
-
分散型パターン(エージェント間ハンドオフ)
- エージェントがワークフロー実行を別のエージェントへ 「ハンドオフ」 する一方向の移行方式
- Agents SDKではハンドオフはツールまたは関数の一種であり、ハンドオフ関数呼び出し時に最新の会話状態を渡し、新しいエージェントで即座に実行を開始
- 単一エージェントが中央制御や合成を維持する必要がなく、各エージェントが実行を引き継いでユーザーと直接やり取りする方式に最適
- 例: トリアージエージェントがユーザークエリを評価し、テクニカルサポート、営業、注文管理エージェントへルーティング
-
宣言的 vs 非宣言的グラフ
- 一部のフレームワークでは、宣言的(declarative) な方法で、すべての分岐、ループ、条件をノード(エージェント)とエッジ(ハンドオフ)で構成されるグラフとして事前定義する必要がある — 可視性は高いが、ワークフローが動的かつ複雑になると煩雑になり、ドメイン固有言語の学習も必要
- Agents SDKは コードファースト(code-first) アプローチを採用し、なじみのあるプログラミング構造でワークフローロジックを直接表現でき、グラフ全体を事前定義せずに、より動的で適応的なエージェントオーケストレーションが可能
ガードレール
-
ガードレールの役割
- データプライバシーリスク(例: システムプロンプト漏えい防止)や評判リスク(例: ブランドに沿ったモデル挙動の強制)の管理に寄与
- 単一のガードレールだけでは十分な保護が難しく、複数の専門化ガードレールを組み合わせて使う ことで、より回復力のあるエージェントを構築する必要がある
- ガードレールは重要な構成要素だが、強力な認証・認可プロトコル、厳格なアクセス制御、標準的なソフトウェアセキュリティ対策と組み合わせる必要がある
-
ガードレールの種類
- 関連性分類器(Relevance classifier): エージェントの応答が意図された範囲内にあるか確認し、トピック外のクエリをフラグ(例: 「エンパイア・ステート・ビルの高さは?」 はトピック外としてフラグ)
- 安全性分類器(Safety classifier): システム脆弱性を悪用しようとする ジェイルブレイクやプロンプトインジェクション などの危険な入力を検知
- PIIフィルタ: モデル出力における個人識別情報(PII)の不要な露出を防止
- モデレーション(Moderation): ヘイトスピーチ、嫌がらせ、暴力などの有害または不適切な入力をフラグ
- ツールセーフガード(Tool safeguards): 各ツールに読み取り専用か書き込み可か、可逆性、必要なアカウント権限、金銭的影響などに基づいて 低/中/高リスク等級 を付与し、高リスク機能の実行前にガードレール検査の一時停止や人へのエスカレーションなどの自動アクションを発動
- ルールベース保護(Rules-based protections): ブロックリスト、入力長制限、正規表現フィルタなどの単純な決定論的措置により、禁止語やSQLインジェクションのような既知の脅威を防止
- 出力検証(Output validation): プロンプトエンジニアリングとコンテンツ検査を通じて、応答がブランド価値に適合しているか確認
-
ガードレール構築アプローチ
- 既に特定されているリスクに対するガードレールから設定し、新たな脆弱性が見つかったら追加で多層化
- 効果的なヒューリスティック:
- データプライバシーとコンテンツ安全性に集中
- 実際のエッジケースと失敗事例に基づいて新たなガードレールを追加
- セキュリティとユーザー体験の双方を最適化し、エージェントの進化に応じてガードレールを調整
- Agents SDKでは、ガードレールを 第一級オブジェクト(first-class concept) として扱い、デフォルトで 楽観的実行(optimistic execution) 方式を使用 — ベースエージェントが先回りして出力を生成している間にガードレールが同時実行され、制約違反時には例外を発生させる
-
人手介入の計画
- 人手介入は、ユーザー体験を損なわずにエージェントの実運用性能を改善できる 重要な安全装置
- 特に配備初期に重要で、失敗の特定、エッジケースの発見、堅牢な評価サイクルの確立に寄与
- 人手介入が必要な2つの主要トリガー:
- 失敗しきい値の超過: エージェントの再試行や行動に制限を設け、超過時(例: 複数回試しても顧客意図を把握できない)には人へエスカレーション
- 高リスク行動: センシティブ、不可逆、または重大な影響を伴う行動(例: ユーザー注文のキャンセル、大規模返金の承認、決済処理)は、エージェントへの信頼が高まるまで人の監督が必要
結論
- エージェントは、曖昧さを推論し、ツールを通じて行動し、多段階タスクを 高い自律性 で処理する、ワークフロー自動化の新時代を切り開く
- 単純なLLMアプリケーションと異なり、エージェントは エンドツーエンドのワークフローを実行 するため、複雑な意思決定、非構造化データ、脆弱なルールベースシステムに適している
- 信頼できるエージェントを構築するには、有能なモデル、明確に定義されたツール、明瞭で構造化された指示を組み合わせ、複雑さに応じたオーケストレーションパターンを用いつつ、単一エージェントから始めて必要なときだけマルチエージェントへ拡張する ことが重要
- ガードレールは、入力フィルタリングからツール利用、人手介入まであらゆる段階で重要であり、エージェントが本番環境で安全かつ予測可能に運用されることを保証
- 成功する配備は、オール・オア・ナッシングではなく、小さく始めて実ユーザーと検証し、時間とともに能力を育てる 反復的アプローチにある
まだコメントはありません。