先看现象。百度千帆 ERNIE-4.5-8K 的 v2 接口做合同摘要,输入用 tiktoken 估是 7.8k,返回错误码 336501,原文 input tokens exceed the limit of 8192,把正文砍到 6k 就通了。

把日志和配置对完,能解释这个现象的基本就这几处。8192 是输入加输出的总预算,还要留出回答的空间。少数情况下是千帆对中文标点和数字的计数比 cl100k 更高。

少数情况下是system 提示与多轮历史一起计入,不只是本次正文。

不容易想到的是,重试时把上一次的完整 prompt 又拼了一次。

动手时先用接口返回的 usage 核对真实输入量

curl -s https://qianfan.baidubce.com/v2/chat/completions -H "Authorization: Bearer $QIANFAN_KEY" -H "Content-Type: application/json" -d @short.json | jq '.usage'

接着按 6k 输入加 1k 输出重切正文

python split_contract.py --max-input-tokens 6000 --reserve 1024 --file contract.txt

随后分段摘要后再做一次汇总,避免整篇进上下文

python map_reduce.py --parts parts/ --out summary.md

等前面都确认过,再把 max_output_tokens 明确写进请求体

python -c "import json;d=json.load(open('req.json'));d['max_output_tokens']=1024;json.dump(d,open('req.json','w'))"

恢复的判定其实很直接。接口返回 200,usage 里 prompt_tokens 与 completion_tokens 之和小于 8192,长合同也能拿到完整摘要。

各家 tokenizer 口径不同,估出来的数字只能当参考,真正要盯的是响应里的 usage;预算要把输入和输出一起算,否则刚好卡在边界上照样报错。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189