- 🔪 Top-K:限制候选词数量,使生成内容集中。
- 🧠 Top-P:控制候选词动态的累加截断,确保合理的候选词动态加入。
- 🌡️ Temperature:调整生成的随机性,控制生成风格的严谨或随意。
🌡️ Temperature
模型的原始输出:不是一个词,而是一张“榜单”。
当 LLM 读完你的 Prompt 并准备生成下一个 token 时,它输出的其实是一个包含所有已知词汇(通常几万个)的 Logits(原始得分)列表。
假设词表只有 4 个词,对于输入 “天空是”,模型的原始输出可能是:
- 蓝色的:得分 10.0
- 灰色的:得分 8.0
- 红色的:得分 2.0
- 绿色的:得分 0.1
2. Softmax 归一化:将得分变成概率
模型会通过一个叫 Softmax 的函数,把上面的得分变成概率百分比(总和为 100%)。
- 蓝色的:85%
- 灰色的:14%
- 红色的:0.9%
- 绿色的:0.1%
关键时刻来了:现在该选哪个词?
两种选择策略
策略 A:贪婪搜索 (Greedy Search) —— 没有随机性
每次只选概率最大的那个词。
- 结果:永远选“蓝色的”。
- 后果:同样的 Prompt 永远生成同样的内容。但这会让生成的文本非常死板,容易陷入循环,缺乏创造力。
策略 B:随机采样 (Random Sampling) —— 随机性的来源
我们根据概率分布来“掷骰子”。
- 虽然“蓝色的”概率最大(85%),但我们依然允许系统有 14% 的几率选“灰色的”,甚至 0.9% 的几率选“红色的”。
- 这就是为什么同一个 Prompt 会有不同结果。 模型其实是在说:“大多数时候天空是蓝的,但偶尔也是灰的,极少数情况(晚霞)是红的。”
- 采样机制赋予了 LLM “创造力”和“多样性”。
Temperature(温度)的原理与作用
从数学原理上讲,Temperature () 是一个除数,它作用在 Softmax 之前。公式简写为:。让我们看看调整 值会发生什么:
🧊 低温状态 (,例如 0.1) —— “强者愈强”
当 很小时(比如 0.1),我们用原始得分除以一个小数,由于指数函数的特性,原本的高分会被极其夸大,原本的低分会被极其压缩。
- 原始分布:蓝(85%),灰(14%),红(0.9%)
- 低温处理后:蓝(99.99%),灰(0.01%),红(0.00%)
- 效果:概率分布变得极其尖锐(Sharp)。模型几乎只会选择第一名。
- 表现:回答非常稳定、精确、死板,几乎没有随机性。
- 适用场景:代码生成、数学解题、事实问答(你肯定不希望 1+1 有 10% 的概率等于 3)。
🔥 高温状态 ( 或更高) —— “众生平等”
当 很大时,原始得分之间的差距被缩小了。比如这里 。
- 原始分布:蓝(85%),灰(14%),红(0.9%)
- 高温处理后:蓝(50%),灰(35%),红(15%)
- 效果:概率分布变得扁平(Flat)。
- 原本概率很低的“冷门词”现在有了更高的被选中机会。
- 表现:回答极具创造性、用词丰富,但也容易胡说八道(因为选了不合理的词)。
- 适用场景:写诗、头脑风暴、创意写作。
⚖️ 标准状态 ()
保持模型原始输出的概率分布,不做人为的缩放。
场景设定:让 AI 补全句子
假设我们给 LLM 的输入(Prompt)是:“这只猫坐在……”
模型计算出下一个字的 原始得分(Logits),前三名可能是:
- 地毯 (Mat) -> 得分:10.0 (最符合常理)
- 椅子 (Chair) -> 得分:9.0 (也很合理)
- 月亮 (Moon) -> 得分:2.0 (离谱,但充满想象力)
核心数学魔法:除法缩放
Temperature () 在数学公式里是一个 除数。
公式核心部分是:。我们要对比的是 差距。
情况 A:低温状态()—— 差距被拉大(贫富差距极大)
我们在做指数运算前,先把得分除以 0.5(相当于乘以 2)。
- 地毯:
- 月亮:
接下来算指数(概率的雏形):
- 地毯的权重: (4.8 亿)
- 月亮的权重:
结果:4.8 亿 vs 54。
“地毯”的概率几乎是 100%,“月亮”的概率无限接近 0。 这时候模型 绝对不敢 胡说八道,它只会选最安全的词。
情况 B:高温状态()—— 差距被缩小(众生平等)
这次我们除以 5。
- 地毯:
- 月亮:
接下来算指数:
- 地毯的权重:
- 月亮的权重:
结果:7.4 vs 1.5。
虽然“地毯”还是老大,但它不再拥有统治级的优势了。此时转化为概率大约是:
- 地毯:约 60%
- 月亮:约 12%
本来“月亮”根本不可能出现,但在高温下,它突然有了 12% 的出场机会!如果在生成几百个字的过程中,每个字都有 10% 的机会选一个“离谱”的词,那么整段话的风格就会大变。
具体表现:从“无聊”到“疯癫”
基于上面的计算,生成的句子会变成这样:
🧊 T=0.1 (极度理性)
“这只猫坐在地毯上,看着窗外的鸟。” (解释:每个词都选概率最高的,逻辑完美,但像白开水。)
😐 T=1.0 (正常交流)
“这只猫坐在椅子上,打了个哈欠。”(解释:偶尔选了第二名的‘椅子’,还是符合常理的。)
🔥 T=2.0 (高温/创意模式)
“这只猫坐在 月亮 上,用尾巴钓星星。” (解释:模型选中了低概率的‘月亮’。虽然物理上不合理,但文学上极具画面感。这就是 创造力。)
🤪 T=10.0 (温度过高/胡言乱语)
“这只猫坐在 哲学 的 三角形 里,紫色味道。”(解释:概率分布太平了,模型开始随机抓取完全不相关的词。这就变成了 胡说八道。)
为什么叫“扁平 (Flat)”
想象一片地形:
- 原始得分:像喜马拉雅山。“地毯”是珠峰,“月亮”是一个小土包。
- 高温 ( 变大):相当于把珠峰 按 下去,把小土包 抬 起来。
- 最终效果:整个地形变成了一片 高原平地。
当所有词的高度都差不多时,随机扔一个球(采样),落在哪里都有可能。这就是“众生平等”。
总结图解
想象一个转盘抽奖:
- 模型输出:给“蓝色”划分了大块扇形,给“灰色”划分了小块。
- Sampling:开始转动转盘。
- Temperature:
- 调低温度:就是人为地把“蓝色”的扇形面积撑大,挤压其他颜色的空间,让你几乎只能抽中蓝色。
- 调高温度:就是把所有颜色的扇形面积变得差不多大,让你抽中什么都有可能。
工程结论:
Temperature 并不改变模型的能力,它只是 改变模型“冒险”的意愿。
- 低温 = 保守派,不求有功但求无过。
- 高温 = 冒险家,追求新奇但容易翻车。
🔪 Top-K
Top-K 限制了模型在每一步中输出的概率最高的前 K 个最可能的词。这可以通过限制模型的词汇表来减少不连贯或无意义的输出。
具体场景说明
假设 K = 3,Prompt:“今天早餐我想吃……”模型预测之后的各个候选词经过倒序排序之后如下:
- 面包 (40%)
- 包子 (30%)
- 油条 (20%)
- 混凝土 (0.01%) -> 离谱词
- 三角函数 (0.001%) -> 离谱词
如果不加限制:虽然概率很低,但如果掷骰子运气极差,模型真有可能输出“我想吃混凝土”。
启用 Top-K (K=3):
系统直接划一条线,只保留前 3 名(面包、包子、油条)。第 4 名及以后的词,概率直接强制变为 0。
然后我们在 {面包, 包子, 油条} 这三个词里随机选。
局限性
Top-K 有个大问题:它是死板的数字。
- 场景 A(词汇贫乏):问“1 + 1 = ?”。概率分布是:2 (99%), 3 (0.01%)... 如果 K=5,它会强行把后面几个极低概率的错误答案也拉进来凑数,增加了出错风险。
- 场景 B(词汇丰富):写小说“他脸上的表情是……”。可能前 20 个形容词(悲伤、愤怒、无奈、苦笑...)都很合适。如果 K=5,你反而把剩下 15 个好词给误杀掉了,导致文采变差。
🧠 Top-P (动态累加截断)
为了解决 Top-K 的死板问题,研究者提出了 Top-P,逻辑是:不限制具体选几个词,但我要求这些词加起来的概率总和要达到 P%。 从而增加输出的多样性,同时避免低概率的词。
设定 P = 0.9 (即 90%)。系统会从第一名开始往下加,直到概率总和超过 90% 为止。剩下的全部扔掉。
具体场景对比
场景 1:答案很确定的情况
Prompt:“中国的首都是……”模型预测之后的各个候选词经过倒序排序之后如下:
- 北京 (0.85)
- 上海 (0.05)
- 深圳 (0.02)
- 广州 (0.01)
从第一名开始往下加,看什么时候撞线 (>= P)。
- 加(北京): 0.85 (还没到 0.9,继续)
- 加(上海): 0.85 + 0.05 = 0.90 (撞线了!停止!)
现在的概率和是 0.9,不是 1。所以要把 {北京, 上海} 的概率按比例放大,让它们加起来等于 1。
- 北京的新概率
- 上海的新概率
最终采样:在这两个词里掷骰子。
场景 2:答案很开放的情况
Prompt:“在一个风雨交加的夜晚,侦探推开了门,看到了……” 模型预测之后的各个候选词的概率经过倒序排序之后如下:
- 尸体 (10%)
- 血迹 (8%)
- 猫 (7%)
- 脚印 (6%)
- ... (后面还有几十个合理的词)
Top-P 过程:
10% + 8% + 7% ... 一直加,可能加到第 15 个词,总和才凑够 90%。
候选池:{尸体, 血迹, ..., 第15个词}。
⚙️ 三个参数如何协同工作
这三个参数就像是一个 三级流水线。
- 第一步:🌡️ Temperature(调整概率形状)
- 第二步:🔪 Top-K(强制截断前几名)
- 第三步:🧠 Top-P(核心累加截断)
- 最后:🎲 随机采样(掷骰子)
具体场景
🧙♂️ 场景:你要 AI 写一个奇幻故事的开头。
Prompt:“魔法师举起法杖,召唤出了一只__……”
假设模型原始预测的候选词转换后的概率倒序如下(长尾词表有 50,000 个):
- 🐉 火龙 (40%) - 最合理
- 🦅 凤凰 (30%) - 很合理
- 🐰 兔子 (15%) - 有点反差萌
- 🦆 烤鸭 (5%) - 离谱但搞笑
- 🚜 拖拉机 (2%) - 完全不合逻辑
- ... (剩下 8% 是数万个无关词,如“今天”、“但是”等)
第一道工序:Temperature(温度)—— 调氛围
作用:在做任何删除之前,先决定我们要“保守”还是“激进”。
- 如果设 T = 0.5 (低温):
- “火龙”的概率会被放大到 80%,“烤鸭”可能降到 0.1%。
- 后果:后续的 Top-K/P 只能在“火龙”和“凤凰”里选了。
- 如果设 T = 1.5 (高温):
- “火龙”降到 25%,“烤鸭”升到 10%,“拖拉机”升到 5%。
- 后果:长尾词(烤鸭、拖拉机)的生存几率大大增加。
假设我们设定 T = 1.0 (标准),保持原始概率不变,进入下一关。
第二道工序:Top-K —— 粗筛(防崩坏的硬底线)
作用:不管概率多少,我只允许前 K 名参赛。这是一种 低成本的物理防御,防止模型在极低概率的长尾里选出完全破坏语法的词。
- 设定 K = 3:
- 保留:{火龙, 凤凰, 兔子}
- 淘汰:{烤鸭, 拖拉机, ...} —— 即使“烤鸭”有 5% 的概率,也被无情砍掉了。
- 结果:回答一定在常规生物范围内。
- 设定 K = 50:
- 保留前 50 名。
- 结果:“烤鸭”和“拖拉机”都活下来了,进入下一关。
假设我们设定 K = 50,保留了多样性。
第三道工序:Top-P —— 精筛(智能动态截断)
作用:在 Top-K 留下的圈子里,根据概率总和再次筛选。这是为了 保证质量。
- 设定 P = 0.85:
系统开始累加概率(假设 T=1.0):
- 火龙 (40%) -> 总和 40%
- 凤凰 (30%) -> 总和 70%
- 兔子 (15%) -> 总和 85% —— 够了,停止!
结果:虽然 Top-K 放过了“烤鸭”,但 Top-P 觉得前三名的概率加起来已经足够代表主流意见了,所以 把“烤鸭”踢出局。
最终候选池:{火龙, 凤凰, 兔子}。
三者协同的“黄金组合”策略
理解了流程,你就知道怎么组合它们来达到不同目的:
1. 🤖 “严谨逻辑型” (代码生成、数学解题)
- 策略:压低不确定性,消灭长尾。
- 配置:
- Temperature = 0 (或极低,0.1):直接把第一名的概率撑到最大。
- Top-K = 1 (或 5):只要前几名。
- Top-P = 0.1:只要最核心的那个。
- 效果:模型变成一个只会选“火龙”的复读机,极其稳定。
2. 💬 “正常对话型” (客服、助手)
- 策略:说话要通顺,偶尔可以有点小变化,但别离谱。
- 配置:
- Temperature = 0.7 - 0.9:适度活跃。
- Top-K = 50:砍掉绝对的垃圾词。
- Top-P = 0.85 - 0.9:保留主流可能。
- 效果:大部分时候说“火龙”,偶尔说“兔子”,绝对不会说“拖拉机”。
3. 🎨 “疯狂创意型” (头脑风暴、写段子)
- 策略:我要惊喜!我要那个“烤鸭”!
- 配置:
- Temperature = 1.2+:强行把“烤鸭”的概率提上来。
- Top-K = 100+ (甚至不设):千万别把“烤鸭”被 K 值一刀切了。
- Top-P = 0.95 - 0.99:允许累加到很后面,给长尾词机会。
- 效果:模型可能会写出“魔法师召唤出了一只 烤鸭,烤鸭还开着 拖拉机”这种神奇的句子。
📝 总结
- 🌡️ Temperature 是 “兴奋剂”:它决定了模型有多大意愿去冒险。
- 🔪 Top-K 是 “入围门槛”:由于计算资源有限,先用它快速砍掉 99% 的垃圾词。
- 🧠 Top-P 是 “质量守门员”:它根据当前的自信程度,动态决定要保留多少个候选项。
💡 最佳实践:通常即使你想调整随机性,优先调 Temperature 和 Top-P。Top-K 通常固定在 40-100 作为一个保底的安全网即可。