こんにちは、スクーティー代表のかけやと申します。
弊社は生成AIを強みとするベトナムオフショア開発・ラボ型開発や、生成AIコンサルティングなどのサービスを提供しており、最近はありがたいことに生成AIと連携したシステム開発のご依頼を数多く頂いています。
AIエージェント って聞いたことあるけど、実際どうやって作るの? どんな時に役立つの? と思っていませんか? 大丈夫、この記事を読めば、あなたもAIエージェントの基本から応用までバッチリ理解できます!
AIエージェントは、まるで優秀なアシスタントのように、あなたの代わりに様々なタスクをこなしてくれる頼もしい存在。例えば、スマホの音声アシスタントに話しかけて天気を調べたり、音楽を再生したりするのも、実はAIエージェントの働きです。もっと身近なところでは、ECサイトでおすすめ商品が表示されるのも、AIエージェントがあなたの好みを学習して、ピッタリの商品を選んでくれているからなんです。
この記事では、そんなAIエージェントの設計方法を徹底解説します。類似の技術との違いや、具体的な作り方のステップ、さらには、どんな場面で活躍するのかまで、幅広くご紹介します。さあ、AIエージェントの世界へ飛び込み、あなたのビジネスや生活をよりスマートに、効率的に変革しましょう!
効果的なAIエージェントとは?基本概念と定義
本記事はAnthropicが公開した以下の記事を要約したものになります。


効果的なAIエージェントとは?
AIエージェントとは、簡単に言うと、自分で考えて行動できるコンピュータープログラムのことです。例えば、あなたが「今日の天気を調べて」とスマートフォンに話しかけると、AIエージェントがインターネットで天気情報を探し、あなたに教えてくれます。これはAIエージェントの簡単な例で、もっと複雑なタスク、例えば、顧客からの問い合わせに自動で対応したり、プログラムのコードを書いたりすることもできます。
さらに具体的な例を挙げると、オンラインショッピングサイトで、あなたの好みに合わせて商品を提案してくれる機能もAIエージェントの一種です。過去の購入履歴や閲覧履歴を分析し、「あなたへのおすすめ」を表示してくれます。また、企業の経理部門では、請求書の処理を自動化するためにAIエージェントが活用されています。AIエージェントは、請求書の内容を読み取り、適切な勘定科目に仕分けし、支払い処理まで自動で行います。さらに、工場では、AIエージェントがロボットを制御し、製品の組み立てや検査を自動化しています。これにより、生産効率が向上し、品質も安定します。
このように、AIエージェントは様々な場面で、人間をサポートし、より効率的で便利な社会を実現しています。 Anthropicの提供するClaudeは、「コンピュータ利用」のデモンストレーションで、人間のようにコンピュータを操作し、ファイル操作、ウェブブラウジング、アプリケーションの利用など、さまざまなタスクを実行できることを示しています。
AIエージェントと似たものに、チャットボットやSiriのような音声アシスタントがありますが、これらはあらかじめ決められたルールに従って動きます。一方、AIエージェントは、自分で状況を判断し、最適な行動を選べる点が大きく異なります。AIエージェントのすごいところは、人間のように柔軟に考え、学習できることです。これにより、様々な分野で、人間を助け、より良い結果を生み出すことが期待されています。
AIエージェントに関してはこちらにわかりやすくまとめています。ぜひご覧ください!


