Gemma 4のチャットテンプレートのツール呼び出しバグを見つけて修正した話

Reddit r/LocalLLaMA / 2026/4/29

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical Usage

要点

  • 著者は、Gemma 4のデフォルトのチャットテンプレートが `anyOf: [$ref, null]` のようなJSON Schemaパターンで定義されたツールパラメータを誤って扱い、モデルに渡る前にスキーマの型情報が失われることを突き止めました。
  • この不具合は、JSON Schemaにトップレベルの `type` が存在せず、有用な構造が `anyOf` や `$ref`、`$defs` の中にある場合に起きるようです。
  • Qwen 3.5とGemma 4の実行ログを解析した結果、著者はチャットテンプレートのJinjaを少し変更してツールのスキーマが正しくレンダリングされるように修正しました。
  • 著者はHugging Faceの `google/gemma-4-31B-it` にPRを提出し、さらにJinjaを拡張して `$ref`、`anyOf/oneOf/allOf`、`$defs`、`enum/const`、nullable型、配列のitemsやオブジェクトのpropertiesなど多くのJSON Schema要素を保持するようにしました。

TLDR: 一般的なJSONスキーマのパターン `anyOf: [$ref, null]` を使ったツールのパラメータは、プロンプトに `type` フィールドが空の状態としてレンダリングされます。これにより、モデルが見る前に有用なスキーマ情報が削ぎ落とされます。

--

長い、やや冗長なバージョン:

Gemma 4 は、>3 個の推論エンジンで私のカスタム MCP ツールを呼び出す際に問題がありました。一方で Qwen3.5 と gpt-oss-20b は問題なく動いていました。

チャットテンプレートの問題か、あるエッジケースにおける推論ライブラリの問題のどちらかだと考えました。そして、多くの人が Gemma 4 をエージェントとして満足していたので、時間が解決してくれるだろうと思っていました。

しかし少なくとも 2 週間は直りませんでした。仕方なく、自分で調査する必要がありました。

やったこと:

  1. llama-server を使って、macbook pro 上で Qwen3.5-27B-Q4_K_M と gemma-4-31B-it-Q4_K_S に対し、同じプロンプト/ツールを実行し、冗長なログファイルを作成しました。
  2. codex CLI で GPT-5.5-high にログを読み、問題を診断させました。
  3. 数分で見つかりました。デフォルトの Gemma チャットテンプレートは、ツールのパラメータに直接 `type` フィールドがある前提になっています。つまり、nullable な参照のような JSON スキーマ形状とは動きません:

{"anyOf": [{"$ref": "#/$defs/SomeObject"}, {"type": "null"}]}

ここではトップレベルの type がありません。有用な構造は anyOf と $defs の中にあります。テンプレートは anyOf、$ref、$defs を落としてしまい、結果として type: "" としてレンダリングされます。

  1. チャットテンプレートの jinja に小さな変更を入れることで修正でき、これで Gemma は私のツールを完全に呼び出せるようになりました!

とにかく、HF に PR を出しました。google/gemma-4-31B-it です。

<UPDATE>

私は、直接トップレベルの type で意味を公開しない多くの JSON スキーマ形状に起因する問題のうちの 1 つだけを解決したのだと気づきました。そこで、jinja を次の点に対応するよう更新しました:

これで jinja は次を保持します:

- $ref

- anyOf

- oneOf

- allOf

- $defs

- enum

- const

- type: ["string", "null"]

- 配列/オブジェクトを含む型の配列に対する items / properties

- null 値を null

修正済みの jinja:
https://pastebin.com/tBAHN6FV

submitted by /u/EntertainmentBroad43
[link] [comments]