一句话定义:对比搜索(Contrastive Search)是一种文本生成的解码策略,每一步同时看两件事——候选词的概率高不高、它跟已经写过的内容像不像——在两者之间取平衡,从而既保持连贯、又抑制重复。
它解决什么问题
让语言模型用贪心搜索(Greedy Search)或束搜索(AI 词典:Beam Search">Beam Search)写长文,很容易变成复读机:「我们的产品致力于为用户提供……我们的产品致力于为用户提供……」
这不全是模型笨。Transformer 里不同词的内部向量方向相当接近(术语叫表示空间各向异性),重复内容和上文的相似度天然就高;而概率最大化这个目标本身也在奖励「接着说已经说过的话」——重复句的下一个词几乎必然出现,概率天然高。
打个比方:写年终总结时,最顺口的那句话,往往就是你去年抄过的那句。只看概率,模型就会不断绕回自己的旧句子。
它怎么做
每一步先从概率最高的前 k 个候选词里取一小撮(k 通常只取几个到十几个,用来控制算量),再给每个候选打分:
score = (1 − α) × 概率 − α × 该候选与上文所有词的最大相似度
第二项是惩罚项:候选词在模型内部的向量表示跟已写内容越像,扣分越多。最后胜出的,是那个既大概率合理、又没和上文「撞脸」的词。α 一般取 0 到 1;α = 0 就退化成纯概率最大化,也就是贪心搜索;α 越大越强调别重复,但过大会为了不一样而跑题、句子逻辑变松。
和相邻概念的区别
| 策略 | 有随机性吗 | 选词依据 | 重复问题 |
|---|---|---|---|
| 贪心 / 束搜索 | 无 | 只看概率 | 严重,容易循环 |
| Top-k / Top-p 采样 | 有 | 从截断后的分布里随机抽 | 缓解,但可能跑题、结果不可复现 |
| 重复惩罚 | 无 | 给已出现过的词降权 | 只压「一模一样的词」 |
| 对比搜索 | 无 | 概率 + 与上文的表示相似度 | 连「换个说法的重复」也能压 |
注意最后两行的差别:重复惩罚管的是「这个词刚才出现过没有」,对比搜索管的是「这个词的内部表示跟上文像不像」。所以像「非常好 / 极其出色」这类换汤不换药的重复,前者拦不住,后者能拦。
对实际工作的意义
- 需要稳定、可复现、不啰嗦的输出时,比如客服话术、检索增强生成的摘要、结构化抽取,对比搜索是个好选项:比采样可控,比贪心干净。
- 需要发散创意时它不合适。它没有随机性,同一个输入跑一百遍是同一个结果;做头脑风暴、文案变体得靠采样。
- 代价是慢。每一步都要和上文算相似度,上下文越长越明显;它也不能和随机采样混着用。
- 上手时,主流推理框架(如 Hugging Face Transformers 的 generate)通常把它作为一个解码选项,配两个关键参数:惩罚权重和候选池大小。具体参数名、默认值和取值范围以官方文档为准,别照抄博客里的数字。
一句话记住:贪心看「哪个词最可能」,采样看「哪个词差不多就行」,对比搜索看「哪个词最可能、同时又不像刚说过的话」。
