チャットテンプレート(Jinja形式)
チャットテンプレートは、system / user / assistant という「会話」を、そのモデル固有の特殊トークン列に組み立てる規則です。モデルは会話という概念をそのまま受け取るわけではなく、この規則で1本のテキストに変換されたものを読んでいます。記述形式として使われているのがPython圏のテンプレート言語Jinjaで、Hugging Faceのモデルにある chat_template.jinja というファイルの正体がこれです。
実物を見る — モデルごとに違う
たとえばQwen系が使うChatML形式では、会話はこう組み立てられます:
<|im_start|>system
あなたは親切なアシスタントです。<|im_end|>
<|im_start|>user
こんにちは<|im_end|>
<|im_start|>assistant
Llama系は <|start_header_id|> 系の別のタグを使い、Gemma系もまた別です。instructモデルは「このテンプレートで組んだ入力」で学習されているため、違う組み方をすると学習時と条件がずれて素の性能が出ません。テンプレートがモデルごとに配布されるのはこのためです。
どこに入っているか
- Hugging Face:
tokenizer_config.jsonのchat_templateフィールド、または独立ファイルchat_template.jinja - GGUF: ファイル内のメタデータとして埋め込み(llama.cpp系はここから読む)
- Ollama: 例外的にJinjaではなくGo言語のテンプレート形式に書き直したものをModelfileに持つ
普段はOllamaやLM Studioが自動適用してくれるので、ユーザーが意識する必要はありません。
壊れるとどうなるか — 不調の定番原因
意識が必要になるのはおかしくなったときです。テンプレート不一致の典型症状は3つ:
<|im_end|>のようなタグが返答にそのまま漏れる- 止まるべき所で止まらず自問自答を続ける(停止トークンのずれ)
- ツール呼び出しが一度も発火しない(ツール指示の組み込みはテンプレートの仕事)
llama.cppに --jinja というフラグがあるのは、GGUFに埋め込まれたテンプレートをJinjaとして厳密に解釈するためで、ツール呼び出しを使う場合は実質必須です。LM Studioでモデルが暴走するときも、モデル設定のプロンプトテンプレート欄を確認するのが定石です。
当サイトとの関係
判定ツールが扱う「載るか」はVRAM容量の話ですが、「載ったのに変な出力になる」相談の多くはここが原因です。量子化版を配布するミラーによってはテンプレートの埋め込みが古い・欠けていることもあるため、挙動が怪しいときは公式リポジトリのテンプレートと見比べるのが近道です。
関連用語
- トークンとトークナイザー — LLMが文章を数える単位。日本語は英語よりトークン効率が悪く、体感速度にも効く
- ベースモデルとInstructモデル — 「-Instruct」が付く方が対話用。素のベースモデルは指示に従わない
- ツール利用(function calling / MCP / スキル) — 汎用モデルに検索・コード実行・API操作などの「手順」を外付けする仕組み。ローカル小型は苦手
- Ollama — ローカルLLMを1コマンドで動かせる定番の無料ソフト
参考資料(出典)
- https://huggingface.co/docs/transformers/chat_templating
- https://jinja.palletsprojects.com/
- https://github.com/ggml-org/llama.cpp
▶ あなたのPCで動くモデルを自動判定する(スペック送信なし・ブラウザ内完結)
上記はアフィリエイトリンクです。経由して課金された場合、当サイトに紹介料が入ります。