LLM 的 Temperature 参数到底是什么?
之前我对 Temperature 的认识一直停留在它就是个调随机性的参数。
但是后来发现许多地方写的 Temperature 的范围是 0.0~1.0,问豆包有关 Temperature 的时候给我说的是 0.0~2.0。这个不一致的点引起了我的警觉,是不是豆包说错了?到底 Temperature 的范围是多少?还有我发现豆包给我说的 Temperature 不能设置成 0.0,因为公式中这个参数作为了一个分数的分母,但是我记得确实在某个 API 文档里见过这个参数可以设置为 0 的,而且明确说明的是设置为0输出越稳定,这个数值越大越发散,输出越有创意。正是带着这些疑问,不一致的观察,我想知道为什么,所以写下了这篇文章。
也明白了这玩意儿本质上是在修改 Token 的概率分布。搞懂之后,再看各种项目里的
temperature=0、temperature=0.1、temperature=0.7,一下就顺眼了。
一个让我困惑很久的问题
刚开始调 LLM API 的时候,经常看到这样的代码:
response = client.chat.completions.create( model="gpt-4o", temperature=0.7)然后教程告诉我:temperature 越高越有创造力、temperature 越低越严谨。说实话,我记住了,但也只是记住了temperature 越大越发散,temperature 越小回答越忠实稳定。
Temperature 不会提高模型能力
这是我觉得最容易误解的地方。可能有人潜意识里会觉得:temperature 调高 = 模型更聪明 实际上不是。
Temperature 根本不会增加模型知识,也不会提高推理能力。
它做的事情只有一个:重新调整 Token 的概率分布。
换句话说:模型知道什么,不知道什么。跟 Temperature 没关系。
Temperature 只决定:模型更保守、还是更敢冒险
LLM 实际上在干什么?
说白了,LLM 本质上一直在干一件事:预测下一个 Token
例如:
中国的首都是?模型可能会得到这样的结果:
| Token | 分数 |
|---|---|
| 北京 | 10 |
| 上海 | 7 |
| 广州 | 5 |
| 深圳 | 4 |
注意,这里还不是概率,这是 Logit。可以理解成:模型心里的倾向分。然后经过 Softmax,变成概率:
| Token | 概率 |
|---|---|
| 北京 | 94% |
| 上海 | 4.7% |
| 广州 | 0.6% |
| 深圳 | 0.2% |
最后从这里面抽一个,这就是采样。
Temperature 到底干了什么?
核心公式其实只有一个:
Softmax(logit / T)其中:
T = TemperatureTemperature 本质上是在:放大或者缩小 Token 之间的差距。
Temperature < 1:放大差距
假设:
北京 10上海 7广州 5如果:
temperature=0.5会变成:
北京 20上海 14广州 10差距直接翻倍,于是概率会变成:
北京 99%上海 1%左右。模型几乎一定选北京。
所以低温的本质是:让高概率 Token 更容易赢
Temperature > 1:缩小差距
如果:temperature=2
则变成:
北京 5上海 3.5广州 2.5差距变小,概率变平。
于是:
上海广州这些原本没什么机会的 Token。
也开始有机会被选中了。
所以高温的本质是:给低概率 Token 更多出场机会
那 Temperature=0 到底是什么?
这里有个特别容易误解的地方。
数学上其实不存在:
temperature=0因为:
logit / 0直接炸了。但工程实现里,几乎所有模型都支持temperature=0
原因很简单,厂商会特殊处理。直接变成argmax,也就是谁概率最大选谁,不采样了。
实际项目怎么选?
| 场景 | 推荐 Temperature |
|---|---|
| 代码生成 | 0~0.2 |
| 法律 RAG | 0~0.2 |
| 知识库问答 | 0~0.3 |
| 信息抽取 | 0~0.2 |
| 总结归纳 | 0.2~0.5 |
| 普通聊天 | 0.7 |
| 创意写作 | 0.8~1.2 |
| 小说创作 | 1.0~1.5 |
为什么有的模型是 0~1,有的是 0~2?
这个我后来也查过,答案其实很简单。
数学上,Temperature 没有上限。只要:T > 0 就行。
但问题是:超过某个范围以后,生成质量通常会快速下降。
例如:
temperature=5很容易出现:
- 胡言乱语
- 重复
- 跑题
- 幻觉增加
所以很多厂商直接限制:0~2、0~1 方便用户使用。
最后总结一下
我觉得 Temperature 最容易记住的一句话是:
Temperature 不会改变模型知道什么,它只改变模型愿意冒多大的风险。
| Temperature | 模型状态 |
|---|---|
| 0 | 只选最确定答案 |
| 0.1 | 非常保守 |
| 0.3 | 稍微润色 |
| 0.7 | 正常聊天 |
| 1.0 | 开始自由发挥 |
| 1.5 | 创意增强 |
| 2.0 | 高风险区域 |
说白了,Temperature 调的不是知识,而是随机性。调的不是能力,而是模型的性格。