Temperature 和 Top-p 到底在调什么?从大模型生成原理讲清楚这两个参数
很多人第一次注意到 temperature 和 top-p并不是在论文里而是在产品界面里。比如在 Google AI Studio 的 Run settings 面板中就可以直接调整 model parameters如果你改用 Gemini API也会在generationConfig里看到temperature、topP这样的字段。也就是说这两个参数不是学术讨论里的边角料而是今天实际调用大模型时就摆在开发者面前的“生成控制旋钮”。问题也因此很自然它们到底在控制什么为什么只改一个小数模型的输出风格就会明显变化大模型的结构要回答这个问题先别急着上复杂公式。把大模型先看成一个“预测下一个词”的系统就够了。你给它一句话开头比如“今天天气真”模型不会直接在内部想出一整句完整答案而是会先看上下文然后对词表里所有可能接在后面的 token 打分。这个“打分”不是我们平时说的概率而更像是模型对每个候选词的偏好强弱。Transformer 的经典论文里也明确写到解码器输出会经过一个线性变换再经过 softmax最终变成“下一个 token 的预测概率”。所以从最朴素的直觉看大模型生成文本其实就是一条很简单的链路先算分数再把分数变成概率最后从这些概率里选一个 token 出来。如果再把这条链路说得更形象一点可以把它理解成三个动作。第一步模型根据前文给每个候选 token 打一个“倾向分”第二步这些分数经过 softmax被压成总和为 1 的概率分布第三步系统按这个分布做一次采样选出真正要输出的那个 token。选完以后这个 token 会被接回原句成为新的上下文模型再重复同样的过程。因此大模型并不是“一次性写完全文”而是在不断重复“评分—变概率—抽取”的循环。Temperature 的公式作用上面这条链路里temperature 起作用的位置正好就在“分数变概率”这一步。假设模型对所有候选 token 给出的原始分数是 z1,z2,…,znz_1, z_2, \dots, z_nz1,z2,…,zn这些分数通常叫做logits。如果不加 temperature那么 softmax 之后第 iii 个 token 的概率就是而引入 temperature TTT 之后公式会变成也就是说temperature 并不是在 softmax 后面再随便调一下概率而是在进入 softmax 之前先把所有 logits 都除以一个 TTT。这一步看起来只是一个简单的缩放但会直接改变整个概率分布的形状。如果 T1T1T1那么公式和原始 softmax 完全一样temperature 不产生额外影响。如果 T1T1T1例如 T0.5T0.5T0.5那么每个 logit 都会被“放大”一倍。原本大的分数会变得更大原本小的分数会变得更小于是 softmax 输出的概率分布会更尖锐最高概率 token 的优势会被进一步拉大模型就更倾向于选择最稳妥、最确定的答案。相反如果 T1T1T1例如 T1.5T1.5T1.5 或 T2T2T2那么 logits 会被压缩分数之间的差距被缩小最后得到的概率分布会更平缓原本概率较低的 token 也更有机会被采样到模型输出就会更发散、更多样。这个过程可以用一个简单例子直观看出来。假设某一步只有两个候选 token它们的 logits 分别是 4 和 2。这时概率高度集中在第一个 token 上输出会非常保守。而当 T2T2T2 时相当于 logits 变成 2 和 1可以看到第二个 token 的机会明显变大了模型更愿意尝试“不那么标准但也合理”的选项。所以从公式本质上说temperature 做的事情可以概括为一句话它通过缩放 logits来控制 softmax 之后概率分布的尖锐程度。低 temperature 让分布更尖高 temperature 让分布更平。前者更偏向确定性输出后者更偏向多样性输出。它并不改变模型“认为谁最好”的排序但会改变“最好和次好之间到底差得有多大”而这正是它能显著影响生成风格的根本原因。Top-p 是什么如果说 temperature 主要是在调“概率分布的陡峭程度”那么 top-p 更像是在调“模型到底允许自己在多大的候选范围里做选择”。前面说过大模型会先给所有候选 token 打分再通过 softmax 变成一组概率。到了这一步其实词表里每个 token 都有一个概率只是有的很高有的几乎可以忽略不计。top-p 做的事情就是先把这些 token 按概率从高到低排好然后只保留前面那一部分“最有可能的候选”直到它们的累计概率达到设定的阈值 ppp。可以把它写成一个很简单的形式。假设排好序后的概率是那么 top-p 会取前面最小的一组 token使得它们的累计概率满足这其实就够了。它表达的意思很直白模型不会从整个词表里随便选而是只会在“最有希望”的那一小部分候选里继续抽样。比如某一步里模型算出来几个候选词的概率分别是“开心” 0.40“高兴” 0.25“愉快” 0.15“兴奋” 0.10“雀跃” 0.05其他词加起来 0.05。如果这时候 top-p 设成 0.8那么系统只需要保留前四个词因为它们的累计概率已经达到0.400.250.150.100.900.40 0.25 0.15 0.10 0.900.400.250.150.100.90后面的“雀跃”和其他更小概率的词就直接不参与这次采样了。也就是说top-p 不会去改变“开心”和“高兴”谁更可能它只是先划定一个范围模型这一步只能在这些相对靠谱的候选里选别跑得太远。所以从直觉上看top-p 控制的是候选池大小。ALL IN ALL所以从原理上看temperature 和 top-p 并不是在改变模型“知道什么”而是在改变模型“怎么从自己知道的东西里说出来”。它们不决定模型是否懂你的问题更多决定模型在输出时是偏向唯一最优解还是愿意在一小片合理答案之间进行探索。前者更像“把最可能的话说出来”后者更像“在合理范围内允许一些变化”。对于写代码、抽取信息、做结构化问答这类任务通常会更偏向低随机性而对于文案、创意写作、头脑风暴这类任务则更可能需要更宽松的采样空间。Google 的文档也把 temperature 明确归为 response generation 时控制随机性的参数把 top-p 定义为控制候选 token 累计概率范围的参数。回到一开始的问题为什么在 Google 的界面里你只是改了两个小数回答风格就像换了个人答案就是这两个参数正好卡在大模型生成链路里最敏感的那一截——“最后到底选哪个 token”。模型前面的大部分计算负责形成一个可能答案的概率地形图而 temperature 和 top-p决定的是你要在这张地形图上走得多稳、多窄还是多活、多开。理解了这一点再去看这些参数就不会觉得它们只是调节“创造力”的神秘旋钮而会知道它们其实是在直接干预大模型的采样机制。