LESSON 30分

ストーリー

田中VPoE
エージェントパターンを学んだところで、次はエージェントの「手足」となるツールの設計を学ぼう
あなた
ツールはAPIを呼び出すだけじゃないんですか?
田中VPoE
API呼び出しはツールの一種に過ぎない。重要なのは、LLMが「どのツールを使うべきか」「どんなパラメータを渡すべきか」を正確に判断できるように設計することだ
あなた
LLMが理解しやすいツール設計が大事ということですね
田中VPoE
その通り。ツールの名前、説明文、パラメータ定義が曖昧だと、LLMは間違ったツールを選んだり、不正なパラメータを渡したりする。ツール設計はエージェントの性能を左右する重要な要素だ

ツール設計の基本原則

1. 単一責任の原則

1つのツールは1つの明確な責務を持つべきです。

設計悪い例良い例
ツール名manage_orderssearch_orders / cancel_order / update_order
問題点何をするか曖昧各ツールの責務が明確
LLMの判断困難容易
悪い設計:
manage_orders(action, order_id, ...)
→ actionに "search" / "cancel" / "update" を渡す
→ LLMがactionの値を間違える可能性が高い

良い設計:
search_orders(query, status, date_from, date_to)
cancel_order(order_id, reason)
update_order(order_id, fields)
→ ツール名だけで何をするか明確

2. 明確な命名

ツール名はLLMが目的を即座に理解できる命名にします。

パターン説明
動詞_名詞search_orders最も直感的
get/create/update/deleteget_customer, create_ticketCRUD操作
check/validatecheck_inventory, validate_address検証系
calculate/analyzecalculate_shipping_cost計算・分析系
send/notifysend_email, notify_customer通知系

3. 自己説明的な説明文

ツールの説明文は、LLMがツール選択の判断材料にする最も重要な情報です。

悪い説明:
"注文を検索します"

良い説明:
"注文番号、顧客ID、注文日の範囲、ステータスで注文情報を検索します。
部分一致検索が可能です。最大100件を返します。
注文の詳細(商品、金額、配送先)を確認したい場合に使用してください。"

4. 厳密な入出力定義

パラメータの型、必須/任意、バリデーションルールを明確に定義します。

// ツール定義の例
const searchOrdersTool = {
  name: "search_orders",
  description: "注文番号、顧客ID、日付範囲、ステータスで注文を検索します。部分一致対応。最大100件返却。",
  parameters: {
    type: "object",
    properties: {
      order_id: {
        type: "string",
        description: "注文番号(例: ORD-12345)。部分一致検索可能。"
      },
      customer_id: {
        type: "string",
        description: "顧客ID(例: CUST-001)"
      },
      status: {
        type: "string",
        enum: ["pending", "confirmed", "shipped", "delivered", "cancelled"],
        description: "注文ステータスでフィルタリング"
      },
      date_from: {
        type: "string",
        format: "date",
        description: "検索開始日(ISO 8601形式: YYYY-MM-DD)"
      },
      date_to: {
        type: "string",
        format: "date",
        description: "検索終了日(ISO 8601形式: YYYY-MM-DD)"
      }
    },
    required: [] // 全て任意(少なくとも1つは指定推奨)
  }
};

エラーハンドリングの原則

ツール側のエラー処理

ツールは成功時も失敗時も、LLMが次のアクションを判断できる情報を返すべきです。

// ツールのレスポンス設計
interface ToolResponse {
  success: boolean;
  data?: unknown;
  error?: {
    code: string;
    message: string;
    suggestion: string; // LLMへの次のアクション提案
  };
}

// 例: 注文検索ツールのエラーレスポンス
{
  success: false,
  error: {
    code: "ORDER_NOT_FOUND",
    message: "注文番号 ORD-99999 は見つかりませんでした",
    suggestion: "顧客IDまたは日付範囲で再検索してください"
  }
}

エラーレスポンスの設計ガイドライン

要素必須目的
エラーコードYesエラーの種類を機械的に判別
メッセージYes何が起きたかをLLMに説明
提案RecommendedLLMが次に何をすべきかのヒント
リトライ可能かOptional一時的エラーかどうかの判断材料

ツール設計のベストプラクティス

出力のフォーマット

ポイント説明
構造化データJSONで返す(LLMがパースしやすい)
必要十分な情報量多すぎるデータはトークンを浪費する
一貫したフォーマット全ツールで共通のレスポンス構造
人間可読な値ステータスコードだけでなく説明文も含める

ツール数の適正化

ツール数評価リスク
1-5個最適LLMの選択精度が高い
6-10個良好説明文の品質が重要になる
11-20個注意選択ミスが増える可能性
20個以上非推奨カテゴリ別にサブエージェントに分割すべき

「ツール設計はUXデザインと同じ考え方だ。ユーザー(ここではLLM)にとって直感的で使いやすいインターフェースを設計することが成功の鍵になる」 — 田中VPoE


まとめ

ポイント内容
単一責任1つのツールに1つの明確な責務
命名規則動詞_名詞で目的が即座にわかる名前
説明文LLMがツール選択できる十分な情報を含める
入出力定義型、必須/任意、バリデーションを厳密に定義
エラー処理LLMが次のアクションを判断できるレスポンス設計

チェックリスト

  • ツール設計の4つの基本原則(単一責任、命名、説明文、入出力定義)を理解した
  • ツールのパラメータ定義を型安全に設計できる
  • LLMが理解しやすいエラーレスポンスの設計方法を理解した
  • ツール数の適正化の考え方を把握した

次のステップへ

次は「ファンクションコーリング」を学びます。OpenAI/Claude APIでツールをLLMに接続する具体的な実装方法を理解しましょう。


推定読了時間: 30分