ローカルLLMで「なんだか回答がおかしい…」って時、原因の8割はプロンプトテンプレートの間違いだ。各モデルには決まった会話フォーマットがあって、これがずれるとモデルは迷子になる。
このフォーマットの違いを知らずに、3日間「なんでこのモデル、こんなにバカなんだ?」って悩んだことがある。原因はLlama 3モデルにAlpaca形式でプロンプトを投げてただけ。フォーマットを直した瞬間、モデルが突然賢くなった。
主要なプロンプトテンプレート:
- ChatML(OpenAI系)
<|im_start|>system あなたは優秀なアシスタントです。<|im_end|> <|im_start|>user こんにちは<|im_end|> <|im_start|>assistant
- Llama 3
<|begin_of_text|><|start_header_id|>system<|end_header_id|> あなたは優秀なアシスタントです。<|eot_id|> <|start_header_id|>user<|end_header_id|> こんにちは<|eot_id|> <|start_header_id|>assistant<|end_header_id|>
- Alpaca(古いモデルで多い)
### System: あなたは優秀なアシスタントです。 ### User: こんにちは ### Assistant:
- Mistral(シンプル)
<s>[INST] こんにちは [/INST]
Ollamaは内部的にテンプレートを持ってるから、基本的に気にしなくていい。でもllama.cppを直接使うときや、APIを叩くときは自分でテンプレートを指定する必要がある。
プロンプトテンプレートの自動判別。HuggingFaceのモデルカードに書いてあるし、GGUFファイルのメタデータにもテンプレートが埋め込まれてる。`ollama show ` で確認可能。
このテンプレート問題、慣れれば大したことないけど、最初は本当に沼。僕みたいに「モデルがアホ」と勘違いしないように注意してほしい。