【AI概念学习】LLM 和 Transformer 基础知识
背景
我们都知道目前已经到了 AI 的变革时代。其实从去年下半年以来,我们公司就全面转向 Vibe Coding 和产品 AI 化。在这个过程中,我也接触了一些 RAG 和 Agent 相关项目,相关概念的博文也看了不少,但一直没有系统性总结:有一种好像知道、但一深入就会变得很模糊的感觉。所以后面会开一系列文章,用来总结我看过的一些 AI 相关概念。
本文内容参考了一些文章、ChatGPT,以及我自己的理解。这篇文章主要讲 Transformer,但不做严格算法推导,更多是面向应用开发者的概念介绍。
从用户输入,到模型生成

当我们在 ChatGPT、DeepSeek 或其他大模型里输入一句话时,模型并不是直接“理解文字”。它会先把文字切成 token,再把 token 映射成向量,送入 Transformer 进行一层层计算。最后,模型会从词表中选出下一个 token。
这个 token 会再拼回上下文,继续预测下一个 token,直到生成完整回答。严格说,浏览器或 App 只是承载输入输出,真正执行预测的是服务端推理系统中的模型。
先看总览:大模型流程分三层
可以把大模型相关概念分成三层来看:
| 层次 | 解决的问题 | 典型概念 | | --- | --- | --- | | 训练流程 | 模型参数怎么被训练出来 | 数据清洗、预训练、后训练、微调 | | 模型架构 | Transformer 内部怎么计算 | 向量表示、位置编码、注意力、前馈网络、多层堆叠 | | 推理应用 | 训练好的模型怎么被使用 | Prompt、外部资料、缓存、采样策略、自回归生成 |
这篇文章的主线是“推理时一句话如何被模型处理”。理解这条链路之后,再回头看预训练和后训练,会更容易明白那些权重矩阵到底是怎么学出来的。
文本不是直接进模型:Tokenizer 和 Token ID
模型不能直接处理自然语言字符串。你输入的句子会先经过 tokenizer,被切成更小的 token。
比如“我喜欢机器学习”可能被切成:
我 / 喜欢 / 机器 / 学习
每个 token 会对应一个整数编号,这个编号叫 Token ID。例如在某个模型里可能是:
| Token | Token ID | | --- | --- | | 我 | 1024 | | 喜欢 | 5832 | | 机器 | 9210 | | 学习 | 7345 |
所以一句话进入模型前,通常会先变成类似 [1024, 5832, 9210, 7345] 这样的整数序列。
Token ID 更像词表里的数组下标,有点像字典表中的索引。它只是当前 tokenizer vocabulary 中的编号。
不同模型的 Token ID 一样吗?
不同模型的 Token ID 不一样。
Token ID 不是跨模型通用的编号,而是由具体模型使用的 tokenizer 和词表决定的。同一个词“苹果”,在模型 A 里可能是 ID 1024,在模型 B 里可能是 ID 58320。甚至有的模型会把“苹果”切成一个 token,有的模型可能切成“苹”和“果”两个 token。
这里的关系可以整理成一张小表:
| 范围 | 结论 | | --- | --- | | 同一个模型内 | token 和 token ID 的映射固定 | | 不同模型之间 | tokenizer 不同,切分方式和 token ID 可能不同 |
Token ID 如何变成向量:Embedding 和上下文表示
Token ID 本身只是一个编号,不能直接表达语义。模型内部会用一张可训练的表把它变成向量,这张表叫 Embedding Matrix,也叫做 Embedding Table,也叫词嵌入矩阵。
假设一个模型的词表大小是 50,000,hidden size 是 768,那么 embedding matrix 的形状就是 50000 × 768。每个 token ID 会作为下标,从这张表中取出一行向量。
例如,token ID 1024 可能会查到一个 768 维向量:
1024 → [0.12, -0.44, 0.78, ...]
这里要区分两个概念:
| 概念 | 是否固定 | 说明 | | --- | --- | --- | | 初始 embedding | 推理阶段固定 | 同一个模型、同一套参数下,同一个 token ID 会查到同一行向量;继续训练或微调后参数可能改变 | | 上下文表示 hidden state | 会随上下文变化 | 经过 Transformer 后,同一个词在不同语境中表示不同 |
Hidden state 可以理解为“某个 token 在模型某一层里的向量表示”。刚进入模型时,它是初始 embedding;经过第 1 层 Transformer 后,它变成第 1 层 hidden state;继续往后,每一层都会得到新的 hidden state。
比如“苹果”在“我吃了一个苹果”和“苹果发布了新手机”中,如果 tokenizer 把它切成同一个 token,那么初始 embedding 通常相同。但进入 Transformer 后,它会根据上下文分别变成“水果”或“公司”的上下文表示。
单层 Transformer Block 里发生了什么
用户输入经过 tokenizer 和 embedding 后,会进入多层 Transformer。现代生成式大模型,比如 GPT、LLaMA、DeepSeek 一类,通常是 decoder-only Transformer。
常见 Transformer 结构可以简单分成三类:
| 结构 | 代表模型 | 常见用途 | | --- | --- | --- | | Encoder-only | BERT | 文本理解、分类、匹配、句向量 | | Decoder-only | GPT、LLaMA、DeepSeek | 文本生成、对话、代码生成 | | Encoder-Decoder | 原始机器翻译 Transformer | 翻译、摘要、序列到序列任务 |
一层 Transformer block 通常包含几个核心部分。这里先给一个轮廓,后面会逐个展开:
-
Self-Attention:自注意力机制,负责让当前 token 关注被 mask 允许看到的上下文 token,并把相关信息聚合到当前表示里。
-
Residual Connection:残差连接,把子层输出和原始输入相加,减少信息丢失,让深层网络更容易训练。
-
LayerNorm 或 RMSNorm:归一化层,用来稳定 hidden state 的数值范围,让后续 Attention 和 MLP 计算更平稳。
-
MLP / FFN:前馈网络,负责对每个 token 的表示做进一步加工、组合和筛选特征。
先粗略理解:其中一部分负责让 token 之间交换信息,一部分负责继续加工每个 token 的表示,还有一些结构负责让深层网络更稳定。具体到 Attention、MLP、Residual 和 Norm,下文会分别解释。
为什么需要位置编码?
Transformer 里的注意力计算本身不天然知道 token 顺序。比如 “我喜欢你” 和 “你喜欢我” 包含相似 token,但意思完全不同。
因此模型需要注入位置信息。原始 Transformer 使用 sinusoidal positional encoding,后来的模型也会使用可学习位置编码、ALiBi、RoPE 等方案。很多现代大模型常用 RoPE,也就是 Rotary Position Embedding。后面讲 QKV 时会看到,RoPE 通常会作用在 Q 和 K 上,让模型在计算注意力时感知相对位置。
QKV 是怎么来的
每个 token 进入某一层 Transformer 时,都有一个 hidden state 向量。这个向量本身并不天然分成 Q、K、V,而是通过三组可学习的线性投影矩阵变换出来的:
Q = XWq
K = XWk
V = XWv
其中:
| 矩阵 | 名称 | 作用 | | --- | --- | --- | | Wq | Query Projection Matrix | 把输入表示变成 Query | | Wk | Key Projection Matrix | 把输入表示变成 Key | | Wv | Value Projection Matrix | 把输入表示变成 Value |
换成更直观的说法:
-
Q:我想找什么?
-
K:我能被怎么匹配?
-
V:我真正提供什么内容?
这些矩阵不是人工写死的“参考表”,而是训练过程中学出来的参数。后面讲预训练时,我们会再看模型如何通过 loss、反向传播和优化器更新这些参数。
Attention 矩阵:看谁、看多少
得到 Q 和 K 之后,模型会计算 QK^T。这会得到一张注意力分数表,表示每个 token 对其他 token 的关注程度。
例如,不考虑 causal mask 时,对于“小猫 / 坐在 / 垫子 / 上”这几个 token,可以把注意力表想象成这样:
| 当前 token | 看小猫 | 看坐在 | 看垫子 | 看上 | | --- | --- | --- | --- | --- | | 小猫 | 8.0 | 2.1 | 1.3 | 0.5 | | 坐在 | 3.2 | 7.5 | 6.9 | 2.0 | | 垫子 | 1.1 | 4.8 | 7.2 | 5.9 | | 上 | 0.8 | 2.5 | 6.4 | 7.0 |
这些分数会经过缩放和 softmax,变成注意力权重。最终公式是:
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k) + mask)V
这句话的意思是:**Q 和 K 决定看谁、看多少,mask 决定哪些位置不能看,V 提供真正被聚合的信息。**如果没有 causal mask 或 padding mask,可以把 mask 理解成 0。
普通 self-attention 的计算成本也来自这里。如果序列长度是 n,注意力分数矩阵大约是 n × n,所以常说普通 attention 的复杂度是 O(n²)。这也是长上下文模型更贵、更吃显存的重要原因之一。
多头 Attention:同一层里从多个角度看上下文
多头 attention 和多层 Transformer 不是一个概念,我一开始没太理解这里。
| 概念 | 含义 | | --- | --- | | 多头 | 同一层 attention 内部有多个 head 并行计算 | | 多层 | 多个 Transformer block 前后堆叠 |
一个模型可以是 32 层 Transformer,每层 32 个 attention head。这里的“32 层”和“32 个头”是两个不同维度。
多头 attention 的直观意义是:让模型从多个子空间、多个角度关注上下文。有的 head 可能更关注语法关系,有的可能关注位置关系、指代关系、实体关系或长距离依赖。当然,这些职责不是人工指定的,而是在大量数据学习过程中逐渐形成的;具体训练过程后文会讲。
Mask:为什么生成时不能看未来
生成式语言模型通常会使用 causal mask。它的作用是:当前位置只能看自己和之前的 token,不能看未来 token。
比如已经有 4 个 token,要预测第 5 个 token 时,模型只能基于第 1 到第 4 个 token 来算下一个 token 的概率。训练时虽然整段文本一次喂进去,但 causal mask 会保证每个位置不能偷看后面的答案。
还有一种常见 mask 是 padding mask。当一个 batch 里不同样本长度不同,短句会补 PAD token(例如 <pad>),padding mask 会防止模型关注这些无意义位置。
| Mask 类型 | 作用 |
| --- | --- |
| Causal mask | 防止看未来 token |
| Padding mask | 防止看补齐的 PAD / <pad> 位置 |
MLP / FFN:Attention 之后的信息加工器
每层 Transformer 除了 attention,还有 MLP,也叫 FFN。
这几个名字在 Transformer 语境里通常指同一类模块:
| 名称 | 含义 | | --- | --- | | MLP | Multi-Layer Perceptron,多层感知机 | | FFN | Feed-Forward Network,前馈网络 | | Feed Forward | 前馈层 |
Attention 的重点是“从上下文里拿信息”:当前 token 应该关注哪些 token,每个 token 的信息应该混合多少。
MLP / FFN 的重点是“对拿到的信息进行加工”:提取特征、组合特征、过滤不重要的信息、放大有用的信息,让表示更适合下一层使用。
两者的分工如下:
| 模块 | 主要作用 | | --- | --- | | Attention | 跨 token 交流,聚合上下文 | | MLP / FFN | 逐 token 加工,组合特征 |
FFN 的典型结构
经典 FFN 通常长这样:
FFN(x) = W2 * activation(W1 * x + b1) + b2
它的共同模式是 hidden size → intermediate size → hidden size。原始 Transformer 常把中间维度设成 hidden size 的 4 倍;而很多现代大模型会用带门控的 MLP 变体,例如 LLaMA 系模型中常见的 SwiGLU 结构,可能会出现类似 4096 → 11008 → 4096 的维度变化,内部还会有 gate / up / down 等投影。
中间的 activation 或门控机制会引入非线性。没有非线性的话,多层线性变换本质上仍然可以合并成一个大的线性变换,表达能力会很受限制。
现代大模型常用的激活或门控结构包括 GELU、SiLU、SwiGLU、GEGLU 等。这里不展开具体公式,重点是:现代大模型里的 FFN 往往是带门控机制的 MLP 变体。
Residual Connection 和 Norm
Residual connection,也就是残差连接,通常可以理解成:
输出 = 输入 + 子层输出
它的作用是减少信息丢失,让深层网络里的信息传递更稳定。
Norm 常见有 LayerNorm 和 RMSNorm。它们的作用是稳定数值分布,提高训练和推理稳定性。很多现代大模型会使用 RMSNorm。
为什么是多层 Transformer
单层 Transformer 只能做一次上下文信息聚合和加工。语言理解往往需要多步组合:词义、短语、句法、指代、语义角色、任务意图,这些很难靠一层全部完成。
多层 Transformer 指的是多个 Transformer block 一层一层堆叠。第 1 层接收初始 embedding,第 2 层接收第 1 层输出的 hidden state,第 3 层继续接收第 2 层输出,如此往复。
这里有个容易混淆的点:token 的切分只在最开始 tokenizer 阶段做一次。进入 Transformer 后,token 的位置和数量通常不会在每一层重新划分。变化的是每个 token 对应的向量表示,也就是 hidden state。
比如“苹果发布了新手机”:
| 层次 | “苹果”的表示可能发生什么变化 | | --- | --- | | 第 0 层 | 只是初始 embedding | | 第 1 层 | 注意到附近有“发布”“手机” | | 第 2 层 | 更像“科技公司 Apple” | | 更高层 | 结合任务形成更抽象的上下文理解 |
所以,多层 Transformer 不是反复重新分词,而是对同一批 token 的向量表示反复加工。
模型怎么选出下一个 token:LM Head 和 Logits
Transformer 最后一层输出的是每个位置的 hidden state。训练时通常每个位置都可以映射出一组 logits;推理生成时,模型主要取最后一个有效位置的 hidden state,用它预测下一个 token。
这个输出层通常叫 LM Head,也就是 Language Modeling Head。
假设 hidden size 是 4096,词表大小是 50000,那么 LM Head 会做一次 4096 → 50000 的映射,得到每个候选 token 的 logits。有些模型会把输入 embedding 和 LM Head 权重绑定在一起,以减少参数量并共享词表表示。
Logits 是词表中每个 token 的原始分数。比如:
| Token | Logit | | --- | --- | | 是 | 8.2 | | 不是 | 5.1 | | 可以 | 4.7 | | 因为 | 3.9 |
这些分数会经过 softmax 变成概率,然后模型根据解码策略选择下一个 token。
Temperature:控制输出随机性
Temperature 是推理阶段的采样参数,不是物理温度。它通常作用在 softmax 前:
probabilities = softmax(logits / temperature)
低 temperature 会让分布更尖锐,输出更稳定、更确定。高 temperature 会让分布更平滑,低概率 token 也更有机会被选中,输出更发散、更有创意。需要注意的是,很多 API 里的 temperature = 0 通常表示尽量确定性或贪心解码,并不是在数学公式里真的除以 0。
| 场景 | 建议 | | --- | --- | | 代码、SQL、JSON、分类、信息抽取、事实问答 | 低 temperature,常见 0 到 0.3 | | 创意写作、头脑风暴、命名、故事生成、多版本改写 | 较高 temperature,常见 0.7 到 1.2 |
因此,在需要正确和稳定的任务中通常会调低 temperature;在需要多样性和创意的任务中,temperature 可以适当调高。
Top-p:控制候选 token 范围
Top-p 也叫 nucleus sampling,核采样。它的作用是:只从累计概率达到 p 的最小 token 集合中采样。
假设候选概率如下:
| Token | 概率 | | --- | --- | | A | 0.40 | | B | 0.25 | | C | 0.15 | | D | 0.10 | | E | 0.05 |
如果 top_p = 0.8,模型会按概率从高到低累加:A 是 0.40,A+B 是 0.65,A+B+C 是 0.80。于是候选集合就是 A、B、C,后面的 token 不参与采样。
Temperature 和 top-p 的区别在于:
| 参数 | 控制什么 | | --- | --- | | Temperature | 调整概率分布的形状 | | Top-p | 控制候选 token 的范围 |
除了 temperature 和 top-p,还有 greedy decoding、beam search、top-k sampling、repetition penalty 等解码方式。Chat 模型通常更常用 sampling,因为自然对话需要一定多样性。
为什么模型能连续生成回答:自回归和 KV Cache
大模型通常不是一次生成整段回答,而是一个 token 一个 token 生成。每生成一个新 token,它都会被拼回上下文,作为下一轮预测的输入。
这叫 自回归生成。
生成过程大概是:
-
用户输入上下文。
-
模型预测下一个 token。
-
新 token 拼回上下文末尾。
-
模型继续预测下一个 token。
-
直到遇到结束 token、stop sequence 或最大长度限制。
为了避免每一轮都重复计算所有历史 token 的 K 和 V,推理时会使用 KV Cache。它会把已经算过的 Key 和 Value 缓存起来,下次生成时直接复用。新 token 仍然要和缓存中的历史 K/V 做注意力计算,KV Cache 省掉的是历史 token 的重复投影和重复前向计算。
KV Cache 会影响推理速度、显存占用、最大上下文长度和并发能力。
这里也关联到 Context Window,也就是模型一次能看到的最大 token 数量。上下文太长时,常见处理方法包括截断旧内容、摘要压缩、检索相关片段,或者使用长上下文模型。检索增强生成,也就是 RAG,后文会单独介绍。
这些能力是怎么训练出来的:训练数据
前面讲的是推理时模型怎么处理一句话。接下来回头看:这些参数到底是怎么来的?
训练大模型首先需要大量数据,例如网页、书籍、代码、论文、百科、问答数据、对话数据和专业领域数据。
这些数据通常需要清洗,包括去重、过滤低质量文本、过滤垃圾内容、过滤敏感或违法内容、统一格式、控制不同数据源比例等。
数据质量会直接影响模型能力。对大模型来说,数据不是“越多越好”这么简单,质量、比例和覆盖范围同样重要。
预训练:模型参数从哪里来
预训练是训练基础模型的阶段。它的目标通常是:给定前面的 token,预测下一个 token。
比如训练样本是“北京是中国的首都”。模型看到“北京是中国的”,要预测下一个 token“首都”。
模型预测错了,就通过 loss、反向传播和优化器更新参数。常见损失函数是 Cross Entropy Loss,也就是交叉熵损失。
从训练目标来看,真实 token 的预测概率越高,loss 越小;真实 token 的预测概率越低,loss 越大。
训练流程可以概括为:
-
前向计算得到 logits。
-
用真实下一个 token 计算 loss。
-
反向传播计算每个参数对 loss 的梯度。
-
优化器根据梯度更新参数。
常见优化器包括 Adam 和 AdamW。大模型训练中常见的是 AdamW。相关概念还有 learning rate、warmup、weight decay、gradient clipping 等。
预训练会更新模型中的大量参数,包括 embedding matrix、Wq/Wk/Wv/Wo、MLP / FFN 权重、Norm 参数、LM Head 权重等。
预训练得到的模型通常叫 Base Model。Base Model 会续写文本,也具备基础知识和推理模式,但不一定很会遵循人类指令。
为什么还要后训练
后训练发生在预训练之后。它的目标是让 base model 变成更适合作为助手使用的模型。
常见后训练包括:
| 方法 | 作用 | | --- | --- | | SFT | 监督指令微调,让模型学会问答格式和指令遵循 | | RLHF | 基于人类反馈进行偏好对齐 | | DPO | 直接偏好优化 | | RLAIF | 基于 AI 反馈进行对齐 | | 安全对齐 | 让模型学会拒绝危险请求 | | 工具使用训练 | 学会调用搜索、数据库、代码执行器等工具 |
两者的关系可以概括为:预训练让模型有基础能力,后训练让模型更会当助手。
微调和 LoRA:适配具体场景
微调通常不算预训练。它是在已有模型基础上,用特定数据继续训练,让模型适配某个任务、领域或风格。
比如:
| 原模型 | 微调后 | | --- | --- | | 通用模型 | 医疗问答模型 | | 通用模型 | 法律助手 | | 通用模型 | 公司客服机器人 | | 通用模型 | 代码审查助手 |
微调会更新模型参数。它和后文会介绍的 in-context learning 有一个关键区别:微调发生在训练阶段,会改变参数;in-context learning 发生在推理阶段,不改参数,只靠 prompt 中的例子临时适配。
全量微调会更新大量参数,成本高、显存占用大。真实业务里常用参数高效微调,也就是 PEFT。其中最常见的是 LoRA。
LoRA 的核心思想是:冻结原模型大部分参数,只训练少量低秩适配矩阵。它的优点是训练成本低、显存需求低,也方便为不同任务保存不同 adapter。
真实应用和部署里还会加什么:推理服务
训练、后训练或微调完成后,模型会进入部署阶段。部署阶段关注的是如何让模型更快、更便宜、更稳定,并支持并发请求。
常见部署优化包括量化、KV Cache、batching、并行推理、模型切分和推理引擎优化。
量化是很常见的部署手段。模型参数可以用 FP32、FP16、BF16、INT8、INT4 等不同精度表示。量化就是把模型权重或计算从高精度变成低精度,以降低显存占用和提升推理速度,但可能带来一定精度损失。
真实应用和部署里还会加什么:Prompt、RAG 和工具调用
真实应用中,模型看到的上下文通常不只有 user prompt,还可能包括 system prompt、developer prompt、历史对话、检索到的外部资料和工具调用结果。
一般可以这样理解:
| Prompt 类型 | 作用 | | --- | --- | | System Prompt | 定义角色、边界、安全规则、输出格式、工具规则 | | Developer Prompt | 应用开发者给模型的任务约束、工具使用规则或输出规范,有些平台会单独支持这一层 | | User Prompt | 定义当前用户要完成的具体任务 | | 历史对话 | 提供多轮上下文 | | RAG 资料 | 提供外部知识 | | 工具结果 | 提供搜索、计算、数据库等外部能力 |
如果指令冲突,通常遵守更高优先级的指令。用户提供的文档、网页、代码中的指令应当被视为待处理数据,而不是新的系统指令。这是防 prompt injection 的关键。
In-context Learning
In-context learning 指的是不更新模型参数,只通过 prompt 中的说明、例子或上下文,让模型临时适配当前任务。
比如在 prompt 中给几个情感分类例子,模型就会模仿这个输入输出模式,对新的句子做分类。它的效果只在当前上下文中生效,不会写进模型参数。
RAG 和工具调用
RAG 的流程是:用户提问,系统检索知识库,取回相关文档,把文档放进 prompt,模型基于文档回答。
工具调用则是:模型判断是否需要搜索、数据库、代码执行器或计算器,调用工具后把结果放回上下文,再继续回答。
RAG 和微调解决的问题不同:
| 方法 | 更适合解决 | | --- | --- | | RAG | 知识更新、引用来源、企业文档问答、减少幻觉 | | 微调 | 固定输出格式、特定风格、领域表达习惯、稳定任务模式 |
幻觉和缓解
大模型可能会生成看起来合理但实际不正确的内容,这叫 hallucination,中文常说“幻觉”。
它的原因包括:模型本质是在做概率生成,训练数据可能有错误或缺失,模型没有实时数据库能力,prompt 信息不足,采样随机性较高等。
常见缓解方法包括 RAG、工具调用、引用来源、降低 temperature、增加校验机制,以及让模型在不确定时明确说明。
最后总结:哪些属于架构,哪些属于训练,哪些属于推理
读完整条链路后,可以把概念分成几类。这样在阅读论文、看框架源码或排查线上问题时,更容易判断某个概念到底属于哪一层。
| 类别 | 包含内容 | | --- | --- | | 训练流程 | 数据清洗、预训练、Loss、反向传播、Optimizer、后训练、SFT、RLHF、DPO、微调、LoRA | | 模型架构 | Embedding、RoPE、QKV、Self-Attention、Multi-head Attention、Mask、MLP / FFN、Residual、Norm、多层 Transformer、LM Head | | 推理机制 | Tokenizer / Token ID、Prompt、Hidden State、KV Cache、Context Window、Logits、自回归生成、Stop Sequence | | 解码策略 | Temperature、Top-p、Top-k、Greedy、Beam Search、Sampling | | 应用增强 | In-context Learning、RAG、工具调用、幻觉控制 |
具体的边界是:
-
Transformer 架构:模型内部怎么计算。
-
预训练、后训练、微调:模型参数怎么学出来。
-
Temperature、Top-p:推理时怎么选下一个 token。
-
RAG、工具调用:应用层怎么给模型补充外部能力。
参考 / 延伸阅读
- Attention Is All You Need:Transformer 和 scaled dot-product attention 的原始论文。
- RoFormer: Enhanced Transformer with Rotary Position Embedding:RoPE 的论文。
- The Curious Case of Neural Text Degeneration:nucleus sampling / top-p 的经典论文。
- LoRA: Low-Rank Adaptation of Large Language Models:LoRA 的论文。
评论
暂无公开评论。