一句话定义: DRY 采样(Don't Repeat Yourself sampling)是一种解码策略:当候选 token(词元)会让当前片段变成之前出现过的 n-gram(连续 n 个 token)时,就按重复长度给它降权,从而抑制复读。
原理:打“复读机”,不打常用词
模型写“我们要降本增效,我们要降本增效……”时,频率惩罚(frequency penalty)像统计“我们”出现多少次,出现多就罚;存在惩罚(presence penalty)更粗,只要出现过就压。它们容易误伤必要的“的、了、the、and”。
DRY 不看单个词频,而看“这段搭配是不是又来了”。每生成一步,它把候选 token 和上文末尾拼成不同长度的 n-gram,去更早文本里找相同片段。重复长度没到允许值就放过;超过后,重复越长,惩罚越重。比如“降本增效”重复只是轻推,整句“我们要降本增效”重复就罚得更狠。它不像禁止重复 n-gram(no_repeat_ngram_size)那样“见过一次就拉黑”,也不像频率惩罚那样把常见词全压扁。换行、冒号、引号等“序列分隔符”(sequence breakers)会切断匹配,避免把列表格式、JSON 括号当成复读。
| 方法 | 依据 | 风格 | 常见副作用 |
|---|---|---|---|
| 频率惩罚 | token 出现次数 | 软惩罚 | 高频常用词、专名被误伤 |
| 存在惩罚 | token 是否出现过 | 软惩罚 | 较粗糙,只鼓励新词 |
| 禁止重复 n-gram | 固定长度片段出现过就禁 | 硬约束 | 生硬,破坏必要重复 |
| DRY 采样 | 已出现 n-gram,越长罚越重 | 软约束 | 参数太强会削弱合理重复 |
和相邻概念的区别
重复惩罚(repetition penalty)通常对已出现 token 统一压 logits(模型输出分数),简单但一刀切;DRY 按“重复了多长”给软惩罚,更像人类说“你又复读了”。要绝对禁止重复片段,用 no_repeat_ngram_size;要自然、别啰嗦,DRY 更合适。
实际意义
写长文、多轮对话、RAG 摘要时,模型容易循环。DRY 提供细旋钮:惩罚倍率、底数、允许长度、惩罚窗口、分隔符。参数太强会压掉诗歌副歌、合同条款、代码里的必要重复。不同推理框架是否支持、参数名和默认值不同,以官方页面为准。
普通用户遇到复读,可先找“重复惩罚/DRY”设置;没有就调 temperature、top_p,或提示“不要重复上一段”。复读常和模型、上下文、提示词有关,单个参数不是万能药。
