Temperature、Top-p、Top-k:模型输出的“性格旋钮“
Temperature、Top-p、Top-k:模型输出的"性格旋钮"
前置阅读:Token 大模型眼中的世界、Transformer 与 Attention
这篇讲清楚一组最常被调、又最常被调错的参数:Temperature、Top-p、Top-k。它们决定了同一个模型是"严谨学究"还是"天马行空诗人"。
一、先回到模型输出的本质
每一次大模型生成下一个 token 时,背后做的事其实是:
- 对词表里所有可能的 token算一个概率分布。
- 按某种规则从这个分布里挑一个作为输出。
举个简化例子:模型看到"今天天气真",它内部计算出的下一个 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 不是"模型聪明度"调节器,而是"它愿不愿意冒险说话"的旋钮——你要稳就把它拧低,你要野就把它拧高。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)