同一个提示词,为什么 AI 每次回答都不一样?temperature 和 top_p 一次讲清(2026入门)

这两天帮朋友调一个 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。另外,提示词写清楚,比调参有用得多。

发表评论