用 llama.cpp b4000 加载自己量化的 qwen2 7B,问中文问题它回一堆带特殊符号的英文,温度调到 0 也只是把乱码固定下来,机器是 16G 内存的笔记本。

一开始怀疑是「上下文窗口设得过小,指令被截断只剩系统段」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。GGUF 的词表与模型权重不是同一次转换产物。少数情况下是量化时用了错误的 tokenizer 配置,特殊 token 编号错位。

不容易想到的是,模板未启用,模型没收到对话格式的包装。

第一件事是用内置对话模式启动再问一次

./llama-cli -m qwen2-7b-q4_k_m.gguf -p "你好" -cnv -ngl 99

然后检查词表大小与模型配置是否一致

python -c "import gguf;r=gguf.GGUFReader('m.gguf');print(r.fields['tokenizer.ggml.model'])"

剩下的就是换成官方发布的 GGUF 做对照

./llama-cli -m official-q4_k_m.gguf -p "你好" -cnv

恢复的判定其实很直接。中文问答能给出通顺回答,特殊 token 不再出现在输出里,同一提示在官方 GGUF 与自转文件上表现一致。

乱码优先怀疑词表和模板,再是量化精度,别先去调温度,参数救不回错位的词表。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189