温度 0.2 时分布熵 0.391、最高频词占 87.7%、只有 2 个候选出现过; 1.5 时熵 2.029、占 27.2%、10 个候选全出现。 同样 top_p 0.9,温度 0.7 只留 4 个候选,温度 1.0 要留 6 个。
上一节定住了「说什么」。这一节定「有多不确定」——同样的提示词,参数不同,输出可以差很多。
一、参数不多,但互相耦合
常用的就四个:温度(temperature)、核采样(top_p)、最大长度(max_tokens)、
重复惩罚(frequency/presence penalty)。
前两个都在控制随机性,而它们的作用方式不一样:温度改的是分布的陡缓,
top_p 改的是从分布里截多长一段。
第四节的 Demo 会看到:同样设 top_p 0.9,温度 0.7 时只留 4 个候选,温度 1.0 时要留 6 个。
top_p 的实际效果依赖温度,这就是为什么「两个一起调」很难判断是谁起了作用。
max_tokens 不是「回答长度」,是「最多生成多少」。
设太小会被硬截断——句子说到一半停住,用户会以为模型坏了。
二、温度到底改了什么
模型每一步输出的其实是一个概率分布:所有候选词各有一个分数。 温度做的事就是给这些分数除以 T 再归一化。 T 小于 1,分差被放大,头部词的优势更明显,分布变陡; T 大于 1,分差被压平,尾部词也有机会,分布变缓。 所以温度不是「创造力旋钮」这种玄学说法,它是一个数学操作:除掉一个数,分布的形状就变了。 Demo 里 T=0.2 时最高频的候选占了 87.7%,几乎每次都是它; T=1.5 时只占 27.2%,十个候选全都有机会。 这个 87.7% 到 27.2% 的变化,就是「确定」到「发散」的全部含义。
三、实测:熵从 0.39 涨到 2.03
Demo 造了 10 个候选词和一组分数,在四个温度下各采样 5000 次。 熵是分布不确定性的度量:T=0.2 时 0.391,T=1.5 时 2.029,涨了 5.2 倍。 「出现超过 1% 的候选数」那一列更直观:0.2 时只有 2 个,1.0 时 10 个全出现。 所以低温下的输出几乎是可以预测的,高温下每次都不一样。 要注意的是:温度不会让模型「更聪明」。它只是让低概率的选项更容易被选中。 低概率选项里既有创意,也有错误。这就是「高温更容易胡说」的原因。
四、不同场景怎么取值
抽取式问答、结构化输出:0 到 0.3。要的是「照抄资料,别发挥」,温度越低越稳。 客服、知识助手:0.3 到 0.7。需要一点自然度,但不能跑偏。 创意写作、头脑风暴:0.8 到 1.2。要的就是多样性,容忍一些离谱。 超过 1.5 基本没有实用场景。输出会开始不连贯,甚至在一句话中间换话题。 调参纪律和第九章一样:一次只动一个,跑同一批固定输入,记下结果再动下一个。 同时改温度和 top_p,你永远不知道效果是哪个带来的。
五、动手 Demo:采样实测:温度 0.2 时一个词占 87.7%,1.5 时只剩 27.2%
造 10 个候选词和一组递减的分数,在温度 0.2、0.7、1.0、1.5 下各采样 5000 次,统计每个词的出现频率、 分布熵、最高频词占比和「出现超过 1% 的候选数」; 再按累积概率算 top_p 取 0.5、0.9、1.0 时实际保留几个候选。
z = logits / T
p = np.exp(z - z.max())
p /= p.sum() # 温度只改 shape,不改顺序
idx = rg.choice(len(words), 5000, p=p)
cum = np.cumsum(p[np.argsort(-p)])
keep = int(np.searchsorted(cum, top_p) + 1)
实跑输出:
--------------------------------------------------------------------
模型参数:温度从 0.2 调到 1.5,候选词从 2 个散到 10 个
--------------------------------------------------------------------
温度 分布熵(nats) 最高频词占比 出现超 1% 的候选数
--------------------------------------------------------
0.2 0.391 87.7% 2
0.7 1.405 49.0% 7
1.0 1.753 37.1% 10
1.5 2.029 27.2% 10
温度的作用就是给 logits 除以这个数。T 小于 1 会把差距放大,分布往头部挤;T 大于 1 会把差距压平,尾部词也有机会。
熵那一列最直观:从 0.2 的 0.39 涨到 1.5 的 2.03,涨了 5.2 倍。熵大就是「更随机」,熵小就是「更确定」。
再看 top_p:它按累积概率截断,只保留前几个候选。
温度 top_p 实际保留候选数 保留后的累积概率
-----------------------------------------------
0.7 0.5 2 0.771
0.7 0.9 4 0.924
0.7 1.0 10 1.000
1.0 0.5 2 0.631
1.0 0.9 6 0.922
1.0 1.0 10 1.000
top_p 保留的候选数不是一个固定值,它随温度变。同样是 0.9,温度 0.7 时只要几个词,温度 1.0 时要更多——因为分布更平,得取更多才凑够 90%。
所以「温度和 top_p 别一起调」这条经验是有道理的:两者都在控制随机性,同时调相当于把两个旋钮往同一个方向拧,很难判断是哪个起了作用。
一次只动一个,记下结果,再动另一个——这是调参最基本的纪律。
熵那一列从 0.391 涨到 2.029,涨了 5.2 倍。 最高频词占比从 87.7% 掉到 27.2%,两个数说的是同一件事。 「超 1% 的候选数」在 0.2 时是 2 个,1.0 时是 10 个。 这说明低温下模型的选择空间极小——它几乎没得挑。 top_p 那张表更实用:同样是 0.9,温度 0.7 时保留 4 个候选、累积概率 0.924; 温度 1.0 时要保留 6 个才凑到 0.922。 注意 top_p=0.5 时温度 0.7 保留 2 个、累积 0.771——已经超过 0.5 了,因为第一个候选自己就占了 49%。 累积概率是阶梯状的,不是你想要多少就有多少。 这个 Demo 里分数是我造的 10 个词,不是真模型的词表。 但除以 T 再归一化这个操作是真的,所以熵、占比、top_p 保留数的规律和真模型一致。
30 秒实验
- 把温度改成 3.0,看最高频词占比会掉到多少。
- 把 top_p 改成 0.1,看保留几个候选、输出会不会变成每次都一样。
- 想一想:为什么温度不会让模型「更聪明」,只会「更多样」?
常见误区
- 「温度和 top_p 一起调更快」——两者都在控随机性,同调无法归因。
- 「温度高更有创造力」——高出来的那部分既包含创意也包含错误。
- 「max_tokens 是回答长度」——它是上限,设小了句子会被硬截断。
自测三问(点开对答案)
1. 温度在数学上做了什么? —— 给每个候选的分数除以 T 再归一化,T 小分布变陡、T 大分布变平。 2. 为什么 top_p 的实际效果依赖温度? —— 累积概率的分布形状由温度决定,同样的 0.9 在不同温度下截到的候选数不同。 3. 抽取式问答该把温度设成多少? —— 0 到 0.3,要的是照抄资料而不是发挥。参数定住了「怎么答」。下一步给它喂资料——知识库。
- ☐ (本节完,下一节 10.3.4 第四步:构建并填充知识库)