関連記事:最近話題の AIエージェント ってなに? AIエージェント 完全ガイド
エージェントとワークフロー:重要な違いを理解する
AIを活用したシステムには、大きく分けて「ワークフロー」と「エージェント」の2種類があります。これらの違いを理解することは、効果的なシステム構築の第一歩です。
- ワークフロー: あらかじめ決められた手順に従って、LLM(大規模言語モデル)やツールを連携させるシステムです。例えるなら、料理のレシピのようなものです。手順が決まっているので、結果が予測しやすく、安定した動作が期待できます。具体的な例としては、メールの自動分類システムが挙げられます。受信したメールの件名や本文を解析し、あらかじめ設定されたルールに基づいて、「重要」「プロモーション」「迷惑メール」などのフォルダに自動的に振り分けることができます。もう一つの例は、製造業における品質検査システムです。製品の画像を解析し、事前に定義された欠陥のパターンと照合して、不良品を自動的に検出します。
- エージェント: LLM自身が、状況に応じて次に何をするか、どのツールを使うかを判断し、自律的にタスクを遂行するシステムです。人間のように、柔軟な対応ができる点が強みです。具体的な例としては、顧客からの問い合わせに自動で対応するカスタマーサポートエージェントがあります。顧客の質問内容を理解し、FAQデータベースから適切な回答を探したり、必要に応じてオペレーターにエスカレーションしたりします。もう一つの例としては、自動運転車があります。周囲の状況をセンサーで認識し、交通ルールに従いながら、目的地まで安全に走行します。
どちらが良いかは、目的によって異なります。決まった作業を正確に行うならワークフロー、臨機応変な対応が必要ならエージェントが適しています。
効果的なAIエージェント活用の判断:適切なケースとは
AIエージェントは強力なツールですが、すべての状況に適しているわけではありません。導入を検討する際には、以下の点を考慮しましょう。
- 複雑さと柔軟性: タスクが複雑で、柔軟な対応が必要な場合、エージェントは有効です。例えば、顧客からの問い合わせ対応や、複雑な情報収集・分析など、状況に応じて判断が必要なタスクに向いています。
- コストとレイテンシ: エージェントは、より多くの計算資源を必要とし、応答時間も長くなる傾向があります。リアルタイム性が求められるシステムや、コストが重視される場合は、慎重な検討が必要です。
- 予測可能性: 決まった手順で確実にタスクをこなす必要がある場合は、ワークフローの方が適しています。例えば、定型的なデータ入力や、単純な計算処理など、結果が予測できるタスクに向いています。
- 単一LLMの最適化: 単純なタスクであれば、LLM単体の性能を向上させる方が、効率的な場合があります。例えば、テキストの要約や翻訳など、LLMの得意分野であれば、エージェントを構築するよりも、プロンプトエンジニアリングなどで対応する方が、開発コストを抑えられます。
エージェントは、コストやレイテンシを犠牲にしてでも、タスクのパフォーマンスを向上させたい場合に有効な選択肢となります。
効果的なAIエージェント構築:フレームワークと基本要素
効果的なAIエージェント構築のフレームワーク:選択と注意点
AIエージェント開発を支援するフレームワークは数多く存在します。以下に代表的なものを紹介します。
- LangGraph (LangChain): LangChainが提供する、エージェントの状態管理やループ処理を容易にするフレームワークです。LangGraphは、複雑なエージェントの動作を、グラフ構造で表現できるため、視覚的に理解しやすく、開発効率を高めることができます。特に、複数のステップを踏む必要があるタスクや、状態の遷移が複雑な場合に有効です。
- Amazon BedrockのAI Agentフレームワーク: AWSのサービスで、エージェントの構築、API連携、データソースへの接続を簡単に行えます。Amazon Bedrockを利用すると、AWSの他のサービス(S3、Lambdaなど)との連携が容易になるため、AWSをすでに利用している企業にとっては、特に導入しやすいフレームワークです。
- Rivet: GUIベースでLLMワークフローを構築できるツールです。Rivetは、プログラミングの知識がなくても、ドラッグ&ドロップ操作でエージェントの動作を設計できるため、非エンジニアでもAIエージェントの開発に携わることができます。
- Vellum: GUIで複雑なワークフローを構築、テストできるツールです。Vellumは、Rivetと同様にGUIベースのツールですが、より高度な機能(テスト機能、バージョン管理機能など)を備えているため、より本格的なエージェント開発に適しています。
これらのフレームワークは、開発を効率化する一方で、抽象化のレイヤーが増えることで、デバッグが難しくなる可能性があります。フレームワークを利用する際は、内部の仕組みを理解し、必要に応じてAPIを直接利用することも検討しましょう。
効果的なAIエージェントの構成要素:拡張LLM
効果的なAIエージェントを構築するための基本的な構成要素は、「拡張LLM」です。拡張LLMとは、通常のLLMに、以下の機能を加えたものです。
- 検索: 外部の情報を取得する機能(例:ウェブ検索、データベース検索)。例えば、ユーザーが「最新のニュースを教えて」と尋ねた場合、拡張LLMは、インターネットを検索し、最新のニュース記事を取得して、ユーザーに提供します。具体的な検索機能としては、Google検索、Bing検索、社内データベース検索などがあります。
- ツール: 外部システムと連携する機能(例:メール送信、ファイル操作)。例えば、ユーザーが「明日の会議のスケジュールを設定して」と指示した場合、拡張LLMは、カレンダーツールと連携し、会議のスケジュールを自動的に設定します。具体的なツールとしては、メールクライアント、カレンダー、タスク管理ツールなどがあります。
- メモリ: 過去の情報を保持する機能。例えば、ユーザーとの過去の会話履歴を記憶し、それに基づいて応答を生成します。これにより、より自然で文脈に沿った対話が可能になります。具体的なメモリ機能としては、短期記憶(直近の会話履歴を保持)、長期記憶(ユーザーの好みや過去の行動履歴を保持)などがあります。
近年のLLMは、これらの機能を自律的に活用する能力を備えています。例えば、ユーザーからの質問に対し、自分で検索クエリを生成したり、適切なツールを選択したり、過去の会話を記憶したりできます。
この図は、拡張LLMの構成要素である検索(Retrieval)、ツール(Tools)、メモリ(Memory)と、LLMとの関係性を視覚的に示しています。入力(In)に対し、LLMがこれらの要素とどのように連携し、出力(Out)を生成するのかが一目でわかります。


