Appearance
Temperature & Sampling Strategies
LLM 生成文本时并非确定性过程——它们在每个时间步从概率分布中采样下一个 token。Temperature 和 采样策略(Top-K、Top-P、Beam Search 等)决定了这个概率分布的形状,进而控制输出的随机性、多样性和准确性。理解这些参数是调优 LLM 应用的核心技能。
基础原理:自回归语言建模
在每个生成步骤,LLM 输出一个在词汇表上的概率分布:
P(token | 已生成的文本)贪心解码(Greedy Decoding):每次选择概率最高的 token。确定性强、可重复性高,但容易生成朴素和重复的文本。
采样解码(Sampling Decoding):从概率分布中随机抽样 token。生成多样化、有创造性的文本,但可能产生不连贯或无意义的输出。
采样策略的核心就是在这两个极端之间寻找平衡。
Temperature
Temperature 是最基础的采样调节参数,通过对 logits 进行缩放来改变概率分布的 "峰值程度"。
数学表达
P(token_i) = exp(z_i / T) / Σ_j exp(z_j / T)其中 z_i 是模型输出的第 i 个 token 的 logit,T 是 temperature。
不同 Temperature 的行为
| Temperature | 效果 | 适用场景 |
|---|---|---|
| T = 0 | 等效于贪心解码,只选最高概率 token | 数学计算、代码生成、标准化问答 |
| T = 0.1–0.3 | 非常确定,几乎总是选最佳选项 | 事实性任务、抽取、分类、摘要 |
| T = 0.5–0.7 | 适度多样性,仍保持合理 | 对话、平衡创造性和准确性 |
| T = 1.0 | 模型原始概率分布,无修饰 | 脑暴、创意写作、探索性任务 |
| T > 1.0 | 概率分布趋向均匀,随机性大增 | 脑暴、故事创作、生成异类想法 |
| T > 2.0 | 几乎均匀随机选择,输出很快变得无意义 | 仅用于特殊实验或探索 |
直观理解
- 低 Temperature → 概率分布变得尖锐,高概率 token 更突出,低概率 token 被压制——"安全"、"保守"
- 高 Temperature → 概率分布变得平坦,几乎所有 token 都有机会被选中——"大胆"、"创新"
Top-K Sampling
在采样时只考虑概率最高的 K 个 token,将其余 token 的概率置为零,然后重新归一化。
python
# 伪代码
sorted_probs = sort(probs, descending=True)
top_k_probs = sorted_probs[:K]
top_k_probs = top_k_probs / sum(top_k_probs)
sample from top_k_probs| K 值 | 效果 |
|---|---|
| K = 1 | 等效于贪心解码 |
| K = 5–20 | 极度确定,适合代码和数学 |
| K = 40–60 | 平衡,OpenAI 模型默认约在此区间 |
| K = 100+ | 较多样性,适合创意写作 |
缺点:K 是固定值。在某些时刻模型对某几个 token 非常确定(如结束符号),在其他时刻则比较模糊。固定 K 无法适应这种动态变化。
Top-P (Nucleus Sampling)
解决 Top-K 的缺点。不固定选多少个 token,而是选择概率累计达到 P 的最小 token 集合。
python
sorted_probs = sort(probs, descending=True)
cumulative = cumsum(sorted_probs)
min_k = argmin(cumulative >= P)
top_p_tokens = sorted_probs[:min_k]例如 P = 0.9 表示:只从概率累计占 90% 的最佳 token 中采样。如果某个时刻前两个 token 已经占了 95%,只选 2 个;如果前 50 个 token 才累计到 90%,则选 50 个。
| P 值 | 效果 |
|---|---|
| P = 0.1 | 非常保守,几乎确定性 |
| P = 0.5 | 保守但有一定多样性 |
| P = 0.9 | 平衡,OpenAI/Anthropic 默认 |
| P = 0.95–1.0 | 多样性高,创意任务 |
实践建议:大多数场景下,Top-P 比 Top-K 更灵活,效果更好。可以结合使用(如 Top-K=40 + Top-P=0.9)。
Beam Search
不是单步采样,而是维护一个由 B 个假设(beams)组成的集合,每步扩展并保留最优的 B 条路径。
步骤 1: 生成 B 个最佳第一个 token
步骤 2: 每个 beam 扩展为 B 个后续,保留全局最优的 B 条路径
...
步骤 N: 选择全局最优路径| B 值 | 效果 |
|---|---|
| B = 1 | 等效于贪心解码 |
| B = 4–10 | 显著提升质量,适合翻译、摘要 |
| B > 20 | 收益递减,计算成本高昂 |
优点:在需要最优解的任务上(机器翻译、摘要、代码补全)表现最好。
缺点:生成的文本通常比较朴素和可预测,多样性差。计算量大(线性增长于 beam 宽度)。
其他采样策略
Repetition Penalty(重复惩罚)
降低已在之前文本中出现过的 token 的采样概率,减少重复和循环。
P'(token) = P(token) / ρ 如果 token 已出现
P'(token) = P(token) 如果 token 未出现- ρ = 1.0: 无惩罚
- ρ = 1.1–1.2: 温和惩罚,适用于大多数场景
- ρ > 1.5: 强惩罚,可能导致输出不自然
Frequency Penalty & Presence Penalty (OpenAI 风格)
- Frequency Penalty:根据 token 在已生成文本中的出现次数降低其概率(线性惩罚)
- Presence Penalty:只要出现过就降低概率,不管次数(二元惩罚)
Min-P Sampling
设置最小采样概率阈值,只采样概率高于阈值的 token。简单但有效的方法来过滤低信心度选项。
Contrastive Search / Contrastive Decoding
通过对比模型预测和简单 n-gram 模型预测,优先选择模型确信且不容易被简单模型预测的 token,在保持流畅性的同时增加多样性。
实践参数配方
常见任务的推荐设置
| 任务类型 | Temperature | Top-P | Top-K | 重复惩罚 | 说明 |
|---|---|---|---|---|---|
| 代码生成 | 0.0–0.1 | 0.1–0.5 | 1–10 | 1.05–1.1 | 极度确定,避免语法错误 |
| 数学推理 | 0.0 | 0.0 | 1 | 1.0 | 必须贪心,确保步骤正确 |
| 事实问答 | 0.0–0.3 | 0.1–0.5 | 5–20 | 1.0–1.05 | 保持确定,减少幻觉 |
| 摘要 | 0.0–0.3 | 0.1–0.5 | 10–20 | 1.05–1.1 | 确保覆盖关键信息 |
| 翻译 | 0.0–0.3 | 0.1–0.5 | 5–15 | 1.05 | Beam Search 效果更好 |
| 对话/客服 | 0.5–0.7 | 0.7–0.9 | 40–60 | 1.05–1.1 | 自然且一致性 |
| 脑暴/创意 | 0.7–1.0 | 0.9–1.0 | 50–100 | 1.0–1.05 | 充分多样性 |
| 故事创作 | 0.8–1.2 | 0.95–1.0 | 80–100+ | 1.0–1.05 | 鼓励创新和惊喜 |
| 角色扮演 | 0.6–0.9 | 0.8–0.95 | 40–80 | 1.05 | 保持角色一致但不朴素 |
API 提供商的默认值
| 提供商 | 默认 Temperature | 默认 Top-P | 备注 |
|---|---|---|---|
| OpenAI | 1.0 | 1.0 | 推荐调整 temp 而非 top_p |
| Anthropic | 1.0 | 未公开 | Claude 更依赖 temp |
| 未公开 | 未公开 | Gemini 提供丰富参数控制 | |
| 本地模型 (vLLM) | 1.0 | 1.0 | 通常支持完整参数集 |
进阶话题
自适应采样 (Adaptive Sampling)
一些研究探索根据模型的不确定性动态调整 temperature:
- 当模型对下一个 token 很确定时,降低 temperature(如语法结构位置)
- 当模型不确定时,提高 temperature(如创意写作节点)
多样性 vs 质量的矛盾
低 temperature 和 beam search 可以提升质量,但会降低多样性。一些经验法则:
- 对于有标准答案的任务(代码、数学),优先追求质量
- 对于无标准答案的任务(创作、脑暴),优先追求多样性
- 对于 RAG 和实时应用,平衡两者,并通过重排序提升最终输出质量
Relationships
- 相关概念:LLM Evaluation、Model Inference & Deployment、AI Agents、Retrieval Augmented Generation
- 工具实践:vLLM、TGI、llama.cpp 等推理框架均支持完整的采样参数集
- 与其他调优方法的关系:Model Quantization 影响推理速度和质量,采样参数影响输出特性
Open Questions
- 是否存在 "理想的自适应采样策略",能够根据任务和上下文自动选择最佳参数组合?
- 对于推理模型(如 o3、DeepSeek-R1),temperature 设置是否仍然有意义,还是让位于思维链的确定性?
- 多 token 预测(speculative decoding、Medusa、Eagle)与传统采样策略如何协调?
- 针对非英语和多语言生成,采样参数的效果是否一致?