首页/AI/大模型部署与运维速查/presence/frequency penalty:出现次数惩罚
推理参数与优化50 条

presence/frequency penalty:出现次数惩罚

两个按出现次数调节 logits 的惩罚:presence_penalty 只在 token 出现过时施加固定调整,frequency_penalty 随出现次数线性累计;常见范围 -2~2。

两个惩罚在做什么

presence_penalty 与 frequency_penalty 都按 token 的历史出现情况调节 logits:前者只在某个 token 已经出现过时施加一次固定调整,后者随该 token 出现次数线性累计。两者都不看概率大小,只看出没出过、出了几次,所以对「反复念叨同一句话」这一类问题最直接。

基本信息

presence_penalty出现过就扣固定分
frequency_penalty按出现次数线性累加
常见范围-2 ~ 2
负值含义方向相反,鼓励重复
区别对象repetition_penalty(整体惩罚)

典型使用场景

  • 长文生成里抑制口头禅与固定转场句
  • 客服回复避免反复复述同一句话
  • 代码生成减少重复片段与冗余注释
  • 多轮对话中防止每次回答结构千篇一律
  • 批量生成文案时,避免每篇的开头与结尾句式雷同
  • 把被压下去的高频词列出来人工确认,防止误伤关键术语

Python SDK 片段

Python SDK 片段
r = client.chat.completions.create(
    model="<模型名>",
    messages=[{"role": "user", "content": "继续写一段故事"}],
    presence_penalty=0.3,
    frequency_penalty=0.3,        # 重复更严重时优先加这一项
    temperature=0.8,
)
print(r.choices[0].message.content)

三个去重手段对比

参数调整方式适用
presence_penalty出现过即扣分压制反复出现的句式
frequency_penalty按次数累加压制高频词堆叠
repetition_penalty整体惩罚部分框架的替代实现
与 repetition_penalty 机制不同(出现次数 vs 整体惩罚):一般取其一使用,叠加之后效果难以归因。
取值偏大时会误伤标点与常见虚词,输出变得生硬甚至语句破碎;调参时重点观察输出里的高频词有没有被连带压下。
两者的差别可以这样理解:presence 管「有没有出现过」,frequency 管「出现了多少次」。同一任务里先调其中一个,确认有效再考虑另一个。
惩罚只作用于采样分布,不改变模型对上下文的理解:如果重复的根源在提示词或上下文结构,光加惩罚只能压住表面。

易错点

  • 把负值当无效:负惩罚方向相反、鼓励重复,去重实验里写错符号会得出相反结论
  • 数值给到 2 附近:正常高频词一起被压,输出生硬甚至语句破碎
  • 与 repetition_penalty 叠加使用:两套机制互相作用,效果无法归因
  • 只在一段文本上试:不同任务对重复的容忍度不同,要在业务评测集上确认
  • 只看最终完整文本判断去重效果:流式输出过程中的重复容易被漏掉
  • 在要求术语严格一致的任务上开高惩罚:专有名词被压制后,输出反而出现代称与错称

数据来源与参考

  • OpenAI API 参考:frequency_penalty / presence_penalty(platform.openai.com/docs)
  • vLLM 官方文档:SamplingParams(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