先把当时的情况摆出来。用 tiktoken 的 cl100k_base 按 512 token 切块,换成 qwen 模型后同样的块被服务端判成 700 token,直接超限报错。
原因不止一个,得分开看。不同模型的词表不同,中文切分差异明显。还有一种是用 GPT 的编码去估其它模型的长度。
另外,块里混了代码与中文,比例不同差异被放大。少数情况下是服务端还要额外计算消息包装的开销。
动手时先用目标模型的 tokenizer 重量一遍
python -c "from transformers import AutoTokenizer;t=AutoTokenizer.from_pretrained('Qwen/Qwen2-7B');print(len(t('中文测试'*100)['input_ids']))"
接着按最严格的口径缩小块长
python -c "print(int(512*0.7))"
然后把 tokenizer 名称写进切分配置
python -c "print({'chunk_size':400,'tokenizer':'Qwen/Qwen2-7B'})"
剩下的就是抽块做两种口径的比值对比
python -c "print(round(700/512,2))"
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
别只看报错消失,验证要多做一步。目标模型下每块 token 数都在 400 以内,不再出现超限报错,切块数量增加但召回质量不降。
多模型混跑时按最严格的那个定块长,否则换模型那天就会踩到上限。这类问题最好一次改到位,反复小改反而容易把原因搅混。
