现场是这样的。提示词仓库里 v12 和 v13 用 diff 看只差一个空格,v13 在「输出格式」前多敲了一个。上线后同一批 200 条评测样本的平均输出长度从 420 token 涨到 560 token,摘要任务的截断率从 1% 升到 9%,试过把 temperature 从 0 调到 0.3 结果只是波动更大。
中间走过弯路,把「输出长度统计把思考过程的 token 也算进去了」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。空格改变了分段结构,模型把后面的说明当成同一段的延续;提示词末端空白让缓存前缀对不上,两个版本各自走不同分支;评测样本里有三成本身就接近截断边界。
第一件事是用字节级 diff 找出真正的差异
git diff --word-diff=porcelain v12.txt v13.txt
去掉行尾空白后重新渲染两个版本
python -c "import re;[open(f,'w').write(re.sub(r'[ \t]+$','',open(f).read(),flags=re.M)) for f in ['v12.txt','v13.txt']]"
接着对同一批样本跑两次并统计 token 数
python -c "import json;print(sum(r['usage']['completion_tokens'] for r in map(json.loads,open('run13.jsonl')))/200)"
剩下的就是把最大输出长度调高一档再观察截断率
python -c "print('max_tokens 768 -> 1024')"
别只看报错消失,验证要多做一步。去掉多余空白后 v13 的平均输出长度回到 425 token 附近,截断率降到 2%,与 v12 的差在正常波动范围内。
容易忽略的是,提示词版本管理要按行做规范化,行尾空格和全角空格都会改变模型对段落的判断,diff 只显示「一行有改动」时最容易被忽略。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
