著者:清丸寛一
概要
このたび、LLM-jp-4 シリーズの Thinking モデルの量子化を行いました。量子化モデルは Hugging Face にて Apache-2.0 ライセンスのもと公開しています。
- https://huggingface.co/llm-jp/llm-jp-4-8b-thinking-gguf
- https://huggingface.co/llm-jp/llm-jp-4-32b-a3b-thinking-gguf
使用方法
量子化モデルの標準ランタイムである llama.cpp を用いた使用方法を llm-jp-4-cookbook に記載しています。使用方法についてはこちらをご確認ください。
⚠️ 2026年6月22日現在、通常の llama.cpp では LLM-jp-4 のチャットテンプレートの解析に失敗するため動作しません。上述の cookbook を参照し、LLM-jp が修正を加えた llm-jp/llama.cpp をご使用ください。
量子化方法
llama.cpp を使用し、Q4_K_M 形式に量子化しました。この際、事後学習(教師あり学習)のフェーズで使用した学習データの一部を用いて重要度行列(iMatrix)を計算し、量子化に利用しました。
公開リポジトリには量子化時に使用した重要度行列も含めています。Q4_K_M 以外の形式に再量子化する際などにご活用ください。
性能評価
LLM-as-a-Judge の枠組みで、4つの評価ベンチマークで性能評価を行いました。
- MT-Bench(JA):日本語のマルチターン対話におけるタスク解決能力を評価するベンチマーク。
- MT-Bench(EN):英語のマルチターン対話におけるタスク解決能力を評価するベンチマーク。
- AnswerCarefully:日本語における安全性を評価するためのベンチマーク。
- llm-jp-instructions:人手で作成されたシングルターンの質問応答ペアからなるデータセット。
評価モデルには gpt-5.4-2026-03-05 を使用しました。スコアは評価を3回行ったときの平均です。
| モデル | MT-Bench (JA) | MT-Bench (EN) | AnswerCarefully | llm-jp-instructions |
| llm-jp-4-8b-thinking | 7.54 | 7.79 | 3.69 | 3.54 |
| llm-jp-4-8b-thinking Q4_K_M | 7.57 | 7.66 | 3.71 | 3.58 |
| llm-jp-4-32b-a3b-thinking | 7.82 | 7.86 | 3.70 | 3.61 |
| llm-jp-4-32b-a3b-thinking Q4_K_M | 7.51 | 7.89 | 3.74 | 3.70 |
量子化前後で概ね同等の性能を維持できることが確認できます。
サードパーティモデルとの比較
LLM-jp-4 の量子化モデルとして、いくつかのサードパーティモデルが公開されています。一方で、それらの量子化モデルを検証したところ、オリジナルモデルと挙動が異なる点があることが確認されました。
トークナイズの不一致
一つ目は、オリジナルモデルとトークナイズが異なることです。現在特にダウンロード数が多い mmnga-o 製の量子化モデルと alfredplpl 製の量子化モデルにおいてこの問題を確認しています。
具体例として、以下の文字列を考えます。
<|start|>assistant<|channel|>final<|message|>こんにちは
この度公開した LLM-jp 製の量子化モデルでは以下の分割が得られます。これはオリジナルモデルによる分割と一致しています。
['<|start|>', '▁assistant', '<|channel|>', '▁final', '<|message|>', '▁こんにちは']
一方で、mmnga-o 製の量子化モデルでは以下のように異なる分割結果が得られます。
['<|start|>', 'assis', 'tan', 't', '<|channel|>', 'final', '<|message|>', 'こん', 'にち', 'は']
alfredplpl 製の量子化モデルでも、オリジナルモデルとは異なる分割が行われます。
['<|start|>', 'ass', 'ist', 'ant', '<|channel|>', 'final', '<|message|>', 'こん', 'にち', 'は']
このようなトークナイズの不一致は、学習時と推論時でモデルに与えられるトークン列が変わることを意味し、性能低下に繋がる可能性があります。
語彙操作による空白の挿入・欠落
二つ目は、チャットテンプレート通りの出力が得られるように語彙を操作することによって、不要な空白が挿入されたり必要な空白が欠落したりすることです。この問題は mmnga-o 製の量子化モデルで確認しています。
LLM-jp-4 の Thinking モデルはチャットテンプレートとして OpenAI の Harmony Response Format を採用しています。このフォーマットでは、<|start|>user<|end|> のような形でメッセージの役割や出力チャンネル、本文などを構造的に表現します。しかし、LLM-jp-4 の出力トークン列を素朴に文字列に戻す(脱トークン化する)と、トークナイザの仕様により、特殊トークンの直後に不要な空白が挿入され、このフォーマットから逸脱します。例えば、<|start|>user<|end|> という文字列をトークン化して得られるトークン列 ['<|start|>', '▁user', '<|end|>'] を脱トークン化すると <|start|> user<|end|> となり、user の前に元々存在しなかった空白が挿入されます。ここで ▁ は空白を明示的に扱うためのメタ記号です。
この問題を対処するために、一部のサードパーティモデルでは、チャットテンプレート中で使用される語彙を操作しています。例えば、user と ▁user の語彙 ID を入れ替えることで、脱トークン化時に user の前に空白が挿入されることを回避し、チャットテンプレート通りの出力が得られるようにしています。
しかしこの方法には副作用があります。語彙 ID を入れ替えると、チャットテンプレート中の文字列だけでなく、通常の生成テキストに含まれる同じ語彙の振る舞いも変わります。その結果、本来必要な空白が欠落したり、反対に不要な空白が挿入されたりします。例えば、元々の語彙であれば The user asks ... と脱トークン化されるトークン列をモデルが生成する時、user と ▁user の語彙 ID を入れ替えていると、Theuser asks ... として脱トークン化され、必要なスペースが欠落します。
LLM-jp では、語彙を操作するのではなく、ランタイムである llama.cpp の実装に修正を加えることでこの問題を解決しています。修正版の llama.cpp 実装は Github にて公開しています。
サードパーティモデルの性能評価
特にダウンロード数が多い mmnga-o 製の量子化モデルと alfredplpl 製の量子化モデルについて、MT-Bench による性能評価を行いました。
| モデル | MT-Bench (JA) | MT-Bench (EN) |
| llm-jp-4-8b-thinking | 7.54 | 7.79 |
| llm-jp-4-8b-thinking Q4_K_M (LLM-jp) | 7.57 | 7.66 |
| llm-jp-4-8b-thinking Q4_K_M (mmnga-o) | 7.20 | 7.62 |
| llm-jp-4-8b-thinking Q4_K_M (alfredplpl) | 7.28 | 7.34 |
MT-Bench による評価では、サードパーティによる量子化モデルにおいてオリジナルモデルからの一定の性能低下が確認されました。この差は、上述したトークナイズの不一致に加え、重要度行列の使用有無や、重要度行列の計算に使用するキャリブレーションデータの違いなどに由来している可能性があります。
まとめ
LLM-jp-4 シリーズの Thinking モデルの量子化を行い、Hugging Face にて公開しました。今回公開した量子化モデルが LLM-jp-4 の評価・検証・応用を進めるための一助となれば幸いです。
LLM-jp の活動に興味を持たれた方はこちらのページからぜひご参加ください!