🔧
ツール使用パターン — LLMに手足をつける
関数呼び出しでLLMが外部世界と相互作用する構造
LLMは「今日の天気は?」に本物の天気APIを呼べない。学習データから推論するだけ。ツールを繋げると変わる。
動作原理
- LLMにツールスキーマを渡す:「
get_weather(city: string)関数が使えるよ」 - ユーザー:「ソウルの天気教えて」
- LLM応答:
tool_use: get_weather(city="Seoul") - クライアントが実際にAPI呼び出し → 結果をLLMに渡す
- LLMが結果を自然言語で整理:「ソウルは現在18°C、晴れです。」
LLMが直接APIを呼ぶのではない。「このツールをこのパラメータで呼んで」と要求し、クライアント(開発者コード)が実行して結果を返す構造。
良いツール設計
名前が明確: read_file、search_code、run_test — 名前を見ただけで何をするかわかる。
説明が詳細: LLMはツールの説明を見ていつ使うか決める。「ファイルを読みます」より「指定されたパスのファイル内容をテキストで返します。バイナリファイルは未対応です」の方が良い。
パラメータが簡潔: 必須パラメータを最小化し、オプショナルには適切なデフォルト値を設定。
結果が有用: 成功/失敗、エラーメッセージ、実行結果を構造的に返す。
MCP(Model Context Protocol)
Anthropicが作ったツール標準化プロトコル。ツールを作る人と使う人(LLM/エージェント)を分離する。
MCPサーバーがツールを提供し、MCPクライアント(エージェント)が接続して使用する構造。ツールを一度作れば複数のエージェントで再利用できる。
動作フロー
1
LLM API呼び出し時にtoolsパラメータに利用可能なツールスキーマを渡す
2
LLM応答にtool_useが含まれていれば該当関数を実行
3
実行結果をtool_resultとしてメッセージに追加 → LLM再呼び出し
4
MCPを使えばツールをサーバーに分離して複数エージェントで再利用
ユースケース
チャットボットにDB照会、メール送信、決済処理機能を追加
コーディングエージェントにファイル読み書き、ターミナル実行ツールを提供