跳到正文
AI 知识地图 0.18 · 2026-07-30
关于与纠错文字目录 / Search
理解原理

采样与解码参数:从 logits 到最终序列

用一组可手算的候选分布串起 temperature、top-k、top-p、重复惩罚、停止条件与随机种子,理解每个旋钮改变哪一步、不能保证什么。

核心命题 语言模型每一步只给出条件 logits;解码器把它们变形、过滤、归一化并选择一个 token,再把选择反馈成下一步上下文。温度改变相对概率,top-k/top-p 改变候选支持集,惩罚依赖历史,停止规则决定边界。它们只能在模型已有偏好上重新分配选择,低随机性不等于真实性,高多样性也不等于创造力
读完这一页,你应该能自己回答:
  • logit、概率、贪心与采样之间是什么关系?
  • 温度为什么不改变候选排名,却会改变 top-p 集合大小?
  • top-k 和 top-p 各在什么分布形状下过严或过松?
  • 重复惩罚、停止串和最大长度分别改变哪一环?
  • 怎样为抽取、代码、创作和评测选择并验证解码策略?
  1. 模型按当前前缀输出全词表 logits。
  2. 历史惩罚或约束按已生成内容修改可选分数。
  3. 温度缩放 logit 差,改变分布熵而不改正温度下的排名。
  4. top-k/top-p 删除尾部候选并形成新的支持集。
  5. 剩余分数归一化后,贪心或随机规则选出一个 token。
  6. token 追加到上下文,下一步分布随路径改变。
  7. EOS、停止串、语法状态或长度预算终止循环。
  8. 最终质量由多次任务验证证明,不由某个参数数字保证。

1生成是一条反复闭环,不是一次分类全景

# 生成是一条反复闭环,不是一次分类

大语言模型生成文本的过程常被误认为一次性的“读完输入、输出答案”。实际上,模型并不是一次性写出整段回答,而是一步一步地写。每一步只新增一个 token,然后把这个 token 接在已有文本后面,作为下一步的输入。因此生成是一个反复执行的闭环:输入是当前提示加上已经生成的前缀,输出是一个新 token,或者是表示“到此为止”的停止信号。

这个循环的每一步都经历同样的流程。模型先针对整个词表输出一组 logits,也就是每个候选 token 的相对分数;解码器随后对这些分数做变形和过滤(温度、top-k、top-p、重复惩罚等都属于这一步),再从中选出一个 token,把它追加到已生成序列的末尾。追加后的序列成为下一步的输入,如此循环,直到选中停止信号或达到长度上限。

“每一步都以上一步为条件”这一点带来了一个重要的推论:某一步的微小差异会改变之后每一步所面对的条件分布。第一个 token 的一次随机差异,可能让后面整段回答走向完全不同的方向。因为第二步的 logits 是在“第一步选了词 A”这个条件下计算的,如果第一步选的其实是词 B,那么第二步面对的分数表就已经不同了。差异就这样一步步传递并放大,而不会在后续步骤中被自动修正。

因此,对模型的一次调用产生的只是众多可能采样路径中的一条。看到单条输出,并不能推断其他采样路径也会给出类似的内容。某一步概率上排第二的候选,虽然在当时只差一点,却可能打开一条与第一名完全不同的后续分支,最终通向迥异的段落。

序列的整体概率也可以从这个角度理解。假设模型逐词生成序列 x₁, x₂, …, x_T,则整条序列的联合概率等于沿路径的条件概率乘积:

P(x₁, …, x_T) = P(x₁) × P(x₂ | x₁) × P(x₃ | x₁, x₂) × … × P(x_T | x₁, …, x_{T−1})

每一步的因子都是模型在当前前缀下为该 token 分配的概率。任何一个位置的微小概率差异都会直接进入这个乘积,而后续所有因子又都依赖之前的选择,所以“哪一步选了谁”决定了整条路径的形状。理解了这一点,也就理解了为什么采样参数必须逐个作用在每一步的闭环上,而不是一次性作用在最终答案上。

模型输出全词表 logits温度/惩罚修改分数top-k/top-p过滤候选归一化并选择 token停?未停止:把 token 追加到上下文,重新计算下一步分布
每一步的选择都会成为下一步条件,因此序列概率是沿路径的条件概率乘积;局部“第二名”可能打开完全不同的后续分支。

