先看现象。用 llama.cpp b4021 加载 qwen2.5-7b-instruct-q4_k_m.gguf,中文输出里的书名号与破折号全变成问号,换成同源的 q8_0 就正常,服务端和客户端都按 UTF-8 处理。
把日志和配置对完,能解释这个现象的基本就这几处。该量化档位在转换时裁剪了词表,生僻标点映射丢失。也可能是采样时的量化误差把 logit 推到错误 token。
还有一种情况,客户端按 GBK 解码了 UTF-8 字节。
另外,chat template 里的特殊符号没有正确转义。
动手时先用官方命令行确认是模型问题还是客户端问题
.\llama-cli.exe -m qwen2.5-7b-q4_k_m.gguf -p 输出一段带标点的中文 -n 64
接着换 q5_k_m 量化对比同一句输出
.\llama-server.exe -m qwen2.5-7b-q5_k_m.gguf --port 8080
然后检查返回字节是否为合法 UTF-8
python -c "import sys;sys.stdin.buffer.read().decode('utf-8');print('ok')"
等前面都确认过,再在客户端固定按 UTF-8 解码响应体
print(response.content.decode('utf-8'))
怎么算真的好了,看的是同一批现象。同一段中文在 q5_k_m 下书名号与破折号完整,客户端解码不再抛异常,连续二十条输出没有问号替换。
量化掉标点多半是词表和 tokenizer 的锅,不是采样参数,先换量化档位验证,别急着调 temperature。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
