AIエージェントのための効果的なツールの作成:Anthropicエンジニアリングガイド

Anthropicは、AIエージェントのためのツールの構築と最適化に関する包括的な手法を導入しました。これは、ソフトウェア開発のパラダイムを、決定論的な契約(システム間)から非決定論的な契約(エージェント対システム)へとシフトさせるものです。核心となる教訓は、ツールはLLMの「アフォーダンス」に合わせて特別に設計される必要があり、従来のAPIの柔軟性よりも、コンテキストの効率性と意味的な明快さを優先すべきであるということです。

エージェント中心のツール作成パラダイム

従来のソフトウェアは、特定の入力が常に同じ出力を生成する決定論的な契約に基づいて構築されています。対照的に、AIエージェントは非決定論的です。同じプロンプトに基づいて、ツールを呼び出すことを選択したり、内部知識に頼ったり、明確化を求めたりすることがあります。

エージェントの有効性を最大化するために、開発者はツールを標準的なAPIとして書くのではなく、エージェントが戦略を正常に実行できる「表面積」を増やすように設計する必要があります。エージェントにとって使いやすいツールは、通常、直感的な人間のワークフローと一致します。

ツール開発のための体系的なワークフロー

Anthropicは、ツールのパフォーマンスを洗練させるために、プロトタイピング、評価、およびエージェント主導の最適化という反復サイクルを推奨しています。

1. プロトタイピングとローカルテスト

開発者は、Claude Codeのようなツールを利用して、初期実装を迅速にプロトタイプ作成することから始めるべきです。ワンショット生成を改善するために、Anthropicは関連するSDKやAPIに対してLLMフレンドリーなドキュメント(llms.txtファイルなど)を提供することを提案しています。ツールは以下の方法でローカルテストが可能です:

  • Local MCP Servers: claude mcp addを使用してClaude Codeに接続します。
  • Desktop Extensions (DXT): Claude Desktopアプリに統合されます。
  • Direct API Calls: プログラマティックなテストのためにAnthropic APIを使用します。

2. 評価駆動型の最適化

過学習を避け、現実世界での有効性を確保するために、体系的な測定が必要です。これには以下が含まれます:

  • 複雑なタスクの生成: 単純な「サンドボックス」プロンプトを避け、多段階の、現実世界のシナリオ(例:ログを分析して影響を受けるユーザーを特定し、顧客の請求トラブルを解決する)を好みます。
  • 検証可能な結果: プロンプトと正解(ground-truth)のレスポンスをペアリングするか、検証のためにLLMベースの判定器(judge)を使用します。
  • プログラムによる実行: LLM API呼び出しとツール実行を交互に行うwhile-ループ内で評価エージェントを実行します。
  • 思考のインターリーブ: ツール呼び出しの前に「思考のインターリーブ」またはChain-of-Thought (CoT) ブロックを利用して、エージェントがなぜツールを使用できなかったのか、あるいは非効率なパスを選択したのかを診断します。

3. エージェント主導の洗練

Anthropicは、エージェントが自身の失敗のトランスクリプトを分析することに非常に効果的であることを発見しました。評価トランスクリプトをClaude Codeにフィードバックすることで、開発者はツールの実装と説明を自動的にリファクタリングし、自己一貫性とパフォーマンスを確保することができます。

高パフォーマンスツールのための核となる原則

戦略的なツール選択

ツールの数が増えることが必ずしもパフォーマンスの向上を意味するわけではありません。エージェントは、従来のソフトウェアと比較して、限られたコンテキストウィンドウを持っています。

  • 力任せなツールの回避: すべてのデータを返すlist_contactsツールの代わりに、search_contactsツールを実装します(エージェントがトークンを1つずつ読み取ることを強制させないため)。
  • 機能の集約約: 複数の個別のAPI呼び出しを、単一の高レベルなツールにまとめます。例えば、list_userscreate_eventという個別のツールではなく、schedule_eventツールを作成し、空き状況とスケジューリングを一度の呼び出しで処理できるようにします。

名前空間と境界の定義

エージェントが複数のMCPサーバーを介して数百のツールにアクセスする場合の混乱を防ぐために、開発者は名前空間(関連するツールを共通のプレフィックスでグループ化すること)を使用すべきです。

  • 例: asana_projects_searchjira_projects_searchを使用することで、エージェントは異なるサービス間の境界を明確に区別できます。

コンテキストとシグナルの最適化

ツールのレスポンスは、高シグナルな情報に優先順位を付け、トークン消費を最小限に抑えるべきです。

  • 意味的な識別子: 幻覚(hallucination)を減らすために、不可解なUUIDを自然言語の名前や0インデックスのIDに置き換えます。
  • レスポンス形式: response_format enum(例:CONCISE vs. DETAILED)を実装します。簡潔なレスポンスはトークンを節約し、詳細なレスポンスは後続のツール呼び出しに必要なIDを提供します。
  • Token 効率: コンテキストを管理するために、ページネーション、範囲選択、および切り詰め(truncation)を使用します。AnthropicはClaude Codeのツールレスポンスをデフォルトで25,000トークンに制限しています。

ツール仕様のためのプロンプトエンジニアリング

ツールの説明は、エージェントのコンテキスト内での誘導メカニズムとして機能します。Anthropicは、Claude Sonnet 3.5がSWE-bench Verified評価において最先端のパフォーマンスを達成した際、ツール記述の正確な洗練が極めて重要であったと述べています。

  • 明示的なコンテキスト: ツールを、専門用語や特殊なクエリ形式を含む、新入社員に説明するように記述します。
  • 曖昧さのない命名: 厳格なデータモデルを強制するために、特定のパラメータ名(例:user_idではなくuser)を使用します。

Sources

関連