前言
大语言模型(LLM)的推理过程,本质上是一个在离散 token 空间中进行条件概率建模与自回归采样的计算流程。从系统角度看,这一过程可以被严格拆解为:文本离散化、全量上下文建模(Prefill)、概率分布构造、候选空间裁剪、随机采样、状态递推,直至满足终止条件。以下按照真实执行顺序,对每一阶段进行完整解析。
一、文本输入与 Tokenisation:离散化的起点
模型无法直接处理字符串。所有文本输入首先通过 tokenizer 映射为 token ID 序列。Tokenisation 是一个确定性函数,其输出完全由 tokenizer 和词表定义,与模型参数无关。tokenization分为字词级、子词级、字节级词元化,各有优劣。
现代 LLM 普遍采用子词级(subword)tokenisation(如 BPE、Unigram LM)。其核心目标不是"语言学合理",而是相对于其他词元化的规则,子词级有以下优势:
- 控制词表规模;
- 覆盖长尾词与未登录词;
- 压缩 token 数以降低 Attention 计算成本。
Tokenisation 的结果直接决定:
- 输入 token 数(影响 Attention 的 O(n2)O(n^2)O(n2) 复杂度);
- 可用上下文长度(context window 是 token 数上限,而非字符数);
- 推理成本与延迟的下限。
模型后续所有计算均发生在 token 空间中,任何字符串级操作在此之后都不再存在。
二、Embedding 与 Transformer:进入连续空间
每个 token ID 通过 embedding lookup 映射为一个定长向量,其维度为模型的 hidden size,与词表大小无关。Embedding 层的本质是一个形状为 (∣V∣×d|V| \times d∣V∣×d) 的查表矩阵,其中单个 token 对应的向量长度为 (d)。
Embedding 向量叠加位置编码后,输入 Transformer Decoder 堆栈。每一层 Transformer 由:
- 多头自注意力(Self-Attention)
- 前馈网络(FFN)
- 残差连接与 LayerNorm
组成。
Self-Attention 的计算复杂度随 token 数平方增长,这是长上下文推理的根本瓶颈。
三、Prefill:全量上下文的 Attention 展开
Prefill 是指模型对全部输入 token 进行一次前向传播的阶段,其核心目的不是生成输出,而是构建 Attention 所需的 Key / Value Cache。
在 Prefill 阶段:
- 每一层 Transformer 都会为每个 token 计算对应的 Key 和 Value;
- Attention 在完整序列上展开,复杂度为 O(n2)O(n^2)O(n2);
- Prefill 只执行一次,但计算量巨大。
工程上,长 prompt 导致的首 token 延迟,几乎完全由 Prefill 决定。RAG、长对话、系统 prompt 叠加,本质上都是在放大这一阶段的成本。
四、KV Cache:自回归生成的状态基础
Prefill 结束后,模型已为当前上下文中所有 token 构建好 KV Cache。KV Cache 存储的是各层 Attention 的 Key / Value 张量,其维度属于 hidden space,而非词表空间。
KV Cache 的存在,使得后续生成阶段无需重新计算历史 token 的 Attention,从而将自回归生成的复杂度从 O(n2)O(n^2)O(n2) 降为 O(n)O(n)O(n)。代价是显存占用随上下文长度线性增长。
五、Logits 与 Softmax:从连续表示到词表空间
- 在 Prefill 的最后一个 token,或 Decode 阶段的每一步,模型都会输出一个 logits 向量,其维度等于词表大小 (∣V∣|V|∣V∣)。这是模型唯一一次显式进入"词表空间"。
- Logits 是未归一化的对数得分,不具备概率意义。通过 softmax,将 logits 映射为一个在词表上的概率分布:
pi=ezi/T∑jezj/T p_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} pi=∑jezj/Tezi/T - Temperature 本质上是对 logits 的线性缩放,用于调节概率分布的陡峭程度。Temperature 不改变 token 排序,仅影响概率差距与分布熵,因此只在 sampling 场景中生效。
设模型在某一步输出的 logits 为:
z=(z1,z2,...,z∣V∣),zi∈R \mathbf{z} = (z_1, z_2, \dots, z_{|V|}), \quad z_i \in \mathbb{R} z=(z1,z2,...,z∣V∣),zi∈R
带 Temperature 的 softmax 定义为:
pi(T)=exp(zi/T)∑j=1∣V∣exp(zj/T) p_i(T) = \frac{\exp(z_i / T)}{\sum_{j=1}^{|V|} \exp(z_j / T)} pi(T)=∑j=1∣V∣exp(zj/T)exp(zi/T)
其中(T>0T > 0T>0) 为 temperature,pi(T)p_i(T)pi(T) 是 token (iii) 的生成概率 - Temperature 数学性质
- 排序不变性 :对任意 T>0T>0T>0,若 za>zbz_a > z_bza>zb,则 pa(T)>pb(T)p_a(T) > p_b(T)pa(T)>pb(T),Temperature 不改变 token 排序,只改变概率差距。
- 对数概率差缩放 :logpapb=za−zbT\log \frac{p_a}{p_b} = \frac{z_a - z_b}{T}logpbpa=Tza−zb,Temperature 实际是在缩放 logits 差值,从而控制概率分布的熵。
- 极限行为 :
- T→0T \to 0T→0:分布收敛为 one-hot(近似 argmax)
- (T \to \infty):分布收敛为均匀分布
六、候选空间裁剪:Top-k 与 Top-p
直接在完整词表上采样在工程上不可控,因此需要对概率分布进行裁剪。
设经过 softmax(已包含 temperature)后得到的概率分布为:
p=(p1,p2,...,p∣V∣),∑ipi=1p = (p_1, p_2, \dots, p_{|V|}), \quad \sum_i p_i = 1p=(p1,p2,...,p∣V∣),i∑pi=1将所有 token 按概率从大到小排序:
p(1)≥p(2)≥⋯≥p(∣V∣) p_{(1)} \ge p_{(2)} \ge \dots \ge p_{(|V|)} p(1)≥p(2)≥⋯≥p(∣V∣)
- Top-k:仅保留概率最高的 (k) 个 token,形成硬截断的候选集。
- Top-p(Nucleus Sampling):保留累计概率达到阈值 § 的最小 token 集合,属于分布感知型裁剪
若同时启用,最终候选集为二者的交集。实践中通常以 Top-p 为主、Top-k 为安全阀,用于限制极端平坦分布。
裁剪并不等于选择,它只是定义"哪些 token 仍有资格被选中"。
实际执行顺序为:
logits;→/T;softmax;→Top-p;Vp;→re-normalize;sampling \text{logits} ;\xrightarrow{/T}; \text{softmax} ;\xrightarrow{\text{Top-p}}; V_p ;\xrightarrow{\text{re-normalize}}; \text{sampling} logits;/T ;softmax;Top-p ;Vp;re-normalize ;sampling
Temperature 决定概率如何分布,Top-p 决定哪些概率仍然存在。
七、重归一化与随机采样:离散决策的发生点
候选集确定后,系统会将候选集外 token 的概率置零,并在候选集内重新归一化,形成新的合法概率分布。随后进行一次分类分布采样,选出下一个 token ID。
这是整个推理过程中唯一引入随机性的步骤。所有生成多样性、漂移、重复、幻觉风险,最终都可以追溯到这一采样操作及其参数设置。
当候选集退化为单一 token 时,采样等价于 greedy decoding。
八、Decode 循环:自回归推进
采样得到的 token 会立即:
- 转换为 embedding;
- 输入 Transformer;
- 使用已有 KV Cache,仅计算新 token 的 Attention;
- 输出新的 logits。
同时,新 token 对应的 Key / Value 会被追加进 KV Cache。随后再次进入"logits → 裁剪 → 采样"的循环。
这一 Decode 过程持续进行,直到满足停止条件(EOS、最大 token 数或自定义规则)。Streaming 输出只是 Decode 阶段逐 token 暴露中间结果的表现形式,不改变计算本质。
九、整体视角下的因果链
从系统角度看,整个推理过程可以压缩为一条因果链:
- Tokenisation 决定 token 数与计算下限;
- Prefill 决定首 token 延迟与 Attention 成本;
- KV Cache 决定 Decode 阶段是否可扩展;
- Sampling 决定输出行为的稳定性与熵。