Skip to content

一个预训练的大型语言模型,其本身仅是一个概率分布的强大拟合器。若要将其转化为能够生成高质量、符合特定需求的文本的工具,则必须依赖于精密的解码策略 (Decoding Strategy)。在 transformers 库中,model.generate 方法正是实现这些策略的核心接口。它提供了一套丰富而复杂的参数,允许开发者对模型的生成过程进行细粒度的控制。

本文的目标是系统性地剖析这些参数,将其从看似杂乱的选项中梳理成一个清晰的逻辑框架。读完本文,您将能够理解确定性解码与随机性解码的本质区别,并学会如何通过组合不同的参数,以满足从精确翻译到创意写作等不同场景的需求。

一、 参数的配置中枢:GenerationConfig

在深入了解具体参数之前,必须先明确它们的管理机制。transformers 库将绝大多数生成相关的配置项都收敛到了一个名为 GenerationConfig 的类中。

  • config.json vs. generation_config.json
    • config.json 存储的是模型架构的静态信息,如隐藏层维度 (hidden_size)、注意力头数 (num_attention_heads) 和词表大小 (vocab_size)。
    • generation_config.json 则专门存储解码行为的默认参数,如 max_lengthnum_beamsdo_sample 等。加载模型时,这个文件中的配置会自动附着在模型对象上,成为 model.generation_config
  • 参数生效的优先级
    transformers 遵循一个清晰的覆盖逻辑,优先级从高到低:
    1. generate 方法的运行时参数:在调用 generate 时直接传入的关键字参数(如 max_new_tokens=100)拥有最高优先级。
    2. 传入的 GenerationConfig 对象:可以创建一个 GenerationConfig 实例,修改后通过 generation_config=... 参数传入 generate
    3. 模型自带的 model.generation_config:即从 generation_config.json 文件加载的默认配置。
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model = AutoModelForCausalLM.from_pretrained("google/gemma-2b-it")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b-it")

# 查看模型默认的生成配置
print(model.generation_config)

# 方法一:运行时覆盖 (最高优先级)
inputs = tokenizer("Describe the theory of relativity in one sentence.", return_tensors="pt")
outputs = model.generate(inputs, max_new_tokens=50, do_sample=False) # 运行时指定不采样

# 方法二:修改并传递 GenerationConfig 对象
custom_config = GenerationConfig.from_pretrained("google/gemma-2b-it")
custom_config.max_new_tokens = 100
custom_config.do_sample = True
custom_config.temperature = 0.7
outputs = model.generate(
inputs, generation_config=custom_config)

二、 解码的两大派系:确定性与随机性

所有解码策略的根源,都始于一个核心参数 do_sample。它像一个总开关,决定了生成过程是确定性的还是随机性的。

2.1 确定性解码 (do_sample=False)

当追求输出的稳定性和可复现性时,应采用确定性解码。在这种模式下,采样相关的参数(如 temperaturetop_p)将全部失效。

  • 贪心搜索 (Greedy Search)
    • 机制:这是最简单的解码策略,在每一步都选择概率最高的 token (argmax) 作为输出。
    • 配置num_beams=1 (默认值) 且 do_sample=False
    • 优缺点:速度最快,但容易陷入局部最优,可能导致生成重复、平庸或不连贯的文本,因为它缺乏对全局序列的考量。
  • 束搜索 (Beam Search)
    • 机制:为了克服贪心搜索的短视问题,束搜索在每一步都会保留 num_beams 个最高概率的候选序列(称为“束”或“hypotheses”)。在下一步,它会基于这 num_beams 个序列进行扩展,并再次从中选出总得分最高的 num_beams 个新序列。这个过程持续进行,直到满足停止条件。
    • 核心配置num_beams > 1
    • 关键关联参数
      • length_penalty:由于对数概率的累加特性,较长的序列总得分会偏低。该参数用于惩罚或奖励长度。大于 1.0 会鼓励模型生成更长的序列,小于 1.0 则会惩罚长序列。对于摘要、翻译等任务,设置一个略大于 1.0 的值(如 1.2)通常能提升质量。
      • early_stopping:控制束搜索的终止时机。当 True 时,一旦找到 num_beams 个已经生成结束符 (eos_token) 的完整序列,搜索就会停止。
