大模型通识 / 大模型理论基础
4. 回答怎样一个 Token 一个 Token 地生成
原文备份 · 第 5 / 20 篇 · 查看极客时间原知识库 ↗
本篇目录 · 14 节
来源:大模型理论基础
你让复习助手根据同一段笔记出题。第一次,它问“什么是间隔复习”;第二次,它问“为什么要把练习分散到不同时间”。两种问法可能都合理,但有时答案也会跟着变,甚至出现错误。
你在设置里看见 Temperature、Top-p 和输出长度限制。把 Temperature 调低,是否就能消除错误?把输出长度调高,模型是不是会自动把问题想得更深入?
上一篇已经走到 Transformer 的输出头:它给词表里的候选 Token 打分。本篇从这些分数继续往下走,解释模型怎样根据已有内容,反复计算并选择下一个 Token,直到某个停止条件成立。
我们只讨论常见的自回归文本生成过程。所有概率、Token 切分和案例都是教学构造,不是模型实测;不需要调用付费 API。
一、每选出一个 Token,下一步的问题就变了
假设模型要续写:
间隔复习可以
为了便于观察,我们人为规定下面的“帮助”“记忆”等片段各自都是一个 Token。实际分词不一定如此。
| 步骤 | 本步使用的前缀 | 本步候选分布,教学构造 | 假设本步选中 |
|---|---|---|---|
| 1 | 间隔复习可以 | 帮助 0.6;减少 0.3;改变 0.1 | 帮助 |
| 2 | 间隔复习可以帮助 | 记忆 0.7;理解 0.2;整理 0.1 | 记忆 |
| 3 | 间隔复习可以帮助记忆 | 结束标记 0.8;句号 0.2 | 结束标记 |
这张表把每一步的候选集合缩小到两三个,其余项视为不参与本次教学计算。真实模型通常面对大得多的词表。
第二步没有再次从“帮助、减少、改变”里抽一次。模型已经把“帮助”加入前缀,重新计算“在这段内容后面,接什么更合适”。如果第一步选的是“减少”,第二步就必须基于新的前缀计算,不能照搬表里的概率。
这就是 Autoregressive Generation,自回归生成:后续输出依赖此前内容,包括模型自己刚刚生成的 Token。前缀通过上下文计算影响后续预测,不需要在每一步更新模型参数。《动手学深度学习》:语言模型与序列概率
flowchart TD
A[提示词与已有输出] --> B[模型计算下一 Token 的分数]
B --> C[按设置调整候选分布]
C --> D[选择一个 Token]
D --> E{达到停止条件了吗}
E -- 否 --> F[把选中 Token 加入前缀]
F --> B
E -- 是 --> G[结束本次生成并返回原因]
为了清楚,图中按一步一步画。缓存、批处理、推测解码等实现可以减少重复计算或提高效率,但理解基本生成逻辑时,不必先掌握这些优化。
一个错误为什么可能影响后面整段话
假如助手先把旧版安排中的“周三”写进了回答,后面的解析就可能围绕“周三”继续组织。后续每一步都在使用已经生成的前缀,而不是自动回到最初重新核查所有前提。
这不意味着模型绝不纠错。它也可能继续生成一句更正,或者在应用安排的第二轮检查中改写答案。但“逐 Token 生成”本身,不包含一个保证发现并撤销错误的程序。
二、分数怎样变成概率:先分清三种数字
上一篇的词表输出分数叫 Logits。它们可以是正数或负数,总和也不必为 1。Softmax 可以把它们转换为总和为 1 的概率分布。
用三个抽象 Token A、B、C 举例。假设它们的分数分别是:
A:ln(6) ≈ 1.792
B:ln(3) ≈ 1.099
C:ln(1) = 0
ln 是自然对数,与你在前两篇见到的指数运算相对应。这里特意这样选数字,只是为了方便计算:取指数后恰好得到 6、3、1,总和为 10,概率就是 0.6、0.3、0.1。
接下来还可能应用温度调整、候选过滤等处理。因此,要区分:
| 数字 | 表达的含义 | 不能直接当成什么 |
|---|---|---|
| Logit | 当前模型给候选项的分数 | 已归一化的概率 |
| 模型分布中的概率 | 在当前前缀下对下一 Token 的预测 | 整篇答案的正确率 |
| 调整、过滤后的采样概率 | 生成程序这一步实际如何抽取候选 | 模型未经处理的原始分布 |
例如,把其他候选都过滤掉,只留下 A,采样时 A 的概率会成为 1。这说明程序只允许选 A,不说明 A 所表达的内容已经被证明正确。
开头表中,如果按照那组分布逐步采样,路径“帮助 → 记忆 → 结束标记”的概率为:
0.6 × 0.7 × 0.8 = 0.336
这里算的是给定初始前缀后,这条特定 Token 路径的概率,不是“间隔复习有用”这个命题有 33.6% 的概率成立。若实际改用贪心选择或调整了分布,生成程序选中这条路径的概率也会改变。
三、贪心与采样:同一分布可以有不同选择方式
贪心选择:每一步选最高分候选
Greedy Decoding,贪心解码,每一步都选择概率最高的 Token。在 A 0.6、B 0.3、C 0.1 这组分布中,它会选 A。
若下一步的分布不同,就在下一步重新选最高项。这里的“贪心”只描述局部选择规则,不表示程序已经比较了所有完整回答。Hugging Face:生成策略
最高概率 Token 不一定属于概率最高的完整序列,更不等于事实最正确的回答。第一部分讲生成式 AI 时已经见过局部选择与整条路径的区别;在应用中,也不要把“每步都选第一名”当作质量证明。
采样:按权重抽取,而不是平均抽签
Sampling,采样,根据分布随机选择。概率为 0.6 的 A 更容易被选中,但 B、C 也有机会。
一个可以手工模拟的方法,是把 0 到 1 分成三个区间:
[0.0, 0.6) → A
[0.6, 0.9) → B
[0.9, 1.0) → C
从 [0,1) 均匀取一个随机数:如果是 0.42,选 A;如果是 0.82,选 B;如果是 0.96,选 C。方括号表示包含左端点,圆括号表示不包含右端点,因此边界没有重复归属。
这不是“随机性越强,模型越聪明”。采样可以带来不同措辞和思路,也可能选中不合适的后续内容。一个小概率候选仍可能正确,一个高概率候选也可能错误。
四、Temperature:改变分布的集中程度
Temperature,温度,通常通过把 Logits 除以一个正数 T,再做 Softmax,改变候选概率的集中程度。它不是硬件温度,也不是让模型训练更久的开关。Hugging Face:TemperatureLogitsWarper
写成公式是:
$$
P_T(i)=\frac{\exp(z_i/T)}{\sum_j\exp(z_j/T)},\qquad T>0
$$
z_i 是第 i 个候选的分数;分母把所有候选的指数值加起来。无需记住符号,只需看它对同一组候选产生什么影响。
仍使用基础概率 A 0.6、B 0.3、C 0.1:
| 温度 | A 的概率 | B 的概率 | C 的概率 | 这一步的变化 |
|---|---|---|---|---|
| 0.5 | 78.26% | 19.57% | 2.17% | 更集中于本来较高的候选 |
| 1 | 60% | 30% | 10% | 保持这里的基础分布 |
| 2 | 47.27% | 33.43% | 19.30% | 分布更平缓 |
这些数字可以不用对数验算。仅做温度变换时,把基础概率各自变为 p^(1/T),再除以总和,就得到相同结果。例如 T=0.5:
先平方:0.6²=0.36,0.3²=0.09,0.1²=0.01
总和:0.46
重新归一化:0.36/0.46,0.09/0.46,0.01/0.46
只要 T 为正,这种变换不会改变固定 Logits 的大小排序。所以,如果程序始终用贪心选择,单独改变正温度通常不会改变这一刻的最高项;温度的主要作用体现在采样分布上。在 Transformers 的常见生成用法中,还需要启用采样,相关采样设置才有意义。
温度为 0 怎么理解
上面的公式不能直接除以 0。某些接口把 temperature=0 当作特殊约定,用来表达贪心或近似确定性的生成;另一些实现要求温度严格大于 0,需要通过关闭采样来使用贪心。不能只看参数名字就假定所有库行为相同。
在最高分唯一时,正温度越来越接近 0,分布会越来越集中到该最高项;如果有并列最高项,还要考虑并列的处理方式。
更关键的是:降低温度只是更倾向原本高分的选择。若高分答案本身错了,它可能让错误更稳定地重复出现,而不会把模型缺失的知识补齐。
五、Top-p:保留一组累计概率足够大的候选
Top-p,也叫 Nucleus Sampling,核采样,采用另一种方式:把候选按概率从高到低排列,保留累计概率达到阈值的一小组,再在组内采样。Holtzman 等人的原始研究讨论了这种方法对文本生成的作用。《The Curious Case of Neural Text Degeneration》
用另一组完整教学分布来计算:
| 候选 | 原概率 | 从高到低累计 |
|---|---|---|
| A | 0.50 | 0.50 |
| B | 0.25 | 0.75 |
| C | 0.15 | 0.90 |
| D | 0.07 | 0.97 |
| E | 0.03 | 1.00 |
若设 top_p=0.8,只保留 A、B 还不够,因为累计只有 0.75;加入 C 后达到 0.90,才达到阈值。因此保留 A、B、C,排除 D、E。
然后用保留项的总和 0.90 重新归一化:
A:0.50 / 0.90 ≈ 55.56%
B:0.25 / 0.90 ≈ 27.78%
C:0.15 / 0.90 ≈ 16.67%
显示的小数经过四舍五入,合计可能略偏离 100%;精确分数的总和是 1。
这里的 0.8 不是“保留词表里前 80% 的 Token”,也不是“只留单项概率超过 0.8 的 Token”。它限制的是累计概率质量。不同步骤的分布不同,留下的候选数量也可以不同。Hugging Face:GenerationConfig 的 top_p 定义
如果你看到另一个参数 Top-k,可以作一个简单区分:Top-k 主要限制保留前多少个候选,Top-p 根据累计概率决定保留多少个。
温度和 Top-p 可以一起使用吗
在支持组合的实现中可以。例如先调整温度,再做 Top-p,温度会改变概率,从而可能改变 Top-p 保留的集合。但具体处理顺序、默认过滤器和支持范围取决于实现。
因此,做项目比较时,适合先固定其他条件,只改一个有效参数。否则观察到输出变化,很难判断是哪一个设置起了作用。本篇的表格分别隔离一个机制计算,不代表某个 API 的整套默认行为。
六、回答为什么会停:结束标记与长度上限不是一回事
模型不会在每一步都天然知道“任务已经正确完成”。生成程序需要明确的停止机制。
| 停止方式 | 它表示什么 | 对复习助手意味着什么 |
|---|---|---|
| 生成结束标记 | 选中了配置认可的特殊 Token | 本次序列或回答段落结束,不证明答案正确 |
| 命中停止字符串 | 输出出现应用指定的文本边界 | 边界选得不合适,可能提前截断 |
| 达到输出上限 | 生成数量达到硬限制 | 可能只写了一半题目或缺少解析 |
| 服务中断、取消或转交工具 | 执行环境或协议要求停止当前阶段 | 需要看原因,不能一律当作完整答案 |
EOS,End of Sequence,是结束序列标记的常见名称。实际聊天模型还可能有结束轮次等特殊标记,使用哪个 Token ID 由模型和生成配置决定。显示给用户时,这些标记往往会被隐藏。它不是每次都打印出来的一句“回答完毕”。Hugging Face:生成配置中的 eos_token_id 与长度参数
同样,“最多生成 500 个 Token”不意味着必须写满 500,也不等于最多写 500 个汉字。如果生成正常提前结束,输出可以更短;如果到上限才被切断,内容可能仍不完整。
停止字符串则属于另一层控制。假如你把“答案:”设为停止字符串,助手写完题目、刚准备给出答案,就可能被终止。这个反例说明:停止条件要结合输出格式设计,不能随意借用正文里本来就会出现的文字。
读返回状态,比盯着最后一句话更可靠
以 DeepSeek 的 Chat Completions 文档为例,finish_reason 区分 stop、length、tool_calls 等情况。stop 可以来自自然停止或命中停止字符串;length 表示长度相关限制导致结束,不能把它当作“模型已经写完”。具体字段含义以所用接口版本为准。DeepSeek 官方接口文档
如果复习助手需要保存“题目、答案、解析”三个字段,至少要检查字段是否齐全,以及本次为何结束。提高上限可以缓解截断,但无法代替格式检查,更不能保证答案得到资料支持。
流式输出只是把结果分块送达,让你可以早些看到内容。一个传输块不保证恰好等于一个 Token;也可能只有状态信息。提前收到几段文本,并不表示整个响应已经正常结束。调用代码需要等到完成状态或处理错误,这部分会在 API 实战中展开。
七、为什么同一设置也未必永远输出同一句话
如果采用采样,随机选择本身就可能让两次结果不同。随机种子,Seed,用于控制伪随机数序列;在实现支持、其他条件一致时,它有助于复现一次抽取过程。
但种子不是跨设备、跨版本的绝对保证。计算后端、软件版本等变化也可能影响可复现性;PyTorch 官方明确说明,不保证跨版本、平台等条件下完全相同的结果。PyTorch:可复现性说明
即使用贪心策略,也只能在分数、并列处理等条件确定时说选择确定。实际服务的模型版本、输入模板和计算实现变化,仍可能影响结果。不能把“温度低”直接等同于“今后每次逐字一致”。
如果需要保存一次已经认可的复习卡片,可靠做法是保存那次生成的正文及其来源,而不是期待下次再生成时自动还原它。若要比较参数效果,可以固定材料、提示词与模型版本,多次观察题目是否完整、答案是否有据、措辞是否有足够变化。
还有一个实际限制:**接口里能填写的参数,不一定在所有模式下都生效。**截至本系列的资料观察基准 2026 年 10 月 3 日,DeepSeek 上述文档对 Temperature、Top-p 就分别写了模式相关的生效限制。因此,本篇 T=0.5 或 top_p=0.8 的手算是通用机制演示,不能直接当成任何模式都支持的请求配置。
对于你的项目,可以把判断顺序定为:先确认任务和材料是否清楚,再检查模型能力与输出完整性,最后用受支持的采样参数调节变化程度。解析缺了一半,先查停止原因;事实反复出错,先查依据与模型表现;只是希望题目换种问法,才更适合比较采样设置。
八、理解检查
1. 一次采样得到 A,下一步是否仍然从同一组概率中采样?
通常不是。A 加入前缀之后,模型根据新的上下文计算下一步分布。只有在某个构造或特殊情况下,新的分布才可能恰好相同。
2. 对 A 0.6、B 0.3、C 0.1,按本篇区间法取到随机数 0.82,会选谁?贪心会选谁?
0.82 位于 0.6,0.9),采样选 B;贪心选最高概率的 A。两者使用同一分布,却采用不同决策规则。
3. 对五候选分布 0.50、0.25、0.15、0.07、0.03,top_p=0.7 留下谁?新概率是多少?
留下 A、B,累计 0.75 已达到阈值。重新归一化后,A 为 0.50/0.75=2/3,B 为 1/3。不是留下概率大于 0.7 的候选,也不是留下 70% 数量的候选。
4. 某次分布最高概率的候选本身包含错误事实,降低温度会自动纠正它吗?
不会。温度没有引入新的事实证据;它只调整现有候选的选择倾向,甚至可能让错误更稳定。
5. 输出上限设为 500,实际只得到 120 个 Token,能否断言服务出错?
不能。模型可能已选中结束标记或命中正常停止条件。要结合返回状态与内容检查。反过来,恰好输出到上限也不证明任务完整完成。
6. 返回状态为 length,卡片只有题目,没有答案与解析,应该先提高温度吗?
不应把温度作为首要修复。先检查输出预算、提示中要求的长度和实际停止原因,调整后重新生成或按明确流程续写,再验证字段完整性与内容正确性。继续输出也不保证自动修好所有问题。
现在,你已经把“模型输出一组分数”接到了“应用收到一段回答”:前缀决定本步分布,生成策略决定怎样选,选出的内容成为后续上下文,停止条件结束本轮。采样参数会改变选择方式,却不会凭空补充知识或提供正确性保证。
下一篇《预训练:预测下一个 Token,为什么能形成广泛能力》,我们回到训练阶段,解释这些预测能力是怎样从数据中形成的。
[上一篇:Transformer · 返回第二部分大纲