2logits 只是相对分数,softmax 才给概率基础

# logits 只是相对分数,softmax 才给概率

语言模型在每一步输出的是整个词表上的一组 logits:每个候选 token 对应一个实数分数。这些分数只有相对意义——分数高代表模型相对更偏好这个 token,但它们既不是概率,也没有被约束在 0 到 1 之间。把 logits 变成可以采样、可以解释的概率分布,靠的是 softmax。

softmax 分两步。第一步对每个 logit 做指数运算。指数函数只增不减,而且增长得越来越快,因此它会放大候选之间的分数差距:logit 略高的候选经过指数化后会获得明显更大的权重。第二步把全部指数值加起来作为归一化因子,用每个候选的指数值除以这个总和,得到一组和为 1 的概率。对候选 i 而言:

pᵢ = e^(zᵢ) / Σⱼ e^(zⱼ)

其中 e 是自然指数函数的底数,zᵢ 是候选 token i 的原始 logit,pᵢ 是 softmax 之后抽到该候选的概率,j 遍历词表中的全部候选。这套变换保证了 pᵢ 都在 0 到 1 之间且总和为 1,于是可以当作“下一步选哪个 token”的分布来使用。

softmax 有一个常被低估的性质:它只依赖 logit 之间的差,而不依赖绝对值。给所有 logits 同时加上同一个常数 c,分子分母会同时乘上 e^c,比值不变:

pᵢ = e^(zᵢ − c) / Σⱼ e^(zⱼ − c)

所以给全部 logits 同时加 100,每个 token 的概率分毫不动。数值实现正是利用这一点:通常先减去所有 logit 中的最大值再指数化,这样最大的指数恰好是 1,避免了指数爆炸导致的数值溢出,而结果与直接计算完全相同。

得到概率分布之后,解码器还需要决定怎么用它。贪心解码直接选择 logit 最大的那个候选,等价于选择 softmax 概率最高的 token。随机采样则按分布抽取:如果分布是 [0.7, 0.2, 0.1],采样很多次后各候选出现的频率会趋近这个比例,但单次抽取完全可能选中概率只有 0.1 的候选——概率低不等于不可能。

最后要明确这组概率的含义边界。pᵢ 度量的是“在当前提示与已生成前缀的条件下,模型相对偏好哪个 token”,它不表示该 token 事实上正确,也不能直接当作整段答案的置信度。概率的分母只在当前这一步的词表内做归一化,它无法衡量整条生成路径的质量。

pi=ezijezj=ezicjezjc

3手算温度:同一排名怎样变尖或变平数值例子

# 手算温度:同一排名怎样变尖或变平

温度(temperature)是作用在 softmax 之前的第一个缩放参数。它的输入是原始 logits 和一个正数 T,输出是一份尖锐程度被改变的新概率分布。具体做法是先把每个 logit 除以 T,再对结果做 softmax:

pᵢ(T) = e^(zᵢ / T) / Σⱼ e^(zⱼ / T)

T 必须大于 0。当 T 小于 1 时,每个 logit 被放大,logit 之间的差也被同步放大,指数化后差距进一步拉开,于是高分候选的占比上升,分布变尖。当 T 大于 1 时,logit 差被压缩,概率向中间靠拢,尾部候选的占比上升,分布变平。温度不注入任何新的知识:它既不改变模型学了什么,也不改变候选的排序——把全部 logit 除以同一个正数不会改变大小顺序。它改变的是“第一名赢多少”以及“尾部有多少机会”。

用一组具体数字可以看清这个过程。假设三个候选的原始 logits 是 [2, 1, 0],在不同的 T 下逐项计算:

温度 T缩放后 logitssoftmax 概率(约)分布形状
0.5[4, 2, 0][0.867, 0.117, 0.016]很尖,第一名占主导
1[2, 1, 0][0.665, 0.245, 0.090]保持原始相对差异
2[1, 0.5, 0][0.506, 0.307, 0.186]更平,尾部更容易被选

T=1 时分布如实反映原始 logit 差异。T=0.5 时第一名从 66.5% 上升到 86.7%,几乎垄断了抽样。T=2 时第一名降到 50.6%,第三名的概率从 9% 升到 18.6%,被选中的机会明显变大。排名始终是“候选一 > 候选二 > 候选三”,变的是它们之间的落差。

