一句话定义
重复惩罚(repetition penalty)与频率惩罚(frequency penalty)是解码(decoding)阶段的采样参数:模型每吐一个 token(词元)前,会看它在已生成的文本里出现过没有,把"出现过"当成减分项,压低它的分数,从而减少复读、打转和车轱辘话。
它们到底改了什么
生成是一个 token 一个 token 往前推的。每一步,模型先给词表里每个 token 打一个原始分(logit),归一化成概率,再抽样。惩罚做的事,就是在归一化之前动这些分数:
- 重复惩罚:按固定比例除/乘一个系数,是乘法式惩罚。出现一次和出现十次,力度一样。
- 频率惩罚:减去「系数 × 出现次数」,出现越多扣越狠,线性累加。
- 存在惩罚(presence penalty):只要出现过就固定扣一笔,与次数无关。
打个比方:开选题会。重复惩罚是"这个点子提过,发言音量减半";频率惩罚是"每提一次,音量再降一档";存在惩罚是"提过就扣一次分,后面不再累积"。
| 参数 | 何时扣分 | 扣多少 | 典型用途 |
|---|---|---|---|
| 重复惩罚 | 该 token 出现过 | 固定比例 | 通用对话、减轻复读 |
| 频率惩罚 | 出现过,按次数累加 | 越多扣越多 | 长文续写、避免用词单调 |
| 存在惩罚 | 只要出现过 | 固定值 | 换角度、换话题 |
别和 temperature 搞混
temperature、top-p 调的是"随机程度"——敢不敢选低概率词;惩罚调的是"方向"——往没说过的地方偏。两者都作用在 logits 上,会互相放大或抵消,不同框架里应用顺序也不完全一致,具体以所用框架的官方文档为准。
还有个容易忽略的点:惩罚按 token ID 计算,模型并不懂语义。"中国"和"中""国"是不同 token,罚谁不罚谁,跟意思无关。
对实际工作的意义
好处很直接:写文案、头脑风暴、长文续写时,能明显减少"总而言之……总而言之……"、列表无限循环、同一批形容词反复出现。
代价更值得记住:
- 常用虚词、标点、固定搭配被压,句子变得别扭;
- 写代码时变量名、函数名、括号被改写,直接跑不通;
- 翻译、摘要、结构化输出(比如生成 JSON)时,本该重复的字段名、引号被"改邪",输出坏掉;
- 人名、专有名词、数字反复出现时容易被替换或吞掉。
实践建议:从很小的值起步,一次只动一个参数。很多接口的重复惩罚默认值相当于不生效,频率惩罚默认为 0,实际可用区间以官方页面为准。如果模型在复读,先检查提示词是不是含糊、有没有设好停止条件,别把惩罚当万能药。对代码、JSON、翻译这类场景,通常宁可不加。
