试一下:你给 ChatGPT 同一个问题,连问 5 次。它会给你 5 个措辞不同、角度不同、甚至结论不完全一样的回答。
但如果你把"温度(Temperature)"调到 0------问 100 次,每次回答一字不差。
这篇文章告诉你温度具体怎么工作------从概率分布到随机采样,从"保守复读机"到"天马行空"。文末有一个纯数字推演------你可以手算一遍,彻底理解温度是做什么的。
AI 不是"想"一个答案,是"抽"一个 Token
AI 生成回答的过程不是"写出最优答案"------是逐个 Token 抽样。给定前文,模型计算下一个 Token 的"概率分布":
arduino
前文: "今天天气真"
↓ 模型计算
候选 Token:
好 → 概率 0.45
不 → 概率 0.20
热 → 概率 0.15
冷 → 概率 0.08
糟 → 概率 0.05
棒 → 概率 0.04
烂 → 概率 0.02
其他 → 聚合概率 0.01
模型实际上给词典里 5 万个 Token 每个都算了一个概率------大部分 Token 的概率接近 0------但每个都有一个数。
如果每次选概率最高的 Token(好)------每次回答都是"今天天气真好"------千篇一律,一模一样的答案。但 AI 实际是抽样------概率高的 Token 更容易被抽中------但不是绝对被选中。好 被抽中的概率是 45%,不 是 20%,热 是 15%。有时候(虽然概率低)------"糟"会被抽中 → "今天天气真糟"------然后整个回答的方向就完全不同了。
这个概率分布和抽样机制------就是 AI"随机性"和"创造性"的唯一来源。
温度是怎么工作的:在抽样之前,先"拉伸"或"压缩"概率
温度(Temperature,通常写作 T)是一个 0 到 2 之间的参数。在抽取 Token 之前,它先把所有候选的"原始分数"(logits)除以 T------然后再做 Softmax 变成概率------然后再抽样。
ini
原始分数(logits): [4.0, 2.5, 1.0, 0.3] ← "好/不/热/冷" 的 logits
↓ 每个分数 ÷ Temperature
T=0.5 → 除以 0.5 → [8.0, 5.0, 2.0, 0.6] → Softmax → 概率更陡峭
T=1.0 → 除以 1.0 → [4.0, 2.5, 1.0, 0.3] → Softmax → 概率不变
T=1.5 → 除以 1.5 → [2.7, 1.7, 0.7, 0.2] → Softmax → 概率更平坦
T < 1(低温度):除以一个小于 1 的数 = 放大所有原始分数 = 让高分的更高、低分的更低 = 概率分布变陡峭 = 模型几乎只抽最高概率的 Token → 回答确定、保守、固定。
T = 1(默认):不改动原始分数 = 模型用自己真实的概率分布来抽样 → 有创造力但可预测。
T > 1(高温度):除以一个大于 1 的数 = 缩小所有原始分数 = 高低分趋近 = 概率分布变平坦 = 低概率 Token 也有机会被抽中 → 回答跳脱、从不同角度切入、但也容易胡说。
一个手算例子:T=0.5 vs T=1.0 vs T=2.0
假设下一个 Token 只有四个候选:
Token Logit(原始分数)
好 4.0
不 2.0
热 1.0
冷 0.5
Softmax 公式:P(i) = e^(logit_i/T) / Σ(e^(logit_j/T))
T = 1.0(默认):
ini
e^4.0 = 54.6 → 54.6 / 61.5 = 88.8%
e^2.0 = 7.4 → 7.4 / 61.5 = 12.0%
e^1.0 = 2.7 → 2.7 / 61.5 = 4.4%
e^0.5 = 1.6 → 1.6 / 61.5 = 2.6%
总和 = 61.5
"好"被抽中的概率 88.8%,"不"有 12% 机会------AI 大多数时候说"好",20 次里有大概 3 次说别的。有变化,但不离谱。
T = 0.5(低温度):
ini
e^(4.0/0.5) = e^8.0 = 2981 → 2981 / 3057 = 97.5%
e^(2.0/0.5) = e^4.0 = 54.6 → 55 / 3057 = 1.8%
e^(1.0/0.5) = e^2.0 = 7.4 → 7 / 3057 = 0.2%
e^(0.5/0.5) = e^1.0 = 2.7 → 3 / 3057 = 0.1%
总和 ≈ 3057
"好"的概率被压到 97.5%------AI 几乎每次都说"好"------回答高度统一、一行不差、像规范说明书。
T = 2.0(高温度):
ini
e^(4.0/2.0) = e^2.0 = 7.4 → 7.4 / 13.0 = 56.9%
e^(2.0/2.0) = e^1.0 = 2.7 → 2.7 / 13.0 = 20.8%
e^(1.0/2.0) = e^0.5 = 1.6 → 1.6 / 13.0 = 12.3%
e^(0.5/2.0) = e^0.25 = 1.3 → 1.3 / 13.0 = 10.0%
总和 ≈ 13.0
"好"的概率降到了 56.9%,"不"有 20.8%,"热"和"冷"合计 22.3%------AI 经常不走寻常路------回答有创意、但也可能不准确。50 次输出里------大概只有 28 次是"好"------剩下的 22 次可能让你想不到。
不同温度的"人格"
| 温度 | AI 的样子 | 适合场景 | 风险 |
|---|---|---|---|
| 0 | 每次都选最高概率的 Token------输出完全确定 | 代码、数学、翻译、事实提取 | 没有灵活性,小概率的正确选择永远不被考虑 |
| 0.2-0.5 | 稳定、保守、精准 | 技术文档、合同条款、答案需要可复现 | 回答僵化,语感不自然 |
| 0.7-1.0 | 准确和创意平衡 | 日常对话、文章写作、头脑风暴 | 有些不确定性 |
| 1.2-1.5 | 创造性强,少走寻常路 | 创意文案、写诗、找灵感 | 有 5-10% 概率输出偏离正轨 |
| 1.5-2.0 | 非常随机,逻辑链易断裂 | 几乎没人用------只是实验性调参 | 高概率胡说八道 |
温度 = 0 时 AI 不是"更聪明"------它只是完全不冒风险 。但在需要创意的场景里,不冒风险 = 表现平庸。温度 = 1.2 时 AI 不是"更聪明"------它只是更敢犯错------在需要灵感的场景里这是好事,但在写生产代码时是坏事。
另一个相关参数:Top-P(Nucleus Sampling)
除了温度,还有一个常见参数------Top-P。它的逻辑跟温度不同:
css
Top-P = 0.9 的意思是:
把候选 Token 按概率降序排列 → 从最高概率开始累加 →
只在累加概率达到 90% 以内的 Token 里取样 → 剩下的 10% 直接丢弃
温度调整的是"概率分布的陡峭程度"------所有的 Token 概率都变了,但都还有机会被选中。Top-P 调整的是"候选池的大小"------它把低概率 Token 直接砍掉,只在一个动态大小的"靠谱 Token 池"里做抽样。
两个参数可以同时使用。在实践中------大多数时候你只需要关心温度的直觉:把温度想成一个旋钮------"要精确回答调到 0"、"要创意调到 1.0"------对大部分实际场景足够用了。
一句话总结
温度不是让 AI 更聪明或更笨------它是让概率分布更陡峭或更平坦。温度 0 = 固定输出,温度 1 = 真实的概率分布,温度 2 = 每个 Token 概率趋于均匀。你要精确选低温度,你要创意选中温,你要惊喜(或灾难)选高温度。AI 的"随机性"不是故意掺水------是抽样机制跟概率分布发生相互作用后的自然结果。