過去一年間、私たちはさまざまな業界で大規模言語モデル(LLM)エージェントを構築する数十のチームと協力してきました。一貫して、最も成功した実装は、複雑なフレームワークや専門的なライブラリを使用していませんでした。代わりに、シンプルで構成可能なパターンを用いて構築していました。
過去一年中、私たちは数十のチームと協力し、さまざまな業界で大規模言語モデル(LLM)エージェントを構築してきました。一致して、最も成功した実装は複雑なフレームワークや専門ライブラリを使用していませんでした。代わりに、シンプルで組み合わせ可能なパターンを用いて構築していました。
この記事では、顧客との協力や自らエージェントを構築する中で学んだことを共有し、効果的なエージェントを構築するための開発者向けの実用的なアドバイスを提供します。
この記事では、顧客との協力や自らエージェントを構築する中で学んだことを共有し、開発者に対して効果的なエージェントを構築するための実用的なアドバイスを提供します。
エージェントとは何か?#
「エージェント」はいくつかの方法で定義できます。一部の顧客は、エージェントを、さまざまなツールを使用して複雑なタスクを達成するために、長期間独立して動作する完全自律システムと定義しています。他の顧客は、あらかじめ定義されたワークフローに従うより規範的な実装を説明するためにこの用語を使用します。Anthropic では、これらのすべてのバリエーションをエージェンティックシステムとして分類していますが、ワークフローとエージェントの間に重要なアーキテクチャの違いを引きます:
「エージェント」はいくつかの方法で定義できます。一部の顧客は、エージェントを、さまざまなツールを使用して複雑なタスクを達成するために、長期間独立して動作する完全自律システムと定義しています。他の顧客は、あらかじめ定義されたワークフローに従うより規範的な実装を説明するためにこの用語を使用します。Anthropic では、これらのすべてのバリエーションをエージェンティックシステムとして分類していますが、ワークフローとエージェントの間に重要なアーキテクチャの違いを引きます:
- ワークフローは、LLM とツールがあらかじめ定義されたコードパスを通じて編成されるシステムです。
ワークフローは、LLM とツールがあらかじめ定義されたコードパスを通じて編成されるシステムです。 - エージェントは、LLM が自らのプロセスとツールの使用を動的に指示し、タスクを達成する方法を制御するシステムです。
エージェントは、LLM が自らのプロセスとツールの使用を動的に指示し、タスクを達成する方法を制御するシステムです。
以下では、両方のタイプのエージェンティックシステムを詳細に探ります。付録 1(「実践におけるエージェント」)では、顧客がこれらの種類のシステムを使用することで特に価値を見出した 2 つのドメインを説明します。
以下では、両方のタイプのエージェンティックシステムを詳細に探ります。付録 1(「実践におけるエージェント」)では、顧客がこれらの種類のシステムを使用することで特に価値を見出した 2 つのドメインを説明します。
エージェントを使用するタイミング(および使用しないタイミング)#
LLM を使用してアプリケーションを構築する際には、可能な限りシンプルな解決策を見つけ、必要に応じてのみ複雑さを増すことをお勧めします。これは、エージェンティックシステムをまったく構築しないことを意味するかもしれません。エージェンティックシステムは、しばしばレイテンシとコストをトレードオフしてタスクパフォーマンスを向上させるため、このトレードオフが意味を持つタイミングを考慮する必要があります。
LLM を使用してアプリケーションを構築する際には、可能な限りシンプルな解決策を見つけ、必要に応じてのみ複雑さを増すことをお勧めします。これは、エージェンティックシステムをまったく構築しないことを意味するかもしれません。エージェンティックシステムは、しばしばレイテンシとコストをトレードオフしてタスクパフォーマンスを向上させるため、このトレードオフが意味を持つタイミングを考慮する必要があります。
より高い複雑さが必要な場合、ワークフローは明確に定義されたタスクに対して予測可能性と一貫性を提供しますが、柔軟性とモデル駆動の意思決定が大規模に必要な場合にはエージェントがより良い選択肢です。しかし、多くのアプリケーションにおいては、リトリーバルとコンテキスト内の例を使用して単一の LLM 呼び出しを最適化するだけで通常は十分です。
より高い複雑さが必要な場合、ワークフローは明確に定義されたタスクに対して予測可能性と一貫性を提供しますが、柔軟性とモデル駆動の意思決定が大規模に必要な場合にはエージェントがより良い選択肢です。しかし、多くのアプリケーションにおいては、リトリーバルとコンテキスト内の例を使用して単一の LLM 呼び出しを最適化するだけで通常は十分です。
フレームワークを使用するタイミングと方法#
エージェンティックシステムを実装しやすくするための多くのフレームワークがあります。
エージェンティックシステムを実装しやすくするための多くのフレームワークがあります。
- LangGraph from LangChain;
LangChain からの LangGraph; - Amazon Bedrock's AI Agent framework;
Amazon Bedrock の AI エージェントフレームワーク; - Rivet、ドラッグアンドドロップの GUI LLM ワークフロービルダー;および
Rivet、ドラッグアンドドロップの GUI LLM ワークフロービルダー;および - Vellum、複雑なワークフローを構築およびテストするための別の GUI ツール。
Vellum、複雑なワークフローを構築およびテストするための別の GUI ツール。
これらのフレームワークは、LLM の呼び出し、ツールの定義と解析、呼び出しのチェーンを簡素化することによって、簡単に始められるようにします。しかし、これらはしばしば追加の抽象層を作成し、基盤となるプロンプトと応答を隠すことがあり、デバッグが難しくなることがあります。また、よりシンプルな設定で十分な場合に複雑さを追加する誘惑を引き起こすこともあります。
これらのフレームワークは、LLM の呼び出し、ツールの定義と解析、呼び出しのチェーンを簡素化することによって、簡単に始められるようにします。しかし、これらはしばしば追加の抽象層を作成し、基盤となるプロンプトと応答を隠すことがあり、デバッグが難しくなることがあります。また、よりシンプルな設定で十分な場合に複雑さを追加する誘惑を引き起こすこともあります。
私たちは、開発者が LLM API を直接使用することから始めることを提案します:多くのパターンは数行のコードで実装できます。フレームワークを使用する場合は、基盤となるコードを理解していることを確認してください。内部のメカニズムに関する誤った仮定は、顧客のエラーの一般的な原因です。
私たちは、開発者が LLM API を直接使用することから始めることを提案します:多くのパターンは数行のコードで実装できます。フレームワークを使用する場合は、基盤となるコードを理解していることを確認してください。内部のメカニズムに関する誤った仮定は、顧客のエラーの一般的な原因です。
私たちのクックブックを見て、いくつかのサンプル実装を確認してください。
私たちのクックブックを見て、いくつかのサンプル実装を確認してください。
構築ブロック、ワークフロー、およびエージェント#
このセクションでは、私たちが生産環境で見たエージェンティックシステムの一般的なパターンを探ります。私たちは、基盤となる構築ブロックである拡張 LLM から始め、シンプルな構成ワークフローから自律エージェントへと徐々に複雑さを増していきます。
このセクションでは、私たちが生産環境で見たエージェンティックシステムの一般的なパターンを探ります。私たちは、基盤となる構築ブロックである拡張 LLM から始め、シンプルな構成ワークフローから自律エージェントへと徐々に複雑さを増していきます。
構築ブロック:拡張 LLM#
構築ブロック:拡張 LLM
エージェンティックシステムの基本的な構築ブロックは、リトリーバル、ツール、メモリなどの拡張機能で強化された LLM です。私たちの現在のモデルは、これらの機能を積極的に使用でき、独自の検索クエリを生成し、適切なツールを選択し、保持する情報を決定します。
エージェンティックシステムの基本的な構築ブロックは、リトリーバル、ツール、メモリなどの拡張機能で強化された LLM です。私たちの現在のモデルは、これらの機能を積極的に使用でき、独自の検索クエリを生成し、適切なツールを選択し、保持する情報を決定します。
拡張 LLM
拡張 LLM
私たちは、実装の 2 つの重要な側面に焦点を当てることをお勧めします:これらの機能を特定の使用ケースに合わせて調整し、LLM に対して使いやすく、文書化されたインターフェースを提供することです。これらの拡張機能を実装する方法は多くありますが、一つのアプローチは、最近リリースされたモデルコンテキストプロトコルを通じて、開発者がシンプルなクライアント実装を使用して、成長するサードパーティツールのエコシステムと統合できるようにすることです。
私たちは、実装の 2 つの重要な側面に焦点を当てることをお勧めします:これらの機能を特定の使用ケースに合わせて調整し、LLM に対して使いやすく、文書化されたインターフェースを提供することです。これらの拡張機能を実装する方法は多くありますが、一つのアプローチは、最近リリースされたモデルコンテキストプロトコルを通じて、開発者がシンプルなクライアント実装を使用して、成長するサードパーティツールのエコシステムと統合できるようにすることです。
この記事の残りの部分では、各 LLM 呼び出しがこれらの拡張機能にアクセスできると仮定します。
この記事の残りの部分では、各 LLM 呼び出しがこれらの拡張機能にアクセスできると仮定します。
ワークフロー:プロンプトチェイニング#
ワークフロー:プロンプトチェイニング
プロンプトチェイニングは、タスクを一連のステップに分解し、各 LLM 呼び出しが前の出力を処理します。プロセスが正しい軌道にあることを確認するために、任意の中間ステップにプログラム的なチェック(下の図の「ゲート」を参照)を追加できます。
プロンプトチェイニングは、タスクを一連のステップに分解し、各 LLM 呼び出しが前の出力を処理します。プロセスが正しい軌道にあることを確認するために、任意の中間ステップにプログラム的なチェック(下の図の「ゲート」を参照)を追加できます。
プロンプトチェイニングワークフロー
プロンプトチェイニングワークフロー
このワークフローを使用するタイミング: このワークフローは、タスクが簡単かつ明確に固定されたサブタスクに分解できる場合に最適です。主な目標は、各 LLM 呼び出しをより簡単なタスクにすることで、レイテンシを犠牲にしてより高い精度を得ることです。
このワークフローを使用するタイミング: このワークフローは、タスクが簡単かつ明確に固定されたサブタスクに分解できる場合に最適です。主な目標は、各 LLM 呼び出しをより簡単なタスクにすることで、レイテンシを犠牲にしてより高い精度を得ることです。
プロンプトチェイニングが有用な例:
プロンプトチェイニングが有用な例:
- マーケティングコピーを生成し、それを別の言語に翻訳する。
マーケティングコピーを生成し、それを別の言語に翻訳する。 - 文書のアウトラインを作成し、そのアウトラインが特定の基準を満たしていることを確認し、その後アウトラインに基づいて文書を書く。
文書のアウトラインを作成し、そのアウトラインが特定の基準を満たしていることを確認し、その後アウトラインに基づいて文書を書く。
ワークフロー:ルーティング#
ワークフロー:ルーティング
ルーティングは、入力を分類し、専門的なフォローアップタスクに導きます。このワークフローは、関心の分離を可能にし、より専門的なプロンプトを構築します。このワークフローがなければ、ある種の入力に最適化することが他の入力のパフォーマンスに悪影響を与える可能性があります。
ルーティングは、入力を分類し、専門的なフォローアップタスクに導きます。このワークフローは、関心の分離を可能にし、より専門的なプロンプトを構築します。このワークフローがなければ、ある種の入力に最適化することが他の入力のパフォーマンスに悪影響を与える可能性があります。
ルーティングワークフロー
ルーティングワークフロー
このワークフローを使用するタイミング: ルーティングは、明確なカテゴリがあり、それぞれを別々に処理する方が良い複雑なタスクに適しています。また、分類が LLM またはより伝統的な分類モデル / アルゴリズムによって正確に処理できる場合にも適しています。
このワークフローを使用するタイミング: ルーティングは、明確なカテゴリがあり、それぞれを別々に処理する方が良い複雑なタスクに適しています。また、分類が LLM またはより伝統的な分類モデル / アルゴリズムによって正確に処理できる場合にも適しています。
ルーティングが有用な例:
ルーティングが有用な例:
- 異なるタイプのカスタマーサービスの問い合わせ(一般的な質問、返金リクエスト、技術サポート)を異なる下流プロセス、プロンプト、およびツールに導く。
異なるタイプのカスタマーサービスの問い合わせ(一般的な質問、返金リクエスト、技術サポート)を異なる下流プロセス、プロンプト、およびツールに導く。 - 簡単 / 一般的な質問を Claude 3.5 Haiku のような小さなモデルにルーティングし、難しい / 異常な質問を Claude 3.5 Sonnet のようなより能力のあるモデルにルーティングしてコストと速度を最適化する。
簡単 / 一般的な質問を Claude 3.5 Haiku のような小さなモデルにルーティングし、難しい / 異常な質問を Claude 3.5 Sonnet のようなより能力のあるモデルにルーティングしてコストと速度を最適化する。
ワークフロー:並列化#
ワークフロー:並列化
LLM は時々、タスクに対して同時に作業し、その出力をプログラム的に集約することができます。このワークフロー、並列化は、2 つの主要なバリエーションで現れます:
LLM は時々、タスクに対して同時に作業し、その出力をプログラム的に集約することができます。このワークフロー、並列化は、2 つの主要なバリエーションで現れます:
- セクショニング:タスクを独立したサブタスクに分けて並行して実行します。
セクショニング:タスクを独立したサブタスクに分けて並行して実行します。 - 投票:同じタスクを複数回実行して多様な出力を得ます。
投票:同じタスクを複数回実行して多様な出力を得ます。
並列化ワークフロー
並列化ワークフロー
このワークフローを使用するタイミング: 並列化は、分割されたサブタスクがスピードのために並列化できる場合、またはより高い信頼性のある結果を得るために複数の視点や試みが必要な場合に効果的です。複数の考慮事項を持つ複雑なタスクの場合、LLM は通常、各考慮事項が別々の LLM 呼び出しによって処理されるときにより良いパフォーマンスを発揮し、各特定の側面に集中して注意を向けることができます。
このワークフローを使用するタイミング: 並列化は、分割されたサブタスクがスピードのために並列化できる場合、またはより高い信頼性のある結果を得るために複数の視点や試みが必要な場合に効果的です。複数の考慮事項を持つ複雑なタスクの場合、LLM は通常、各考慮事項が別々の LLM 呼び出しによって処理されるときにより良いパフォーマンスを発揮し、各特定の側面に集中して注意を向けることができます。
並列化が有用な例:
並列化が有用な例:
- セクショニング:
- 一つのモデルインスタンスがユーザーのクエリを処理し、別のモデルが不適切なコンテンツやリクエストをスクリーニングするガードレールを実装します。これは、同じ LLM 呼び出しがガードレールとコアレスポンスの両方を処理するよりもパフォーマンスが向上する傾向があります。
一つのモデルインスタンスがユーザーのクエリを処理し、別のモデルが不適切なコンテンツやリクエストをスクリーニングするガードレールを実装します。これは、同じ LLM 呼び出しがガードレールとコアレスポンスの両方を処理するよりもパフォーマンスが向上する傾向があります。 - 特定のプロンプトに対するモデルのパフォーマンスの異なる側面を評価するために、各 LLM 呼び出しが異なる側面を評価する自動化された評価を実施します。
特定のプロンプトに対するモデルのパフォーマンスの異なる側面を評価するために、各 LLM 呼び出しが異なる側面を評価する自動化された評価を実施します。
- 一つのモデルインスタンスがユーザーのクエリを処理し、別のモデルが不適切なコンテンツやリクエストをスクリーニングするガードレールを実装します。これは、同じ LLM 呼び出しがガードレールとコアレスポンスの両方を処理するよりもパフォーマンスが向上する傾向があります。
- 投票:
- 脆弱性のあるコードをレビューする場合、いくつかの異なるプロンプトがコードをレビューし、問題が見つかった場合にフラグを立てます。
脆弱性のあるコードをレビューする場合、いくつかの異なるプロンプトがコードをレビューし、問題が見つかった場合にフラグを立てます。 - 与えられたコンテンツが不適切かどうかを評価する場合、複数のプロンプトが異なる側面を評価したり、誤報と漏報のバランスを取るために異なる投票閾値を要求したりします。
与えられたコンテンツが不適切かどうかを評価する場合、複数のプロンプトが異なる側面を評価したり、誤報と漏報のバランスを取るために異なる投票閾値を要求したりします。
- 脆弱性のあるコードをレビューする場合、いくつかの異なるプロンプトがコードをレビューし、問題が見つかった場合にフラグを立てます。
ワークフロー:オーケストレーター - ワーカー#
ワークフロー:オーケストレーター - ワーカー
オーケストレーター - ワーカーのワークフローでは、中央の LLM がタスクを動的に分解し、それをワーカー LLM に委任し、結果を統合します。
オーケストレーター - ワーカーのワークフローでは、中央の LLM がタスクを動的に分解し、それをワーカー LLM に委任し、結果を統合します。
オーケストレーター - ワーカーのワークフロー
オーケストレーター - ワーカーのワークフロー
このワークフローを使用するタイミング: このワークフローは、必要なサブタスクを予測できない複雑なタスクに適しています(例えば、コーディングの場合、変更が必要なファイルの数や各ファイルの変更の性質はタスクによって異なる可能性があります)。地形的には似ていますが、並列化との重要な違いはその柔軟性です。サブタスクは事前に定義されず、特定の入力に基づいてオーケストレーターによって決定されます。
このワークフローを使用するタイミング: このワークフローは、必要なサブタスクを予測できない複雑なタスクに適しています(例えば、コーディングの場合、変更が必要なファイルの数や各ファイルの変更の性質はタスクによって異なる可能性があります)。地形的には似ていますが、並列化との重要な違いはその柔軟性です。サブタスクは事前に定義されず、特定の入力に基づいてオーケストレーターによって決定されます。
オーケストレーター - ワーカーが有用な例:
オーケストレーター - ワーカーが有用な例:
- 複雑な変更を毎回複数のファイルに対して行うコーディング製品。
複雑な変更を毎回複数のファイルに対して行うコーディング製品。 - 複数の情報源から関連情報を収集して分析する検索タスク。
複数の情報源から関連情報を収集して分析する検索タスク。
ワークフロー:評価者 - 最適化者#
ワークフロー:評価者 - 最適化者
評価者 - 最適化者のワークフローでは、1 つの LLM 呼び出しが応答を生成し、別の LLM がループ内で評価とフィードバックを提供します。
評価者 - 最適化者のワークフローでは、1 つの LLM 呼び出しが応答を生成し、別の LLM がループ内で評価とフィードバックを提供します。
評価者 - 最適化者のワークフロー
評価者 - 最適化者のワークフロー
このワークフローを使用するタイミング: このワークフローは、明確な評価基準があり、反復的な改善が測定可能な価値を提供する場合に特に効果的です。適合の良い 2 つのサインは、まず、LLM の応答が人間のフィードバックを明示的に表現することで実証的に改善されること、次に、LLM がそのようなフィードバックを提供できることです。これは、人間の作家が洗練された文書を作成する際に経る反復的な執筆プロセスに類似しています。
このワークフローを使用するタイミング: このワークフローは、明確な評価基準があり、反復的な改善が測定可能な価値を提供する場合に特に効果的です。適合の良い 2 つのサインは、まず、LLM の応答が人間のフィードバックを明示的に表現することで実証的に改善されること、次に、LLM がそのようなフィードバックを提供できることです。これは、人間の作家が洗練された文書を作成する際に経る反復的な執筆プロセスに類似しています。
評価者 - 最適化者が有用な例:
評価者 - 最適化者が有用な例:
- 翻訳者 LLM が最初に捉えられない微妙なニュアンスを持つ文学翻訳で、評価者 LLM が有用な批評を提供できる場合。
翻訳者 LLM が最初に捉えられない微妙なニュアンスを持つ文学翻訳で、評価者 LLM が有用な批評を提供できる場合。 - 包括的な情報を収集するために複数回の検索と分析が必要な複雑な検索タスクで、評価者がさらなる検索が必要かどうかを判断します。
包括的な情報を収集するために複数回の検索と分析が必要な複雑な検索タスクで、評価者がさらなる検索が必要かどうかを判断します。
エージェント#
エージェント
エージェントは、LLM が重要な能力を成熟させるにつれて、製品で登場しています — 複雑な入力を理解し、推論や計画に関与し、ツールを信頼性高く使用し、エラーから回復すること。エージェントは、人間のユーザーからのコマンドまたはインタラクティブな議論から作業を開始します。タスクが明確になったら、エージェントは独立して計画し、操作し、必要に応じて人間にさらなる情報や判断を求めることがあります。実行中、エージェントが各ステップで環境から「真実の情報」を得ること(ツール呼び出しの結果やコード実行など)が進捗を評価するために重要です。エージェントは、チェックポイントや障害に遭遇した際に人間のフィードバックを得るために一時停止することができます。タスクは通常、完了時に終了しますが、制御を維持するために停止条件(最大反復回数など)を含めることも一般的です。
エージェントは、LLM が重要な能力を成熟させるにつれて、製品で登場しています — 複雑な入力を理解し、推論や計画に関与し、ツールを信頼性高く使用し、エラーから回復すること。エージェントは、人間のユーザーからのコマンドまたはインタラクティブな議論から作業を開始します。タスクが明確になったら、エージェントは独立して計画し、操作し、必要に応じて人間にさらなる情報や判断を求めることがあります。実行中、エージェントが各ステップで環境から「真実の情報」を得ること(ツール呼び出しの結果やコード実行など)が進捗を評価するために重要です。エージェントは、チェックポイントや障害に遭遇した際に人間のフィードバックを得るために一時停止することができます。タスクは通常、完了時に終了しますが、制御を維持するために停止条件(最大反復回数など)を含めることも一般的です。
エージェントは高度なタスクを処理できますが、その実装はしばしば簡単です。通常、環境からのフィードバックに基づいてツールを使用する LLM です。したがって、ツールセットとその文書を明確かつ慎重に設計することが重要です。ツール開発のベストプラクティスについては、付録 2(「ツールのプロンプトエンジニアリング」)で詳しく説明します。
エージェントは高度なタスクを処理できますが、その実装はしばしば簡単です。通常、環境からのフィードバックに基づいてツールを使用する LLM です。したがって、ツールセットとその文書を明確かつ慎重に設計することが重要です。ツール開発のベストプラクティスについては、付録 2(「ツールのプロンプトエンジニアリング」)で詳しく説明します。
自律エージェント
自律エージェント
エージェントを使用するタイミング: エージェントは、必要なステップ数を予測することが難しいまたは不可能なオープンエンドの問題に使用できます。LLM は多くのターンで動作する可能性があり、その意思決定に対してある程度の信頼を持つ必要があります。エージェントの自律性は、信頼できる環境でタスクをスケールするのに理想的です。
エージェントを使用するタイミング: エージェントは、必要なステップ数を予測することが難しいまたは不可能なオープンエンドの問題に使用できます。LLM は多くのターンで動作する可能性があり、その意思決定に対してある程度の信頼を持つ必要があります。エージェントの自律性は、信頼できる環境でタスクをスケールするのに理想的です。
エージェントの自律的な性質は、コストが高く、エラーが累積する可能性を意味します。私たちは、サンドボックス環境での広範なテストと適切なガードレールを推奨します。
エージェントの自律的な性質は、コストが高く、エラーが累積する可能性を意味します。私たちは、サンドボックス環境での広範なテストと適切なガードレールを推奨します。
エージェントが有用な例:
エージェントが有用な例:
以下の例は、私たち自身の実装からのものです:
以下の例は、私たち自身の実装からのものです:
- SWE-bench タスクを解決するコーディングエージェント。これには、タスクの説明に基づいて多くのファイルに対する編集が含まれます。
SWE-bench タスクを解決するコーディングエージェント。これには、タスクの説明に基づいて多くのファイルに対する編集が含まれます。 - Claude がコンピュータを使用してタスクを達成する私たちの「コンピュータ使用」参照実装。
Claude がコンピュータを使用してタスクを達成する私たちの「コンピュータ使用」参照実装。
コーディングエージェントの高レベルフロー
コーディングエージェントの高レベルフロー
これらのパターンを組み合わせてカスタマイズする#
これらの構築ブロックは、規範的ではありません。これらは、開発者がさまざまな使用ケースに合わせて形成し、組み合わせることができる一般的なパターンです。成功の鍵は、他の LLM 機能と同様に、パフォーマンスを測定し、実装を反復することです。繰り返しますが、明らかに結果を改善する場合にのみ、複雑さを追加することを検討すべきです。
これらの構築ブロックは、規範的ではありません。これらは、開発者がさまざまな使用ケースに合わせて形成し、組み合わせることができる一般的なパターンです。成功の鍵は、他の LLM 機能と同様に、パフォーマンスを測定し、実装を反復することです。繰り返しますが、明らかに結果を改善する場合にのみ、複雑さを追加することを検討すべきです。
要約#
LLM 分野での成功は、最も洗練されたシステムを構築することではありません。自分のニーズに合った正しいシステムを構築することです。シンプルなプロンプトから始め、包括的な評価で最適化し、よりシンプルな解決策が不十分な場合にのみ多段階のエージェンティックシステムを追加します。
LLM 分野での成功は、最も洗練されたシステムを構築することではありません。自分のニーズに合った正しいシステムを構築することです。シンプルなプロンプトから始め、包括的な評価で最適化し、よりシンプルな解決策が不十分な場合にのみ多段階のエージェンティックシステムを追加します。
エージェントを実装する際には、3 つのコア原則に従うよう努めています:
エージェントを実装する際には、3 つのコア原則に従うよう努めています:
- エージェントの設計においてシンプルさを維持する。
エージェントの設計においてシンプルさを維持する。 - エージェントの計画ステップを明示的に示すことで透明性を優先する。
エージェントの計画ステップを明示的に示すことで透明性を優先する。 - 徹底したツールの文書化とテストを通じて、エージェント - コンピュータインターフェース(ACI)を慎重に設計する。
徹底したツールの文書化とテストを通じて、エージェント - コンピュータインターフェース(ACI)を慎重に設計する。
フレームワークは迅速に始めるのに役立ちますが、プロダクションに移行する際には抽象層を減らし、基本コンポーネントで構築することをためらわないでください。これらの原則に従うことで、強力でありながら信頼性が高く、メンテナンス可能で、ユーザーに信頼されるエージェントを作成できます。
フレームワークは迅速に始めるのに役立ちますが、プロダクションに移行する際には抽象層を減らし、基本コンポーネントで構築することをためらわないでください。これらの原則に従うことで、強力でありながら信頼性が高く、メンテナンス可能で、ユーザーに信頼されるエージェントを作成できます。
謝辞#
Erik Schluntz と Barry Zhang によって書かれました。この作品は、Anthropic でエージェントを構築する経験と、顧客から共有された貴重な洞察に基づいています。心より感謝申し上げます。
Erik Schluntz と Barry Zhang によって書かれました。この作品は、Anthropic でエージェントを構築する経験と、顧客から共有された貴重な洞察に基づいています。心より感謝申し上げます。
付録 1:実践におけるエージェント#
顧客との作業を通じて、上記のパターンの実用的な価値を示す AI エージェントの特に有望な 2 つのアプリケーションが明らかになりました。両方のアプリケーションは、エージェントが対話と行動の両方を必要とし、明確な成功基準を持ち、フィードバックループを可能にし、有意義な人間の監視を統合するタスクに最も価値を追加する方法を示しています。
顧客との作業を通じて、上記のパターンの実用的な価値を示す AI エージェントの特に有望な 2 つのアプリケーションが明らかになりました。両方のアプリケーションは、エージェントが対話と行動の両方を必要とし、明確な成功基準を持ち、フィードバックループを可能にし、有意義な人間の監視を統合するタスクに最も価値を追加する方法を示しています。
A. カスタマーサポート#
カスタマーサポートは、ツール統合を通じて強化された機能を持つ親しみやすいチャットボットインターフェースを組み合わせています。これは、よりオープンエンドのエージェントにとって自然なフィットです。
カスタマーサポートは、ツール統合を通じて強化された機能を持つ親しみやすいチャットボットインターフェースを組み合わせています。これは、よりオープンエンドのエージェントにとって自然なフィットです。
- サポートインタラクションは自然に会話の流れに従い、外部情報やアクションへのアクセスを必要とします。
サポートインタラクションは自然に会話の流れに従い、外部情報やアクションへのアクセスを必要とします。 - ツールは、顧客データ、注文履歴、ナレッジベースの記事を引き出すために統合できます。
ツールは、顧客データ、注文履歴、ナレッジベースの記事を引き出すために統合できます。 - 返金の発行やチケットの更新などのアクションはプログラム的に処理できます。
返金の発行やチケットの更新などのアクションはプログラム的に処理できます。 - 成功はユーザー定義の解決策を通じて明確に測定できます。
成功はユーザー定義の解決策を通じて明確に測定できます。
いくつかの企業は、成功した解決策に対してのみ料金を請求する使用ベースの価格モデルを通じて、このアプローチの実行可能性を示しています。
いくつかの企業は、成功した解決策に対してのみ料金を請求する使用ベースの価格モデルを通じて、このアプローチの実行可能性を示しています。
B. コーディングエージェント#
ソフトウェア開発分野は、コード補完から自律的な問題解決に進化する能力を持つ LLM 機能の驚くべき可能性を示しています。エージェントは特に効果的です。
ソフトウェア開発分野は、コード補完から自律的な問題解決に進化する能力を持つ LLM 機能の驚くべき可能性を示しています。エージェントは特に効果的です。
- コードソリューションは自動化されたテストを通じて検証可能です。
コードソリューションは自動化されたテストを通じて検証可能です。 - エージェントはテスト結果をフィードバックとして使用してソリューションを反復できます。
エージェントはテスト結果をフィードバックとして使用してソリューションを反復できます。 - 問題空間は明確に定義され、構造化されています。
問題空間は明確に定義され、構造化されています。 - 出力の質は客観的に測定できます。
出力の質は客観的に測定できます。
私たちの実装では、エージェントは現在、プルリクエストの説明に基づいてSWE-bench Verifiedベンチマーク内の実際の GitHub の問題を解決できます。しかし、自動化されたテストが機能を検証するのに役立つ一方で、広範なシステム要件に沿った解決策を確保するためには人間のレビューが依然として重要です。
私たちの実装では、エージェントは現在、プルリクエストの説明に基づいてSWE-bench Verifiedベンチマーク内の実際の GitHub の問題を解決できます。しかし、自動化されたテストが機能を検証するのに役立つ一方で、広範なシステム要件に沿った解決策を確保するためには人間のレビューが依然として重要です。
付録 2:ツールのプロンプトエンジニアリング#
どのエージェンティックシステムを構築している場合でも、ツールはおそらくエージェントの重要な部分となるでしょう。ツールは、Claude が外部サービスや API とインタラクションすることを可能にし、API 内でその正確な構造と定義を指定します。Claude が応答する際、ツールを呼び出す予定がある場合、API 応答にツール使用ブロックが含まれます。ツールの定義と仕様は、全体のプロンプトと同じくらいプロンプトエンジニアリングの注意を払うべきです。この簡単な付録では、ツールのプロンプトエンジニアリングの方法を説明します。
どのエージェンティックシステムを構築している場合でも、ツールはおそらくエージェントの重要な部分となるでしょう。ツールは、Claude が外部サービスや API とインタラクションすることを可能にし、API 内でその正確な構造と定義を指定します。Claude が応答する際、ツールを呼び出す予定がある場合、API 応答にツール使用ブロックが含まれます。ツールの定義と仕様は、全体のプロンプトと同じくらいプロンプトエンジニアリングの注意を払うべきです。この簡単な付録では、ツールのプロンプトエンジニアリングの方法を説明します。
同じアクションを指定する方法は通常いくつかあります。たとえば、差分を記述することによってファイル編集を指定することも、ファイル全体を再記述することもできます。構造化された出力の場合、コードをマークダウン内または JSON 内で返すことができます。ソフトウェア工学において、これらの違いは表面的なものであり、一方から他方へとロスレスで変換できます。しかし、ある形式は他の形式よりも LLM が書くのがはるかに難しい場合があります。差分を書くには、新しいコードが書かれる前にチャンクヘッダーで変更される行数を知っている必要があります。JSON 内でコードを書くこと(マークダウンと比較して)は、改行や引用符のエスケープを追加で必要とします。
同じアクションを指定する方法は通常いくつかあります。たとえば、差分を記述することによってファイル編集を指定することも、ファイル全体を再記述することもできます。構造化された出力の場合、コードをマークダウン内または JSON 内で返すことができます。ソフトウェア工学において、これらの違いは表面的なものであり、一方から他方へとロスレスで変換できます。しかし、ある形式は他の形式よりも LLM が書くのがはるかに難しい場合があります。差分を書くには、新しいコードが書かれる前にチャンクヘッダーで変更される行数を知っている必要があります。JSON 内でコードを書くこと(マークダウンと比較して)は、改行や引用符のエスケープを追加で必要とします。
ツール形式を決定するための提案は次のとおりです:
ツール形式を決定するための提案は次のとおりです:
- モデルが「考える」ための十分なトークンを与え、行き詰まらないようにします。
モデルが「考える」ための十分なトークンを与え、行き詰まらないようにします。 - フォーマットを、モデルがインターネット上のテキストで自然に見たものに近づけます。
フォーマットを、モデルがインターネット上のテキストで自然に見たものに近づけます。 - 数千行のコードを正確にカウントしたり、書いたコードのエスケープを行ったりする必要がないように、フォーマットに「オーバーヘッド」がないことを確認します。
数千行のコードを正確にカウントしたり、書いたコードのエスケープを行ったりする必要がないように、フォーマットに「オーバーヘッド」がないことを確認します。
経験則の一つは、人間 - コンピュータインターフェース(HCI)にどれだけの努力がかかるかを考え、良いエージェント - コンピュータインターフェース(ACI)を作成するために同じくらいの努力を投資することを計画することです。以下はその方法に関するいくつかの考えです:
経験則の一つは、人間 - コンピュータインターフェース(HCI)にどれだけの努力がかかるかを考え、良いエージェント - コンピュータインターフェース(ACI)を作成するために同じくらいの努力を投資することを計画することです。以下はその方法に関するいくつかの考えです:
- モデルの立場になって考えてみてください。説明やパラメータに基づいて、このツールの使い方は明らかですか、それとも慎重に考える必要がありますか?もしそうなら、それはモデルにとっても同じことが言えます。良いツール定義には、使用例、エッジケース、入力フォーマットの要件、他のツールとの明確な境界が含まれることが多いです。
モデルの立場になって考えてみてください。説明やパラメータに基づいて、このツールの使い方は明らかですか、それとも慎重に考える必要がありますか?もしそうなら、それはモデルにとっても同じことが言えます。良いツール定義には、使用例、エッジケース、入力フォーマットの要件、他のツールとの明確な境界が含まれることが多いです。 - パラメータ名や説明をどのように変更すれば、より明確にできますか?これは、チームのジュニア開発者のために素晴らしいドキュメント文字列を書くことと考えてください。これは、非常に似たツールを多く使用する場合に特に重要です。
パラメータ名や説明をどのように変更すれば、より明確にできますか?これは、チームのジュニア開発者のために素晴らしいドキュメント文字列を書くことと考えてください。これは、非常に似たツールを多く使用する場合に特に重要です。 - モデルがツールをどのように使用するかをテストします:私たちのワークベンチで多くの例の入力を実行して、モデルがどのような間違いを犯すかを確認し、反復します。
モデルがツールをどのように使用するかをテストします:私たちのワークベンチで多くの例の入力を実行して、モデルがどのような間違いを犯すかを確認し、反復します。 - ツールをポカヨケします。引数を変更して、間違いを犯しにくくします。
ツールをポカヨケします。引数を変更して、間違いを犯しにくくします。
私たちがSWE-benchのためにエージェントを構築する際、実際には全体のプロンプトよりもツールの最適化に多くの時間を費やしました。たとえば、エージェントがルートディレクトリから移動した後、モデルが相対ファイルパスを使用するツールで間違いを犯すことがわかりました。これを修正するために、ツールを常に絶対ファイルパスを要求するように変更しました — そして、モデルはこの方法を完璧に使用しました。
私たちがSWE-benchのためにエージェントを構築する際、実際には全体のプロンプトよりもツールの最適化に多くの時間を費やしました。たとえば、エージェントがルートディレクトリから移動した後、モデルが相対ファイルパスを使用するツールで間違いを犯すことがわかりました。これを修正するために、ツールを常に絶対ファイルパスを要求するように変更しました — そして、モデルはこの方法を完璧に使用しました。
原文リンク:https://www.anthropic.com/research/building-effective-agents