Local / Edge実践ガイド
llama.cppで会話が崩れるときはchat templateを確認する

目次
llama.cppでチャットをしたとき、「user」「assistant」といった役割名まで出力される、systemの指示が効かない、会話の区切りが崩れる、といった症状が出ることがある。
この場合、モデルそのものの能力だけでなく、メッセージをモデル向けの文字列へ変換するchat templateが合っているかを確認する。
chat templateは会話をモデル向けの形式へ変換する
チャットAPIでは、system、user、assistantといった役割付きのメッセージを、そのモデルが想定する入力形式へ変換してから渡す。
llama.cppはこの変換にchat templateを利用する。GGUFに含まれるメタデータや、llama.cpp側で選択されたテンプレートが関係する。
モデルの知識や推論能力とは別の処理なので、会話形式だけがおかしいときは先にここを切り分ける。
最初に再現条件を保存する
まず、問題が出た条件を記録する。
llama.cppのバージョン・コミット:
GGUFファイル:
モデル配布元:
送ったmessages:
実際の出力:
llama.cppを更新するとテンプレート処理が変わる可能性があるため、モデル名だけでなく実行環境のバージョンも残す。
GGUFのメタデータを確認する
GGUFにchat template関連のメタデータが含まれている場合、llama.cppがその情報を利用できる。
まず使用中のGGUFにテンプレート情報があるかを確認する。情報が見つからない場合は、似た名前のモデルから推測して設定するのではなく、モデル配布元のモデルカードやリポジトリで推奨形式を確認する。
自動選択と上書きを分けて試す
llama.cppが自動的に選んだテンプレートで会話が崩れる場合は、モデル配布元が示す形式と一致しているかを見る。
別のテンプレートを上書きして試すときは、temperatureやコンテキスト長などほかの条件を同時に変えない。
messages: 同じ
モデル: 同じ
生成設定: 同じ
chat templateだけ変更
という比較にすると、テンプレートの違いが原因か判断しやすい。
raw promptでも切り分ける
モデル配布元が示す正しい入力形式を、chat templateを介さず文字列として与えられる場合は、その結果も比較材料になる。
正しい形式を直接与えた場合は正常に答え、自動チャットだけ崩れるなら、テンプレート変換が原因の候補になる。
一方、正しい入力形式でも同じ質問に答えられないなら、モデルの能力、コンテキスト、生成設定など別の原因を確認する。
まず「モデルに何が渡ったか」を見る
chat templateの問題では、設定を大量に変えるより、同じメッセージが最終的にどの文字列へ変換されているかを見る方が早い。
会話形式の問題とモデル能力の問題を分けて確認すれば、テンプレートの不一致だけを理由にモデル自体を交換する必要も減らせる。
JSON形式の出力を安定させたい場合は、別の層の機能としてllama.cppでGBNF・JSON Schemaを使う方法を確認できる。
まとめ
- chat templateはsystem・user・assistantなどのメッセージをモデル向けの入力形式へ変換する仕組み
- 会話形式が崩れたときは、すぐにモデルの能力不足と判断せずGGUFのメタデータと使用中のテンプレートを確認する
- 同じメッセージを使い、テンプレートの条件だけを変えて出力差を見る
- テンプレートを上書きする場合は、モデル配布元が案内する入力形式を先に確認する
公式サイトで次に進む
この記事で明示的に扱うソフトだけを表示します。配布・手順は各公式ページで確認してください。
llama.cpp
local-gen.jpがファイルを配布するものではなく、互換性を保証するものでもありません。
この記事で扱ったデータ
モデル・GPU・実行ソフトの確認済みデータを、記事とは別に確かめられます。