温度与后续的过滤参数存在联动。因为正温度除法不改变 logit 排名,纯 top-k 过滤选出的成员集合不受温度影响;但温度改变了各候选概率的累积速度,所以 top-p 这种按累计质量截断的集合可能随之变化。此外,T 趋近 0 的极限在公式里并不可直接计算——除数不能为 0,因此服务通常把 temperature=0 特判为贪心解码,或者内部采用自己的最小温度值,而不是真的去“除以零”。理解这一点,就能避免对“温度为 0 时概率长什么样”的错误想象:那不是一份无限尖锐的分布,而是一条绕过采样的分支。

温度 T缩放后 logitssoftmax 概率(约)分布形状
0.5[4,2,0][0.867,0.117,0.016]很尖,第一名占主导
1[2,1,0][0.665,0.245,0.090]原始相对差异
2[1,0.5,0][0.506,0.307,0.186]更平,尾部更容易被选
pi(T)=softmax(ziT)

4top-k:固定候选数,不看概率间隔截断

# top-k:固定候选数,不看概率间隔

top-k 是一道截断过滤。它的输入是候选分数和一个整数 k,输出是只包含排名前 k 的候选的支持集,以及在这个支持集上重新归一化后的概率。实现上,它把排名 k 之后的所有 logits 置为负无穷。由于 e^(−∞) = 0,这些候选在 softmax 里的贡献被完全清零,剩余的 k 个候选重新求和归一化,得到一份总和仍为 1 的分布。之后无论贪心选择还是随机采样,都只可能从这 k 个候选中产生。

理解 top-k 的关键在于:截断后重新归一化的数值才是实际抽样概率。假设原始分布是 [0.665, 0.245, 0.090],取 k=2:

第三名原本还有 9% 的概率,截断后归零;前两名的概率按原比例重新放大到总和为 1,第一名从 66.5% 升到 73.1%。如果这时读取 logprobs 用于分析或记录,必须说明这些数值来自哪一阶段:原始模型分布、温度缩放后的分布,还是截断并重归一化后的分布。三者数值不同,混用会得出错误的结论。

top-k 的优点在于容易解释、实现与计算都稳定:无论分布多么尖锐,候选数都被钳制在 k 以内。但它的缺点同样来自“固定数量”这个特性——k 与分布的形状完全脱钩。它不看概率间隔,只看名次。在极尖锐的分布上,比如第一名概率 0.99,top-k 仍然保留 k−1 个几乎不可能被选的极弱项,这没有实际危害,但也毫无意义;在极平坦的分布上,比如前 100 个候选概率几乎均匀,k=3 又会武断地删除大量彼此同样合理的选项,把本可以自由探索的空间强行收窄。换句话说,同一个 k,在模型极确定和极犹豫时施加的约束强度完全不同。是否可接受,取决于你希望采样保留多大灵活性。

原始概率top-2 保留重归一化
0.665 / 0.245 / 0.0900.665 / 0.245 / 00.731 / 0.269 / 0

5top-p:固定累计质量,候选数随犹豫变化核采样

# top-p:固定累计质量,候选数随犹豫变化

top-p(又称 nucleus sampling)解决的是 top-k 的“固定数量”问题。它的输入是已排序的概率分布和一个累计阈值 p,输出是候选集中累计概率首次达到 p 的那段最小前缀。做法是按概率从大到小累加,保留使累计值首次达到阈值的最少候选。与 top-k 相反,top-p 固定的不是候选数量,而是保留的总概率质量;候选数量随分布形状自动伸缩。

沿用前文那组 logits [2, 1, 0],看看 top-p=0.8 在不同温度下的行为:

分布尖时集合自动收缩:低温下第一名独占 86.7%,一个候选就跨过阈值。分布平时集合扩大:T=1 时单靠第一名不够,加上第二名累计 0.910 才达标。这与 top-k 形成对照——k 固定时,同一个 k 在尖分布上保留过多、在平分布上删除过多;top-p 则在确定的位置收窄,在犹豫的位置放宽,让保留范围跟随模型当前的把握程度。

被保留的概率同样需要再次归一化。截断后剩余概率之和通常小于 1(例如累计到 0.910),重新除以这个和,抽样概率才重新回到总和为 1。这一点与 top-k 相同。

