LLM 从接收输入到输出响应,本质上是将离散的文字符号转化为连续的数学向量,再通过 Transformer 架构逐层处理,最终转回文字的过程。Transformer 于 2017 年由 Google 在论文《Attention Is All You Need》中提出,凭借自注意力机制替代了此前主流的循环神经网络(RNN),实现了对序列的并行处理,成为现代大语言模型的基础架构。GPT、Llama、DeepSeek 等主流模型,本质上都是在 Transformer 的框架上演化而来的。从原理上讲,一次完整的推理过程可以分为以下五个核心阶段。
一、输入预处理(Input Preprocessing)
模型无法直接读懂汉字或英文,只能处理数字。
- 分词(Tokenization)
输入文本首先被切分为更小的单元,称为 Token。Token 不一定等于一个完整的词,现代 LLM 普遍采用 BPE(Byte Pair Encoding)或 SentencePiece 等算法,根据语料中的频率统计,将文本切分为子词(subword)级别的单元。例如"人工智能"可能被切分为"人工"和"智能",而生僻词或专有名词则往往会被拆得更碎。这种做法的好处在于:既能覆盖罕见词汇,又能控制词表规模(通常在 3 万到 15 万之间)。
- 嵌入(Embedding)
每个 Token 会被映射到一个高维向量空间中的坐标,向量的维度通常在 512 到 8192 之间,取决于模型规模。这个向量并非人工设计,而是在预训练过程中通过梯度下降自动学习得到的。语义相近的词在这个空间中距离较近——"猫"和"狗"的向量彼此靠近,而"猫"和"汽车"则相距较远。
从数学结构上看,Embedding 本质上是一张查找表(lookup table),其维度为 |V| × d_model,其中 |V| 为词表大小,d_model 为模型隐层维度。输入的 Token ID 经过 one-hot 编码后,与这张表做矩阵乘法,就得到对应的初始向量表示。
- 位置编码(Positional Encoding)
Transformer 架构以并行方式处理整个输入序列,这意味着它天然无法感知词语的先后顺序——"猫吃鱼"和"鱼吃猫"在没有位置信息的情况下对模型是等价的。为解决这个问题,需要在 Embedding 向量上叠加位置编码。
原始 Transformer 论文采用正弦/ 余弦 函数构造固定的位置向量:
这种设计让相邻位置的编码向量之间具有固定的线性关系,便于模型推断相对距离。
现代主流模型(如 Llama、DeepSeek)则转向 RoPE(Rotary Position Embedding,旋转位置编码) 。RoPE 的思路是:把位置信息编码为向量的旋转角度,在计算注意力时直接作用于 Query 和 Key 向量,使得两个位置之间的注意力权重只依赖于它们的相对位移,而非绝对位置。这种方式在长上下文泛化上表现更好。
二、预填充阶段(Prefill / Context Encoding)
目前主流的大模型(如 GPT、Llama、DeepSeek)多采用 Decoder-only 架构。拿到位置编码后的向量序列,模型进入最核心的计算阶段。
2.1 自注意力机制(Self-Attention)
自注意力机制的核心思想是:序列中每个位置的词,在形成自身表示时,应当参考序列中其他位置的信息,并根据相关程度分配不同的权重。
- QKV 的由来
对于输入序列中的每个词向量 ,模型通过三组不同的权重矩阵 、、,分别将其投影为三个向量:
- Query (查询向量 Q) :代表"这个词想要寻找什么信息"
- Key(键向量 K) :代表"这个词提供了什么信息"
- Value(值向量 V) :代表"如果这个词被选中,实际传递的内容是什么"
- 注意力权重的计算
每个词的 Query 与序列中所有词的 Key 做点积,衡量它们之间的相关程度,再经过 Softmax 归一化得到概率分布,最后加权求和所有词的 Value 向量:
分母中的 是缩放因子,防止向量维度较高时点积结果过大,导致 Softmax 后梯度消失。
以"银行里的钱被取走了"为例:当模型计算"银行"这个词的注意力时,"钱"和"取"对应的权重会较高,而"里"和"的"权重较低——模型因此能判断此处的"银行"指金融机构而非河岸。
- 因果掩码(Causal Mask)
Decoder-only 架构在生成阶段需要遵循 "只能看到过去,不能看到未来" 的约束。为此,在计算注意力矩阵时会施加一个下三角掩码(causal mask) ,将未来位置的注意力权重强制置为负无穷,经过 Softmax 后趋向于零,从而阻断信息的"穿越"。
2.2 多头注意力(Multi-Head Attention)
单组 QKV 投影只能捕捉一种相关模式。多头注意力将 向量空间 切分为 个子空间(通常 为 8、16 或 32),在每个子空间中独立计算注意力,最后将所有头的输出拼接起来,再经过一个 线性变换 压缩回原始维度:
不同的头会自发地学习到不同类型的依赖关系——有的头专注于句法结构(主语与谓语),有的头关注语义共指(代词与其指代的名词),有的头则捕捉长程依赖(段落首尾的逻辑呼应) 。
2.3 前馈网络(FFN)
先回忆一下注意力机制做的事:它让每个词去"看"序列中的其他词,把相关的信息收集过来。但收集完之后呢?这些信息还是一堆混在一起的向量,需要进一步处理,才能变成有用的东西。FFN 就是负责这一步的。
前馈网络(Feed-Forward Network)的结构本身很简单:先把向量"升维"(扩展到更大的空间),做一次非线性变换,再"降维"压缩回来。这个"升维再降维"的过程,相当于给模型更大的工作台,让它能在中间状态中表达更复杂的模式,最后再整理成紧凑的输出。它通常由两层线性变换加一个激活函数(如 GeLU 或 SwiGLU)组成,中间维度一般是 的 4 倍:
有研究认为 FFN 是模型存储事实性知识的主要场所。研究者做了这样的实验:当你问模型"法国的首都是哪里",可以定位到某几层特定的 FFN 权重被激活,把"巴黎"这个答案"调出来"。如果修改FNN的权重,模型的回答就会改变。这说明 FFN 的权重矩阵并非只是在做抽象的数学变换,它在预训练过程中,把大量事实性知识以某种方式编码在了参数里。当然,这个说法目前仍是研究中的假说,FFN 的工作机制远比"存储知识"复杂,但这是目前最有共识的直觉。
2.4 残差连接与层归一化
GPT-3 有 96 层 Transformer Block,像 GPT-4 这样的模型据估计更深。信息从第 1 层流向第 96 层,相当于穿过了 96 道关卡,每道关卡都要做一堆矩阵运算。这里有一个深层神经网络的经典问题:梯度消失。
训练神经网络依赖反向传播——把模型的预测误差从输出层一路向后传,告诉每一层的权重该怎么调整。但这个误差信号在每经过一层时都会被乘上一个小于 1 的系数(链式求导的结果),经过几十层之后,误差信号可能已经衰减到接近于零,前几层的权重几乎收不到有效的训练信号,就等于白训练了。
残差连接的解决方法就是:让每一层的输出 = "这一层的计算结果" + "这一层的原始输入"。 即每个子层(注意力层、FFN 层)的输出都会与输入做残差相加(residual connection),再经过层归一化(Layer Normalization):
残差连接解决了深层网络中梯度消失的问题,使得信号能够有效传播到几十层甚至上百层的深度。
层归一化解决的是另一个问题:随着信号经过多层变换,向量的数值可能越来越大或越来越小,分布变得很不稳定,导致训练不稳定。层归一化相当于在每一步之后,把向量的数值"拉回"到一个正常的范围——均值为 0、方差为 1——再加上两个可学习的缩放参数,让模型自己决定保留多少"幅度"。这两件事加在一起,才让几十层乃至上百层的深层网络变得可以稳定训练。
2.5 逐层深化的语义抽象
一个 Transformer Block = 一次注意力(收集信息)+ 一次 FFN(处理信息)。
把几十个这样的 Block 摞在一起,就是完整的模型。信息从第 1 层流向最后一层,每一层都在做微小但累积的改变:
- 浅层(前几层) :主要在处理局部的表面模式,比如词性(这是动词还是名词)、相邻词之间的简单关系("非常"修饰的是什么)。
- 中间层:开始捕捉更长的句法结构,比如主语和谓语之间的对应,嵌套从句的边界。
- 深层(后几层) :处理更抽象的内容——这句话的意图是什么,上文提到的"它"指代的是哪个实体,回答这个问题需要调用哪方面的知识。
最终,序列中最后一个有效位置(通常是最新输入的 Token)的向量,携带了整个上下文的压缩表示,被送往输出层。
为什么是最后一个 Token?
模型在生成下一个词时,只需要一个向量来代表当前整个上下文的状态。因为有因果掩码的存在,序列中最后一个位置的 Token 在注意力计算时,已经"看过"了它之前所有位置的信息——它是唯一一个整合了全部历史的位置。所以模型取出这个位置在最后一层的输出向量,把它送入输出层做预测,就相当于拿到了整个上下文的压缩摘要。
三、KV 缓存(KV Cache)
理解 KV Cache 需要先明白自回归生成的计算瓶颈。
在生成阶段,每预测一个新 Token,理论上需要将已有的全部序列重新过一遍所有 Transformer Block,重新计算每一层的 Key 和 Value 矩阵。如果序列长度为 ,模型有 层,每生成一个词的计算量就是 ,随序列增长线性膨胀,代价极高。
KV Cache 的做法是:在 Prefill 阶段(处理初始输入时),将每一层每个位置计算得到的 Key 向量和 Value 向量全部缓存到显存中。之后每生成一个新 Token,只需计算该新 Token 对应的 Q、K、V,然后将新的 K、V 追加到缓存末尾,注意力计算时直接读取完整的 KV 缓存即可——新 Token 的 Query 与所有历史 Key 做点积,权重加权所有历史 Value,完成增量更新。
这样,每步生成的计算量从 降至近似 (仅对新 Token 做计算),代价是显存占用随序列长度线性增长。这也是为什么长上下文推理对显存要求很高的根本原因。
四、自回归解码(Autoregressive Decoding)
大模型的生成方式是逐词预测,每次仅输出一个 Token。
- 从向量到概率分布
最后一个 Transformer Block 的输出向量经过一个线性层(也称 LM Head,其权重矩阵维度为 d_model × |V|)映射为词表大小的 logit 向量(原始分数),再经过 Softmax 转化为概率分布:
这个概率分布覆盖了词表中全部 Token,每个 Token 被赋予一个非负概率,所有概率之和为 1。
- 采样策略
- 贪心解码(Greedy Decoding) :直接选取概率最高的 Token,结果确定但容易陷入重复和平庸。
- 温度(Temperature) :在 Softmax 之前将 logit 除以温度参数 。 时分布更尖锐,高概率词的优势被放大,输出趋于保守; 时分布更平坦,低概率词有更多出头机会,输出更有随机性。
- Top-p 采样(Nucleus Sampling) :只从累积概率达到阈值 的 Token 子集中采样,动态过滤掉长尾的低质量选项。
- Top-k 采样:每次只从概率最高的 个 Token 中采样,简单有效。
实际部署中,这些策略往往组合使用。
- 自回归循环
采样得到的新 Token 会被追加到序列末尾,作为下一轮预测的输入背景,循环往复,直到触发停止条件。每一步的生成都以全部历史为条件,这也是"自回归"(autoregressive)名称的由来。
五、后处理与输出(Post-processing)
- 去分词(De-tokenization)
将逐步生成的 Token ID 序列转回人类可读的文本。由于 BPE 等分词算法在切分时可能引入特殊的空格或边界标记,去分词时需要将这些标记还原。
- 停止条件
生成过程在以下情况之一发生时终止:
- 模型生成了特殊的终止符(如
<|endoftext|>或<|eot_id|>),这是模型在训练时学到的"我说完了"的信号; - 生成长度达到预设的最大 Token 数限制;
- 在某些对话系统中,检测到角色切换标记(如生成了"User:"这样的前缀)时也会截断。
最终,去分词后的文本流式或一次性地呈现在用户面前,完成整个推理过程。
小结
将上述五个阶段串联起来,一次完整的 LLM 推理大致如下:
原始文本
→ 分词 + Embedding + 位置编码
→ Prefill:N 层 [Multi-Head Attention + FFN + 残差 + 归一化]
→ KV Cache 建立
→ 自回归解码循环:采样新 Token → 追加序列 → 查 KV Cache → 更新 → 采样 ...
→ 触发停止条件
→ 去分词
→ 输出文本
理解这条链路,有助于解释 LLM 的很多行为:为什么长对话消耗更多资源(KV Cache 增长)、为什么调高温度会让模型"发散"(Softmax 平坦化)、为什么模型有时会在句子中间截断(触发了最大长度限制)。Transformer 的设计并非魔法,每一个环节都有其数学上的必然性。