Menu

LLM temperature 是什么:作用与设置方法

temperature(温度)控制语言模型挑选每个下一个词时有多随机。看看它如何改变每个词的概率、什么时候该调低或调高,以及它和 top_p 有什么区别。

下面的每条提示词都可以编辑:改好后,在 ChatGPT、Claude 或其他 AI 应用中打开。

temperature(温度)是一个数字,控制语言模型挑选下一个词时有多随机。temperature 低时,模型几乎每次都选最可能的那个词,所以回答集中、可复现。temperature 高时,概率分散开来,所以回答变化更多,有时还会跑题。temperature 改变的是模型如何在它已经考虑的词之间做选择,并不会改变模型知道什么。

模型如何挑选下一个词

模型一次写一个 token,token 是一个词或词的一部分(见 token 与上下文窗口)。每一步,模型都会给词表中的每个 token 打一个分,这个分数叫 logit。一个叫 softmax 的函数把这些分数变成概率:每个分数先取指数,再除以所有指数的总和,所以分数越高,分到的份额越大,而所有份额加起来等于 1。然后模型按这些份额随机抽出一个 token。

temperature 正是在 softmax 之前起作用的。每个分数都要除以 temperature T:

probability(word) = exp(score / T) / sum of exp(score / T) over all candidates

T 小于 1 时,分数之间的差距变大,所以领先者领先得更多。T 大于 1 时,差距缩小,所以落后的词追了上来。T = 1 时,你得到的就是模型自己的概率。T = 0 时除法没有意义,所以 API 把它当作“总是选排第一的 token”,这叫贪心解码(greedy decoding)。

动手试试:temperature 滑块

下面的演示用六个候选词来续写“我最喜欢的编程语言是”这句话。分数只是为这个演示挑选的示意值;真实的模型要给包含数万甚至更多 token 的词表打分,而一个语言名称也可能被拆成好几个 token。但其中的数学是真实的:柱状图就是这些分数在你所选 temperature 下的 softmax 结果,点抽样按钮会从中抽出十个词。

我最喜欢的编程语言是 …
Next word probabilities
Python46%
JavaScript28%
Rust14%
C7.6%
Haskell3.4%
COBOL0.8%
Samples
Press Sample to let the model pick a word ten times.

在 1.0 时,Python 约占 46%,COBOL 不到 1%。拖到 0.5,Python 升到约 67%,COBOL 几乎消失。拖到 2.0,Python 降到约 32%,COBOL 升到约 4%,所以大约每三轮十次抽样中,就有一轮会至少出现一次 COBOL。注意有一件事从来不会发生:无论怎么设置,词的排名顺序都不变。temperature 不能让 COBOL 比 Python 更可能出现,它只会拉大或缩小差距。

一个真实的回复是连续几百次这样的挑选,而每次挑出的词都会成为下一次挑选的上下文。前面出现一个不寻常的词,后面的一切都会跟着变,这就是为什么高 temperature 下的回复会比这个演示中单个词的变化偏离得远得多。

什么时候用低 temperature,什么时候用高 temperature

任务起始值原因
代码、修 bug、SQL低,0 至 0.3通常只有一种最佳续写,而且你希望每次运行结果都一样
提取、分类、JSON0任何变化都是噪声,而且输出要交给程序读取
解释、日常问题服务商的默认值默认值就是为一般用途选的
头脑风暴、起名、故事创意默认值或稍高一些你想要彼此不同的选项

有两点要注意。第一,低 temperature 并不能让答案变正确。如果模型最可能给出的答案是错的,temperature 0 就会每次都稳定地给你同一个错误答案,见 AI 幻觉。第二,非常高的值(在取值范围到 2 的 API 上明显高于 1)常常会让文字失去条理或者变得不知所云,因为不太可能的 token 被选中得越来越频繁。

有时随机性正是你想要的。自洽性提示会故意在非零 temperature 下把同一个推理问题运行好几次,然后采用大多数运行都认同的答案。

temperature、top_p 和 top_k

另外还有两个参数也控制采样,API 通常把它们和 temperature 放在一起。