使用 top-p 时还要注意它的实现边界。哪些候选被计入累计、恰好“达到阈值的那个 token”算不算在集合内、并列概率按什么顺序排、是否强制保留一个最低候选数,这些细节因实现而异,不能只凭参数名假定行为一致。例如某些实现保证至少保留一个候选,某些实现包含刚跨过阈值的那一项而另一些不包含。跨服务或跨框架复现行为时,这些差异会直接影响最终抽取到的 token。

T概率top-p=0.8 的最小集合
0.5[0.867,0.117,0.016]只需第 1 个(0.867≥0.8)
1[0.665,0.245,0.090]前 2 个(累计 0.910)
2[0.506,0.307,0.186]前 2 个(累计 0.813)

6参数组合的先后会改变最终分布管线

# 参数组合的先后会改变最终分布

temperature、重复惩罚、top-k、top-p 各自的行为前面已经讲清,但它们很少单独出现。实际解码时,一个管线同时接收原始 logits、生成历史和全部参数,输出最终的候选支持集与抽样分布。这些变换不是可交换的:惩罚会直接改动分数、甚至改变候选排名;温度不改变排名,却改变概率的累计速度;截断会删除候选。对一组分数先做温度再截断,和先截断再做温度,作用对象不同,结果也就可能不同。

可以用一个简单推演看清顺序的影响。假设惩罚把一个原本排名第三的候选抬到第二,那么 top-k=2 的成员集合就变了——这是“惩罚改变排名”的后果。再假设温度把分布拉平,top-p=0.8 的累计可能从“前 2 个达标”变成“前 3 个达标”——这是“温度改变累计速度”的后果。如果惩罚在截断之后才执行,被删除的候选根本没有机会被惩罚复活。这些差异都会传导到最终抽样分布。

因此,参数组合的具体含义只能按服务实现来解释。许多 API 并不承诺统一的执行顺序,不同框架内部的管线编排也不同。同时设置 top-k 与 top-p 时,常见做法是取两者的交集——先删到只剩前 k 个,再按累计质量继续收窄,或者反过来;无论哪种实现,交集通常比任一单独策略都严格得多。此外,默认值也可能隐式开启某种截断:你以为只设置了温度,服务可能在后台还应用了它自己的 top-p 或最低温度。

做可归因的实验时,正确的方式是从单一机制开始,逐项加入参数。先只改温度,确认行为变化;再加入 top-p,观察新增的影响;最后才叠加惩罚或同时启用两种截断。一次同时调整多个参数,就无法判断输出的变化到底来自哪一个。

历史惩罚温度top-p采样历史惩罚top-p温度采样顺序 A 与顺序 B 的 top-p 支持集可能不同因此必须以服务实现为准,不能只凭参数名推断
温度改变累计概率,惩罚还可能改变排名;在截断前后应用会得到不同候选集。许多 API 不承诺统一顺序。

7重复惩罚修改的是历史相关分数历史

# 重复惩罚修改的是历史相关分数

重复惩罚是唯一依赖生成历史的分数修正。它的输入是已生成 token 的历史和当前 logits,输出是针对“出现过的 token”调整后的分数。意图很直接:抑制模型翻来覆去地说同一个词或同一个短语。但它的实现有多种变体,行为差异很大:

常见概念典型作用主要风险
presence penalty某 token 出现过即施加一次惩罚必要的复用也被压制
frequency penalty随出现次数增加而加大惩罚长文中的术语一致性下降
repetition penalty按实现对已见 token 的 logit 乘或除一个系数正负 logit 的处理与 tokenizer 边界复杂
no-repeat n-gram硬性禁止重复出现的 n-gram 续写语法、引用与代码可能无路可走

presence 只看“是否出现过”,frequency 看“出现了多少次”,两者都属于软惩罚:只是压低分数,不保证不再出现。no-repeat n-gram 则是硬过滤:直接把命中规则的续写从候选集中删除。repetition penalty 的实现最不统一——有的实现把已见 token 的 logit 除以一个系数,有的乘以一个系数,而 logit 可以是负数,乘与除、对正对负的效果方向都需要按具体实现确认。

“降低重复率”并不自动等于“输出更好”。很多文本本来就要求精确复用:代码中的变量名、论文里的固定术语、引用中的专有名词,反复出现才是正确行为。惩罚机制不区分“有害的机械重复”和“必要的精确复用”,可能把唯一正确的候选压制到选不出来。硬 n-gram 过滤更直接:当句子结构被迫需要某个刚刚用过的短语时,候选集可能被删空,模型只能绕路或者停住。

