这个坑值得记一笔。为了省缓存费用把 600 字输出规范从 system 挪到 user 消息,同一批 200 条测试里格式遵守率从 92% 掉到 61%,模型开始自由发挥字段顺序。

刚开始盯着「多轮对话里 user 指令只出现第一轮」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。指令和用户问题混在一起,权重被稀释;user 消息里前半段是数据,指令埋在中间;缓存前缀变了,旧版本的回答还在被复用。

固定 200 条样本跑遵守率基线

python eval_format.py --set fmt_200.jsonl --model gpt-4.1-mini

再往下把规范放回 system 再跑同一批

python eval_format.py --set fmt_200.jsonl --model gpt-4.1-mini --system rules_v2.txt

接着对比两次的字段缺失与顺序错误

python diff_eval.py --a before.json --b after.json

等前面都确认过,再确认缓存键包含 system 版本

python -c "print('cache_key=model+system_hash+user')"

别只看报错消失,验证要多做一步。规范放回 system 后遵守率回到 93%,200 条样本里字段缺失从 39 条降到 4 条,缓存命中率只下降 6 个百分点。

省缓存的前提是前缀稳定,把规范挪到 user 既破坏缓存又削弱指令;要省就压缩 system 字数,别改它的位置。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189