大模型推理参数怎么调?

大模型推理参数怎么调?Temperature、Top-p、Top-k 有什么区别?
你让ChatGPT写了三遍同一道题的答案,结果三次三个样——别慌,这不是bug,而是大模型的"人性"所在。
上次我们聊了大模型为什么会"一本正经地胡说八道"。讲明白了幻觉的根源:大模型本质上是概率机器,它在"编"内容时并不觉得自己在撒谎。
但你有没有想过另一个问题:同样一个模型,为什么有时候输出稳定得像复读机,有时候又放飞自我到离谱?
答案藏在几个不起眼的参数里。
模型是怎么"选词"的
大模型写东西,其实是一个字一个字蹦出来的。
每蹦一个字之前,它会做这么几件事:
首先,它会给词汇表里的每个词打分。词汇表多大?通常5万到15万个词。模型要给每一个都打个分数,这个分数叫logits。
然后,分数要变成概率。怎么变?用一个叫Softmax的数学函数。变完之后,所有概率加起来等于1。
这里有个关键点:概率分布不是"非此即彼"的。分数最高的词概率最大,但分数低的词概率不会变成零,只是比较小。
类比一下,就像一个巨型抽奖转盘。5万张牌,每张牌占一块扇形面积。模型决定哪块面积大一点,哪块小一点。
你问它下一个词是什么,它就在这个转盘上转一下,指到谁就选谁。
转盘的面积分布,就是概率分布。

从"死板"到"灵活"——采样方式的演进
最早的大模型很老实。
它每次都选概率最高的那个词。这叫贪心解码——就像考试时永远选第一个选项,不冒险。
后来有人觉得这样太无聊。试试Beam Search:不是只选一条路,而是同时保留几条最可能的路径,像多开了几个存档。
但问题来了。
太稳定的输出,读起来像复读机。同样的问题问三遍,答案一字不差。用户体验很差。
于是随机采样出现了。
现在不是100%选最高概率的词了,而是按概率比例来抽。高概率的词抽中机会大,但低概率的词也有可能被选中。
这就像抽奖:面积大的当然更容易被转到,但面积小的也不是没机会。
于是输出开始有了"人味"。同一个问题,你问三遍可能会得到三个不同的回答。有的更详细,有的更简洁,有的角度还不太一样。
AI的创造力,其实就来自于这种概率分布边缘的随机性。
不是模型"选择"了什么,而是概率恰好落到了那里。

Temperature——控制输出的"冷热"
好了,现在我们知道模型是用概率在选词。
但概率分布是可以"调教"的。
Temperature,就是干这个的。
它的本质是对logits做一次缩放,再过Softmax。公式不讲了,太枯燥。你只需要理解它的效果:
低温T≈0.1的时候,概率分布会变得"尖锐"。
本来可能A词概率0.3,B词0.25,C词0.2。差距不算大。但低温一加,A词概率可能变成0.8,B词变成0.15,C词基本没戏了。
相当于放大镜照在最高概率那个词上,其他词更没存在感了。
结果就是:输出极其稳定。你问十遍同一个问题,大概率得到基本相同的答案。
那高温呢?
T≈2.0的时候,概率分布会变得"平滑"。
原本A词0.3、B词0.25、C词0.2的差距,被压缩了。A词可能变成0.4,B词变成0.35,C词也有0.2了。
这时候低概率的词更有机会被选中。输出更多样、更新鲜,但也可能更离谱。
温度就像调味料。
低温是白开水,喝着安全但没味道。高温是烈酒,上头上得快,但也容易翻车。
还有个特殊情况:T=0。
这时候等价于贪心解码——永远100%选最高概率的词。同样的输入,永远同样的输出。
追求稳定的场景,这就是最佳选择。

Top-K和Top-P——两种截断策略
随机采样给了模型自由度,但也有个问题。
概率分布的尾巴上,那些概率极低的词,偶尔还是会被抽中。你肯定不想让模型突然蹦出一个完全不着边际的词。
所以要截断。
Top-K是最朴素的想法:不管分布怎么样,只保留概率最高的K个词,其余直接置零。
比如K=50,那就只看概率排名前50的词。剩下的5万个词,直接判死刑。
简单粗暴,但有个问题。
有时候概率分布很集中,可能前3个词的概率加起来就超过99%了。但Top-K非要保留50个,多余的40个其实是噪音。
有时候分布很分散,可能前100个词都有一定概率。你设K=50,反而把有价值的词给误杀了。
于是Top-P登场了。
它不固定数量,而是固定一个概率阈值P。比如P=0.9。
做法是:从概率最高的词开始,往下累加。累加到超过0.9就停。这几个词形成了一个"核"。
这样,当模型很有把握时,可能只有2-3个词进核。当模型犯难时,可能有50个词进核。
自适应。聪明。
Top-K是"只准前K名进决赛"。Top-P是"分数线达到多少就停"。
工业界现在普遍推荐Top-P。GPT-4的默认设置也是Top-P而不是Top-K。

三个参数怎么配合
好了,现在你有三个旋钮可以调:Temperature、Top-K、Top-P。
但它们不是独立工作的。
有个执行顺序:先Top-K,再Top-P,最后Temperature。
你可能会想:先后顺序有什么影响?
影响大了。
假设先用Temperature调整了概率分布,再用Top-P截断。这时候截断看的是调整后的分布。
如果反过来,先截断再调温度,分布的变化就会在不同的候选集上发生。
所以搞清楚顺序很重要。
更重要的是:Temperature和Top-P是"此消彼长"的关系。
Top-P=1.0意味着不截断,把所有词都留着,让Temperature自由发挥。
Top-P=0.5意味着大幅截断,只保留概率最集中的那一半。这时候即使温度高,能选的范围也有限。
同时调两个,效果会打架。你不知道是哪个旋钮在起作用。
有个口诀:调了Top-P就先固定Temperature,不要两个一起改。
就像调音响的低音和高音旋钮。同时拧,你分不清是哪个在影响声音。
我自己的经验是:先调Temperature。Top-P保持默认0.9或1.0。Top-K一般默认不设置,让Top-P来干活。
只有当你发现模型频繁选到一些很低质量的词时,再考虑限制Top-K或者降低Top-P。

不同场景怎么配置
理论讲完了,来点实用的。
代码生成、数学计算这类任务,要的是准确,不求创意。
T=0~0.2,Top-P=1.0,不截断但温度极低。每次输出稳定一致,不接受意外。
日常对话、摘要写作,需要平衡。
T=0.5~0.7,Top-P=0.9。有一定变化空间,但不会太离谱。
故事创作、头脑风暴,想要惊喜也愿意承担风险。
T=0.8~1.2,Top-P=0.95。给模型更多自由度,让它敢想敢写。
你发现规律了吗?
越需要精确的场合,温度越低。越需要创意的场合,温度越高。
Top-P也是同样的逻辑。越需要控制,阈值越低。越需要自由,阈值越高或设为1.0。
其实就像不同场合穿不同衣服。没有哪套衣服是万能的,只有适合不适合。

调参的本质
聊到这儿,你发现没有?
调参不是什么高深的技术活,本质上是在"控制"模型的随机性。
让它更听话,还是更有创意?你想要中间哪个点?
大模型的输出,本来就是一个概率游戏。参数只是让你在这个游戏里,有更多的主动权。
下次遇到输出太死板或太放飞的情况,记得先检查这三个参数。
这比怀疑模型"不够聪明"有用得多。
对了,如果模型能调用工具呢?比如帮你查天气、定闹钟、搜资料——它是怎么做到的?下回我们来聊这个。