还要注意 token 层的复杂性。用户眼中的一个“词”可能跨越多个 token 片段,而大小写、空格前缀、形态变化(单复数、时态)又可能对应完全不同的 token。惩罚按 token 或 n-gram 记录,可能与用户感知的“重复”不一致。因此重复惩罚不是语义去重器。配置它时应当结合任务检查三件事:文本中哪些重复是必要的、是否可能出现长循环、事实一致性是否因此受损。

常见概念典型作用主要风险
presence penalty某 token 出现过即施加一次惩罚必要复用也被压制
frequency penalty随出现次数增加惩罚长文术语一致性下降
repetition penalty按实现对已见 token 的 logit 乘/除正负 logit 处理与 tokenizer 边界复杂
no-repeat n-gram硬禁止重复 n-gram语法、引用与代码可能无路可走

8停止条件决定边界,不决定内容完整性终止

# 停止条件决定边界,不决定内容完整性

生成什么时候停下来,与生成的内容好不好,是两件独立的事。终止器在每一步接收新采样的 token、已解码的文本、语法状态和剩余预算,输出两个结果之一:继续生成,或者停止,并附上结束原因。不同终止机制的触发位置不同,失败模式也完全不同:

机制触发位置失败模式
EOS token模型采样到专用终止 ID模板 ID 错误或被过滤,模型不停
停止字符串解码文本匹配到字节/字符序列跨 token/流式块边界匹配失败,或误截用户内容
最大新 token 数达到硬预算JSON、代码或句子中途截断
语法接受态约束解码器确认结构完成格式完成但语义仍可能错误

EOS 是词表里一个专门的 token。模型只有在采样到它时才结束;如果提示模板把这个 ID 写错,或者过滤环节误删了它,模型就会一直生成下去,直到其他条件强制截断。停止字符串则发生在文本层:把已解码的字符串与配置的序列做匹配,命中即停。它的难点在于一个停止串可能由多个 token 拼成,也可能出现在用户引用的正文里——模型输出中本来要保留的内容恰好包含停止串,就会被错误地当作终止信号截断。流式服务还必须跨块保留匹配状态,因为一个停止串可能被拆在两次推送的边界上,同时要明确返回的内容里是否包含停止串本身。

max tokens 是最直白的硬预算:不管输出进行到哪里,预算耗尽就强制停止。一个正在写的 JSON 对象、一段未闭合的代码、一句说了一半的话,都会被拦腰截断。语法接受态则相反,它由约束解码器给出:只有当生成的结构达到可接受状态时才允许结束。它证明的是“结构完整”,不是“语义正确”——一个格式合法的 JSON 完全可能装着错误的数据。

因此,停止成功只能说明生成过程按某种规则结束了,不能解释为内容完整或语义正确。结构化任务应当把三样东西分开记录:finish reason(是哪种机制触发的停止)、解析是否成功、内容校验是否通过。三者各自独立,混为一谈会让下游系统把“被截断的合法前缀”当成完整结果。

机制触发位置失败模式
EOS token模型采样到专用终止 ID模板 ID 错或被过滤,模型不停
停止字符串解码文本匹配字节/字符序列跨 token/流式块边界,截掉用户内容
最大新 token达到硬预算JSON、代码或句子中途截断
语法接受态约束解码器确认结构完成格式完成但语义仍可能错误

9贪心、采样、束搜索分别优化什么策略

# 贪心、采样、束搜索分别优化什么

经过缩放、惩罚和截断之后,最终还要回答一个问题:从候选分布里到底怎么选?序列策略接收每一步的候选分布,输出一条或多条完整序列。常用的三类策略优化的是三个不同的目标,不能互相替代。

贪心解码每步只选概率最高的那个 token。它优化的是“每一步的局部概率”,速度快、随机性低,适合做简单抽取和基线对照。但每步选最高概率,不保证整条序列的概率最高:早期那个最高的 token 可能通向概率很低的后续分支,而当时略低的第二名才通向更完整的路径。贪心看不到这一点,因为它在第一步就把其他分支全部丢弃了。重复循环也常与这种局部最优有关。