拡張機能を実装する方法は様々ですが、Anthropicが提唱するModel Context Protocol (MCP)を利用すると、シンプルなクライアント実装で、様々なサードパーティツールと連携できます。MCPは、異なるシステム間の相互運用性を高めることを目的としており、AIエージェントと外部ツールとの連携をよりスムーズにします。
Model Context Protocol (MCP):エージェントとデータを繋ぐ
Anthropicがオープンソースで公開しているMCPは、AIアシスタントをデータソース(コンテンツリポジトリ、ビジネスツール、開発環境など)に接続するための新しい標準規格です。これにより、AIアシスタントはより関連性の高い、優れた応答を生成できるようになります。
MCPは、以下の3つの主要コンポーネントを提供します。
- MCP仕様とSDK
- ClaudeデスクトップアプリでのローカルMCPサーバーサポート
- MCPサーバーのオープンソースリポジトリ
Claude 3.5 Sonnetは、MCPサーバーの実装を迅速に行う能力に長けており、企業や個人が重要なデータセットを様々なAIツールに接続することを容易にします。
MCPについてはこちらの記事に概要を記載しているのでぜひご覧ください!


関連記事:Claude MCPでAIエージェントはさらなる未来へ・・・Anthropic社発表のAIとWebサービス統合標準規格
効果的なAIエージェント設計:ワークフローパターン
プロンプトチェーン:タスク分解で精度向上
プロンプトチェーンは、複雑なタスクを複数のステップに分割し、各ステップでLLMを呼び出すワークフローです。各ステップの出力を次のステップの入力として利用します。
下の図は、プロンプトチェーンのワークフローを示しています。入力(In)から始まり、複数回のLLM呼び出し(LLM Call 1, LLM Call 2, LLM Call 3)と、途中のゲート(Gate)による判定を経て、最終的な出力(Out)に至る流れがわかります。ゲートでは、条件分岐が行われ、Passなら次のLLM呼び出しへ、FailならExit(終了)となります。


