ストーリー
ツール設計の基本原則
1. 単一責任の原則
1つのツールは1つの明確な責務を持つべきです。
| 設計 | 悪い例 | 良い例 |
|---|---|---|
| ツール名 | manage_orders | search_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/delete | get_customer, create_ticket | CRUD操作 |
| check/validate | check_inventory, validate_address | 検証系 |
| calculate/analyze | calculate_shipping_cost | 計算・分析系 |
| send/notify | send_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に説明 |
| 提案 | Recommended | LLMが次に何をすべきかのヒント |
| リトライ可能か | 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分