束搜索是对贪心视野的修补。它同时保留若干条累计分数较高的前缀,每一步扩展后只留下累计分数最好的 B 条(B 为束宽),最终输出整条累计分数最高的序列。这是在近似寻找“整条序列概率最高”的解,比贪心更接近全局目标,传统翻译等目标空间较窄的任务从中受益明显。但它的代价和边界也很清楚:计算量随束宽成倍增长;模型对序列概率的估计本身存在长度偏置,短序列容易被高估,需要专门修正;在开放式生成中,束搜索常常退化成单调、缺乏变化的文本。束宽、长度偏置和开放生成退化,共同限制了它的适用范围。

随机采样(通常配合 top-k/top-p 截断)则根本不追求最高概率序列。它按照模型给出的分布抽取,目标是保留多样路径,同时借截断避开概率极低的尾部噪声。对话、创作、需要生成多个候选再挑选的场景适合这种策略。它的代价是结果本身是一个分布:一次抽样只是一次实现,评测时必须重复多次,用统计量而不是单条输出来下结论。

策略优点适合边界
贪心快、低随机简单抽取、基线局部最优、可能循环
束搜索探索多个高分前缀传统翻译等目标较窄任务昂贵,开放生成常显得单调
截断采样多样且避开极低概率尾部对话、创作、多候选结果是分布,需重复评测

无论采用哪种策略,最终都应按照任务质量来解释输出。模型赋予的高概率表达的是模型偏好,不等于事实正确;一条序列概率更高,只是模型认为它更可能,而不是它更好。

策略优点适合边界
贪心快、低随机简单抽取、基线局部最优、可能循环
束搜索探索多个高分前缀传统翻译等目标较窄任务贵,开放生成常显得单调
截断采样多样且避开极低概率尾部对话、创作、多候选结果是分布,需重复评测

10按任务选择参数,而不是寻找万能配方决策

# 按任务选择参数,而不是寻找万能配方

“代码用 temperature=0、创作用 1”这类口诀流传很广,但只是粗略经验。参数选择不是一个查表动作,而是一个输入为任务成功标准、风险、成本和服务实现,输出为候选解码配置加外部验收方案的决策过程。同样的问题在不同模型、不同版本上,最优参数可能不同;同一个参数在质量、成本、延迟上的取舍也不同。

可靠的做法是先建立低随机基线,再围绕目标指标扫描单一机制,最后复测组合。基线用贪心或极低温度生成,先把“随机性”这个变量固定住,才能看出参数调整带来的真实差异;然后一次只改一个参数,记录指标变化;确认了每个机制的方向后,才去测试组合配置,并留意组合间的顺序效应。

不同任务的起点和验证方式差异很大:

表格中每行的验证项与参数同等重要:分类任务要测的不只是温度,还有标签 token 的校准、拒答率;JSON 任务要把“schema 合法”与“字段语义正确”分开统计;代码任务最终由编译、测试和安全扫描裁决,而不是由输出的流利度裁决。

最后要澄清一个普遍的误读:降低温度只是让模型更稳定地选择它原本就偏好的高分路径,它并不修复任何知识缺陷。如果最高概率路径本身就是幻觉、偏见或错误的算法,temperature=0 只会稳定地复现同一个错误。参数调整的是“选择哪条已有路径”的稳定性,而不是模型知识本身。知识层面的问题要靠检索、工具、约束与外部校验去解决。

任务起始思路必须配套的验证
分类/抽取低随机或约束候选标签 token、校准、解析与拒答
结构化 JSON约束解码优先,低随机辅助schema 合法与字段语义分别测
代码补丁较窄候选,可生成多个编译、测试、安全扫描
事实问答随机性不是核心控制检索引用、工具与事实核验
创意发散适度提高熵,多候选新颖性、约束满足与人工选择
自洽推理独立采样多条路径答案可比较、成本与系统性偏差

11固定 seed 为什么仍未必完全可复现复现

# 固定 seed 为什么仍未必完全可复现

固定 seed 常常被当成“保证输出逐字相同”的开关,但 seed 实际只做一件事:固定某个随机数生成器的序列。复现一次生成所需的输入远不止这一个数,还包括完整请求、模型与 tokenizer 版本、解码实现和执行环境;得到的输出也只能承诺为“可比较的 token 路径”,而不是逐字一致。

