← レッスンに戻る
第4章 · Claude API応用

Tool Use (Function Calling)

Tool Use · 約 14 分

重要キーワード

English日本語説明
Tool Use ツール使用 LLM が宣言された関数を呼び出して外界とやりとりする仕組み
JSON Schema JSONスキーマ ツール入力の型定義に使われる規格
Parallel Tool Use 並列ツール使用 複数の独立ツールを 1 ターンで同時呼び出し
tool_result ツール実行結果 アプリ側で関数を実行した結果を返すメッセージ種別

Tool Use (ツール使用)

LLM 単体では計算・検索・DB アクセス・API 呼び出しが苦手です。 Tool Use はモデルに 「関数」を定義して渡し、必要なら呼び出してもらう 仕組み。 別名 Function Calling

流れ

  1. ユーザーが質問する。
  2. モデルがツールを呼ぶ必要があるか判断 → tool_use ブロックを返す。
  3. アプリ側で実際に関数を実行し、結果を tool_result として返す。
  4. モデルが最終回答を生成する。
User    : 東京の天気は?
Claude  : 🛠 get_weather(city="Tokyo") を呼びたい
App     : ✅ 実行して結果を渡す → {"temp": 22, "rain": false}
Claude  : 東京は気温22℃で雨は降っていません。

コード例

tools = [{
    "name": "get_weather",
    "description": "指定都市の天気を取得します",
    "input_schema": {
        "type": "object",
        "properties": {
            "city": {"type": "string", "description": "都市名 (例: Tokyo)"},
        },
        "required": ["city"],
    },
}]

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "東京の天気は?"}],
)

if resp.stop_reason == "tool_use":
    tu = next(b for b in resp.content if b.type == "tool_use")
    result = real_get_weather(tu.input["city"])

    # tool_result を含む新しいリクエスト
    resp2 = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        tools=tools,
        messages=[
            {"role": "user", "content": "東京の天気は?"},
            {"role": "assistant", "content": resp.content},
            {"role": "user", "content": [{
                "type": "tool_result",
                "tool_use_id": tu.id,
                "content": str(result),
            }]},
        ],
    )
    print(resp2.content[0].text)

設計のコツ

Parallel Tool Use

Claude は 複数のツールを同時に呼ぶ ことができます。 独立した関数なら並列実行で高速化できます。

[tool_use: get_weather(Tokyo)]
[tool_use: get_weather(Osaka)]

これらを並列に実行 → 両方の tool_result をまとめて返すと効率的。

tool_choice で制御

tools=[...],
tool_choice={"type": "tool", "name": "get_weather"},  # 強制
# tool_choice={"type": "any"}   # ツールのいずれかを必ず使う
# tool_choice={"type": "auto"}  # デフォルト (使うかどうか自動判断)

よく使う応用

試す: ツール定義を Claude に書かせる

最初の設計を Claude に手伝ってもらうと早いです。

▶ ツール JSON Schema 設計依頼
「会議室予約システム」用の Tool Use 定義 JSON Schema を、書き込み(reserve)・読み取り(list_rooms, get_availability) の 3 つで設計してください。各ツールに description と input_schema を含めて、JSON で返してください。

演習問題

演習 1: 電卓ツールを実装する

Tool Use を使って 「四則演算電卓」 を Claude に呼び出させてください。

  • ツール名: calc
  • 入力: expression: string (例: "3 * (5 + 2)")
  • 出力: 数値
  • 安全のため、Python の eval ではなく ast.literal_eval 風の制限付き評価を使う

会話例: 「3 * (5+2) は何?」 → ツール経由で 21 を返答。

スタータープロンプト:
Python で Tool Use を使った電卓を実装するコードを示してください。要件:
- ツール `calc(expression)` を定義
- `eval` は使わず ast モジュールで安全に評価する
- ユーザー入力「3 * (5+2) は?」に対して Claude が calc を呼び、最終回答を返す完全な流れ
- claude-sonnet-4-6 を使用、コードのみ示す
ヒントを見る

eval は危険なので避けます。ast.parse(expr, mode='eval') で AST 化し、許可ノード (Num/BinOp/UnaryOp など) のみ評価する関数を実装するのが安全。

理解度チェック

  1. Tool Use で `input_schema` に使われる規格は?
    1. JSON Schema
    2. OpenAPI
    3. Protobuf
    4. Avro
  2. tool_use ブロックを受け取った後、アプリは何を返す?
    1. error
    2. tool_result
    3. system
    4. tool_call
  3. ツール定義で最も精度に影響するのは?
    1. 関数名のスペル
    2. description の質
    3. ファイルサイズ
  4. tool_choice = `{"type": "any"}` の意味は?
    1. 好きなツールを必ず 1 つ使う
    2. ツールを使わない
    3. 並列に全ツールを呼ぶ
    4. ランダムに 1 つ選ぶ
解答と解説を見る
  1. A — ツール入力は JSON Schema で型定義します。
  2. B — 実行結果を `tool_result` ブロックとして user 役で返します。
  3. B — ツールの選択判断は description の品質に大きく依存します。
  4. A — ツールのいずれかを必ず使うよう強制します。