2.2 随机性解码 (do_sample=True)

当需要多样化和富有创造性的输出时,应启用随机性解码。此时,模型会在每一步根据 logits 转换的概率分布进行抽样。

  • 温度 (Temperature)
    • 机制temperature 参数用于调整原始 logits 的尺度,从而改变最终概率分布的“形状”。公式为 softmax(logits / temperature)
    • 效果
      • temperature < 1.0:使概率分布更“尖锐”,高概率的 token 变得更加突出,生成结果更趋向于确定性。
      • temperature > 1.0:使概率分布更“平滑”,增加了低概率 token 被选中的机会,生成结果更具多样性和随机性。
      • temperature 趋近于 0 时,采样等价于贪心搜索。
  • Top-K 采样
    • 机制top_k 参数将词汇表的采样范围限制在概率最高的 k 个 token 之内。模型仅在这 k 个候选 token 中进行按概率采样。
    • 效果top_k=50 意味着在每一步,模型都只会从最可能的 50 个词中选择下一个词。这有效避免了采样到非常不合逻辑的“长尾”词汇,但其候选集大小是固定的,不够灵活。
  • Top-P (Nucleus) 采样
    • 机制top_p 参数提供了一种更动态的候选集筛选方法。它选择一个累积概率总和刚好超过 p 的最小 token 集合。
    • 效果:例如,top_p=0.9 意味着模型会从概率最高的词开始累加,直到它们的概率和达到 0.9 为止,然后在这个动态大小的候选集(“核”,nucleus)中进行采样。在概率分布尖锐时,候选集可能很小;在分布平坦时,候选集则会变大。这通常被认为比 Top-K 更优越。

三、 高级控制与策略组合

除了上述核心策略,transformers 还提供了控制重复、长度和组合策略的能力。

  • 重复控制
    • repetition_penalty:一个大于 1.0 的值,用于对已经出现在生成文本中的 token 的 logits 施加惩罚,从而降低其再次出现的概率。
    • no_repeat_ngram_size:一个整数 n,强制要求任何长度为 n 的 n-gram 在生成文本中只能出现一次。这是一个非常强的硬性约束。
  • 策略组合:束搜索采样 (Beam-search Sampling)
    • 配置num_beams > 1 且 do_sample=True
    • 机制:这种混合策略在束搜索的每一步扩展中,不再是确定性地选择 Top-K 候选,而是通过采样(受 temperaturetop_p 等参数影响)来选择下一个 token。
    • 用途:旨在结合束搜索的全局优化能力与采样的多样性,适用于需要高质量且多样化输出的任务。

四、 实践指南:任务与参数配方

任务类型推荐策略核心参数建议解释
翻译、摘要、问答确定性解码do_sample=Falsenum_beams in, length_penalty in [1.0, 1.5]追求事实准确性和忠实度,束搜索能找到更优的全局解。
开放式对话、故事生成随机性解码do_sample=Truetop_p in [0.9, 0.95], temperature in [0.7, 0.9], repetition_penalty ≈ 1.2需要高多样性和创造性,Top-P 采样能动态调整候选集,温度和重复惩罚则能平衡多样性与连贯性。
代码生成随机性解码 (偏保守)do_sample=Truetop_p ≈ 0.9, temperature ≈ 0.6需要一定的创造性来补全代码,但又不能过于发散导致语法错误,因此采用较低的温度。
受控生成确定性或随机性force_words_idsprefix_allowed_tokens_fn 等当需要强制生成特定内容或遵循特定格式(如JSON)时,使用约束解码参数。

五、结语

transformers 的 generate 方法为开发者提供了一个强大的控制台,用以驾驭大型语言模型的生成能力。其核心在于理解确定性(以束搜索为代表)和随机性(以 Top-P/Top-K 采样为代表)两大解码范式。通过 GenerationConfig 统一管理配置,并根据具体任务,策略性地组合 num_beamsdo_sampletemperaturetop_plength_penalty 等关键参数,是实现从“可用”到“优质”文本生成的必经之路。精通这些参数,意味着你真正掌握了与模型进行高效沟通的语言。

持续沉淀企业 AI 技术内容。