同一个问题,为什么每次回答不一样
文字稿约 2300 字 · 按画面章节整理展开收起
同一个问题,问五次
问一个小模型:“你最喜欢什么动物?只说名字。”同一个问题,连问五次:猫,熊猫,猫,兔子,兔子。它到底最喜欢什么?把一个叫“温度”的参数调到 0,再问五次:五次都是猫。回答为什么会变?温度,又调了什么?
今天,我们就来看看,模型写下一个 token 的时候,是怎么挑的。
每写一步,模型给出的是一张表
前面几期说过,模型是一个 token 一个 token 往外写的。但每写一步,它给出的不是一个 token,而是一张表:词表里的每个 token,都配一个概率,加起来正好是百分之百。开头那个问题,第一步是这样一张表:猫占百分之 41.8,兔子 35.4,狮子 8.7,后面还有老虎、熊猫、狗……这张表是 Ollama 返回的,最多给前 20 名。原始数字叫 logprob,全称 log probability,对数概率,我们把它换算成了百分比。前 20 名加起来,占了百分之 99.8;剩下的 15 万多个 token,一共只分到百分之 0.2。换个问题:“天空是什么颜色?用一个字回答。”“蓝”一个,就占了百分之 99.1。有的问题,答案几乎是定的;有的问题,好几个答案都说得通。
写哪一个?转一下转盘
那到底写哪一个?打个比方:就像转一个抽奖转盘。表里的每个 token,在转盘上占一格,概率越大,格子越大。转一下,指针停在哪一格,这一步就写哪个 token。猫的格子最大,最常被转中;可兔子的格子也不小,转中它,一点也不奇怪。这一步叫采样,英文 sampling:按概率,随机挑一个。开头问了五次,就是转了五次转盘:结果当然不一样。要是不转呢?每次直接拿最大的那一格,这叫贪心解码,英文 greedy decoding。那就五次都是猫。
回答长一点,就是一连转很多次
回答长一点,也是一样:每写一个 token,就转一次转盘。我们让它用一句话介绍猫,问了三次。三次都从“猫是一种”开始:这两步,最大的格子都超过百分之 99。再往下一步,表就散开了:“温”字占百分之 19.0,“常见的” 17.1,“优雅” 11.9……第一次,转中了只占百分之 1.9 的“天生”,后面整句话,就跟着变了。另外两次,都转中了“温”,写出了“温顺”,再往后,又分了岔:“独立”占百分之 77.2,“优雅”只占 6.4,两次各转中一个。一步不同,后面就步步不同。回答越长,两次一模一样的机会就越小。
温度:转之前,先改转盘
那温度是什么?温度,就是转之前,先把转盘改一改。调低温度,大格子更大,小格子更小;调高温度,格子更平均。怎么改?温度 0.5,就是把每个概率平方,再按比例,凑回百分之百。猫原来是兔子的 1.18 倍,平方以后,拉大到 1.4 倍左右:猫变成百分之 55.9,兔子 40.1。温度 2,反过来,是把每个概率开平方。猫原来是狮子的 4.8 倍,开平方后,只剩 2.2 倍左右。更要紧的是那些小格子:一个万分之一的格子,猫原本是它的 4180 倍,开平方后,只剩 65 倍左右。转盘上还有 15 万多个格子,大多比这还小得多;一起放大,就能分走一大块。温度越接近 0,最大的那格,就越接近百分之百;到了 0,干脆不转了,直接拿最大的。
真转一转:每个温度,各问 100 次
光算还不够,我们真的转一转:同一个问题,每个温度,各问 100 次。为了只看温度,其他采样设置都关掉了。温度 0:100 次全是猫,只有 1 种回答。温度 0.5:猫 58 次,兔子 38 次,和刚才算出来的 55.9、40.1,差不多。温度 1:猫 44 次,兔子 28 次,狮子 12 次,一共 9 种回答,和表里的概率,也大致对得上。只问 100 次,差个几次,很正常。
温度 2:小格子被放大了
温度 2 呢?100 次里,一下子冒出了 62 种回答。其中 24 次,第一步就转出了前 20 名以外的 token;温度 1 的时候,它们加起来,只占百分之 0.2。还有不少回答,该停的地方没停,后面接了一串莫名其妙的字。这就是那 15 万多个小格子,被放大之后的样子。
温度该调多少
那温度该调多少?看你要什么。要稳定,比如分析、做选择题,温度调低;要多样,比如写作、起名字,可以调高一点。对还能调温度的模型,Anthropic 的文档也是这么建议的。模型也有默认值:Qwen3 在 Ollama 里,默认温度是 0.6,还配了 top-p 0.95:从最大的格子往下数,加起来够百分之 95 就停,后面的长尾,直接剪掉。温度 2 那一幕冒出来的长尾,正是 top-p 默认剪掉的:在开头那张表上,它只留下前 5 名。用默认设置,温度 2 问 40 次,只有 5 种回答,都在这 5 名里。也有不让你调的:我们给 Claude Sonnet 5.5 传温度 0 和 0.5,都被拒绝了,只有 1.0 能用。文档写着:Claude Opus 4.6 之后发布的模型,温度只接受 1.0。
温度 0,就一定不变吗?
最后一个问题:温度 0,回答就一定不变吗?在这台电脑上,我们让它用三句话介绍一下猫,温度 0,跑了 20 次,每一次都一字不差。我们也留意到一点出入:同一个问题,发了 6 次,看第一步的表,只有第一次,猫是百分之 41.8;其余 5 次,都是 41.9。不过,温度 0 的回答,在这台电脑上,一次也没变过。我们的推测是:两个候选要是挨得很近,这点出入,就可能让最大的那个换人。对还能调温度的模型,Anthropic 的文档也提醒:就算温度是 0,结果也不是完全确定的。所以,温度 0 能让回答稳很多,但不保证每次都一样。
总结一下
总结一下。第一,模型每写一步,给出的是一张概率表,不是一个答案。第二,采样就是按概率转转盘,所以同一个问题,回答会变。第三,温度在转之前改转盘:调低更稳,调高更散;温度 0,就是每次都拿最大的。
回答忽好忽坏,先问三件事
下次觉得模型的回答忽好忽坏,先问三件事:温度设的是多少?没设的话,默认是多少?这个任务,要的是稳定,还是多样?是不是只问了一次?一次回答,只是转盘上的一格。
今天我们看了,模型的下一个 token,是怎么挑出来的。下一期聊量化:Qwen3 1.7B,为什么一个 1.4 GB 的文件就装得下?