ストーリー
ツール説明文の重要性
説明文がツール選択精度を左右する
LLMは以下の情報からツールを選択します。
LLMのツール選択判断材料:
1. ツール名 → 第一印象(直感的な判断)
2. description → 詳細な判断材料(最も重要)
3. パラメータ定義 → 何を渡すべきかの理解
4. ユーザーの入力 → どのツールが必要かの推論
良い説明文 vs 悪い説明文
悪い説明文:
name: "get_data"
description: "データを取得します"
→ 何のデータ? どんなときに使う? LLMは判断できない
良い説明文:
name: "get_order_details"
description: "注文番号を指定して注文の詳細情報を取得します。
返却情報: 商品一覧、合計金額、注文日時、配送先住所、
支払い方法、注文ステータス。
注文の内容を確認したい場合に使用してください。
配送状況の追跡には track_shipment を使用してください。"
→ いつ使うか、何が返るか、他のツールとの使い分けが明確
説明文設計のガイドライン
1. 目的を明確に記述する
[テンプレート]
"[何を] [どのように] [する/取得する]。
[返却される情報/実行される処理]。
[このツールを使うべき場面]。"
2. 類似ツールとの区別を明示する
似た機能のツールがある場合、使い分けを説明文に含めます。
search_orders:
"注文の一覧を条件で検索します。
複数件の注文をフィルタリングして取得したい場合に使用します。
特定の注文の詳細が必要な場合は get_order_details を使ってください。"
get_order_details:
"注文番号を指定して1件の注文の完全な詳細情報を取得します。
商品、金額、配送先、ステータスなど全情報が含まれます。
注文の検索には search_orders を使ってください。"
3. ネガティブ指示を含める
「このツールを使うべきでない場面」を明示すると精度が上がります。
calculate_shipping_cost:
"配送先住所と商品の重量・サイズから配送料を計算します。
注意: 実際の配送手配は行いません。配送手配には
create_shipment を使用してください。"
複数ツールからの選択ロジック
ツールのカテゴリ分類
ツール数が多い場合、カテゴリで整理してLLMの判断を助けます。
ツールカテゴリ:
[注文関連]
- search_orders: 注文一覧の検索
- get_order_details: 注文詳細の取得
- cancel_order: 注文のキャンセル
- update_order: 注文情報の更新
[配送関連]
- track_shipment: 配送状況の追跡
- create_shipment: 配送の手配
- calculate_shipping_cost: 配送料の計算
[顧客関連]
- get_customer_info: 顧客情報の取得
- update_customer_info: 顧客情報の更新
- get_customer_history: 購入履歴の取得
動的ツール選択
すべてのツールを毎回渡すのではなく、コンテキストに応じて提供するツールを絞り込みます。
function selectToolsForContext(
userMessage: string,
conversationHistory: Message[]
): Tool[] {
const allTools = getAllTools();
// キーワードベースの絞り込み
const keywords = extractKeywords(userMessage);
if (keywords.includes("注文") || keywords.includes("オーダー")) {
return allTools.filter(t => t.category === "order" || t.category === "shipping");
}
if (keywords.includes("返金") || keywords.includes("キャンセル")) {
return allTools.filter(t =>
t.category === "order" || t.category === "billing"
);
}
// デフォルト: 主要ツールのみ提供
return allTools.filter(t => t.priority === "high");
}
パラレルツール呼び出し
複数ツールの同時実行
LLMが複数のツールを同時に呼び出すことがあります(OpenAI APIの parallel tool calls)。
// LLMのレスポンスに複数のtool_callsが含まれる場合
const toolCalls = message.tool_calls; // [{search_orders, ...}, {get_customer_info, ...}]
// 並列実行で効率化
const results = await Promise.all(
toolCalls.map(async (call) => {
const args = JSON.parse(call.function.arguments);
const result = await executeTool(call.function.name, args);
return {
tool_call_id: call.id,
role: "tool" as const,
content: JSON.stringify(result)
};
})
);
// 全結果をメッセージに追加
messages.push(...results);
パラレル呼び出しの注意点
| 注意点 | 説明 | 対策 |
|---|---|---|
| 依存関係 | ツールAの結果がツールBの入力に必要 | 依存関係があるツールは順次実行に制限 |
| レート制限 | 外部APIのレート制限に抵触 | 同時実行数の上限を設定 |
| エラー伝播 | 1つのツールの失敗が全体に影響 | 個別にエラーハンドリング |
まとめ
| ポイント | 内容 |
|---|---|
| 説明文の重要性 | LLMのツール選択精度を直接左右する |
| 説明文設計 | 目的、返却情報、使い分けを明記 |
| 動的ツール選択 | コンテキストに応じてツールを絞り込み精度を向上 |
| パラレル実行 | 独立したツールは並列実行で効率化 |
チェックリスト
- ツール説明文の重要性と設計ガイドラインを理解した
- 類似ツールの使い分けを説明文で明示する方法を理解した
- 動的ツール選択の考え方を把握した
- パラレルツール呼び出しの実装と注意点を理解した
次のステップへ
次は「エラーハンドリングとリトライ」を学びます。ツール実行時のエラー処理やフォールバック戦略を理解しましょう。
推定読了時間: 30分