考卷上有几道题?Temperature 和 Top-K 调参指南

你用 ChatGPT 写代码,temperature 调到 0.2,它老老实实地给你 return 一个 bug-free 的函数。你把 temperature 拉到 0.9,让它写同一段代码,它开始给你编造 API、发明不存在的参数名、在注释里写诗。

这背后没那么多玄学,它其实是一道数学题。

大模型在生成每一个词的时候,本质上是在做选择题。它脑子里有几十万个候选词,每个词都有一个「被选中」的概率。你的 temperature 和 Top-K,就是在决定这道选择题怎么出。


大模型生成下一个词,靠的是计算,不是灵感

当你输入「你好」之后,模型并不会像个诗人一样苦思冥想接下来该说啥。

它做的事情很机械:算出整个词表中每个词跟在「你好」后面的概率,得到一个概率分布。大概是这样的------

text

arduino 复制代码
"你好" 之后该接什么?

吗    0.60   ████████████████████████████████████
啊    0.15   ██████████
美    0.05   ███
坏    0.01   ▌
(其他几十万个词,概率都极小)

看到没有。「吗」概率最高,0.6。如果你每次都挑概率最高的那个词,模型就会输出「你好吗」------每次都是,100% 可预测。

这套逻辑叫 greedy decoding,相当于温度等于 0 时的行为。它的问题也很明显:生成的文本千篇一律,没啥灵魂。而且在某些场景下,概率最高的那个词未必就是最合适的------比如写诗的时候,最不合理的词反而最妙。

所以我们需要两个旋钮来干预这个选择题。


Temperature:让概率分布「变胖」或「变瘦」

Temperature 做的事情很简单,就是在做选择之前,先把所有概率重新「捏」一遍。

公式很简单: 把每个词的概率取 1/T 次方,然后重新归一化。

听着挺唬人,但效果很好理解:

  • T < 1(比如 0.2) :高概率的词被推得更高,低概率的词压得更低。概率分布「变瘦」了,高峰更尖,模型会非常坚定地选最高概率的那个词。结果:确定性强,输出几乎不变。
  • T > 1(比如 0.8) :高概率的词被稍微压一压,低概率的词被抬一抬。概率分布「变胖」了,那些本来没什么机会的词现在也有了一定的概率。结果:随机性增加,输出更多样。

回到「你好」的例子:

text

ini 复制代码
原始概率(T=1.0):
吗 0.60 | 啊 0.15 | 美 0.05 | 坏 0.01

T = 0.2(压低随机性):
吗 0.92 | 啊 0.05 | 美 0.02 | 坏 <0.001
→ 几乎必然是「吗」,非常严肃,非常稳妥

T = 0.8(抬高随机性):
吗 0.45 | 啊 0.20 | 美 0.10 | 坏 0.04
→ 「坏」也有 4% 的概率被选中,这就是创意的来源

注意:就算 temperature 很高,概率最高的词依然是最高。temperature 只负责「压缩」或「拉伸」概率之间的距离,不改变排序。你永远是在一个合理的候选集里做选择------只是选择的范围变宽了。


Top-K:一刀切掉长尾

如果说 temperature 是「微调概率」,那 Top-K 就是「暴力裁剪」。

它的逻辑比 temperature 还粗暴:只在概率最高的 K 个词里采样,剩下的所有词直接淘汰,概率置为 0。

比如 Top-K = 4,那么不管词表有几万、几十万个词,模型的目光全部锁定在概率前四的候选词上。其它的,看都不看。

text

ini 复制代码
所有候选词(几十万个):
吗 0.60 | 啊 0.15 | 美 0.05 | 坏 0.01 | 咯 0.003 | 呢 0.001 | ...

Top-K = 4:
吗 0.60 | 啊 0.15 | 美 0.05 | 坏 0.01
→ 后面的「咯」「呢」以及剩下几十万个词,全部砍掉

Top-K 的默认值通常是 8。K 越小,选择范围越窄,输出越「保守」。但 K 太大也没意义------长尾的词本来概率就微乎其微,砍不砍区别不大。

Top-K 解决了一个实际的问题:就算你设了一个合理的 temperature,低概率的「垃圾词」仍然可能被采样到。万一有个完全没意义、但又因为 temperature 稍微抬了头的词被抽中,整个生成就偏了------这其实就是「幻觉」的数学机制。


两个旋钮一起拧

这里有个很多人忽略的关键点:temperature 和 Top-K 不能两个都设很大,也不能两个都设很小。 它们要搭配。

错误示范一:temperature=0.9,Top-K=50。你又想要创意,又不限制候选集,模型在几万个词里随机选,出来的东西完全不可控。

错误示范二:temperature=0.05,Top-K=2。你把候选集压到只剩两个词,温度又低到几乎没有随机性,模型只能输出最无聊、最可预测的结果。

正确的组合逻辑是这样的:

场景 Temperature Top-K 效果
代码生成 / 合同撰写 0.1--0.3 6--10 确定性为主,但保留一定的词汇多样性,不会在非关键位置死板
通用对话 / 客服 0.5--0.7 6--8 自然但不离谱,能应对多样化的用户表达
文艺创作 / 文案 0.7--0.9 3--5 创意不减,但小 Top-K 确保只在最靠谱的几个方向里发散