活用例:
- マーケティングコピーの作成後、別言語に翻訳する: ある企業が、新製品のキャッチコピーを日本語で作成し、それを英語とフランス語に翻訳したいと考えているとします。プロンプトチェーンを使えば、まずLLMに日本語のキャッチコピーを作成させ(ステップ1)、次に別のLLMにそのキャッチコピーを英語に翻訳させ(ステップ2)、さらに別のLLMにフランス語に翻訳させる(ステップ3)という一連の流れを自動化できます。各ステップで異なるLLMを使うことで、それぞれの言語に特化した、より高品質な翻訳が期待できます。
- ドキュメントの概要を作成し、基準を満たしているか確認後、本文を作成する: ある研究者が、論文の執筆を効率化したいと考えています。プロンプトチェーンを使えば、まずLLMに論文の概要を作成させ(ステップ1)、次に別のLLMにその概要が論文の構成として適切か、必要な要素(研究目的、方法、結果、考察など)が含まれているかを確認させ(ステップ2)、最後に最初のLLMに概要に基づいて本文を執筆させる(ステップ3)という流れを自動化できます。これにより、論文の質を向上させつつ、執筆時間を短縮できます。
このワークフローは、タスクを明確に分解できる場合に有効です。各LLM呼び出しを単純化することで、精度を高めることができます。
ルーティング:入力に応じたタスク振り分け
ルーティングは、入力を分類し、それぞれに適したタスクに振り分けるワークフローです。これにより、タスクごとに特化したプロンプトやツールを用意できます。
下の図は、ルーティングのワークフローを示しています。入力(In)に対し、LLM Call Routerが、入力を分析し、適切なLLM Call(LLM Call 1, LLM Call 2, LLM Call 3)に処理を振り分ける様子がわかります。


活用例:
- 顧客からの問い合わせ内容(質問、返金、技術サポートなど)に応じて、異なる処理、プロンプト、ツールに振り分ける: 例えば、ECサイトの運営者が、顧客からの問い合わせ対応を自動化したいと考えているとします。ルーティングを使えば、顧客からのメールやチャットのメッセージをLLMで解析し、「商品の在庫に関する質問」「返品・交換に関する問い合わせ」「技術的なトラブル」など、問い合わせの種類を自動的に判別できます。そして、判別結果に基づいて、それぞれに最適な対応フロー(FAQの提示、返品手続きの案内、技術サポート担当者への転送など)に自動的に振り分けることができます。これにより、顧客満足度を向上させつつ、オペレーターの負担を軽減できます。
- 簡単な質問はClaude 3.5 Haiku、難しい質問はClaude 3.5 Sonnetに振り分け、コストと速度を最適化する: 例えば、ある企業が、社内向けのAIチャットボットを開発しているとします。ルーティングを使えば、従業員からの質問の難易度をLLMで自動的に判定し、簡単な質問(「今日の会議室の予約状況は?」「Wi-Fiのパスワードは?」など)は、高速かつ低コストなClaude 3.5 Haikuに処理させ、複雑な質問(「プロジェクトXの進捗状況は?」「競合製品AとBの比較分析は?」など)は、より高性能なClaude 3.5 Sonnetに処理させることができます。これにより、チャットボットの応答速度を向上させつつ、コストを最適化できます。
このワークフローは、異なる種類の入力に対し、それぞれ最適な処理を行いたい場合に有効です。
並列化:処理の高速化と多様な出力
並列化は、複数のLLMを同時に動作させ、結果を統合するワークフローです。主に2つのパターンがあります。
- 分割 (Sectioning): タスクを独立したサブタスクに分割し、並列に実行する
- 投票 (Voting): 同じタスクを複数回実行し、多様な出力を得る
下の図は、並列化のワークフローを示しています。入力(In)に対し、複数のLLM(LLM Call 1, LLM Call 2, LLM Call 3)が並列に動作し、それぞれの結果をAggregator(集約器)が統合して、最終的な出力(Out)を生成する様子がわかります。


