探针 1|为什么你每次问大模型,答案都不一样

你问同一个问题,AI 每次答得都不一样
你大概有过这种体验:同一句话,连着问大模型两遍,两次的答案不一样。
第一次你可能没在意,问得多了,心里就犯嘀咕:它是不是在瞎编?是不是不靠谱?
答案可能出乎你的意料:不是它在瞎编,而是它本来就是这么设计的。「答案每次都不一样」,这其实是大模型跟搜索引擎很不一样的地方。
这篇就从这个最不起眼、却天天撞见的现象起手,一路挖到它最底层的机制。
决定它有多「飘」的,是个叫 temperature 的旋钮
答案不一样,还分轻重。有时候,它只是把同一件事换个说法,差别不大;有时候,它简直像换了个人,答得特别「飘」,天马行空。
这种「飘」的程度,其实是可以调的。幕后有个旋钮专门管它,叫 temperature(温度)。
平时你大概率没见过它,它藏在 API 和后台设置里,普通用户根本碰不到。但每一个聊天产品背后,都悄悄设着一个 temperature 值,决定它回答时有多「飘」:设成 0,最死板、最稳;数字调大,越发散、越天马行空。
那这个旋钮到底在改什么?要讲清这个,得先看大模型是怎么一个字一个字往外蹦的。
挖到底:模型每吐一个字,都是一次「抽签」
很多人以为,大模型是「想好一整句话,再写出来」。其实不是。它是一个字一个字往外蹦的,每蹦一个字,都要在几千个候选字里做一次选择。
这个选择的过程,分三步。
第一步,打分。 模型会给词表里的每个候选字打一个原始分数(行话叫 logits),分数越高,代表它觉得这个字越该接在后面。
第二步,变成概率。 这些原始分数会被压成一张概率表:所有候选字的概率加起来正好等于 1,分数高的概率高,分数低的概率低。这一步用的是 softmax。
第三步,抽签。 模型按这张概率表,抽出下一个字。概率高的字,被抽中的机会大;概率低的,机会小,但不是绝对没有。
关键就在第三步。
你可能会想:既然「是」的概率最高,模型直接选「是」不就行了?那样的话,每次答案不就该一样了吗?
但模型没那么干。它是抽签:照着这张概率表抽,概率高的机会大,概率低的也有机会。这个动作,行话叫采样(sampling)。
正因为是抽签、不是死认第一名,同一个起点,每次才可能抽出不同的字。这才是「答案每次都不一样」真正的根。

temperature 改造的是这张概率表的「陡峭程度」
那 temperature 在哪一步插手?它不决定「抽不抽签」,而是在打分那一步动手脚:把每个字的分数都除以 temperature,相当于调节分数之间的相对差距,从而间接改变最后那张概率表的形状,说得通俗点,就是改这张表有多陡。
temperature 设成 0,概率表会被压得极端陡峭:分数最高的那个字,概率几乎占满,剩下的几乎为零。抽签时你几乎只能抽到它,这一步的随机性消失了,等价于永远选第一名。这叫贪婪解码(greedy),结果自然稳定。
temperature 调大,概率表会被摊平:原本概率很低的字,也分到一点机会。抽签时,小概率字就真的有可能被抽中。于是每次抽的结果不一样,答案开始发散,温度太高了还会「飘」。

一句话记住:温度等于 0,是**「永远选第一名」;温度大于 0,是「按概率加权的抽签」**。

顺带提一句,你可能还见过 top-k 和 top-p(也叫核采样)。它们也是采样策略,作用在「让哪些字有资格参与抽签」上:top-k 只在概率最高的前 k 个里抽,top-p 只在累积概率达到 p 的那一小撮里抽。它们常和 temperature 配合着用,看张图你就懂它俩的区别:

想亲手拧 temperature、top-k、top-p 这三个旋钮,看概率分布实时变、亲手抽一签看「每次不一样」?我做了一个交互演示:temperature 演示工具 →
反直觉彩蛋:我把温度设成 0,为什么答案还是不一样?
原理讲完了,但有个连很多工程师都会踩的坑。我把 temperature 设成 0,怎么云端 API 给的答案还是不一样?
理论上,temperature 等于 0 就是贪婪解码,每一步都选概率最高的字,没有随机,相同的输入应该得到一模一样的输出。
但实际跑起来,云端服务还是可能不一样。问题不在模型本身,而在它底下那一层工程,主要有两个环节:
- 连续批处理。云端为了省算力,不会一条一条单独算你的请求,而是把好多条请求凑成一个批次一起算。你这次和谁凑在同一个批次里,下一次可能就变了,批次大小也跟着变。
- GPU 内核的求和顺序变了。像 FlashAttention 这类底层计算库,做求和(reduction)时会把数据切成小块分头算;批次大小一变,切法就不一样,求和的先后顺序也跟着变,结果末尾几位就可能不一样。
为什么求和顺序变一下,结果就不一样?因为计算机算浮点数,加法并不满足结合律——同样几个数,先加哪两个,末尾几位可能有出入。平时这点出入完全无所谓,可一旦碰到两个候选字分数几乎并列、难分高下的时候,这点微差就足以让「第一名」翻盘。于是抽出来的字不一样,后面的走向也跟着岔开。

所以 temperature 等于 0,是「该确定」的必要条件,但云端那一套推理并不保证它充分。想尽量可复现,得固定批次、固定内核、固定硬件,或者用专门做确定性的推理内核——光在本地跑、设个随机种子(那只能管采样层的随机),解决不了这个问题。
这根探针挖到了什么
你看,一个「答案每次都不一样」的小疑问,底下连着好几层:抽签到底在抽什么,概率表长什么样,temperature 怎么改写它,最后还摸到了云端工程层的不确定性。
顺着这一趟,你其实顺手搞懂了不少词:logits、softmax、采样、temperature、贪婪解码,还有 top-k、top-p。以后再刷到它们,你大概就知道在讲什么,不用再觉得是天书。
这也是这个连载想干的事:不让你死背名词,而是拿一根探针,从一个你天天撞见的小现象扎下去,把这些词一个一个挖到根上。AI 的新词天天冒,但底下的原理就那些,挖通一回,以后再冒新的你也不慌。
下一篇,换根探针扎下去:AI 为什么按「字」收费,中文还比英文贵。下回聊。