Transformer 的 Encoder 和 Decoder 模块介绍:从结构原理到大模型应用实践
Transformer 的 Encoder 和 Decoder 模块介绍:从结构原理到大模型应用实践
1. 文章背景:为什么这个主题重要
Transformer 是现代大模型的核心基础架构。无论是 BERT、GPT、T5,还是现在常见的 ChatGLM、LLaMA、Qwen、DeepSeek 等大语言模型,本质上都和 Transformer 架构密切相关。
很多人在学习大模型应用开发时,可能一开始更关注 RAG、Agent、Prompt Engineering、向量数据库和微调,但如果完全不了解 Transformer 的 Encoder 和 Decoder,就很难真正理解这些系统背后的模型能力边界。
例如:
- 为什么 BERT 更适合文本理解、分类、Embedding?
- 为什么 GPT 更适合文本生成和对话?
- 为什么 T5、BART 这类模型适合翻译、摘要和文本改写?
- 为什么 Decoder-only 模型成为当前大语言模型主流?
- 为什么推理时需要 KV Cache?
- 为什么生成式模型不能一次性并行生成完整答案?
- 为什么 Encoder 输出可以用于语义检索,而 Decoder 输出更适合自回归生成?
这些问题都和 Transformer 的 Encoder、Decoder 结构有关。
从企业级 AI 落地角度看,理解 Encoder 和 Decoder 的价值不只是为了面试,也直接影响模型选型和系统设计:
- 做语义向量检索时,更关注 Encoder 表示能力;
- 做知识库问答生成时,更关注 Decoder 生成能力;
- 做文本摘要、翻译、改写时,可以考虑 Encoder-Decoder 架构;
- 做聊天机器人、Agent、代码生成时,通常使用 Decoder-only 架构;
- 做低延迟推理部署时,要重点理解 Decoder 的逐 token 生成和 KV Cache。
所以,这篇文章会从工程视角拆解 Transformer 的 Encoder 和 Decoder,而不是只停留在公式层面。
2. 核心问题:实际开发中会遇到什么问题
在实际大模型应用开发中,很多问题都来自对 Transformer 架构理解不清。
2.1 不知道不同模型结构适合什么任务
常见模型可以简单分成三类:
| 架构类型 | 代表模型 | 典型任务 |
|---|---|---|
| Encoder-only | BERT、RoBERTa | 分类、匹配、Embedding、文本理解 |
| Decoder-only | GPT、LLaMA、Qwen | 对话、续写、代码生成、Agent |
| Encoder-Decoder | T5、BART | 翻译、摘要、改写、生成式理解 |
如果做 RAG 的 Embedding 检索,却拿一个普通生成式模型直接取最后 token 表示,效果可能不稳定;如果做聊天生成,却用 Encoder-only 模型,也无法自然完成自回归生成。
2.2 不理解 Mask,容易误解模型训练和推理
Encoder 和 Decoder 最大区别之一是 Attention Mask。
Encoder 通常可以看到完整输入序列,适合做全局理解。Decoder 在生成时只能看到当前位置之前的 token,不能偷看未来 token,这叫 causal mask。
这就是为什么 Decoder 适合做文本生成:它符合“根据前文预测下一个 token”的训练和推理方式。
2.3 不理解 KV Cache,难以优化推理速度
大模型推理时,Decoder 是逐 token 生成。如果每生成一个 token 都重新计算整个上下文的 Attention,成本会非常高。
KV Cache 的作用就是缓存历史 token 的 Key 和 Value,避免重复计算。这是大模型推理部署中非常关键的优化点。
2.4 不理解架构,容易把 RAG、Agent 问题都归因于 Prompt
很多应用问题不一定是 Prompt 的问题,而可能是模型能力边界或架构差异导致的。
例如:
- Embedding 效果差,可能是表示模型不适合;
- 长文本生成慢,可能是 Decoder 推理复杂度高;
- 摘要不稳定,可能是模型上下文压缩能力不足;
- Agent 工具调用不稳定,可能是指令跟随和结构化输出能力不足。
理解 Transformer 架构,可以帮助我们更理性地做模型选型和系统优化。
3. 基础概念:用工程视角解释关键概念
3.1 Transformer 的整体思想
Transformer 最早提出时是为了解决序列建模问题。传统 RNN、LSTM 需要按顺序处理 token,训练并行度有限。Transformer 使用 Attention 机制,让序列中每个 token 可以直接关注其他 token,从而提升并行计算能力和长距离依赖建模能力。
Transformer 的核心模块包括:
- Token Embedding;
- Positional Encoding;
- Multi-Head Attention;
- Feed Forward Network;
- Residual Connection;
- Layer Normalization;
- Encoder;
- Decoder。
整体来看,Transformer 不是一个单一模块,而是一套可堆叠的神经网络结构。
3.2 Self-Attention:让 token 之间互相看
Self-Attention 的核心是:每个 token 根据 Query、Key、Value 计算与其他 token 的关系。
常见公式如下:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中:
- Q:Query,表示当前 token 想查询什么信息;
- K:Key,表示每个 token 能提供什么匹配信息;
- V:Value,表示每个 token 实际携带的内容;
- d_k:Key 向量维度,用于缩放点积结果;
- softmax:将相关性分数转换成权重。
从工程角度理解,Attention 就是一个动态加权的信息聚合过程。模型会根据当前 token 的需求,从其他 token 中选择最相关的信息。
3.3 Multi-Head Attention:多角度看上下文
单个 Attention 头只能从一个角度建模关系。Multi-Head Attention 会并行使用多个 Attention 头,让模型从不同子空间学习不同关系。
例如在一句话中:
小明把书放在桌子上,然后他离开了房间。
不同 Attention 头可能关注:
- “他”指代“小明”;
- “书”和“放在”之间的动作关系;
- “桌子”是位置;
- 句子整体时序关系。
多头机制增强了模型表达能力。
3.4 Encoder 和 Decoder 的基本区别
Encoder 和 Decoder 都由 Attention、FFN、残差连接和归一化组成,但它们的目标不同。
| 模块 | 主要目标 | 是否能看完整输入 | 典型用途 |
|---|---|---|---|
| Encoder | 理解输入 | 可以 | 表征、分类、匹配、检索 |
| Decoder | 生成输出 | 不能看未来 | 对话、续写、翻译输出 |
| Encoder-Decoder | 输入理解 + 输出生成 | Encoder 看输入,Decoder 自回归生成 | 翻译、摘要、改写 |
一句话总结:
Encoder 擅长理解,Decoder 擅长生成。
4. 系统设计:如何搭建完整流程或架构
4.1 Encoder-only 架构
Encoder-only 模型只保留 Transformer Encoder 部分。典型代表是 BERT。
其输入是一段完整文本,输出是每个 token 的上下文表示,或者使用 CLS token 表示整个句子。
典型流程如下:
输入文本
↓
Tokenizer
↓
Token Embedding + Position Embedding
↓
多层 Transformer Encoder
↓
句向量 / token 向量
↓
分类、匹配、检索、抽取
Encoder-only 的特点是:
- 可以双向看到上下文;
- 适合文本理解;
- 不适合自回归生成;
- 常用于 Embedding、分类和文本匹配。
在企业应用中,Encoder 模型常用于:
- RAG 向量检索;
- FAQ 相似问题匹配;
- 文本分类;
- 意图识别;
- 命名实体识别;
- 语义相似度计算。
4.2 Decoder-only 架构
Decoder-only 模型只保留 Transformer Decoder 的自回归生成部分。典型代表是 GPT 系列、LLaMA、Qwen 等。
其训练目标是根据前面的 token 预测下一个 token。
流程如下:
输入 Prompt
↓
Tokenizer
↓
Token Embedding + Position Encoding
↓
多层 Transformer Decoder
↓
预测下一个 token
↓
将新 token 拼回输入
↓
继续生成
Decoder-only 的特点是:
- 只能看当前位置之前的 token;
- 适合生成任务;
- 推理是逐 token 进行;
- 可通过指令微调变成聊天模型;
- 当前大语言模型主流采用该架构。
企业应用中,Decoder-only 模型常用于:
- 智能客服;
- 知识库问答生成;
- Agent 工具调用;
- 代码生成;
- 报告生成;
- 文档摘要;
- 多轮对话。
4.3 Encoder-Decoder 架构
Encoder-Decoder 模型同时包含 Encoder 和 Decoder。典型代表是原始 Transformer、T5、BART。
流程如下:
输入文本
↓
Encoder 编码输入
↓
Decoder 根据已生成 token 和 Encoder 输出生成目标文本
↓
最终输出
这种架构特别适合输入和输出都很明确的 seq2seq 任务,例如:
- 机器翻译;
- 文本摘要;
- 文本改写;
- 问答生成;
- 结构化到文本生成。
它的优点是输入理解和输出生成分工清晰,但当前通用大模型领域,Decoder-only 架构更常见。
5. 关键实现:核心模块、技术选型和实现细节
5.1 Encoder 模块结构
一个标准 Transformer Encoder Layer 通常包含:
- Multi-Head Self-Attention;
- Add & Norm;
- Feed Forward Network;
- Add & Norm。
结构如下:
Input
↓
Multi-Head Self-Attention
↓
Residual + LayerNorm
↓
Feed Forward Network
↓
Residual + LayerNorm
↓
Output
Self-Attention 让每个 token 融合全局上下文,FFN 则对每个 token 的表示进行非线性变换。
Encoder 的 Attention 通常是双向的,即每个 token 可以关注序列中所有 token。
5.2 Decoder 模块结构
一个标准 Transformer Decoder Layer 通常包含三个核心部分:
- Masked Multi-Head Self-Attention;
- Cross-Attention;
- Feed Forward Network。
结构如下:
Target Input
↓
Masked Multi-Head Self-Attention
↓
Residual + LayerNorm
↓
Cross-Attention with Encoder Output
↓
Residual + LayerNorm
↓
Feed Forward Network
↓
Residual + LayerNorm
↓
Output
需要注意:在 Decoder-only 模型中,通常没有 Cross-Attention,因为它没有独立 Encoder 输出。GPT、LLaMA 这类模型主要使用 Masked Self-Attention + FFN 堆叠。
5.3 Masked Self-Attention
Decoder 生成第 t 个 token 时,不能看到 t 之后的 token。否则训练时模型会偷看答案,推理时又看不到未来,训练和推理就不一致。
因此需要 causal mask。
示意如下:
token1 只能看 token1
token2 可以看 token1, token2
token3 可以看 token1, token2, token3
token4 可以看 token1, token2, token3, token4
Mask 矩阵可以理解为:
1 0 0 0
1 1 0 0
1 1 1 0
1 1 1 1
其中 1 表示允许关注,0 表示不能关注。
5.4 Cross-Attention
Encoder-Decoder 架构中的 Decoder 不仅要看自己已经生成的 token,还要看 Encoder 的输入表示。这一步通过 Cross-Attention 完成。
在 Cross-Attention 中:
- Query 来自 Decoder;
- Key 和 Value 来自 Encoder 输出。
可以理解为:Decoder 每生成一个 token,都去 Encoder 输出中查询和当前生成位置最相关的输入信息。
例如机器翻译中,Encoder 编码中文句子,Decoder 生成英文句子。生成每个英文词时,Decoder 会通过 Cross-Attention 关注中文输入中的相关部分。
5.5 一个简化版 PyTorch Encoder Layer
下面是一个简化版 Encoder Layer 示例,帮助理解模块组合:
import torch
import torch.nn as nn
class SimpleEncoderLayer(nn.Module):
def __init__(self, d_model=512, num_heads=8, dim_ff=2048):
super().__init__()
self.self_attn = nn.MultiheadAttention(
embed_dim=d_model,
num_heads=num_heads,
batch_first=True
)
self.ffn = nn.Sequential(
nn.Linear(d_model, dim_ff),
nn.ReLU(),
nn.Linear(dim_ff, d_model)
)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
def forward(self, x, attention_mask=None):
attn_out, _ = self.self_attn(x, x, x, attn_mask=attention_mask)
x = self.norm1(x + attn_out)
ffn_out = self.ffn(x)
x = self.norm2(x + ffn_out)
return x
这个代码体现了 Encoder 的核心结构:
- Q、K、V 都来自输入 x;
- Attention 后接残差和归一化;
- FFN 后再接残差和归一化。
5.6 一个简化版 Decoder Layer
下面是带 causal mask 的简化 Decoder Layer:
import torch
import torch.nn as nn
class SimpleDecoderLayer(nn.Module):
def __init__(self, d_model=512, num_heads=8, dim_ff=2048):
super().__init__()
self.self_attn = nn.MultiheadAttention(
embed_dim=d_model,
num_heads=num_heads,
batch_first=True
)
self.ffn = nn.Sequential(
nn.Linear(d_model, dim_ff),
nn.ReLU(),
nn.Linear(dim_ff, d_model)
)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
def forward(self, x):
seq_len = x.size(1)
causal_mask = torch.triu(
torch.ones(seq_len, seq_len),
diagonal=1
).bool().to(x.device)
attn_out, _ = self.self_attn(
x, x, x,
attn_mask=causal_mask
)
x = self.norm1(x + attn_out)
ffn_out = self.ffn(x)
x = self.norm2(x + ffn_out)
return x
真实大模型会更加复杂,例如使用 RMSNorm、RoPE、SwiGLU、GQA、MQA、FlashAttention、KV Cache 等优化,但核心思想仍然是 Masked Self-Attention + FFN。
6. 常见问题:实际落地中的坑和解决方案
6.1 把 Encoder 模型当生成模型使用
Encoder-only 模型不适合直接做开放式生成。它更适合理解和表示。如果想做对话、续写、代码生成,应该使用 Decoder-only 或 Encoder-Decoder 模型。
解决方案:
- 语义检索、分类、匹配:优先考虑 Encoder;
- 聊天、问答生成、Agent:优先考虑 Decoder-only;
- 翻译、摘要、改写:可以考虑 Encoder-Decoder 或指令大模型。
6.2 Embedding 模型选型错误
做 RAG 时,不建议直接用普通生成模型的隐藏状态当 Embedding。专业 Embedding 模型通常经过对比学习、排序任务或检索任务训练,更适合语义检索。
解决方案:
- 使用专门的 Embedding 模型;
- 根据中文、英文、代码、领域文档选择模型;
- 建立检索评估集;
- 用 Recall@k、MRR 等指标评估。
6.3 忽略 Decoder 推理成本
Decoder-only 模型生成是逐 token 的。输出越长,推理越慢,成本越高。
解决方案:
- 控制 max_tokens;
- 使用流式输出;
- 启用 KV Cache;
- 对高频问题做缓存;
- 对简单任务使用小模型;
- 使用量化、并发 batching、vLLM 等推理框架。
6.4 长上下文不等于一定效果好
很多人认为上下文窗口越长越好,但实际不一定。长上下文会带来:
- 成本增加;
- 延迟增加;
- 注意力稀释;
- 无关信息干扰;
- 更难做答案溯源。
解决方案:
- RAG 中只放最相关证据;
- 使用 Rerank 过滤上下文;
- 对长文档做分层摘要;
- 对历史对话做压缩;
- 不要盲目把所有资料塞给模型。
6.5 不理解 Mask 导致训练数据构造错误
如果训练生成模型时没有正确设置 causal mask,模型可能在训练阶段看到未来 token,导致训练指标虚高,但推理效果很差。
解决方案:
- 自回归任务必须使用 causal mask;
- 序列标注任务使用双向 Encoder;
- seq2seq 任务区分 source mask 和 target mask;
- 注意 padding mask 和 causal mask 的组合。
7. 效果评估:如何判断系统是否有效
Transformer 架构本身不是最终目标,最终要看它在业务任务中的效果。
7.1 Encoder 类任务评估
Encoder 常用于分类、匹配和检索。
常见指标:
| 任务 | 指标 |
|---|---|
| 文本分类 | Accuracy、Precision、Recall、F1 |
| 语义匹配 | AUC、F1、Accuracy |
| 向量检索 | Recall@k、MRR、nDCG |
| 实体识别 | Precision、Recall、F1 |
| 聚类 | Silhouette Score、人工评估 |
对于 RAG Embedding,重点关注 Recall@k。因为如果正确文档没有被召回,后面的生成模型再强也无能为力。
7.2 Decoder 类任务评估
Decoder 常用于生成任务。
常见指标:
| 任务 | 指标 |
|---|---|
| 对话问答 | 人工评分、满意度、幻觉率 |
| 摘要 | ROUGE、人工一致性 |
| 代码生成 | Pass@k、单元测试通过率 |
| Agent | 任务完成率、工具调用准确率 |
| RAG 答案生成 | 忠实性、正确性、可追溯性 |
企业场景不要只看语言流畅度,更要看答案是否正确、是否基于证据、是否可追溯。
7.3 推理性能评估
工程落地还要评估性能指标:
- 首 token 延迟;
- 平均输出速度;
- 最大并发;
- GPU 显存占用;
- 单次请求成本;
- 超时率;
- 错误率;
- P95 / P99 延迟。
Decoder-only 大模型部署时,这些指标非常关键。
8. 工程优化:性能、成本、稳定性和可维护性
8.1 KV Cache 优化
Decoder 推理时,每生成一个新 token,都需要基于历史上下文计算 Attention。KV Cache 会缓存历史 token 的 Key 和 Value,避免重复计算。
简化理解:
没有 KV Cache:
每一步都重新计算所有历史 token
有 KV Cache:
历史 token 的 K/V 缓存起来
新一步只计算新 token 的 Q/K/V
这可以显著提升推理速度,是生产部署必备优化。
8.2 Attention 计算优化
Attention 计算复杂度与序列长度平方相关。长上下文下成本非常高。
常见优化包括:
- FlashAttention;
- Sliding Window Attention;
- Grouped Query Attention;
- Multi-Query Attention;
- 稀疏注意力;
- 上下文压缩;
- RAG 检索过滤。
8.3 模型量化
大模型部署时,显存是核心瓶颈。量化可以降低显存占用。
常见方式:
| 量化方式 | 特点 |
|---|---|
| FP16/BF16 | 常见推理精度 |
| INT8 | 显存更低,通常效果较稳 |
| INT4 | 显存大幅降低,但可能有精度损失 |
| GPTQ/AWQ | 常见权重量化方法 |
工程上要结合效果评估,不要只看显存降低。
8.4 模型选型建议
不同任务选择不同结构:
| 场景 | 推荐架构 |
|---|---|
| 文本分类 | Encoder-only |
| 语义检索 | Encoder-only Embedding 模型 |
| 知识库问答生成 | Decoder-only |
| 多轮对话 | Decoder-only |
| 翻译摘要 | Encoder-Decoder 或 Decoder-only |
| Agent 工具调用 | Decoder-only |
| 文本改写 | Encoder-Decoder 或指令大模型 |
大模型应用开发不是所有任务都用最大的生成模型。合理选型可以降低成本并提升稳定性。
9. 实践建议:给开发者的落地建议
9.1 学 Transformer 不要只背结构图
学习 Transformer 时,不要只记“Encoder 有 Self-Attention,Decoder 有 Masked Attention 和 Cross-Attention”。更重要的是理解它们解决的问题:
- Encoder 解决输入理解;
- Decoder 解决自回归生成;
- Cross-Attention 解决输入到输出的对齐;
- Mask 解决训练和推理一致性;
- KV Cache 解决生成推理效率。
9.2 做 RAG 要区分检索模型和生成模型
RAG 系统中通常有两类模型:
- Embedding 模型:负责把问题和文档变成向量;
- LLM 生成模型:负责基于检索结果生成答案。
这两类模型能力不同,不应该混为一谈。
推荐流程:
用户问题
↓
Encoder Embedding 模型生成查询向量
↓
向量数据库检索相关文档
↓
Rerank 精排
↓
Decoder LLM 生成答案
这也是 Encoder 和 Decoder 在企业知识库问答中的典型协作方式。
9.3 做 Agent 要重点关注 Decoder 能力
Agent 依赖模型的指令跟随、规划、工具调用和结构化输出能力。这些主要由 Decoder 生成能力决定。
在 Agent 选型时,需要评估:
- 是否能稳定输出 JSON;
- 是否能正确选择工具;
- 是否能根据工具结果修正计划;
- 是否会编造工具结果;
- 是否能处理多轮上下文;
- 是否支持函数调用或工具调用协议。
9.4 面试时可以这样总结
如果面试中被问到 Encoder 和 Decoder 区别,可以这样回答:
Encoder 主要用于理解输入,Self-Attention 通常是双向的,可以看到完整上下文,适合分类、匹配、Embedding 等任务。Decoder 主要用于生成输出,使用 causal mask,生成当前位置时只能看到历史 token,适合对话、续写和代码生成。Encoder-Decoder 架构则把输入理解和输出生成分开,适合翻译、摘要等 seq2seq 任务。当前大语言模型主流是 Decoder-only,因为它天然适合自回归生成,并能通过指令微调适配对话、RAG 和 Agent 场景。
10. 总结:提炼核心观点
Transformer 的 Encoder 和 Decoder 是理解大模型架构的基础。
Encoder 的核心价值是理解和表示。它可以双向关注完整输入,适合语义匹配、文本分类、Embedding、检索和抽取任务。
Decoder 的核心价值是生成。它通过 causal mask 实现自回归预测,适合对话、续写、代码生成、知识库问答和 Agent 工具调用。
Encoder-Decoder 架构则结合了输入理解和输出生成,适合翻译、摘要、改写等 seq2seq 任务。
从企业级大模型应用角度看,理解 Encoder 和 Decoder 可以帮助我们做出更合理的技术选择:
- 做向量检索,不要忽视 Encoder 表示模型;
- 做对话生成,需要理解 Decoder 自回归机制;
- 做推理部署,需要关注 KV Cache 和生成延迟;
- 做 RAG 系统,需要让 Encoder 负责检索,Decoder 负责生成;
- 做 Agent 系统,需要重点评估 Decoder 的工具调用和结构化输出能力。
最后用一句话总结:
Encoder 负责把输入“看懂”,Decoder 负责把答案“写出来”。真正的企业级大模型应用,往往不是只依赖某一个模块,而是根据任务目标,把理解、检索、生成、评估和部署优化组合成完整系统。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)