活用例:
- 分割:
- ガードレール: ユーザーの質問を処理するLLMと、不適切な内容を検閲するLLMを並列に動作させる: 例えば、子供向けのオンライン学習プラットフォームで、AIチューターがユーザーからの質問に答えるシステムを構築するとします。ガードレールとして、質問に回答するLLMと並行して、別のLLMに質問内容をチェックさせ、不適切な表現や有害な情報が含まれていないかを確認します。もし不適切な内容が検出された場合は、回答をブロックしたり、警告メッセージを表示したりするなどの対応を取ることができます。これにより、子供たちが安全にプラットフォームを利用できるようになります。この並列処理により、応答の質を担保しつつ、セキュリティも高められます。
- 自動評価: LLMの性能評価で、異なる側面を別々のLLMに評価させる: LLM開発者が新しいモデルの性能を評価する際に、生成されたテキストの品質、関連性、創造性など、複数の側面を評価する必要があります。これらの評価を、それぞれ異なるLLMに並列で実行させることができます。例えば、品質評価用のLLMには文法的な正確さや流暢さを、関連性評価用のLLMには質問との関連性や情報の正確さを、創造性評価用のLLMには新規性や意外性を評価させます。そして、各LLMの評価結果を統合して、最終的なモデルの性能を判断します。これにより、評価プロセスを効率化し、より多角的な評価が可能になります。
- 投票:
- コードレビュー: 複数のプロンプトで脆弱性をチェックし、問題があれば警告する: ソフトウェア開発チームが、コードのセキュリティを強化するために、複数のLLMにコードレビューを依頼します。各LLMには異なるプロンプトを与え、それぞれ異なる視点からコードの脆弱性をチェックさせます。例えば、あるLLMにはSQLインジェクションのリスクを、別のLLMにはクロスサイトスクリプティングのリスクを、さらに別のLLMにはバッファオーバーフローのリスクを重点的にチェックさせます。そして、複数のLLMが脆弱性を指摘した場合にのみ、警告を発するようにします。これにより、誤検知を減らしつつ、セキュリティ上の問題を見逃すリスクを低減できます。
- コンテンツ評価: 複数のプロンプトで不適切さを評価し、投票数に応じて判断する: ソーシャルメディアプラットフォームが、ユーザーが投稿したコンテンツの適切性を判断するために、複数のLLMに評価を依頼します。各LLMには異なるプロンプトを与え、それぞれ異なる基準でコンテンツを評価させます。例えば、あるLLMにはヘイトスピーチの検出を、別のLLMには暴力的な表現の検出を、さらに別のLLMにはプライバシー侵害のリスクの検出を依頼します。そして、複数のLLMが不適切と判断した場合にのみ、コンテンツを削除したり、ユーザーに警告したりするなどの対応を取ります。これにより、コンテンツモデレーションの精度を向上させつつ、表現の自由とのバランスを取ることができます。
このワークフローは、処理の高速化や、多様な視点からの結果を得たい場合に有効です。
オーケストレーター・ワーカー:動的なタスク分解と委任
オーケストレーター・ワーカーは、中心となるLLM(オーケストレーター)が、タスクを動的に分解し、複数のワーカーLLMに委任し、結果を統合するワークフローです。
下の図は、オーケストレーター・ワーカーのワークフローを示しています。入力(In)に対し、Orchestrator(オーケストレーター)が、タスクを複数のLLM Call(LLM Call 1, LLM Call 2, LLM Call 3)に動的に分割し、それぞれの結果をSynthesizer(統合器)がまとめて、最終的な出力(Out)を生成する様子がわかります。


活用例:
- コード変更: 複雑な変更を複数のファイルに加える必要があるコーディングタスク: 例えば、ソフトウェア開発者が、大規模なリファクタリングを行う必要があるとします。オーケストレーターLLMは、まず、変更が必要なファイルを特定し、それぞれのファイルに対して、どのような変更が必要かを分析します。そして、各ファイルに対する変更作業を、別々のワーカーLLMに割り当てます。各ワーカーLLMは、担当ファイルの変更を完了し、その結果をオーケストレーターLLMに報告します。オーケストレーターLLMは、すべてのワーカーLLMからの結果を統合し、最終的な変更を確定します。これにより、複雑なコード変更を効率的に行うことができます。変更内容によっては、さらに変更が必要なファイルが出てくる可能性がありますが、その場合は、再度同じプロセスを繰り返します。
- 検索: 複数の情報源から情報を収集、分析するタスク: 例えば、市場調査アナリストが、特定の業界に関するレポートを作成する必要があるとします。オーケストレーターLLMは、まず、必要な情報を特定し、複数の検索クエリを生成します。そして、各検索クエリを、別々のワーカーLLMに割り当てます。各ワーカーLLMは、担当する検索クエリを実行し、関連する情報を収集します。そして、収集した情報をオーケストレーターLLMに報告します。オーケストレーターLLMは、すべてのワーカーLLMからの情報を統合し、分析し、最終的なレポートを作成します。これにより、多角的な情報を効率的に収集し、質の高いレポートを作成できます。検索の過程で、さらに詳細な情報が必要になった場合は、追加の検索クエリを発行し、ワーカーに再度検索を依頼します。
このワークフローは、事前に必要なサブタスクを予測できない複雑なタスクに適しています。
エバリュエーター・オプティマイザー:反復的な改善
エバリュエーター・オプティマイザーは、あるLLMが応答を生成し、別のLLMが評価とフィードバックを行うことを繰り返すワークフローです。
下の図は、エバリュエーター・オプティマイザーのワークフローを示しています。入力(In)に対し、LLM Call Generatorが応答を生成し、LLM Call Evaluatorがそれを評価します。EvaluatorがAccepted(承認)すれば、その応答が出力(Out)となります。Rejected(拒否)された場合は、フィードバックがGeneratorに送られ、応答が改善されます。このサイクルが繰り返されます。


