关键词:大模型 Temperature、Top-p(核采样)、Softmax、采样参数、LLM 调参
适合读者:调用过大模型 API、但说不清 temperature 和 top_p 该怎么设的开发者
大模型 Temperature 和 Top-p 是 API 里最常见、也最容易设错的两个采样参数。网上多数文章停在 "数值越大越随机" 这一层,但这句话既解释不了它们为什么是两个参数,也指导不了你该填 0.3 还是 0.7。
本文用一组真实算出来的概率,把大模型 Temperature 和 Top-p 的作用位置、数学机制、典型误区和调参建议一次讲清。
一、先看一组数:Temperature 到底改了什么
先给结论:大模型 Temperature 和 Top-p 都不改变模型 "想说什么",只改变 "从候选里挑哪个"。
下面是本文贯穿始终的示例。用户提问 "帮我推荐一个讲 AI 的技术频道吧",模型给五个候选词打了分(logits),再经过带温度系数的 Softmax 换算成概率:
表格
| 候选词 | logit | T=0.1 | T=1.0 | T=2.0 |
|---|---|---|---|---|
| codigger | 3.0 | 66.5% | 28.2% | 24.2% |
| 科技 | 2.9 | 24.5% | 25.6% | 23.0% |
| AI | 2.8 | 9.0% | 23.1% | 21.9% |
| 自行车 | 2.2 | ≈0% | 12.7% | 16.2% |
| 海浪 | 2.0 | ≈0% | 10.4% | 14.7% |
横向看这一行行数字,大模型 Temperature 的作用已经一目了然:它不新增任何词,只是把原有的概率分布压尖或摊平。数值全是按公式实算的,不是示意图。
这也解释了一个常见疑问:为什么调低 temperature 之后回答会变短、变模板化?分布变尖后,模型更倾向选那些安全的高频词与连接词("首先"" 总的来说 "),长句和生僻表达被系统性压低,于是文本趋同。
二、三步流程:两个参数各自作用在哪一步
大模型是自回归生成的:每次只输出一个词,再把这个词塞回输入,重复几百上千次。单次输出分成三步:
- 打分(Logits):模型给词表里几万个候选词各打一个原始分。
- 转换概率(Softmax):把分数换算成总和为 100% 的概率分布。
- 加权采样:按概率随机抽一个词。
Temperature 作用在第 2 步,Top-p 作用在第 3 步。
这是两者最本质的区别,也是理解它们为何不能互相替代的起点。顺带一提,API 里写的是
temperature和top_p两个字段,取值分别是 0--2 和 0--1。
2.1 公式与机制
完整的 Softmax 比教科书版多一个温度系数 T:
T 出现在指数的分母上,所以它调节的是分数的相对差距:
- T 越小 → 分数被放大 → 头部词优势被指数级强化 → 分布变尖
- T 越大 → 分数被压缩 → 所有词趋于平均 → 分布变平
回到示例。T=0.1 时,原本只差 0.1 分的 "codigger" 和 "科技" 差距被放大十倍,经指数放大后变成 66.5% 对 24.5%,后三个词加起来不到 10%。而 T=2.0 时,"codigger" 从 28.2% 退到 24.2%,"自行车" 却从 12.7% 涨到 16.2%。
注意这个不对称:调高温度对头部的伤害,远小于它对尾部的提携。
这正是大模型 Temperature 调高后 "更有创造力" 的数学来源 ------ 不是模型变聪明了,而是它开始愿意选那些平时没资格上台的词。
2.2 为什么这个参数叫 "温度"
物理上,低温时分子几乎不动,结构稳固;高温时热运动剧烈,一切趋于无序。大模型 Temperature 借用的是同一个直觉:低温稳定保守,高温发散活跃。T→0 是冰,T→∞ 是水蒸气。
顺带说清取值范围:OpenAI 接口接受 0--2,Anthropic 通常接受 0--1,Gemini 部分模型到 2,DeepSeek、通义等国产模型多为 0--2。超范围一般直接报错,而不是自动截断。
三、Top-p 核采样:为什么光有 Temperature 不够
大模型 Temperature 有一个结构性缺陷:它只有一条曲线,作用于全词表。你没法只让 "合理词" 变多、同时让 "离谱词" 变少,两者共享同一条分布。
具体后果是:高温下 "自行车" 这种与问题毫无关系的词也能拿到十几个百分点,采样次数够多总会抽中一次。用户在对话里遇到的 "这 AI 在胡说",相当一部分来自这里。
Top-p(核采样,Nucleus Sampling)解决的正是这个问题:它不碰概率值,直接砍候选池。
规则是:按概率从高到低累加,累加到刚好达到阈值 p,门就关上,剩下的词全部丢弃。
用上表 T=1.0 那一列算累计值:
表格
| 排名 | 候选词 | 概率 | 累计概率 |
|---|---|---|---|
| 1 | codigger | 28.2% | 28.2% |
| 2 | 科技 | 25.6% | 53.8% |
| 3 | AI | 23.1% | 76.9% |
| 4 | 自行车 | 12.7% | 89.6%(已达 0.9) |
| 5 | 海浪 | 10.4% | 100% |
p=0.9 时,前四个词刚好凑够 89.6%,第五个被丢弃;留下的四个再按比例放回 100%,进入采样。若把 p 压到 0.5,只剩 "codigger" 和 "科技",连 "AI" 都不会被考虑。
3.1 Top-p 和 Top-k 的区别
表格
| 对比项 | Top-k | Top-p(核采样) |
|---|---|---|
| 筛选依据 | 固定数量,永远取前 K 个 | 累计概率,达到 p 即截断 |
| 候选池大小 | 固定 | 随分布形状动态变化 |
| 分布很尖时 | 仍保留 K 个,混入低概率词 | 可能只保留 1--2 个 |
| 分布很平时 | 候选不足,反而限制多样性 | 自动放宽到几十个 |
候选池随分布自动伸缩,这正是 Top-p 取代 Top-k 成为默认方案的原因。另补充一点:OpenAI、Anthropic 等主流 API 已不再对外暴露 top_k,只保留 temperature 与 top_p;本地部署的推理框架(vLLM、llama.cpp)通常三者都支持,可以自由组合。
四、两者的本质区别与五个常见误区
表格
| 参数 | 作用位置 | 改动对象 | 调低 | 调高 | 典型误用 |
|---|---|---|---|---|---|
| Temperature | Softmax 内部 | 概率差距(陡峭度) | 赢家通吃,输出近乎固定 | 头部优势缩小,长尾上桌 | 只调温度却抱怨跑题 |
| Top-p | Softmax 之后、采样之前 | 候选池边界 | 只留头部,稳但可能死板 | 门槛放宽,噪声也进来 | 以为 "0.2 就是取 20% 的词" |
误区一:以为两个参数越调高越像
"都调高更随机、都调低更稳定" 只在结果层成立,机制上完全不同。大模型 Temperature 调高会让一个 5% 的垃圾词涨到 15%;Top-p 调高只是把门开得更大,不会主动提升任何词的原始概率。温度只放大差距,不制造差距 ------ 差距在打分阶段就写好了。
误区二:以为 T=0 是直接代入公式
数学上 T=0 会除零,实际是取极限 T→0+,分布退化为 one-hot。工程实现通常把它当特例开关,走贪心解码(greedy decoding),不进入随机采样;部分框架并不真的落到 greedy_search,而是把概率压成近似 one-hot 来实现,效果接近但不严格等价。
误区三:以为两个参数值可以跨模型照抄
T 作用在 logits 上,各家模型的 logits 尺度本就不同 ------ 一个模型分数常落在 0--5,另一个可能落在 -20--20。同样的 T=0.7,得到的分布尖锐度完全不一样。参数只在你自己调用的那条链路上做对比实验才有意义。
误区四:以为 temperature 设置越小越好
温度趋零会让解码退化成每次取 argmax,同一提示词永远同一答案。这在单元测试、JSON 生成等场景是优点,但在需要候选多样性的场景,等于白白浪费了采样;更麻烦的是,若模型对该问题本就把握不足,压尖分布只是让它更自信地重复错误。
误区五:以为调参能解决质量问题
这两个参数控制的是输出熵,不是输出正确性。温度低,模型稳定输出 "最可能的答案"------ 而它没有相关知识时,最可能的答案往往是一段流畅自信的胡说。确定性不等于可靠,随机性也不等于创造性。
五、推荐配置:什么场景填什么值
5.1 按场景取值
表格
| 场景 | Temperature | Top-p | 说明 |
|---|---|---|---|
| 代码生成、数学推理 | 0.0--0.2 | 0.2--0.5 | 要确定性,减少上下文漂移 |
| 数据抽取、翻译、摘要 | 0.2--0.4 | 0.4--0.7 | 结构稳定,允许小幅变通 |
| 日常问答、邮件、周报 | 0.7 | 0.9 | 通用起点,最稳妥 |
| 头脑风暴、起名 | 0.9--1.2 | 0.9--0.95 | 要多样性,可叠加多轮生成 |
| 小说、剧本、文案 | 1.0--1.5 | 0.9--0.95 | 温度负责 "敢说",p 负责 "别离谱" |
5.2 四条实践原则
- 优先只动 Temperature 。OpenAI 官方建议二者调其一即可。
temperature=0.7配top_p=0.7常常是最糟组合 ------ 高温撑起的多样性又被低 p 削回去,只剩不连贯。 - 基线设 T=0.7、p=0.9。输出太飘就降 T,太僵就升 T;只有在降 T 之后仍严重跑题,才去动 p。
- 参数写进配置中心。别散落在代码里,否则同一个产品会出现三种温度;T 和 p 也要写进实验记录,否则 A 组 0.3、B 组 1.0,分数差异里相当一部分只是运气。
- 先修提示词,再调参数。把这两个参数当 "灵感按钮",往往会让本该定位在检索质量或上下文长度上的问题,被误判成 "模型不够聪明"------ 这类误判的代价通常是换模型、换供应商。
六、总结
回到开头那张表:28.2% 与 10.4% 的差距,说到底是模型不做思考,只在几万个概率里反复掷骰子。
- 大模型 Temperature 决定骰子的偏心程度 ------ 通过缩放 logits 改变概率分布陡峭度;
- Top-p 决定骰子有几个面 ------ 通过累计概率截断候选池。
理解了这个分工,你就能判断什么时候该调哪个:要稳定降 T,要多样升 T;要防跑题动 p,跨模型别照抄。