温度和 top-p 详解
同一个 prompt 为什么会给出不同答案,以及这两个主要采样旋钮究竟怎样改变模型的选择。
先动手,再深入阅读
温度如何改变选择 · 7 分钟同一个 prompt 发两次,得到两个不同的答案。这不是不稳定——这是一个刻意加入的随机步骤,而且它由你控制。
每一步,模型都会在整个词表上输出一个概率分布。总要有个机制从这个分布里挑出一个 token。temperature 和 top-p 管的就是「怎么挑」。
为什么不总是挑概率最高的 token?
每次都挑第一名,这叫贪心解码,它产出的文本比你预想的要差。
它会自我重复、掉进循环,专挑最安全、最没味道的说法。原因在于,自然语言并不是概率最高的那个词序列——真实的写作里到处都是局部上出人意料的选择。每一步都去优化概率,写出来的东西读起来就像在打太极。
所以随机性是被刻意注入的。
温度
温度(temperature)在采样前重塑分布。它把模型的原始分数除以一个数,然后重新归一化。
假设模型概率最高的四个候选是 60%、25%、10%、5%。
**低温度(≈0.2)**会放大差距。这个分布会变成大约 95% / 4% / 1% / 约 0%。第一名几乎总是赢。输出聚焦、可复现。
温度为 1.0 时,分布保持模型产出的原样。
**高温度(≈1.5)**会把差距抹平——也许变成 40% / 28% / 19% / 13%。不太可能的 token 有了真正的机会。输出更多样,但过了某个点就开始胡言乱语。
直观理解:温度控制的是**模型的自身偏好被尊重到什么程度。**低意味着「严格照训练来」,高意味着「给我点惊喜」。
温度为 0 实际上就是贪心解码。当你希望每次都得到同一个答案时,它很有用。
top-p
top-p 从另一个方向解决同一个问题。它不重塑概率,而是把候选名单截断。
把 token 按概率排序,从最高的开始累加,累加值一旦超过 p 就停。只从这个集合里采样。
top_p = 0.9 配上一个很笃定的分布(95% / 3% / 1% / ...)时,光第一个 token 就跨过了 0.9——集合里只有一个成员,输出实际上就是确定性的。换成一个平坦的分布(12% / 11% / 10% / 9% / ...),要凑到 0.9 得拉进很多 token,候选池就很宽。
这种自适应正是它的吸引力所在。**top-p 让模型自己的置信度来决定选择范围有多宽。**下一个 token 显而易见时,它就保持显而易见;真正开放时,就允许有变化。
对比一下 top_k:它无论置信度如何,永远取固定数量的候选——更粗糙,因为当某个 token 有 99% 的概率时,40 个候选实在太多。
两个一起用
大多数 API 两个都开放。同时调两个会让效果难以推理,所以常见的建议是挑一个调,另一个保持默认。
实用的起点:
| 任务 | 设置 | 原因 |
|---|---|---|
| 抽取、分类、结构化输出 | temperature 0 | 你要的是一个正确答案,还要可复现 |
| 代码 | temperature 0-0.3 | 正确性比多样性重要 |
| 摘要、事实性回答 | temperature 0.3-0.7 | 保持一点流畅度,但仍然有据可依 |
| 对话助手 | 约 0.7-1.0 | 回答老是重复会显得很机械 |
| 头脑风暴、创意草稿 | 1.0+ | 多样性正是目的 |
温度做不到的事
有两个常见的误解值得澄清。
**温度为 0 不等于准确。**它只意味着模型最喜欢的那个 token 每次都赢。如果它最喜欢的是错的,你就会稳定地拿到同一个错误答案。温度控制的是波动,从来不是正确性。
**高温度不会创造创意。**它只是把采样池放宽。真正的新意来自 prompt 和模型自身的能力;温度只改变你愿意在排序列表上往下够多深。
可复现性
温度为 0 能让你接近确定性,但不总是精确的。并行硬件上的浮点非确定性、批处理带来的影响,以及静默的模型更新,都可能让输出发生变化。有些厂商提供 seed 参数来帮忙,但保证程度不一。如果精确复现很重要,那就把输出记下来,别假设你能重新生成它们。
要点回顾
- 随机性是刻意的:贪心解码产出的文本既重复又平淡。
- 温度重塑分布——低就变尖,高就变平。
- top-p 根据模型自己的置信度,自适应地截断候选池。
- 改一个,别改两个。抽取和代码用温度 0;对话和创意用更高。
- 这两个旋钮都不影响准确性——只影响波动。
下一篇: 基座模型 vs 对话模型——为什么原始的预测引擎表现得不像助手。