活用例:
- 翻訳: 翻訳結果に対し、別のLLMが改善点を指摘し、より自然な翻訳を目指す: 例えば、ある翻訳者が、英語の小説を日本語に翻訳しているとします。まず、翻訳者LLMが、原文を日本語に翻訳します。次に、エバリュエーターLLMが、翻訳結果を評価し、不自然な表現や誤訳を指摘します。そして、翻訳者LLMは、エバリュエーターLLMからのフィードバックに基づいて、翻訳結果を修正します。このプロセスを繰り返すことで、翻訳の質を向上させることができます。例えば、「This is a pen.」という原文を、最初は「これはペンです。」と直訳したとします。エバリュエーターLLMが、「文脈によっては不自然」と指摘し、翻訳者LLMが「これはペンというものです。」と修正する、といった具合です。
- 検索: 検索結果に対し、別のLLMが更なる検索が必要かを判断する: 例えば、ある研究者が、特定のテーマに関する論文を検索しているとします。まず、検索LLMが、キーワードに基づいて論文を検索し、結果をリストアップします。次に、エバリュエーターLLMが、検索結果を評価し、必要な情報が十分に網羅されているか、さらに検索が必要かを判断します。もし、情報が不足していると判断した場合は、検索LLMに追加の検索クエリを指示し、より多くの論文を検索させます。このプロセスを繰り返すことで、研究者は、必要な情報を漏れなく収集できます。
このワークフローは、明確な評価基準があり、反復的な改善が効果的な場合に適しています。
この設計思想は、以前紹介したReflexionに共通する部分があります。こちらの記事に紹介していますので、ぜひご覧ください!


関連記事:DifyでReflexionを試す:LLMの出力精度は上がるのか!?
効果的なAIエージェント:自律的な問題解決
自律エージェント:計画、実行、環境からのフィードバック
エージェントは、LLMが中心となり、自律的に計画、実行、環境からのフィードバックを得て、タスクを遂行します。
下の図は、自律エージェントの基本的な動作を示しています。人間(Human)からの指示や質問に対し、LLM Callが、環境(Environment)に対してアクション(Action)を起こします。そして、環境からのフィードバック(Feedback)を受け取り、次のアクションを決定します。このサイクルを繰り返し、最終的にStop(停止)の判断をするまで続きます。


重要なポイント:
- 環境からのフィードバック: ツール呼び出しの結果やコード実行結果など、環境からの「真実」を得ることが重要です。例えば、コードを実行した結果、エラーが発生した場合は、そのエラーメッセージをフィードバックとして受け取り、コードを修正する必要があります。
- 人間のフィードバック: チェックポイントや問題発生時に、人間からのフィードバックを得ることも有効です。例えば、エージェントが生成した文章が、意図した内容と異なる場合は、人間がその点を指摘し、エージェントに修正させることができます。
- 停止条件: タスク完了時だけでなく、最大反復回数などの停止条件を設定し、制御を維持することが重要です。例えば、エージェントが無限ループに陥らないように、最大10回までツール呼び出しを繰り返す、といった制限を設けることができます。
エージェントは、複雑なタスクを処理できますが、実装は比較的シンプルです。多くの場合、LLMが環境からのフィードバックに基づき、ツールを繰り返し使用するループで構成されます。
下の図は、コーディングエージェントの動作例をより詳細に示しています。人間(Human)からの指示(Query)は、インターフェース(Interface)を介してLLMに伝えられます。LLMは、タスクが明確になるまで(Until tasks clear)、人間と対話し、必要に応じて質問(Clarify)をしたり、修正(Refine)を求めたりします。タスクが明確になったら、LLMは環境(Environment)に対して、ファイル検索(Search files)、パスの取得(Return paths)、コードの記述(Write code)、ステータスの確認(Status)、テスト(Test)、結果の取得(Results)などのアクションを実行します。そして、テストに合格するまで(Until tests pass)、このサイクルを繰り返します。最終的に、完了した結果(Complete)を人間に表示(Display)します。


