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(dk QKT)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 负责把答案“写出来”。真正的企业级大模型应用,往往不是只依赖某一个模块,而是根据任务目标,把理解、检索、生成、评估和部署优化组合成完整系统。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