调用大模型 API 时,temperature 几乎是最常被随手一填、又最少被真正理解的参数。很多人把它当成「创造力旋钮」——调高更有创意,调低更严谨。这个说法不算错,但太模糊,导致大量误用:有人给需要严格 JSON 输出的任务设了高 temperature 然后抱怨格式不稳定,有人给头脑风暴设了 0 然后觉得模型「没想象力」。
要用对它,得先理解它到底在改什么。而这要从一个基本事实讲起:大模型生成的每一个词,本质上都是从一个概率分布里采样出来的。 理解了这句话,temperature 就不再神秘。
模型每一步都在预测「下一个词的概率分布」,temperature 决定采样时对高概率词有多偏爱。
前提:模型输出的是概率,不是答案
大模型生成文本是逐个 token 进行的。每一步,模型并不是「直接想出下一个词」,而是给词表里所有候选词各算一个概率。比如输入「今天天气真」,模型内部可能是这样:
好 → 0.62
不错 → 0.18
冷 → 0.09
糟糕 → 0.05
...(其余成千上万个词,概率很低)然后从这个分布里「采样」一个词作为输出,再把它接到输入后面,预测下一个词,如此循环。Temperature 影响的,正是「采样」这一步对概率分布的处理方式。 这也是它和推理过程绑定的原因——它是解码阶段的参数,不改变模型本身。
Temperature 做的事:把分布拉平或压尖
Temperature 是一个作用在概率分布上的缩放参数。直观理解:
- Temperature 低(趋近 0):分布被「压尖」,高概率的词概率被进一步放大,低概率词几乎归零。极端情况 temperature=0,等于每次都选概率最高的那个词(贪心解码),输出接近确定——同样的输入几乎总得到同样的输出。
- Temperature 高(比如 1.0 以上):分布被「拉平」,原本概率低的词也有了更多被选中的机会。输出更多样、更「发散」,但也更容易跑偏、出现不通顺或离题的内容。
回到上面的例子:低 temperature 下几乎必出「好」;高 temperature 下,「冷」「糟糕」被选中的概率明显上升,你可能得到更意外的续写。所谓「创造力」,本质就是允许模型选那些它认为不那么可能、但仍然合理的词。
这也解释了一个常见困惑:为什么 temperature=0 也不是 100% 稳定?因为在实际系统里,并行计算的浮点误差、多个词概率相同时的取舍等因素,仍可能带来极小的波动。想要严格可复现,还要固定随机种子等条件,且不同厂商实现不同。
Top-p、Top-k:和 Temperature 配合的另一组旋钮
Temperature 常和 top_p(核采样)一起出现,它们从不同角度控制随机性:
- Top-k:只从概率最高的 k 个词里采样,其余直接排除;
- Top-p(nucleus sampling):只从「累计概率达到 p」的最小词集合里采样。比如 top_p=0.9,就是把候选词按概率从高到低累加,取到刚好凑够 90% 的那批词,从中采样。
它们是「先划定候选范围」,temperature 是「在范围内怎么偏好」。实践中的常见建议是只重点调其中一个(多数场景调 temperature 就够),两个都往极端调容易互相干扰、行为难以预测。具体参数含义可参考模型参数词条。
Top-p 先划定候选词范围,temperature 再决定范围内的偏好,两者从不同角度控制随机性。
不同任务的推荐设置
没有「万能 temperature」,只有「适合任务的 temperature」。一份经验起点(不同模型的合理区间略有差异,以实测为准):
| 任务类型 | 建议方向 | 原因 |
|---|---|---|
| 结构化输出、JSON、代码、抽取 | 很低(接近 0) | 要稳定、可解析、可复现,不需要花样 |
| 事实问答、翻译、摘要 | 低 | 要准确,减少发挥空间 |
| 分类、判断、评分 | 很低 | 要一致,同样输入应给同样结论 |
| 日常对话、客服 | 中等 | 自然但不失控 |
| 文案、起名、头脑风暴 | 偏高 | 要多样、要意外 |
| 创意写作、诗歌 | 高 | 鼓励发散 |
一个高频错误是给需要确定性的任务设了偏高的 temperature:JSON 偶尔少个括号、分类结果时好时坏、Agent 的工具调用参数不稳定,很多「模型不靠谱」的抱怨,根子在这里。反过来,抱怨模型「输出千篇一律、没创意」的,往往是 temperature 压太低了。
一组可复现的对比实验
想建立手感,别看参数表,自己跑一组对比。方法很简单,控制变量:
- 固定一个提示词,比如「给一款主打隐私保护的记账 App 起 5 个名字」;
- 只改 temperature,分别用 0、0.7、1.2 各跑 3 次;
- 观察两件事:同一 temperature 下 3 次结果的差异有多大(随机性)、以及不同 temperature 之间风格的变化(发散程度)。
你会清楚看到:temperature=0 时三次几乎一样、名字偏保守;1.2 时每次都不同、偶有惊艳也偶有离谱。再换一个「把这段话转成 JSON」的任务重复实验,你会发现高 temperature 下 JSON 开始出错——这时你就真正理解了「为什么结构化任务要低 temperature」,而不是死记结论。这种最小实验驱动的理解,正是评测和调参的基本功。
控制变量、只改一个参数、多跑几次——十分钟的对比实验胜过反复读参数文档。
适用人群与注意事项
适合所有直接调用大模型 API、需要调参的开发者和提示词工程师。几个要注意的点:
- [推理模型](/wiki/reasoning-model)可能不吃这一套:一些主打推理的模型对 temperature 的响应和常规模型不同,甚至官方建议用默认值别动,调参前先看模型文档;
- temperature 不解决能力问题:模型不会的东西,调高 temperature 只会让它更自信地编,调参改变的是「怎么选词」,不是「知不知道」;
- 评测时要固定 temperature:做模型对比或提示词 A/B 时,temperature 必须固定,否则你分不清差异来自模型还是来自随机性。
常见问题
Q:temperature 设 0 就完全不会变了吗? A:非常接近确定,但如前所述,工程实现层面的因素仍可能带来极小波动。要严格复现需要额外固定种子等条件,且依赖厂商实现。追求「大致稳定」用 0 就够,追求「逐字节复现」要看具体平台支持。
Q:temperature 和 top_p 我到底调哪个? A:多数场景调 temperature 即可,top_p 保持默认。两个都调容易行为难测。要精细控制时,可固定 temperature=1、只用 top_p 收窄候选,这是另一种常见流派。选一种风格坚持用。
Q:为什么同样的问题,网页版聊天助手每次回答不一样? A:因为它们通常用非零的 temperature 来让对话更自然。这不是 bug,是刻意设计。你在 API 里把 temperature 设低,就能得到更稳定的回答。
小结
Temperature 不是玄学的「创造力旋钮」,而是控制采样随机性的参数:低了压尖分布、输出确定,高了拉平分布、输出发散。理解它的前提是记住「模型每步输出的是概率分布」这个事实。用法也简单——要稳定可解析的任务往低了设,要多样有惊喜的任务往高了设,做评测时固定住它。想真正上手,花十分钟做一组控制变量的对比实验,比记任何参数表都牢。