为什么随机数相同,输出仍可能不同?因为采样抽取的本质是:拿一个随机数去和累计概率边界比较,看它落在哪个区间,就选哪个 token。temperature、top-p、惩罚的任何变化都会移动这些边界;边界一移动,同一个随机数就可能落进另一个候选的区间。选中的 token 一旦不同,后续每一步的条件分布全部改变,整条路径随之分叉。所以“随机数相同”只保证比较用的数没变,不保证比较的边界没变。

而边界的变化来源比参数调整多得多。模型权重更新、tokenizer 版本变化、提示词的字节级差异、浮点运算内核的更换、并行归约顺序、批处理中其他请求的影响、解码实现改动,甚至服务端的静默更新,都可能让同一请求算出略有不同的概率。某些硬件算子本身就不提供位级确定性,同一批数据两次运算的结果可能差在最后一个有效位上——这一点差异就足以让随机数越过边界,选中相邻的候选。

因此,托管服务提供的固定 seed 通常只是近似复现的承诺,不构成逐字一致的保证。真正做复现实验时,应当完整保存模型或服务版本、完整请求(含所有默认参数)、seed、输出 token ID 与 logprobs,这样至少能判断“不一致”发生在概率计算阶段还是抽取阶段。如果托管 API 只提供“尽力而为”的 seed,就应该把两次结果视为近似复现,而不是把任何一次结果当作可证明的确定性证据。

12随机系统应该怎样评测实验

# 随机系统应该怎样评测

开启采样之后,系统输出的是一个分布,而不是一条确定的路径。随机解码的评测因此也不同于确定性系统:它的输入是固定输入集、系统版本和参数候选,输出是多次独立采样得到的质量、多样性、方差、成本与失败分布。一次生成的好坏不能代表某组采样参数的总体质量——那一次可能只是分布的一次幸运或不幸的实现。

一套可靠的评测流程可以从八步展开。

第一步,固定输入集与版本:保存精确的提示、模板、模型与 tokenizer 版本,保证评测对象不漂移。第二步,建立贪心基线:先看模型最偏好的那条路径质量和失败模式长什么样,它是一切参数对比的参照点。第三步,一次只扫一个机制:温度、top-p、top-k、惩罚分别扫出各自的曲线,而不是同时改动多个参数。第四步,重复独立采样:对每组配置跑足够多次,报告均值、方差、分位数、最坏失败与成功率。均值会掩盖尾部风险——成功率 95% 与“5% 的请求彻底失败”是两个必须分别看到的数字。

第五步,同时测质量和多样性:字符串差异高不自动等于有价值的多样性,两个完全不同的错误答案同样“差异大”。多样性必须与质量放在一起衡量。第六步,记录结束原因:EOS、停止字符串、长度截断、错误要分开统计,一个样本因为什么停止本身就是评测信息。第七步,按任务做外部验证:代码要真的编译和跑测试,事实要查证据,结构要过解析器,不能只凭模型概率或表面流利度判断。第八步,做交互消融:组合参数测出收益后,逐项移除一个参数再测,确认收益确实来自该项而不是偶然。

这套流程的价值在于把随机性从“噪声”变成可度量的对象:通过多次采样和分位数报告,你可以判断一组参数在多大范围内稳定,又在什么条件下失控。

13概念依赖与延伸学习路线

# 概念依赖与延伸学习

本页讨论的机制都建立在几个更底层的概念之上,而其中每一个又通向更深的主题。下表给出延伸阅读的方向和每个方向要回答的关键问题:

过关标准:能从一排 logits 手算温度、top-k、top-p 之后的候选分布,指出组合参数的实现依赖,并为具体任务设计含多次采样、结束原因和外部验证的评测。

方向接下来读关键问题
分数从哪里来大语言模型自回归条件分布怎样由 Transformer 产生?
候选单位Token 与分词停止串和惩罚怎样受 token 边界影响?
观察概率Logprobs暴露的是管线哪一阶段的概率?
硬格式保证约束解码如何把非法 token 概率直接置零?
多路径可靠性自洽性采样多次采样何时能用投票换可靠性?
真实性边界幻觉为何解码参数不能替代证据核验?
资料来源与改编说明

生成闭环图、处理顺序图、logits 手算、停止/惩罚对照表和评测流程均为本项目原创组织。

访问日期:2026-07-22