Temperature、Top-p、Top-k:模型输出的"性格旋钮"

前置阅读:Token 大模型眼中的世界Transformer 与 Attention
这篇讲清楚一组最常被调、又最常被调错的参数:Temperature、Top-p、Top-k。它们决定了同一个模型是"严谨学究"还是"天马行空诗人"。

一、先回到模型输出的本质

每一次大模型生成下一个 token 时,背后做的事其实是:

  1. 对词表里所有可能的 token算一个概率分布。
  2. 按某种规则从这个分布里挑一个作为输出。

举个简化例子:模型看到"今天天气真",它内部计算出的下一个 token 概率可能是:

"好"      → 0.50
"不错"    → 0.25
"晴朗"    → 0.10
"糟糕"    → 0.05
"奇怪"    → 0.03
... 其他几万个 token,概率各占小数

最终输出哪一个?这取决于"采样策略"。

Temperature、Top-p、Top-k 就是控制这一步的三个旋钮。

在这里插入图片描述

二、Temperature:分布的"温度"

Temperature(温度)= 控制概率分布的"陡峭程度"。

数学上,模型在 softmax 时把每个 token 的 logits 除以 T,再算 softmax:

P ( t ) = e z t / T ∑ i e z i / T P(t) = \frac{e^{z_t / T}}{\sum_i e^{z_i / T}} P(t)=iezi/Tezt/T

直觉上:

  • T 趋近 0:分布变得极其陡峭——最高概率那个 token 几乎 100% 拿走全部概率。输出趋于确定、保守、稳定。
  • T = 1:模型原始分布。正常水平。
  • T 趋近 2:分布被压平——所有 token 概率被拉近,冷门 token 也有机会被抽到输出趋于随机、奇特、甚至胡言乱语。

继续上面的例子:

Temperature 分布近似 输出特征
0.0 “好” 99%,其他几乎 0 几乎每次都输出"好"
0.7 “好” 60%,“不错” 25%,“晴朗” 10%…… 主流答案,偶有变化
1.0 模型原始分布(“好” 50% ……) 自然多样
1.5 “好” 30%,“晴朗” 15%,连"糟糕"都有 8% 更有"创造力",也更易翻车
2.0 各 token 概率被严重拉平 经常输出莫名其妙的内容

怎么选 Temperature

场景 推荐 T
数学、代码、抽取、分类 0 ~ 0.3
普通问答、客服 0.3 ~ 0.7
写作、创意、头脑风暴 0.7 ~ 1.2
让模型刻意"野"一点(小说、诗) 1.0 ~ 1.5
1.5 以上 基本不用——容易胡说

经验法则:要稳,就压低;要花,就拉高。没把握就给 0.7。

三、Top-k:只在"前 k 名"里挑

Top-k = 每次生成时,只考虑概率排名前 k 的 token,剩下的全部归零,再在 k 个里按概率采样。

例子(k=3):

原始分布:
  "好"   50%
  "不错" 25%
  "晴朗" 10%
  "糟糕"  5%
  ...

Top-3 后:
  "好"   50/85 ≈ 59%
  "不错" 25/85 ≈ 29%
  "晴朗" 10/85 ≈ 12%
  其他   0%

效果:屏蔽掉所有冷门候选——模型不会突然蹦出一个奇怪的词。

Top-k 的优缺点

  • 优点:简单粗暴,能稳住"完全离谱"的输出。
  • 缺点k 是固定数字,不管分布多陡多平都用同一个 k——分布平坦时 k 太小会过度限制,分布陡峭时 k 太大又没起作用。

所以工程上很少单独用 Top-k,更多是和 Top-p 配合或被 Top-p 替代。

四、Top-p(Nucleus Sampling):按"累积概率"动态截断

Top-p = 把 token 按概率从高到低排,累加到 p(如 0.9)就停下来,只在这部分里采样。

例子(p=0.9):

"好"   50%   累积 50%
"不错" 25%   累积 75%
"晴朗" 10%   累积 85%
"糟糕"  5%   累积 90% ← 到这停下
其他剩下的 token,全部不参与

效果:

  • 分布陡峭时("好"占 90%),可能只考虑 1-2 个 token。
  • 分布平坦时(每个候选都不到 5%),会自动考虑很多 token。

Top-p 是"动态版 Top-k"——根据分布形状自动决定考虑多少候选。

这是它比 Top-k 更聪明的地方,也是为什么主流 API 默认用 Top-p。

怎么选 Top-p

场景 推荐 Top-p
严谨任务(代码、数学) 0.1 ~ 0.5
普通对话 0.7 ~ 0.9
创意写作 0.9 ~ 1.0
1.0 等价于不裁剪,全分布参与

五、三个参数的关系

实际上它们是叠加生效的——大多数 API 是这样的执行顺序:

原始分布
   ↓
