问题出现得很突然,日志倒是留得挺全。transformers 4.44 加 Qwen2.5-7B-Instruct,history 里存了两条连续的 user,apply_chat_template 报 Conversation roles must alternate user and assistant。

刚开始盯着「历史裁剪从中间切断,首条变成 assistant」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。用户连续发两条消息,中间没有 assistant 回复。另一种情况是工具结果被当成 user 追加在 user 之后。

另外,模板开头补了 system,但模型模板只允许一条。

先打印历史的角色序列

python -c "import json;h=json.load(open('h.json'));print([m['role'] for m in h])"

然后合并相邻同角色消息

python merge_roles.py --in h.json --out h2.json

再往下用模板渲染确认结构

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

首条角色单独校验

python -c "import json;print(json.load(open('h2.json'))[0]['role'])"

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

别只看报错消失,验证要多做一步。模板渲染成功,首条是 user,消息严格交替,生成结果与合并前语义一致。

提醒一点。交替规则由模板强制,不是模型偏好,合并相邻同角色消息比伪造一条空回复干净。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189