AIは学習した時点の情報しか持っていません。ですから在庫数や料金を聞かれると、当時は正しかった値をそのまま答えます。
学習後に変わった4項目で試したところ、ツールを渡さない構成の正答は1件でした。しかも誤った3件も、正解した1件と同じ調子で返ってきます。
学習後に変わった4項目で判定しました。ツールなしの正答は1件で、誤った3件も同じ調子で返ってきます。
ツール利用の有無で答えがどう変わるのかを、項目ごとに判定しました。用意したのは学習した時点では正しかったが、今は変わっている4項目です。
断っておくと、これはモデルを動かした実測ではありません。覚えている値と実際の値を置いて突き合わせた判定です。置いた値はコードに書いてあります。
// 現在の実データ。ツールを渡した構成だけがここを見に行ける
const NOW = {
'在庫数': '0個', '料金プラン': '月2,400円',
'担当者': '佐藤', '営業時間': '10時から19時',
};
// モデルが学習時点で覚えている値。当時は正しかった
const MEMORIZED = {
'在庫数': '12個', '料金プラン': '月1,800円',
'担当者': '田中', '営業時間': '10時から19時', // これだけ変わっていない
};
学習後に値が変わった項目を聞いたとき、どう答えるか 項目 ツールなし ツールあり 実際の値 在庫数 12個 × 0個 0個 料金プラン 月1,800円 × 月2,400円 月2,400円 担当者 田中 × 佐藤 佐藤 営業時間 10時から19時 10時から19時 10時から19時 ツールなしの正答: 1 / 4 ツールありの正答: 4 / 4 呼び出し回数: 0回 と 4回
1件だけ正解しているところが厄介です。営業時間は変わっていないので、覚えている値がそのまま正しかっただけになります。
本当の問題は誤答の件数ではありません。どの項目が変わったかを本人が知らないまま、4件とも同じ調子で答えてくることです。
受け取る側からは区別がつきません。「担当者は田中です」と返ってきたとき、それが確認した結果なのか記憶なのかは文面から読み取れないためです。
ツールを渡した側は4回の呼び出しが発生しています。1項目につき1往復です。正しさと引き換えに、時間と費用が増えます。
変わっていない項目だけが正解する。当たったのは偶然に近い。
Tool use lets Claude call functions that you define or that Anthropic provides.原文Claude Platform Docs「Tool use with Claude」 この内容の有効期限2027-02-17
使える機能の一覧を先に渡し、必要だと判断したときにAIから呼び出させます。呼ぶかどうかを決めるのはAI側です。
ツール利用は、AIに使ってよい機能の一覧を渡し、必要に応じて呼ばせる仕組みです。在庫を調べる、メールを送る、計算するといった機能を登録しておきます。
質問と一緒に、使えるツールの一覧を渡します。AIは必要だと判断すると、答えを返すかわりにどのツールをどんな引数で呼びたいかを返します。呼び出した結果をもう一度渡すと、それを踏まえた答えが返ってきます。
ですから1つの質問に答えるまでに、最低でも2往復が必要になります。
ここが設計上の要点です。Anthropicの説明でも、依頼の内容とツールの説明文をもとに、いつ呼ぶかをモデルが決めるとされています。こちらが呼ばせるのではありません。
つまり説明文の書き方が動作を左右します。何を受け取り何を返すのかが曖昧だと、呼ぶべき場面で呼ばれないことがあります。
同じ文書には、ツールの違いは主にコードがどこで実行されるかにあるとも書かれています。自分で定義したものは自分の側で、提供元が用意したものは提供元の側で動きます。
実装していて効いたのは、ツールの説明文を人向けの仕様書ではなく、呼ぶ側への案内として書くことでした。「在庫を返す」ではなく「商品IDを受け取り、現在の在庫数を整数で返す。取り寄せ中は0を返す」と書くと、呼ばれ方が安定します。ツールを整理して管理する話はツールレジストリの記事で扱っています。
Claude determines when to call a tool based on the user's request and the tool's description.原文Claude Platform Docs「Tool use with Claude」 この内容の有効期限2027-02-17
読み取りから始めます。書き込みや送信を渡す場合は、実行できる範囲を先に絞ってください。
ツール利用で渡す範囲は、間違って呼ばれたときに何が起きるかで決まります。呼ぶかどうかを決めるのはAI側なので、間違いは起きる前提で考えます。
3番目と4番目を渡すときは、実行環境の側で範囲を絞るのが確実です。指示で禁じる方法は守られたかどうかを後から確認できません。
範囲を絞る仕組みはサンドボックス実行の記事で、人の承認を挟む構成はHITLの記事で扱っています。
ツールを増やすほど、どれを呼ぶかの判断が難しくなります。特に役割の似たツールを複数渡すと、迷いが出ます。
対策は数を絞ることと、重なりをなくすことです。「顧客を検索する」と「顧客を名前で探す」を両方置かず、どちらかにまとめてください。
ツールを渡しても呼ばれないことがあります。そのとき記憶から答えてしまうと、この記事の最初の結果に戻ります。
ですから「確認できなかった場合はその旨を答える」と指示しておくか、呼ばれたかどうかを実装側で確認してください。
間違って呼ばれても困らないものから渡していく。
Tools differ primarily by where the code executes.原文Claude Platform Docs「Tool use with Claude」 この内容の有効期限2027-02-17
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る