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.9 比 temperature=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 重复率曲线——画出来再调参。