按 tiktoken 的 cl100k_base 估算中文工单长度做路由,估算 6000 token 的请求实际 usage 是 9800,路由到 8k 模型直接返回 400 context_length_exceeded。
一开始怀疑是「图片和附件另算,没有计入估算」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。不同模型的分词器不同,cl100k 估中文偏差大。也可能是消息包装和工具定义也占 token。
不容易想到的是,估算后没有留安全余量。
动手时先对比估算值与实际 usage
python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode('设备无法开机 请尽快处理')))"
随后换成目标模型自己的分词器再估
python -c "import tiktoken;e=tiktoken.get_encoding('o200k_base');print(len(e.encode('设备无法开机 请尽快处理')))"
接着在估算值上留 20% 余量再路由
python -c "n=6000;print(int(n*1.2))"
末了把每次的估算偏差写进监控
python -c "print({'est':6000,'real':9800,'ratio':round(9800/6000,2)})"
改完先别撤,确认这几项。留出余量后请求都能落到容量足够的模型,400 归零,监控里估算偏差的中位数是 1.18 倍。
补一句。估算 token 最准的办法是用目标模型的分词器,跨模型套用编码表,中文场景偏差能到三四成。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