1. Top-k 截断(只留前 k 个)
   ↓
2. Top-p 截断(再留累积达到 p 的)
   ↓
3. 用 Temperature 调整剩余分布的陡峭度
   ↓
4. 按调整后的分布采样

实务上不需要三个全开

  • OpenAI / 大多数主流 API:通常只调 Temperature + Top-p
  • HuggingFace 本地推理:可三个都设
  • 常见做法:Top-k 设个保险值(如 50),主要靠 Temperature + Top-p 调

六、其他常见的"采样旋钮"

除了三巨头,工程里还有几个有用的:

Frequency Penalty(频率惩罚)

同一个 token 在已生成内容里出现得越频繁,下一次抽中它的概率就被压得越低。

用途:避免模型反复重复同一个词 / 句——比如客服机器人"非常感谢您的咨询、非常感谢您的耐心、非常感谢……"循环。

值域常见 0 ~ 2。0.3 ~ 0.7 是比较稳的设置。

Presence Penalty(出现惩罚)

和 Frequency 类似,但只看"出现过没",不看出现几次
用途:鼓励模型扩展话题——别老围着一个点转。

Repetition Penalty(重复惩罚)

部分开源模型常用,作用类似 Frequency Penalty,直接对已出现 token 的 logits 做除法

Stop Sequences(停止符)

当生成内容里出现某个字符串时,立刻停下。
用途:

  • 让模型在 \n\n 处停(避免它一直写下去)
  • 让 Agent 在 Observation: 处停(ReAct 模式)
  • 让 JSON 在 } 后停

Max Tokens

最大输出长度,超过强行截断。
和成本直接挂钩——按 token 计费的 API 上,max_tokens 是钱包护栏。

Seed

固定随机种子,相同输入 + 相同 seed → 相同输出
用途:调试、可复现实验、对比不同 Prompt 的效果。

七、几个常见误区

1. “Temperature = 0 就能保证完全确定的输出”

不一定

  • API 上的 T=0 通常等价于 greedy(永远取最高概率),但模型推理本身在某些硬件 / 框架下也会有微小不确定性
  • 想真复现,要 T=0 + 固定 seed + 同一硬件 / 同一推理框架

2. “Temperature 越高,模型越聪明 / 有创造力”

前期是,到一定值后就开始胡言乱语
"创造力"和"胡说"在数学上是同一种现象(让低概率 token 有机会被选中),只是程度不同T > 1.5 后基本是负面效果

3. “Top-p 和 Temperature 同时调”

别同时大幅调——它们会互相放大。常见组合:

  • T=0, Top-p=1:完全确定
  • T=0.7, Top-p=0.9:默认配置
  • T=1.2, Top-p=0.95:创意模式

调一个就够,另一个保持默认

4. “推理模型也按这套调”

注意:OpenAI o1 / o3 系列不接受 temperature、top-p 等采样参数——它们内部的"思考"是被训练锁定的。
DeepSeek-R1 / Claude Extended Thinking 接受,但官方建议保持温度较低(0~0.3)——否则推理过程容易跑偏。

5. “结构化输出靠低温度就够”

不够稳。要让 JSON 100% 不错,需要:

  • 低温度 +
  • 明确的 system prompt 规定格式 +
  • Structured Output / Function Call / JSON Mode(API 原生支持的格式约束)

后者在底层强制约束生成空间,比靠温度可靠得多。

八、给不同任务的推荐配置

任务 Temperature Top-p 备注
代码生成 0.0 ~ 0.2 1.0 越准越好
数学解题 0.0 1.0 推理模型则按官方建议
信息抽取 / 分类 0.0 1.0 必须确定
客服问答 0.3 ~ 0.5 0.9 稳重为主,留点自然
翻译 0.3 ~ 0.5 0.9 太低会僵硬
一般对话 / 总结 0.7 0.9 默认值就很好
写作 / 文案 0.8 ~ 1.0 0.95 让它自然些
头脑风暴 / 诗歌 1.0 ~ 1.3 0.95 要"花"一点
调试 / 复现 0.0 + seed 1.0 完全确定

九、小结

  • Temperature:分布的"陡峭度",越低越保守越高越随机
  • Top-k:只看前 k 个候选,简单但僵硬
  • Top-p:动态截断到累积概率 p,比 Top-k 聪明,主流首选。
  • 三者叠加生效:先 Top-k → Top-p → Temperature → 采样
  • 配套旋钮:Frequency / Presence Penalty(防重复)、Stop(断句)、Max Tokens(钱包护栏)、Seed(可复现)。
  • 经验法则:严肃任务低温度、创意任务高温度,Top-p 给 0.9 兜底
  • 推理模型不调采样——交给它自己。

一句话总结:Temperature 不是"模型聪明度"调节器,而是"它愿不愿意冒险说话"的旋钮——你要稳就把它拧低,你要野就把它拧高。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