同一个模型、同一句 prompt,为什么有时严谨有时放飞?答案在解码策略:模型每步输出的是词表上的概率分布,如何从分布里选下一个 token 由温度、top-k、top-p 等参数决定。本文把每个旋钮的物理含义与调参直觉讲清。

生成即逐步采样

自回归生成每步做同一件事:模型给出词表概率分布 → 解码策略选一个 token → 拼入上下文 → 下一步。贪心(永远选概率最大)只是策略之一;采样类策略在”确定性”与”多样性”之间提供连续可调的光谱。

温度(temperature):分布的锐化旋钮

采样前对 logits 除以 T 再 softmax:

  • T → 0:分布无限锐化,退化为贪心——最确定、最保守,也最容易重复与呆板
  • T = 1:模型原始分布
  • T > 1:分布拉平,低概率词机会变大——更发散、更有”创意”,也更容易胡话

直觉:温度不改变概率排序,只改变差距。T=0.3 时 Top1 几乎必中;T=1.5 时第 20 名的词也有机会上台。

top-k:候选池硬截断

只从概率最高的 k 个词中采样,其余置零:

  • k=1 即贪心;k=40 表示每步在 40 个候选里抽签
  • 缺陷:k 是静态的——分布平坦时(该发散时)40 个太少,分布尖锐时(该确定时)40 个太多(尾部垃圾词混入)

top-p(nucleus sampling):候选池动态截断

按概率从高到低累加,达到累积阈值 p 即截断(如 p=0.9:候选集=凑够 90% 概率质量的最小词集):

  • 分布尖锐时候选集自动变小(甚至 1-2 个词)→ 确定
  • 分布平坦时候选集自动变大 → 多样
  • 动态自适应是 top-p 优于 top-k 的核心,今天的主流默认

重复惩罚类:压制车轱辘话

  • repetition_penalty / frequency_penalty:对已出现过的 token 降权,惩罚系数 >1 抑制复读
  • presence_penalty:出现过即固定降权
  • 场景:长文本生成、代码补全中防循环;过强会导致”不敢用常用词”的怪异文风

组合配方(按任务类型)

任务 温度 top-p 重复惩罚 理由
代码/数学/事实问答 0-0.2 1.0 默认 要确定性与正确率
摘要/抽取/改写 0.2-0.4 0.9 略加 忠实原文,少发挥
通用对话 0.6-0.8 0.9-0.95 默认 自然与稳定平衡
创意写作/脑暴 0.9-1.2 0.95 加 要多样性与意外
批量去重采样(self-consistency) 0.7-1.0 0.95 默认 多次采样投票需独立性

原则:温度与 top-p 通常只调一个(两者作用重叠,同调易失校准);API 默认值多为对话场景优化,代码类任务记得手动压到 0 附近。

其他解码策略速览

  • beam search:保留 k 条最优序列并行扩展,翻译/摘要时代的主流;成本高、多样性差,聊天场景已被采样取代
  • min_p:按 Top1 概率的比例设下限(Top1 的 10% 以下全剔除),比 top-p 更抗”分布异常平坦”的崩坏步
  • best-of-n / 重排序:采样 n 条用裁判模型选最佳——用算力换质量的上限玩法

调参实验方法

固定 seed 对比会掩盖采样差异(同 seed 同结果);正确做法:固定 prompt、变参数、每配置采样 10-20 条,人工或 LLM 裁判评多样性与质量均值——解码策略是分布级属性,单条对比无统计意义。

解码策略是模型与用户之间的最后一层创作权:温度管锐度、top-p 管候选池、惩罚管复读。理解每个旋钮在概率分布上做了什么,”调参”就从玄学变成对分布形状的主动 sculpting。