同一份摘要提示词,gpt-4o 返回 180 字,gpt-4o-mini 返回 720 字,两边 temperature 都是 0,max_tokens 都给 1024,人工看内容都对,但前端卡片高度差了一屏。
一开始怀疑是「提示词只说了「简要」,没有字数上限」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。temperature 0 只是贪心解码,不保证两模型行为一致。少数情况下是两个模型的默认 stop 与训练偏好不同。
少数情况下是mini 模型倾向复述原文,长模型倾向归纳。
动手时先把输出长度分布统计出来再决定约束方式
python -c "import json;ds=[json.loads(l) for l in open('out.jsonl')];print(min(len(d['t']) for d in ds),max(len(d['t']) for d in ds))"
提示词里给出字数区间并附一个示例
python run_batch.py --prompt prompts/summary_v4.txt --model gpt-4o-mini
然后用 max_tokens 做硬上限并在截断时标记
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d '{"model":"gpt-4o-mini","max_tokens":220,"temperature":0,"messages":[{"role":"user","content":"用 150 到 200 字概括"}]}'
剩下的就是对超出区间的结果做二次压缩再入库
python shorten.py --in out.jsonl --max-chars 220
别只看报错消失,验证要多做一步。两个模型的输出都落在 150 到 220 字之间,前端卡片不再跳动,截断标记为 false 的比例超过 98%。
补一句。把长度约束写进提示词只是软约束,真正兜底要靠 max_tokens 加后处理,别把格式稳定寄托在 temperature 上。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
