← 全部极客知识库

大模型通识 / 大模型理论基础

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 · 返回第二部分大纲