LESSON 30分

ストーリー

田中VPoE
ファンクションコーリングの実装方法は理解したな。次は「LLMがどうやって正しいツールを選ぶか」という戦略を学ぼう
あなた
ツールが2-3個なら間違えないと思いますが、10個以上あると迷いそうですね
田中VPoE
まさにその通りだ。ツール数が増えるほど、LLMが間違ったツールを選んだり、本来不要なツールを呼んだりするリスクが高まる。ツールの説明文の書き方一つで、選択精度が大きく変わる
あなた
説明文がそんなに重要なんですか
田中VPoE
LLMはツール名と説明文だけを頼りにツールを選択する。曖昧な説明文は、人間が曖昧なメニューを見て注文を間違えるのと同じだ

ツール説明文の重要性

説明文がツール選択精度を左右する

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分