Local / Edge実践ガイド

llama.cppで会話が崩れるときはchat templateを確認する

llama.cppで会話が崩れるときはchat templateを確認する
目次

llama.cppでチャットをしたとき、「user」「assistant」といった役割名まで出力される、systemの指示が効かない、会話の区切りが崩れる、といった症状が出ることがある。

この場合、モデルそのものの能力だけでなく、メッセージをモデル向けの文字列へ変換するchat templateが合っているかを確認する。

chat templateは会話をモデル向けの形式へ変換する

チャットAPIでは、systemuserassistantといった役割付きのメッセージを、そのモデルが想定する入力形式へ変換してから渡す。

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のメタデータと使用中のテンプレートを確認する
  • 同じメッセージを使い、テンプレートの条件だけを変えて出力差を見る
  • テンプレートを上書きする場合は、モデル配布元が案内する入力形式を先に確認する

公式サイトで次に進む

この記事で明示的に扱うソフトだけを表示します。配布・手順は各公式ページで確認してください。

local-gen.jpがファイルを配布するものではなく、互換性を保証するものでもありません。

同じテーマから

この記事で扱ったデータ

モデル・GPU・実行ソフトの確認済みデータを、記事とは別に確かめられます。

サイト内検索