効果的なAIエージェントの活用事例:コーディングと顧客サポート
Anthropicはエージェントの活用事例として以下をあげています。
- コーディングエージェント:
- SWE-benchタスクの解決: GitHubのissueを解決する。具体的には、バグの修正、機能の追加、コードのリファクタリングなど、様々なタスクを自動的に実行できます。AnthropicのClaude 3.5 Sonnetは、SWE-benchにおいて、以前のモデルと比較して大幅な性能向上を達成し、複雑なリポジトリの変更や、曖昧な指示への対応能力が向上しています。
- 「コンピュータ利用」リファレンス実装: Claudeがコンピュータを操作してタスクを完了する。具体的には、ファイルの作成、編集、削除、ウェブサイトの閲覧、アプリケーションの操作など、人間が行うようなコンピュータ操作を、Claudeが自律的に実行できます。
- カスタマーサポートエージェント: チャットボットインターフェースとツール連携を組み合わせ、顧客対応を自動化します。具体的には、顧客からの質問に自動で回答したり、商品の注文を受け付けたり、返品手続きを案内したりすることができます。いくつかの企業では、このアプローチによる使用量ベースの価格モデル(成功した解決に対してのみ課金)を採用しており、エージェントの有効性に対する自信を示しています。
これらのパターンを組み合わせたり、カスタマイズしたりすることで、様々なユースケースに対応できます。
効果的なAIエージェント開発:ツール設計の重要性
効果的なAIエージェントのツール設計:プロンプトエンジニアリング
エージェントの性能を最大限に引き出すには、ツールの設計が非常に重要です。ツールは、LLMが外部サービスやAPIと連携するためのインターフェースであり、その定義や仕様は、プロンプトと同様に注意深く設計する必要があります。
ポイント:
- 明確なフォーマット: LLMが扱いやすいフォーマットを選択する(例:diff形式よりもファイル全体を書き換える、マークダウンよりもJSON)。LLMは、人間が読みやすい形式よりも、機械が処理しやすい形式を好む場合があります。例えば、変更箇所だけを示すdiff形式よりも、ファイル全体を書き換える方が、LLMにとっては処理しやすい場合があります。また、人間が見やすいマークダウン形式よりも、構造化されたデータであるJSON形式の方が、LLMにとっては解析しやすい場合があります。
- 十分なトークン: LLMが「考える」ための十分なトークンを確保する。LLMは、与えられたトークン数の中で、応答を生成します。そのため、複雑なタスクを実行させる場合は、十分なトークン数を割り当てる必要があります。具体的な目安としては、ツールの説明や入力データ、出力結果などを考慮し、余裕を持ったトークン数を設定することが推奨されます。
- 自然な形式: LLMがインターネット上で見慣れている形式に近づける。LLMは、大量のテキストデータを学習しています。そのため、インターネット上でよく使われる形式(例えば、JSON、XML、CSVなど)で情報を与えると、より正確に理解し、処理することができます。
- オーバーヘッドの削減: 文字数カウントや文字列エスケープなど、余計な処理を避ける。LLMに、不要な処理をさせると、パフォーマンスが低下する可能性があります。例えば、ファイルの内容を変更する際に、変更箇所の行番号を計算させるような処理は、LLMにとっては負担が大きいため、避けるべきです。
- ドキュメント: ツールの説明、パラメータ、使用例、エッジケースなどを詳細に記述する。ツールをLLMに利用させる際には、人間がAPIドキュメントを読むように、ツールの詳細な説明を提供する必要があります。これにより、LLMは、ツールをより正確に、効率的に利用することができます。具体的には、ツールの目的、各パラメータの意味と型、入力値の制約、出力値の形式、正常系と異常系の例などを記述します。
- テスト: 実際にLLMにツールを使わせ、エラーを修正し、改善を繰り返す。ツールを設計したら、必ずLLMに実際に使わせて、期待通りに動作するかを確認する必要があります。エラーが発生した場合は、原因を特定し、ツールの定義や説明を修正します。
- ポカヨケ: 引数の形式を変更し、ミスを防止する。ツールを設計する際には、LLMが誤った使い方をしないように、工夫する必要があります。例えば、日付を入力するパラメータがある場合、YYYY-MM-DD形式で入力するように指定することで、MM-DD-YYYY形式などの誤った入力を防ぐことができます。
ツールの設計には、人間とコンピュータのインターフェース(HCI)と同様の労力をかけるべきです。Anthropicは、SWE-benchのエージェント開発において、プロンプトよりもツールの最適化に時間を費やしたと述べています。
効果的なAIエージェント開発:PythonによるMCPクライアント構築例
以下はPythonでMCPクライアントを構築し、サーバーと連携してツールを利用する例です。
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from anthropic import Anthropic
import sys
class MCPClient:
def __init__(self):
self.session: Optional[ClientSession] = None
self.anthropic = Anthropic()
async def connect_to_server(self, server_script_path: str):
# ... (サーバー接続処理 - 詳細割愛) ...
pass
async def process_query(self, query: str) -> str:
# ... (クエリ処理、ツール呼び出し - 詳細割愛) ...
pass
async def chat_loop(self):
# ... (チャットループ - 詳細割愛) ...
pass
async def cleanup(self):
# ... (クリーンアップ処理 - 詳細割愛) ...
pass
async def main():
# ... (メイン処理 - 詳細割愛) ...
pass
if __name__ == "__main__":
import asyncio
asyncio.run(main())
このコードは、以下の処理の骨格を示しています。
- MCPサーバーへの接続
- 利用可能なツールのリスト取得
- ユーザーからのクエリを受け付け、Claude APIを呼び出す
- Claudeからの応答(テキストまたはツール呼び出し)を処理する
- ツール呼び出しの場合、MCPサーバー経由でツールを実行する
- ツール実行結果をClaudeに返し、次の応答を取得する
- 最終的な応答をユーザーに表示する
- チャットループを繰り返す
- 終了時にリソースをクリーンアップする
このコードはあくまで一例であり、実際のアプリケーションでは、エラーハンドリング、ロギング、UIの改善など、様々な追加要素が必要になります。詳細な手順はこちらを参照してください。
効果的なAIエージェント構築:まとめと注意点
効果的なAIエージェント開発の原則:シンプルさ、透明性、優れたACI
Anthropicは、効果的なAIエージェントを開発するための3つの原則を提唱しています。
- シンプルさ: エージェントの設計はシンプルに保つ。複雑なシステムは、バグを生みやすく、メンテナンスも困難になります。可能な限りシンプルな設計を心がけ、必要に応じて段階的に機能を拡張していくのが良いでしょう。
- 透明性: エージェントの計画ステップを明示的に示す。エージェントがどのように考えて行動しているのかを、人間が理解できるようにすることが重要です。これにより、エージェントの動作をデバッグしたり、改善したりすることが容易になります。
- 優れたACI (Agent-Computer Interface): ツールを徹底的にドキュメント化し、テストする。エージェントが利用するツールは、人間が使うAPIと同様に、使いやすく、理解しやすいものである必要があります。詳細なドキュメントを作成し、様々なテストケースで動作を確認することで、ツールの品質を向上させることができます。
フレームワークは、開発の初期段階では役立ちますが、本番環境に移行する際には、抽象化レイヤーを減らし、基本的なコンポーネントで構築することを検討しましょう。
効果的なAIエージェント:過度な複雑さを避ける
LLMアプリケーション開発で最も重要なことは、必要以上に複雑なシステムを構築しないことです。まずはシンプルなプロンプトから始め、包括的な評価によって最適化し、より単純な解決策が不十分な場合にのみ、マルチステップのエージェントシステムを追加することを検討しましょう。複雑なエージェントシステムは、開発コストやメンテナンスコストが高くなるだけでなく、予期せぬ動作を引き起こす可能性もあります。シンプルなプロンプトで十分な性能が得られるのであれば、それが最も効果的な解決策と言えるでしょう。