🧠 第十章 管理和部署
📄 一句话概括

温度 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 秒实验

  1. 把温度改成 3.0,看最高频词占比会掉到多少。
  2. 把 top_p 改成 0.1,看保留几个候选、输出会不会变成每次都一样。
  3. 想一想:为什么温度不会让模型「更聪明」,只会「更多样」?

常见误区

  1. 「温度和 top_p 一起调更快」——两者都在控随机性,同调无法归因。
  2. 「温度高更有创造力」——高出来的那部分既包含创意也包含错误。
  3. 「max_tokens 是回答长度」——它是上限,设小了句子会被硬截断。
自测三问(点开对答案) 1. 温度在数学上做了什么? —— 给每个候选的分数除以 T 再归一化,T 小分布变陡、T 大分布变平。 2. 为什么 top_p 的实际效果依赖温度? —— 累积概率的分布形状由温度决定,同样的 0.9 在不同温度下截到的候选数不同。 3. 抽取式问答该把温度设成多少? —— 0 到 0.3,要的是照抄资料而不是发挥。

参数定住了「怎么答」。下一步给它喂资料——知识库。

相关笔记