A
AIエージェントの仕組み
ch4-s4 · Multiple Tools & tool_choice

複数ツールと選択

約 15 分

この回のゴール

1. 前回の復習

前回は電卓 1 つだけ。実運用では 複数のツール を並べて、Claude に場面に応じて選ばせます:

 [事前準備]
 ┌────────────┐  ┌──────────┐  ┌──────────┐
 │ 文書ファイル │─▶│ チャンク   │─▶│ 埋め込み  │
 └────────────┘  └──────────┘  └─────┬────┘
                                      ▼
                          ┌─────────────────┐
                          │  FAISS index    │  (永続化可能)
                          └─────────────────┘

 [問い合わせ時]
                      埋め込み              Top-k 取得
 [質問] ─────────────▶ [q_vec] ─────────────▶ [ chunks ]
                                                   │
                                                   ▼
                                      ┌──────────────────────┐
                                      │  Claude (システム指示付) │
                                      └──────────┬───────────┘
                                                 ▼
                                      ┌──────────────────────┐
                                      │  回答 + 引用元 [1][2] │
                                      └──────────────────────┘

2. Claude はどうやってツールを選ぶか

Claude は各ツールの descriptioninput_schema.properties.*.description読んで、ユーザーの質問に 最も合うもの を選びます。

例:

質問 Claude の思考 呼ばれるツール
「123×456 は?」 計算が必要 calculator
「今何時?」 時刻が必要 get_current_time
「"apple" の意味は?」 辞書が必要 search_dictionary
「東京の天気は?」 天気が必要 get_weather
「こんにちは」 ツール不要 なし(直接応答)

カギは description の質。曖昧だと Claude が迷ったり、間違ったツールを呼んだりします。

3. tool_choice — 選択の制御

system = """あなたは社内アシスタントです。
以下のルールを厳守してください:

1. 回答は【参考情報】に基づいてのみ行うこと
2. 参考情報にない質問には「その情報は確認できません」と答えること
3. 回答の根拠となった文書を [1][2] のように引用すること
4. 憶測や学習済み知識での補完は禁止
"""
tool_choice 意味
{"type": "auto"} (デフォルト) Claude が自由に判断。ツールが不要なら使わない
{"type": "any"} 必ずどれかのツール を使う。使わない応答は禁止
{"type": "tool", "name": "calculator"} 特定のツール を強制
{"type": "none"} ツールを 絶対使わない

いつどれを使う?

4. 並列ツール使用 (Parallel Tool Use)

Claude は 1 レスポンスで複数のツールを同時に呼ぶ ことがあります:

【参考情報】
[1] ネオテックでは入社初年度から年間 15 日の有給休暇を付与します...
[2] 勤続 3 年以上の社員は年間 20 日、5 年以上は 25 日...

【質問】
有給は入社何年目で 25 日になる?

実装側は 全部を並行して実行 し、全部の結果を 1 つの user メッセージ にまとめて返します:

messages = [
    ...,
    {"role": "assistant", "content": response.content},  # 3 つの tool_use
    {"role": "user", "content": [
        {"type": "tool_result", "tool_use_id": "toolu_A", "content": "..."},
        {"type": "tool_result", "tool_use_id": "toolu_B", "content": "..."},
        {"type": "tool_result", "tool_use_id": "toolu_C", "content": "..."},
    ]},
]

効率化ポイント: - API 呼び出しが 2 回で済む(3 連続ではなく) - ツール実行は Python 側で asyncio.gatherThreadPoolExecutor で並列可能

5. 無効化したいなら

response = client.messages.create(
    ...,
    tool_choice={"type": "auto", "disable_parallel_tool_use": True},
)

1 回に 1 つしかツール呼ばない状態にできる。順次実行したい場合に使う。

6. エラーが出たら

ツール実行でエラーが出たら is_error: True を付けて伝える:

{
    "type": "tool_result",
    "tool_use_id": "toolu_ABC",
    "content": "Error: ネットワーク接続に失敗しました",
    "is_error": True,
}

Claude はこれを見て「別のツールを試す」「ユーザーに状況を伝える」などの賢い対応を取ります。

7. まだできないこと(→ 次章エージェント)

この回までの tool_use には 制約 があります:

# 今の実装: 1回だけツールを使って終わる
response1 = client.messages.create(tools=tools, messages=[...])   # tool_use
result = execute(response1)
response2 = client.messages.create(tools=tools, messages=[..., tool_result])  # 最終回答

でも実際は:

👉 次章「AI エージェント」では、この ループ を自動化します。これが「エージェント」という概念です。


まとめ

第 4 章のクロージング → 次章への接続

ツール呼び出しの仕組みはわかった。でも 1 ターン 1 往復では、連続的な思考(計算→天気→判断→別の計算)ができない。 👉 次章「AI エージェント」では、ツール呼び出しを多段でループさせる ReAct パターン に進みます。

参考文献

A
本家 Claude Academy で手を動かす
この回に対応する Anthropic 公式のレッスンです。ここは「なぜそう動くか」、向こうは「どう書くか」。サインインなしで読めます。
📝 理解度クイズ (3 問) 💡 ログインすると進捗が保存されます

💬 このサブステップの Q&A

まだ質問はありません。最初の質問を投稿してみましょう。

質問の投稿にはログインが必要です。