温度与随机性
它每一步都在按概率抽签,这个抽签是被设计出来的。有唯一答案的任务把它调低,要发散的场景留着它。但调低只让它更一致,不会让它更正确。
同一个问题问两遍,两次答案对不上,很多人第一反应是这东西出毛病了。恰恰相反:每次从分布里抽一个签,是它被设计成这样的工作方式,不是一个等修复的缺陷。这一个机制同时管着两件事——你能拿到的多样性,和你必须防的波动。
读完你能回答:
- 「调低就更准」这句话错在哪?
- 为什么同一个问题两次回答不一样,而且输出越长越不稳?
- 哪些任务该把随机性压到最低,哪些该把余地留出来?
把它收窄得到的是同一个答案,不是更对的答案
关于这股随机性,最常见的一个误读值得放在最前面说清楚:收窄它,并不等于让它变对。
「把随机性调低,答案就更准」——这句话里,「准」被当成了「对」。实际发生的是:分布被压得更尖之后,每次抽签都落在同一个最可能的选项上,所以你看到的是同一个答案,而不是一个更正确的答案。
如果那个高概率选项本身就是错的,收窄随机性只是让你稳定地拿到同一个错误。这在生产上比随机出错更难发现——随机出错会引起注意,稳定出错会被当成事实。
所以两件事要分开:
- 要一致性,靠收窄随机性。批量处理、需要可复现的场景,压到最低是对的。
- 要正确性,靠的是给材料、给可核对的依据、最后那道校验。随机性在这里帮不上忙。
还有两条边界值得一起记住。其一,压到最低并不等于输出一定合法:凡是要喂给下游系统的结果,都得过一次结构校验,不合格就重试或者降级——随机性是一个客观存在的事实,设计时要把它考虑进去,别指望能像修 bug 一样把它调没。其二,随机性低,输出也更容易套路化:同样的措辞、同样的结构,看三次就腻。如果这份输出是给人读的文案,压到最低往往不是最优解——那种场景要的恰恰是几个不一样的版本。
它不是挑最好的,是照着概率抽一个
要讲清上面那件事,得回到它写每个字的动作上:每个位置的候选表是算出来的,接着照着这张表抽一个,而不是取排头那个——这套动作的机制,预测下一个字讲得最透。
这里只补一句和温度直接相关的:候选表的形状,就是这个旋钮唯一能改的东西。
于是误差会滚起来。输出几百个 token,就等于抽了几百次签;只要中间有一次抽中了别的,从那之后每一步的概率分布都跟着变。越长的输出越不稳定,原因就在这里——跟「它写到后面变糊涂了」没关系,纯粹是累积的抽签次数变多了。
有一点也要说清:就算把随机性压到最低,同一个提示跑出来也不保证一字不差。批处理时的并发情况、浮点运算的先后顺序、服务端换了版本,都会造成细微差别。最低只意味着「几乎一致」,离「加密级别的一致」还差得远。真想要严格一致,得由你自己把结果存下来复用。
温度决定它敢不敢挑冷门词
调整上面说的这些,用的是同一个参数,它叫温度。此外还有一个常和它一起出现的旋钮。
- 温度管的是「敢不敢挑冷门词」。把它调低,能挑的范围就收窄到最有把握的那几个候选,写出来的东西偏保守、容易重复、胜在稳妥。把它调高,长尾里的候选被抬起来,措辞更鲜活了,可跑偏的概率也跟着涨。gpt3-paper 在这根旋钮上,创造力与可靠性分处两端,同时要两样做不到。
- 还有一个「先划一条线」的旋钮。做法是先给候选按概率高低排序,从头往下累加,累到设定的比例就停,剩下的直接丢掉。它的价值在于:分布无论多平坦,那些一眼就不该出现的东西都抽不出来。放到产品里,它当安全阀比温度更称职。
- 不是每个接口都会把旋钮交给你。有些较新的推理型模型压根不收温度这个参数,或者收了也不产生任何效果。选型阶段就要把这件事确认掉,否则方案会建在一个根本拧不动的参数上。厂商的文本生成文档对这些参数有明确的定义。openai-textgen
有没有唯一答案,决定它该留多少余地
判断标准只有一条:这个任务有没有唯一正确答案。有,就把随机性压到最低;没有,才留一点余地。按这条标准,日常调用大致分成三档。
答案唯一的一档。从一份合同里把签署日期、双方名称、金额提出来;给一批用户反馈打上类目标签;把一段自由文本整理成字段固定的记录;把一句业务描述翻成查询语句。这些活只有一种做法算对,任何波动都是错误,压到最低。
要准、但允许措辞自由的一档。把一段英文说明译成中文、把口语化的需求改写成正式描述、把一场会议记录压成摘要:事实和意思不能错,具体用哪个词可以有点余地。偏低就够,别压到底。
图的就是不一样的一档。给同一款产品起十个标题、写三种调性不同的推广文案、让人从几个角度想想这个功能该怎么切——这一档要的恰恰是差异,随机性要留足。这里唯一要防的,是它一路跑到胡说的范围里去。
一个产品里往往同时跑着好几类调用,参数不该一刀切共用。让「抽字段」和「起标题」挤在同一组设置里跑,两头都会遭殃。
在动这个旋钮之前,还有很多事要做
听到有人抱怨「输出不稳定」,第一个该怀疑的不是这个旋钮,而是提示词写得太松。格式没给、例子没给、不许做什么也没说——这几种情况占了大头。
把四个部件补齐、把例子给上、把输出格式卡住,换回来的稳定性提升,比把一个数值从中间往下挪一格要大得多。这背后是一条顺序:该补的部件先补齐,例子加上,技巧调顺,参数排在这些之后。参数之所以排在最后,不是因为它没用,而是因为它能遮住的毛病最少——它能让同一个答案反复出现,却不会让那个答案变得更对。
把前面几步都做完了,最后一件事是判断这次调整到底有没有让结果变好——那把尺子还是同一组样例:先有尺子,再动旋钮。
