🧠AI LLM 基础

采样参数与输出控制

面试回答

常见问法

温度、top-p、max tokens 这些推理参数分别起什么作用?

回答

温度主要控制随机性,越高越发散;top-p 控制候选词的累计概率范围,限制采样空间;max tokens 控制输出长度和成本。它们本质上是在”稳定性、创造性、成本”之间做权衡。

# 采样参数使用示例
import torch

def generate_with_params(model, input_ids, 
                        temperature=0.8, 
                        top_p=0.95, 
                        max_tokens=100):
    """
    使用不同采样参数生成文本
    
    温度=0.2: 确定性高,适合问答系统
    温度=0.8: 创造性高,适合写作任务
    top-p=0.9: 限制90%概率质量的候选词
    max_tokens: 控制输出长度和成本
    """
    outputs = model.generate(
        input_ids,
        do_sample=True,
        temperature=temperature,
        top_p=top_p,
        max_new_tokens=max_tokens,
        pad_token_id=model.eos_token_id
    )
    return outputs

# 温度对生成多样性的影响
low_temp_prompt = "写一个关于夏天的故事"
high_temp_prompt = "发挥创意,写一个奇幻的夏天故事"

# 低温度:确定性输出
low_temp_output = generate_with_params(model, low_temp_prompt, temperature=0.2)

# 高温度:创造性输出  
high_temp_output = generate_with_params(model, high_temp_prompt, temperature=0.8)

追问

  • 为什么温度调高后更容易胡说?(低概率token被采样)
  • top-p 和 top-k 有什么差别?(累积概率 vs 固定数量)
  • 线上系统为什么常常需要对输出长度做硬限制?(成本控制)

原理展开

模型先给出每个 token 的概率分布,采样参数决定如何从这个分布里挑下一个 token。温度会改变分布陡峭程度,top-p 会裁掉尾部低概率候选,max tokens 则直接限制生成步数。

实际工程里,这些参数不只是”生成质量”问题,还会影响接口延迟、token 成本和产品稳定性。越开放的采样通常越适合创作型任务,越保守的采样越适合问答和生产系统。

# 手动实现top-p采样
def top_p_sampling(logits, top_p=0.95):
    """
    Top-p采样实现
    
    1. 按概率排序
    2. 累积概率达到top_p
    3. 只从这些token中采样
    """
    probs = torch.softmax(logits, dim=-1)
    sorted_probs, sorted_indices = torch.sort(probs, descending=True)
    
    # 累积概率
    cumulative_probs = torch.cumsum(sorted_probs, dim=-1)
    
    # 找到top_p对应的阈值
    threshold_idx = torch.searchsorted(cumulative_probs, top_p)
    threshold_prob = sorted_probs[threshold_idx]
    
    # 过滤低于阈值的token
    mask = probs >= threshold_prob
    filtered_logits = logits.masked_fill(~mask, float('-inf'))
    
    # 从过滤后的分布中采样
    filtered_probs = torch.softmax(filtered_logits, dim=-1)
    sampled_idx = torch.multinomial(filtered_probs, 1)
    
    return sampled_idx

# 温度对分布的影响
def apply_temperature(logits, temperature):
    """
    温度调节
    
    temperature < 1: 分布更尖锐(确定性更强)
    temperature > 1: 分布更平滑(创造性更强)
    """
    return logits / temperature

易错点

  • 认为单独调一个参数就能稳定解决所有输出问题
  • 不区分模型能力问题和采样策略问题
  • 忽略参数组合的效果(如高温度+低top-p可能不稳定)

记忆技巧

记住采样三要素:

  1. 温度 = “控制随机性”(0.2-0.8范围)
  2. top-p = “概率质量限制”(0.9-0.95范围)
  3. max tokens = “长度和成本控制”

典型应用场景:

  • 问答系统:低温度+高top-p+适中长度
  • 创作任务:高温度+中top-p+较长长度
  • 代码生成:低温度+高top-p+精确长度