你可以这样记:

  • Temperature 低 + Top-K 大:准确,但保有艺术性。适合需要精确但不死板的场景。
  • Temperature 高 + Top-K 小:靠谱的创意。高温度让模型胆大,小 Top-K 给这个胆大套上个缰绳。

其实就等于说:Top-K 决定「你是在多大的池子里采样」,temperature 决定「在这个池子里,你是倾向于选最好的那个,还是偶尔试试后面几个」。


代码里怎么用

看一下实际 Demo------用的是 DeepSeek 的 API,通过 LangChain 来调。

笔记里的这行注释是点睛之笔:temperature 和 Top K 不可能都太大,都很小也没有必要。下面的代码就是把这句话翻译成了配置,分别创建了两条「生产线」:

创意线路:temperature=0.8,Top-K=4

「我想要创意,creative chain 让温度高起来(0.8),随机性放开。」但同时 Top-K 只取到 4,相当于告诉模型:你只在最合理的前四个候选词里发挥创意,别一下子滑到十万八千里外。这套配置跑出的散文是这样的------

像一首被遗忘的小调,带着草木将枯未枯的淡淡涩意。它不急,也不凉,只是温柔地、反复地,拂过你的眉梢与袖口......

画面感有,但不跑偏,因为它从头到尾都没离开主题。

严谨线路:temperature=0.2,Top-K=8

「Temperature 压到 0.2,保信息的完整性和准确度,precise chain。」这里 Top-K 反而给到了 8------因为温度已经压得很低了,高概率的词几乎一定会被选中,给一个大一点的 K 只是为了在非关键位置多一些自然的变化,避免输出变成机械的车轱辘话。这套配置跑出来是这样的------

当夕阳滑落山头,山野的晚风仿如化为一位温柔的使者,无声拥抱这片静谧的土地。它没有形状,却可轻抚每一片叶片......

能明显感觉到跟上面不一样------语句更规整、更「正确」,但少了一点野生的灵气。不过它绝对不跑题,也绝对不编造不存在的东西。

两条线路本质上是同一个 pipeline:

text

复制代码
Prompt → LLM → 输出解析(纯文本)

LangChain 的 .pipe() 就跟水管工似的,把这三个东西串起来。你只需要往入口灌一个 theme,出口就能接到结果:

text

ini 复制代码
const creativeChain = storyPrompt.pipe(creativeModel).pipe(storyOutputParser);
const preciseChain  = storyPrompt.pipe(preciseModel).pipe(storyOutputParser);

const creativeText = await creativeChain.invoke({ theme: "秋日山野晚风" });
const preciseText  = await preciseChain.invoke({ theme: "秋日山野晚风" });

实际业务里大概会长成这样:

  • 你要写一个 AI 合同审查功能,用 preciseChain------temperature 0.2 + Top-K 8,保证每个条款的措辞都在预期范围内
  • 你要写一个 AI 文案生成器,用 creativeChain------temperature 0.8 + Top-K 4,有创意但不跑偏

幻觉问题和这两个旋钮的关系

很多人把幻觉当成模型的缺陷,但说白了,它只是概率采样必然会出现的情况。

你想,模型在生成每一个 token 的时候都在几十万个候选词里做随机选择。只要某个低概率的「坏词」被抽中了,后续的生成就会在错误的基础上继续------正所谓一步错,步步错

Temperature 把低概率词的阈值抬高,客观上增加了幻觉的概率。不过这不能全怪 temperature------如果你不想要任何随机性,那把 temperature 设为 0,走 greedy decoding 就好,100% 确定。但那样也就失去了所有灵活性。

所以在实践中,治理幻觉是一套组合拳:

  1. 先用 Top-K 把垃圾词砍掉------那些概率本身就很低、没有任何语义价值的词,直接不要
  2. 再用 temperature 在剩下的好词里控制随机性------需要创意就高一点,需要严谨就低一点

笔记里也提到了这个思路:「把 temperature 拉高,随机性增加,生成会不太靠谱;有些创作类的随机性会增加创意,但还是得保证质量。可以分两步做------先用 Top-K 把高概率的词选出来,再用 temperature 控制随机性。」


这俩的区别

Top-K 决定「考卷上有几道题」,temperature 决定「你是选最确定的答案,还是偶尔选个不那么确定的」。

Top-K=4 意思是只有 4 个选项给你选,temperature=0.2 意思是你大概率会选最像正确答案的那个。

理解了这两个参数干什么的、怎么配合,你就能把 AI 应用的输出从「它好像在随机输出」变成「我知道它在什么范围内发挥」。

相关推荐
云原生melo荣2 小时前
Multi-Agent 系统(一):问题域与架构选型——为什么这次"固定流程"编排不动
agent·ai编程
码农胖大海3 小时前
AI 响应慢自查清单
agent·ai编程
梓䈑3 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
机建狂魔4 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
一条鱼丶6 小时前
35 个文件、14.58% 数据是空的,我让 TRAE Work 十分钟收拾干净了
ai编程
Pokerhead7 小时前
一个 Codex,能装下所有 AI 模型?
大数据·人工智能·ai·大模型·ai编程·codex
西安小哥7 小时前
AI 知识库与智能检索:高阶面试实战指南
ai编程
console.log('npc')8 小时前
OptMem 使用教程
人工智能·ai编程·记忆