AI 基础入门 · 第12课
采样与生成参数:temperature、top_p 到底怎么调
同一个问题,模型这次回答很稳,下次突然开始胡说八道——这不是 bug,是采样参数没调对。大模型每吐一个 token,都是在几万个候选里"抽一次签"。这一课讲清楚:贪心 vs 采样的区别、temperature(0 是确定性还是 2 是放飞自我)、top_p / top_k 怎么圈定候选范围、repetition_penalty 怎么治"车轱辘话"。学完你就能给"写代码"和"写小说"配不同的参数手感。
① 小白第一课怎么学(4 步走,约 50 分钟)
采样参数是你在 API / llama.cpp 里最常调的几个旋钮,调对了输出质量立刻上一个台阶。
1建立直觉(10 分钟)
读②③:模型每步都是在概率分布上抽一个 token。
2搞懂 4 个旋钮(15 分钟)
读④:temp / top_p / top_k / rep_penalty 各管一摊。
3会配场景(15 分钟)
读⑤:写代码用什么、写小说用什么、问答用什么。
4刷题自测(10 分钟)
做⑦⑩,错题回⑥看易错点。
本课小目标学完你要能:① 说清贪心和采样的区别;② 解释 temperature 从 0 调到 2 会发生什么;③ 区分 top_p 和 top_k;④ 给"写代码/写小说/做问答"三组场景配出合理参数。
② 一图看懂:模型每一步是怎么"抽签"的
读法:模型每吐一个 token,都会算出一张"下一个词该是谁"的概率表。贪心 = 永远选第一名;采样 = 按概率大小抽签。temperature 就是把这张表捏尖或拍平:温度越低越尖(确定),越高越平(发散)。
③ 本质直觉:采样就是"按概率抽签"
一句话定义:大模型每生成一个 token,都会先算出词表里每个候选 token 的概率,然后按某种规则从中挑一个。这个"挑"的过程就叫采样(Sampling)。
贪心解码(Greedy):最简单——每次都选概率最高的那个 token。好处是稳定、可复现;坏处是输出死板、容易车轱辘话,而且一步选错后面步步错。
随机采样(Sampling):按概率大小抽签,概率高的抽中概率大,但低概率的也有机会。好处是输出有多样性、有创意;坏处是可能抽中怪词。
关键旋钮 temperature:它在抽签之前先把概率分布"捏一捏"。温度趋近 0 → 分布变成尖峰,几乎只选第一名(≈贪心);温度拉到 2 → 分布被拍平,低概率词也有机会,输出开始放飞。
类比:temperature 就像考试打分后的"水涨船高"系数。温度低 = 只给前几名发奖;温度高 = 把大家分数拉平,后几名也能中奖。
为什么需要这些旋钮没有旋钮,模型要么死板(贪心)要么胡说(纯采样)。temperature + top_p + top_k 三个旋钮配合,才能在"稳"和"活"之间找到你要的那个手感。
④ 完整体系:4 个核心参数逐个拆
参数速查表
| 参数 | 取值范围 | 作用 | 典型值 |
| temperature | 0 ~ 2(0 最确定) | 把概率分布捏尖(低)或拍平(高) | 0.2~0.7 常用,1.0 默认 |
| top_p(核采样) | 0 ~ 1 | 只在累计概率前 p 的候选里抽 | 0.9~0.95 |
| top_k | 正整数 | 只在概率最高的前 k 个里抽 | 40~100 |
| repetition_penalty | 1.0 ~ 1.2 | 惩罚已经出现过的 token,治车轱辘话 | 1.05~1.15 |
| frequency_penalty | -2 ~ 2 | 按出现频率惩罚,越常出现惩罚越大 | 0~0.5 |
top_p vs top_k 一句话区别
| top_k | top_p(核采样) |
| 圈候选的方式 | 固定数量:只看概率最高的 k 个 | 动态比例:累计概率加到 p 就停 |
| 例子 | top_k=40:永远只在前 40 个里抽 | top_p=0.9:累计概率到 90% 就停,候选数随句子变 |
| 优点 | 实现简单,可控 | 候选数自适应:简单词时少、难词时多 |
| 缺点 | 候选数固定,不够灵活 | 略复杂 |
llama.cpp 对应参数--temp 0.7 --top-p 0.9 --top-k 40 --repeat-penalty 1.1
top_p 和 top_k 同时用会怎样两者会叠加生效(先按 top_k 截断,再按 top_p 核采样)。一般调一个就够,OpenAI 官方建议优先调 top_p,top_k 用默认或设大。
⑤ 用法场景:写代码 / 写小说 / 做问答各配什么参数
| 场景 | temperature | top_p | rep_penalty | 手感 |
| 写代码 / 函数调用 | 0.1 ~ 0.3 | 0.95 | 1.0 | 要确定性,别瞎发挥 |
| 事实问答 / 翻译 | 0.2 ~ 0.5 | 0.9 | 1.05 | 稳为主,偶尔换个说法 |
| 通用聊天 / 助手 | 0.6 ~ 0.8 | 0.9 | 1.1 | 默认区间,平衡稳和活 |
| 写小说 / 头脑风暴 | 0.9 ~ 1.2 | 0.95 | 1.15 | 要创意,允许发散 |
| 完全确定性输出 | 0 | 任意 | 1.0 | 贪心解码,同输入必同输出 |
场景 1:让模型写 Python 函数
代码必须能跑,不能让它自由发挥。
temperature 调到 0.1~0.2,top_p 0.95。这样模型基本选概率最高的写法,不会突然冒出奇怪的变量名。要 100% 可复现就直接 temp=0。
场景 2:让模型写一段故事开头
要创意,不要每次都"从前有座山"。
temperature 拉到 0.9~1.1,top_p 0.95,rep_penalty 1.15。允许低概率词出现,故事才不会套路化。但别超过 1.3,否则开始胡言乱语。
场景 3:模型一直重复同一句话
"这个这个这个"车轱辘话。
把 repetition_penalty 调到 1.1~1.2,或者用 frequency_penalty 0.3~0.5。已经出现过的 token 被降权,就不会一直复读。
调参心法先固定其他参数,只调 temperature:太低死板、太高胡说,找到"既不套路也不跑偏"的那个点,通常在 0.6~0.8。再用 rep_penalty 治复读,top_p 一般不用动。
⑥ 高频错误诊断(4 条)
错误 1:以为 temperature 越高越好(越有创意)超过 1.2 之后模型开始胡说八道、逻辑断裂。创意和失控只有一线之隔,写作类 1.0 左右足够。
错误 2:写代码时 temperature 拉很高代码必须确定,temp 高了会冒出不存在的函数名、变量名乱编。写代码用 0.1~0.3。
错误 3:以为 top_p=1 就是关闭采样top_p=1 表示不做核采样(全候选都看),但 temperature 还在起作用。要完全确定性得把 temperature 设 0。
错误 4:repetition_penalty 拉到 1.5 以上惩罚太狠会导致模型为了不重复而故意换奇怪的词,甚至语义不通。1.0~1.2 是安全区。
⑦ 考点真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 贪心 vs 采样 | 问哪个最确定 | 贪心 = 选概率最高 |
| temperature | 问 0 和 2 分别怎样 | 0=确定,2=发散 |
| top_p | 问核采样原理 | 累计概率到 p 就停 |
| 调参场景 | 问写代码用多少 | 低 temp(0.1~0.3) |
真题基础1. 贪心解码(greedy)和采样(sampling)的核心区别是什么?
真题中档2. 把 temperature 设为 0,模型会怎样?
真题中档3. top_p=0.9 的"核采样"是什么意思?
真题拔高4. 让模型写一段能直接运行的 Python 函数,下面哪组参数最合适?
⑧ 必背知识点卡
采样本质:模型每步在概率分布上抽一个 token 不是查字典
贪心:永远选第一名,确定但死板 temp=0 即贪心
temperature:0=确定,1=默认,2=发散 常用 0.6~0.8
top_p:核采样,累计概率到 p 就停 常用 0.9~0.95
top_k:只在前 k 个候选里抽 常用 40~100
rep_penalty:1.0~1.2,治车轱辘话 别超 1.2
写代码:temp 0.1~0.3;写小说 temp 0.9~1.2 按场景调
⑨ 应用输出:curl 一次带完整采样参数的请求
实战场景:用 OpenAI 兼容接口,让模型写一段有创意的文案。
① 选参数:写文案要创意,temperature 拉到 0.9,top_p 0.95。
②
发请求:
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen",
"messages": [{"role":"user","content":"写一句奶茶店招牌文案"}],
"temperature": 0.9,
"top_p": 0.95,
"repeat_penalty": 1.1
}'
③ 对比:把 temperature 改成 0.2 再跑一次,你会发现文案变得很"正确"但没味道;改回 0.9 就有创意了。
口述全链路"模型算出下一个 token 的概率分布 → temperature 把分布捏尖或拍平 → top_p/top_k 圈定候选范围 → repetition_penalty 给出现过的 token 降权 → 在剩下的候选里抽一个,拼到输出末尾。"
⑩ 分层练习 16 题(基础 6 + 中档 5 + 拔高 5)
▍基础 6 题
基础1大模型每生成一个 token 时在做什么?
先算出词表里每个候选 token 的概率,再按某种规则(贪心或采样)挑一个出来。
基础2贪心解码是什么意思?
每一步都选概率最高的那个 token,确定但死板,同输入必同输出。
基础3temperature 设为 0 会怎样?
分布变成尖峰,退化为贪心解码,输出完全确定。
基础4repetition_penalty 用来治什么?
治"车轱辘话"——模型一直重复同一句话/同一个词。
基础5写代码时 temperature 一般设多少?
0.1~0.3,要确定性,别让它自由发挥。
基础6top_p 的取值范围是多少?
0 ~ 1,常用 0.9~0.95。
▍中档 5 题
中档7temperature 从 0.7 调到 1.3,输出会怎么变?
分布被拍平,低概率词有更多机会被选中,输出更发散、更有创意,但也更容易出现逻辑不通的胡说。
中档8top_p 和 top_k 的本质区别?
top_k 固定数量(永远只在前 k 个里选);top_p 动态比例(累计概率到 p 就停,候选数随句子难度自适应)。
中档9frequency_penalty 和 repetition_penalty 有什么区别?
repetition_penalty 对"已经出现过的 token"整体降权;frequency_penalty 按出现次数线性惩罚(出现越多罚越重),颗粒度更细。
中档10为什么 temperature 太高(如 2.0)会导致输出胡说?
分布被拍平后,低概率的怪词、不通顺的组合也有不小概率被抽中,模型开始"为了不重复而硬凑",逻辑和语法都崩。
中档11写小说/头脑风暴一般配什么参数?
temperature 0.9~1.2,top_p 0.95,repetition_penalty 1.15。要创意、允许发散,但别超 1.3。
▍拔高 5 题
拔高12top_p=1.0 是不是等于关闭采样?
不是。top_p=1.0 只表示不做核采样(全候选都参与),temperature 仍在起作用。要完全确定性必须把 temperature 设 0(或 0.01)。
拔高13为什么 temperature 和 logits 缩放是一回事?
temperature 实际作用在 softmax 之前的 logits 上:logits 除以 T 再 softmax。T 小 → 差异被放大 → 尖峰;T 大 → 差异被缩小 → 平坦。
拔高14repetition_penalty 设到 1.5 以上会出什么问题?
惩罚太狠,模型为了不重复而故意换生僻词、绕着说,甚至语义不通。1.0~1.2 是安全区。
拔高15为什么 API 厂商推荐"优先调 temperature,少动 top_p"?
temperature 是全局手感旋钮,调一档整体风格就变,直观;top_p 是硬性截断,调不好容易突然丢词。日常用 temperature 0.7 + top_p 0.9~0.95 就够了。
拔高16要让同一个 prompt 每次输出完全一致,除了 temp=0 还要注意什么?
还要固定随机种子(seed)、固定系统提示、固定上下文窗口大小、相同模型版本。即使 temp=0,不同推理引擎/批处理实现也可能有微小数值差异。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① 模型每步抽签,贪心选第一、采样按概率抽。
② temperature 捏分布:0 确定、1 默认、2 放飞;常用 0.6~0.8。
③ 写代码低 temp(0.2)、写小说高 temp(1.0);rep_penalty 1.1 治复读。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画"概率分布→抽签"流程图 | 说清贪心 vs 采样 |
| 第 2 天 | 背知识点卡 + 基础 1-6 | 基础全对 |
| 第 3 天 | 读④参数表,做中档 7-11 | 区分 top_p/top_k |
| 第 4 天 | 做拔高 12-16 | 理解 logits 缩放 |
| 第 5 天 | 做⑦真题 4 题 + 实测 curl 改 temp | 手感对得上 |
| 第 6-7 天 | 合上书口述三句口诀 | 不看资料全说对 |
📌 知识链路
前置知识(先学)
·
第11课 · 分词器:采样是在 token 序列上一步步抽下一个 token,先搞懂 token 是什么。
本节位置
本页站在模型"生成输出"的环节——模型算出概率分布后,用这一课的旋钮决定怎么从中挑出下一个 token。它直接决定输出的风格和质量。