Skip to content

Chapter 6 · 用解码控制约束输出形态

Schema 控制结构,解码参数控制风格。这一章涵盖温度、top_p、max_tokens、repetition_penalty 这一组"采样器旋钮"。

Item 16:事实性任务 temperature=0;生成性任务 top_p=0.9

一个旋钮的功能是决定模型说话的多样性,不是它的智力。

核心

事实问答(QA、SQL、JSON 抽取)必须 temperature=0——否则同样问题两次答案不一致,无法做评估。创造性任务(文案、对话、剧本)需要随机性,这时用 top_p=0.9temperature=1 更稳——nucleus sampling 把尾部低概率噪声砍掉,保留高质量随机性。

Things to Remember

  • temperature=0 是事实任务的默认值,不要因为"想看模型创造力"就开高。
  • 创造任务用 top_p=0.9(Holtzman 2019),不要用 top_k——后者对长尾不灵敏。
  • 任何评估必须固定温度 + seed + model version。

Item 17:用 max_tokens 与 Schema maxLength 双闸防失控长度

一个 LLM 能写 10 个字,也能写 10 万个字——除非你拦住它。

核心

不设上限的 LLM 会写出从 100 字到 10000 字方差极大的回答。max_tokens 是硬截断,Schema maxLength 是字段级软约束,两者结合才能稳定控制长度。Length-Controlled AlpacaEval(arXiv:2404.04475)证明 verbosity bias 是个普遍且严重的评估失真——不控长度,连胜率都信不过。

Things to Remember

  • 永远设 max_tokens,宁可截断也不要放任。
  • Schema 字段级 maxLength 是字段长度的最后防线。
  • 评估比较时用 length-controlled metric(LC win-rate)。

Item 18:repetition_penalty 与 no_repeat_ngram 防退化

长生成的死循环不是 bug,是默认行为。

引子

Holtzman 2019(arXiv:1904.09751)揭示了一个反直觉事实:最大化概率的解码策略(greedy / beam search)最容易退化为重复。原因:模型在高概率区间下倾向于"重新走一次刚才走过的路径",这条路径在一开始概率最高就会反复被选中。修复方法是 nucleus sampling + repetition penalty + n-gram blocklist 三件套。

反例 vs 正例

python
# Bad
generate(prompt, max_new_tokens=2000)  # 默认 greedy + beam
# → "...对此我深表歉意。对此我深表歉意。对此我深表歉意。..."

# Good
generate(prompt, max_new_tokens=2000,
         do_sample=True, top_p=0.9,
         repetition_penalty=1.1, no_repeat_ngram_size=3)

Things to Remember

  • 长生成(> 500 tokens)必加 repetition_penalty=1.05–1.2 + no_repeat_ngram_size=3-5
  • repetition_penalty 过高(> 1.3)会破坏代码生成(合法变量复用被惩罚)。
  • 核心指标:长度 vs 重复率曲线——画出来再调参。

Effective LLM