记录一下那天晚上的排查过程。加载自己微调过的模型,请求 chat/completions 返回 400,原文 Jinja template error: unexpected end of template,用 transformers 的 apply_chat_template 本地渲染却没问题。

刚开始盯着「同时存在 tokenizer_config 与独立模板文件,取了错的那份」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。模型目录里的 chat_template.json 被手工改坏,少一个 endfor。另一种情况是模板里有 vLLM 不支持的 Jinja 扩展写法。

少数情况下是模板依赖的变量名与请求传入的字段不一致。

本地渲染一次确认模板本身是否合法

python -c "from transformers import AutoTokenizer;t=AutoTokenizer.from_pretrained('./m');print(t.apply_chat_template([{'role':'user','content':'hi'}],tokenize=False))"

随后看服务端到底加载了哪份模板

grep -o 'chat_template[^,]*' vllm.log | head

显式指定模板文件再起服务

vllm serve ./m --chat-template ./chat_template.jinja --port 8000

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

怎么算真的好了,看的是同一批现象。请求返回 200,返回内容符合模板规定的格式,日志里不再出现 Jinja 报错。

模板文件和配置里的模板同时存在时优先级不直观,出问题就用参数显式指定,比猜优先级快得多。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189