system 提示词写到 9000 字,模型开始不遵守最前面的格式规则,日志里 prompt_tokens 只有 5200,实际发出去的内容被网关砍掉了后半段。
一开始怀疑是「模板里有重复段落,白占大量预算」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。网关对单字段长度有上限,超出部分静默丢弃。另一种情况是客户端用字符串截断而不是 token 截断,切在句子中间。
少数情况下是硬性规则放在最前面,正好是优先被截掉的部分。
量 system 的真实 token 数
python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode(open('sys.txt',encoding='utf-8').read())))"
再往下查网关的字段长度限制
curl -s http://127.0.0.1:8080/metrics | findstr -i max_body
接着找出模板里的重复段落
python -c "s=open('sys.txt',encoding='utf-8').read();print(len(s.split(chr(10))),len(set(s.split(chr(10)))))"
等前面都确认过,再把硬性格式要求移到用户消息附近
python -c "print({'messages':[{'role':'system','content':'摘要'},{'role':'user','content':'格式要求'}]})"
别只看报错消失,验证要多做一步。请求的 prompt_tokens 与文件 token 数误差小于 3%,格式规则稳定生效,网关日志里不再出现截断计数。
长提示词要按重要性排序,越靠前越容易被各种截断策略砍掉,硬约束最好靠近用户消息。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
