这两天帮朋友调一个 AI 客服机器人,他问我一个问题:提示词一个字没改,为什么 AI 第一次回答很规矩,第二次就开始自由发挥?我让他去看接口参数,果然,temperature 被设成了 1.3。
这不是个例。很多人用了一两年 AI,都没碰过这两个参数。今天把我理解的 temperature 和 top_p 讲清楚,看完你就知道什么时候该动它们。
先说结论:AI 输出的每个字都是「抽」出来的,这两个参数管的是抽奖的规则。
AI 写字的底层:概率
大模型输出文字,是一次一个 token。每写一个,模型手里都有一张概率表。
比如「今天天气真」的后面,可能是这样:
- 好:55%
- 不错:30%
- 冷:10%
- 差:5%
数字是我编的比方,真实情况是模型算出成千上万个候选,每个都有自己的概率。
关键在于,模型不直接选第一名。它按概率抽签,越大概率越容易抽中,小概率也留着出头的机会。你看到的流畅回答,就是这样成千上万次抽签连出来的。
为什么每次回答都不一样?因为抽签。这是所有事情的起点。
temperature:给概率表调音量
temperature 控制的是抽签之前,概率分布被拉平还是拉尖。
调低,比如 0.2,概率差距被放大。55% 可能变成 80%,5% 可能压到 0.1%。冷门词几乎没机会,输出稳定、保守,同一个问题反复问,回答基本一致。
调高,比如 1.5,概率差距被抹平。55% 掉到 40%,5% 涨到 15%。冷门词和奇怪的表达有了出场机会,回答更有新意,也更容易跑偏。
取值范围一般是 0 到 2,DeepSeek 和 OpenRouter 的官方文档都写着默认值 1.0。「温度」这个词是从物理学借来的:高温下分子乱跑,低温下安安静静,意思差不多。
有个细节要注意:temperature 设 0,文档上的说法是同样的输入总是给同样的回答。但工程上真要稳定复现,API 还提供了 seed 参数,指定随机种子。OpenRouter 文档的原话是「部分模型不保证确定性」。所以 0 只是接近确定,不是绝对锁死。
top_p:按概率总和截名单
top_p 换了个思路。它不看单个词的概率,看的是累计概率。
top_p = 0.9 的意思是:把候选词按概率从高到低排队,从第一名开始累加,加到总和达到 90% 为止,后面的一律出局。模型只在这个名单里抽签。
它和 temperature 的区别可以这样记:temperature 改的是每个词被抽中的难度,top_p 改的是参赛选手名单。
顺带说下 top_k,按名额截取,只留概率前 K 名。K=5 就是无论概率怎么分布,永远只留 5 个候选。top_p 是动态名单,概率集中时名单短,概率分散时名单长,一般公认更灵活。top_k 在 OpenRouter 上默认是关闭的。
官方建议:只调其中一个
DeepSeek 的接口文档里有一句原话:一般建议只改 temperature 或 top_p 其中之一,不要同时改。
原因是它们动的都是同一张概率表。一个拉平、一个截尾,两个一起调,最后分布长什么样很难说清,出了问题也没法定位是哪个参数干的。
我的习惯是只动 temperature,top_p 保持默认 1.0。一次只留一个变量,好排查。
不同任务,我用的值
下面是我自己的参考值。效果因模型而异,建议拿自己的任务实测。
| 任务 | temperature 建议 | 理由 |
|---|---|---|
| 日常问答、翻译 | 默认(1.0 左右) | 不动它,够用了 |
| 写文案、头脑风暴 | 0.8 ~ 1.2 | 让它敢说点新鲜话 |
| 数据抽取、分类、输出 JSON | 0 ~ 0.3 | 要稳定,不要惊喜 |
| 写代码 | 0 ~ 0.3 | 代码不需要文采,需要编译通过 |
还有一个 2026 年的新知识点:推理模型开思考模式后,这些参数可能失效。DeepSeek 文档明确写了,思考模式下 temperature 无效;top_p 只在思考模式生效,而且有效区间被限制在 0.95 到 1.0,你填 0.7 会被当成 0.95 处理。我之前给思考模型调温度,调了半天没反应,后来才知道是这个原因。想控制这类模型的行为,去动 reasoning_effort,不是 temperature。
三个常见误区
误区一:回答不一样,说明 AI 不可靠。不一样是设计如此。要稳定,调低 temperature 或者用 seed。
误区二:两个参数一起调,效果更好。官方明确不建议。一次只动一个。
误区三:聊天软件里找不到这两个参数,说明它们不存在。ChatGPT、Kimi 这类产品的聊天界面确实不开放这两个旋钮,它们是 API 层的参数。Kimi 官方文档里也写着,由于大模型的不确定性,实际回复内容可能不一致。聊天产品只是把这个随机性藏起来了。
这些参数在哪改
聊天网页版基本都不开放,能动手的地方在 API 和客户端。
拿 DeepSeek 的接口举例,请求体里加上就行(模型名和地址以官方文档为准):
curl https://api.deepseek.com/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer 你的KEY" -d '{"model":"deepseek-flash","messages":[{"role":"user","content":"给这款保温杯写三条卖点"}],"temperature":0.2}'
把 0.2 改成 1.2 再跑一遍,同一个问题,你能明显感觉到第二次的文案更放得开。自己试一次,比看十篇文章都直观。
不想写代码也有办法。不少客户端的模型设置里就有这两个滑杆,我平时会把常用的模型配成两份,一份默认参数用来聊天,一份把温度调到 0.2 附近,专门跑数据提取。
写在最后
AI 不是在心里打好完整草稿再念给你听的,它是一个词一个词抽出来的。temperature 和 top_p 就是你手里的两个旋钮:一个管抽签的难度,一个管名单的长短。
拿不准的时候,记住我的做法:默认跑一遍,不满意再只调 temperature。另外,提示词写清楚,比调参有用得多。