问题出现得很突然,日志倒是留得挺全。社群数据清洗时按字符数估 token,实际调用老是超限,统计发现含 emoji 的一句话二十个字符被算成六十多个 token,中文生僻字也按多字节回退。
刚开始盯着「按 UTF-8 字节数估会高估普通中文」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。emoji 在词表里被拆成多个 token。也可能是生僻字不在常用表里 按字节回退。
还有一种情况,不同模型的词表差异很大。
动手时先用真实分词器抽样统计
python -c "import tiktoken;e=tiktoken.get_encoding('o200k_base');print(len(e.encode('你好🙂👨👩👧')))"
接着按文本类型分组算平均系数
python token_stats.py --in sample.jsonl --group has_emoji
然后把系数写进预估函数
python estimate.py --coef-emoji 1.8 --coef-cn 0.7
剩下的就是对超限样本做一次真实调用校准
python calibrate.py --n 200 --model gpt-4o-mini
别只看报错消失,验证要多做一步。预估与真实 usage 偏差在 5% 以内,含 emoji 的样本不再触发超限。
容易忽略的是,字符数只是粗略代理,emoji 和组合字符会被切成很多片,做预算要用目标模型的分词器实测。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