top_p(核采样)只保留概率加起来达到 p 的那些最可能的 token,再从中采样。用演示中 temperature 为 1 时的数字来算:Python、JavaScript 和 Rust 加起来约 88%,再加上 C 就超过了 90%。所以设置 top_p = 0.9 时,模型只在这四个词中采样,Haskell 和 COBOL 永远不会出现。和 temperature 不同,top_p 会自动适应:模型有把握时,入选的 token 很少;没把握时,入选的就很多。

top_k 保留固定数量的最可能 token,比如前 40 个。有的 API 提供这个参数,有的没有。

服务商一般建议只改 temperature 或 top_p 中的一个,不要两个都改,因为两者的效果叠加起来很难预测。

在 API 中设置 temperature

聊天应用隐藏了这个设置,但 API 把它作为一个参数。取值范围取决于服务商:OpenAI 的 Chat Completions API 接受 0 到 2,Anthropic 的 Messages API 接受 0 到 1。有些推理模型只接受默认值。

from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list

response = client.chat.completions.create(
    model=MODEL,
    messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
    temperature=0.2,
)
print(response.choices[0].message.content)
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

message = client.messages.create(
    model=MODEL,
    max_tokens=500,
    temperature=0.2,
    messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
)
print(message.content[0].text)

聊天应用为什么隐藏它,以及你可以怎么做

ChatGPT、Claude 和 Gemini 的应用都替你选好采样参数,不提供滑块。这让应用保持简单,而且对大多数请求来说,换一种方式写提示词对答案的改变,远比调一个采样参数大得多。

所以在聊天应用里,提示词就是你的控制手段。只要一个答案,得到的会接近模型的首选。要很多彼此不同的答案,那么无论 temperature 是多少,你都能得到多样的结果,因为模型现在有了避开首选的理由。在两个标签页之间切换,并换一个产品,看看有什么不同。

Fill in
给一款习惯打卡 App起一个名字。
Try it
Example replyReplies vary between models and runs.

连连打卡。 简短好记,还点出了让人每天都想回来的连续打卡。

聊天应用里的重新生成按钮会用同一个提示词重新抽样一条回复,这是快速了解回答差异有多大的好办法。如果差异比你想要的大,解决办法通常是写一个更具体的提示词:精确的任务会缩小好答案的范围,让每次运行的结果更接近。提示词写作指南介绍了应该补充哪些内容。

常见问题

LLM 的 temperature 是什么?

temperature 是一个采样参数,控制每个下一个 token 的选择有多随机。模型会给每个可能的下一个 token 打分,这些分数在转换成概率之前要先除以 temperature。数值低时,排第一的选项占绝对优势;数值高时,概率被拉平,不太可能的 token 被选中的次数也会变多。

写代码时 temperature 应该设成多少?

设一个较低的值,0 到 0.3 之间是写代码、提取数据以及任何只有一个正确答案的任务的常见起点,因为你想要最可能的结果,并且每次都能复现。想要多样性时再调高,比如想名字或者构思不同的设计方案。有些推理模型只接受默认值,所以请查看服务商的文档。

temperature 和 top_p 有什么区别?

temperature 改变的是整个概率分布的形状。top_p 也叫核采样(nucleus sampling),它的做法是截断:模型只从概率加起来达到 p 的最小一组 token 中采样,所以 top_p = 0.9 会去掉那条由不太可能的 token 组成的长尾。服务商一般建议只调其中一个,另一个保持默认值。

temperature 设为 0 时输出是确定的吗?

接近确定,但并不完全。设为 0 时,模型每一步都选最可能的 token,所以多次运行的结果通常相同或非常接近。不过服务商服务器上细小的数值差异仍可能偶尔改变某个 token,而只要有一个 token 不同,回复的剩余部分就可能走上另一条路。

在 ChatGPT 或 Claude 里能调 temperature 吗?

在聊天应用里不行:它们替你选好了采样参数,也没有提供 temperature 的开关。你可以通过 API 设置它,也可以在 OpenAI 的 Playground、Anthropic Console 和 Google AI Studio 这类开发者工具里设置。在聊天应用里,直接在提示词中要求多样或一致的回答。

Coddy 编程语言插图

和 Coddy 一起学编程

开始