← AIバイブコーディングTips 一覧へ Quality / Tool Schema Defense

モデルが賢くなるほど、ツール呼び出しは雑になる?

自前でツール定義やMCPサーバーを実装しているなら他人事ではない。新しいClaudeモデルほど、独自スキーマにない項目を勝手に発明して壊れたtool callを出す——という逆説的な報告があった。

この記事で手に入るもの

「賢いモデルほど安全」という前提を疑う理由と、自前のツール定義を壊されないための検証・拒否・再試行ループ、スキーマ設計を寄せる方向の考え方。

01 — 何が起きているか

新しいモデルほど、スキーマにない項目を発明する

コーディングツール「Pi」の開発者Arminが報告した現象が、Simon Willisonのブログ「Better Models: Worse Tools」で紹介されている。新しいClaudeモデル(Opus 4.8、Sonnet 5)は、より古いモデルよりもPiの独自編集ツールに対して壊れた呼び出しを出しやすいという。

具体的には、ネストされたedits[]配列の中に、スキーマに存在しない項目を勝手に追加して呼び出してくる。Piはこれをスキーマ違反として拒否し、モデルに再試行を要求する仕組みになっているため実害は防げているが、「新しいモデル=より信頼できる出力」という前提が崩れているのがそのまま観測できる事例だ。


02 — なぜ起きるか

「賢さ」ではなく「学習の的」がズレている

Arminの仮説は、モデルの知能低下ではなく、強化学習の対象が変わったことにある。

01

組み込みツールへの特化学習

新しいClaudeモデルは、Claude Code組み込みの編集ツール——search and replace方式——に対して強化学習で強く最適化されている可能性が高い。組み込みツールの成功パターンに寄りすぎた結果、それ以外の形をしたツール定義への汎化が弱くなった。

02

自前スキーマは「未知の形」として扱われる

Piの独自編集ツールは、Claudeが慣れた search and replace の形と微妙に違うネスト構造を持つ。モデルにとってはこれが「見慣れない形」であり、慣れた形に寄せようとして存在しない項目を発明してしまう、という説明がつく。

03

ベンダーごとに「得意な形」が違う

対比としてOpenAI Codexはapply_patchという別方式のメカニズムを持つ。つまり「正解の編集ツール形状」はベンダーごとに異なり、自前ツールがどちらの形にも似ていなければ、どちらのモデルでも同じ問題が起こりうる

ここが核心。モデルのバージョンが上がるたびに、賢さは上がってもツール呼び出しの正確さが上がるとは限らない。強化学習が最適化した対象(組み込みツールの形)から外れるほど、逆に崩れやすくなる。


03 — 実装への教訓

自前のツール定義・MCPサーバーをどう守るか

元記事はこの現象を報告するに留め、明確な解決策までは示していない。ただ、自分でツール定義やMCPサーバーを実装している側からすると、翻訳できる教訓ははっきりしている。

01

検証→拒否→再試行のループを必ず持つ

Piがそうしているように、スキーマ外の項目は黙って受け入れず、エラーとして突き返して再試行させる。壊れた呼び出しをそのまま処理してしまう実装は、モデルが賢くなるほど危険になる。

02

スキーマの形状を「モデルが慣れた形」に寄せる

独自のネスト構造を発明するより、search and replaceのような広く学習されている形に寄せられないか検討する。奇抜な設計であるほど、モデル側の「見慣れた形に寄せたい」圧力で崩れやすい。

03

モデルを更新するたびに、拒否ログを監視する

使っているモデルのバージョンを上げた直後は、スキーマ違反で拒否した回数が増えていないかをログで確認する。壊れた呼び出しの増加は、性能向上の裏で静かに起きるドリフトとして現れる。


04 — 自分の運用に当てはめる

持ち帰れる3点

独自のツール定義・MCPサーバーを持っているなら、次のモデル更新で同じことが起こりうる。

「新しい=安全」を前提にしないモデルのバージョンが上がっても、ツール呼び出しの正確さが上がるとは限らない。検証は毎回必要。
拒否→再試行の設計を先に作るスキーマ外の項目を黙って通さない。壊れた呼び出しを弾く仕組みが、更新に対する唯一の防波堤になる。
モデル更新時は拒否ログを見る「賢くなった」だけで済ませず、拒否件数の変化という具体的な数字で確認する。