同一份摘要提示词,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 上。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189