第4章 · Advanced Claude API

Tool Use (Function Calling)

Tool Use
→ で次のスライド · F でフルスクリーン · N で講師ノート · Esc で終了

重要キーワード

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)

設計のコツ

  • description が命。ツールが何をするか明確に書く (Claude のツール選択判断はここに依存)。
  • input_schema は JSON Schema。required も明記する。
  • 副作用のあるツール (送金等) は人間の確認を挟む設計に。
  • 多すぎるツール は精度を落とす。10 個以上なら絞り込むか、上位ツールでルーティングする。

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"}  # デフォルト (使うかどうか自動判断)

よく使う応用

  • DB クエリ実行 (read-only から始める)
  • 検索エンジン呼び出し (Web Search)
  • 計算実行 (Python REPL)
  • GitHub API, Slack 投稿 などの社内連携

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

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

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

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

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

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

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

▶ Playground を開いて実行

理解度チェック

4 問のクイズで理解度を確認しましょう。

クイズを開く
🎉

まとめ

お疲れ様でした!