应用开发视角的 Transformer 架构:从 Self-Attention 到 Decoder-Only
为什么应用开发也要懂 Transformer?
不管你投什么岗位,面试官都可能问一句:你了解 Transformer 吗?
很多人的第一反应是:我又不训练模型,Transformer 和我有什么关系?
确实有关系。你日常开发中遇到的这些问题,答案全在 Transformer 架构里:
- Token 怎么计费的?为什么一次交互消耗几万 Token?
- 上下文窗口为什么有上限?GPT-4 是 128K,Claude 是 200K,为什么不能无限长?
- 为什么模型会”忘记”前面的内容?长对话到后面,模型对开头的信息越来越模糊。
- 为什么结构化 Prompt 比大段文字效果好?
不了解 Transformer,你只能靠经验去试;了解了,你就能从原理出发去推。
Transformer 之前的困境
Transformer 之前,主流架构是 RNN 和 CNN,它们各有各的致命伤。
RNN(循环神经网络) 有两个核心问题:
- 梯度消失:序列越长,前面的信息传到后面就越弱。处理 1000 个 Token 时,第 1 个 Token 的梯度信号到第 1000 步基本就没了。这就是为什么 RNN 记不住长距离依赖。
- 串行计算:RNN 必须一个 Token 一个 Token 地处理,第 2 个 Token 必须等第 1 个处理完才能开始。没法并行,训练速度上不去。
CNN(卷积神经网络) 的问题在于:
- 局部感受野:CNN 天然只能看到局部窗口内的信息,想看全局就得堆很多层。
- 长距离依赖弱:两个相隔很远的词之间的关系,CNN 很难捕捉到。
Transformer 的解法:用注意力机制一步到位解决这两个问题。每个 Token 直接和所有其他 Token 计算相关性,不需要像 RNN 那样一步步传。第 1 个 Token 和第 1000 个 Token 的关系,一步就能算出来。而且所有 Token 的注意力可以同时计算,GPU 最擅长这种大规模并行运算。
一句话:RNN 记不住长距离关系,CNN 看不到全局,Transformer 用注意力一步搞定,还能并行。
Self-Attention:Transformer 的灵魂
一句话理解 Self-Attention:让每个词去看它和其他所有词的关系,然后根据关系远近决定关注多少。
举个经典例子:”银行”这个词,在”我去银行存钱”和”我在河边的银行散步”里意思完全不同。Self-Attention 做的就是根据上下文里其他词的信息,动态调整”银行”这个词的表示。
Q、K、V 是什么?
面试官最爱问这个。别去背公式,说清楚逻辑就行。
Self-Attention 用三个矩阵把每个 Token 映射成三个向量:
- Q(Query):我在找什么?当前词想知道自己和谁有关系。
- K(Key):我有什么?每个词能提供什么信息。
- V(Value):我的内容是什么?每个词的实际信息。
拿”我去银行存钱”举例:
- “银行”的 Q 去问:谁和我有关系?
- “存钱”的 K 回答:和我有关系!
- “河边”的 K 回答:和我没关系。
- 然后根据关系远近加权,把”存钱”的 V 拿过来,更新”银行”的表示。
Q 找对象,K 判断匹不匹配,V 提供实际内容。 这就是 Self-Attention 的核心逻辑。
对应用开发的启示
为什么上下文质量决定了输出质量?因为 Self-Attention 的本质就是”根据上下文决定关注什么”。你给的上下文里全是噪音,注意力就会分配到不该关注的地方;你给的上下文全是相关信息,注意力就能聚焦到正确的内容上。
这就解释了:
- 模糊的 Prompt 效果差:上下文里没有明确的关键信息,注意力被分散。
- 结构化的 Prompt 效果好:清晰的结构让注意力更容易找到关键信息。
- 上下文里塞太多无关代码导致质量下降:无关信息抢占了注意力,关键信息被稀释。
Multi-Head Attention:为什么要多个头?
一个头的局限:单头注意力只有一个 QKV 变换,只能学一种关系模式。但语言里的关系是多样的——语法关系、指代关系、语义关系等等,一个注意力头很难同时捕捉这么多种关系。
多头的解法:Multi-Head Attention 就是把 QKV 复制多份,每份独立算注意力,每份学不同的关系模式。
8 个头就像 8 个”视角”:
- 第 1 个头关注语法结构
- 第 2 个头关注指代关系
- 第 3 个头关注语义相近的词
- 第 4 个头关注位置相邻的词
- 最后把 8 个头的结果拼起来,综合判断
不是说模型被手动设计了这些分工,而是在训练过程中,不同的头自然学会了关注不同的关系模式。
对应用开发的启示
为什么结构化 Prompt 比大段文字效果好?因为多头注意力在处理结构化信息时效率更高。
一段结构清晰的 Prompt,每个注意力头可以快速定位到自己关注的部分——语法头看结构,语义头看关键词,指代头看参数对应关系。而一段大段文字的 Prompt,信息密度一样,但多头注意力在处理时需要额外的计算来提取结构,效率更低。
结构化不是给人类看的,是给多头注意力看的。
Positional Encoding:为什么位置信息这么重要?
很多人不知道的一个关键点:Self-Attention 本身是完全不看顺序的。
把”猫吃鱼”和”鱼吃猫”丢给 Self-Attention,没有位置编码的话,处理结果是一样的。因为注意力只看”哪些词之间有关系”,不看”谁在前面谁在后面”。
但顺序对语言太重要了。”狗咬人”和”人咬狗”,词一样,意思完全相反。
所以 Transformer 必须通过 Positional Encoding 把位置信息硬加进去,告诉模型”这个词在第几个位置”。
对应用开发的启示
为什么长上下文后面模型会”忘记”前面的内容?
位置编码有一个隐含的问题:模型在训练时见过的位置范围是有限的。如果一个模型训练时最长只见过 4096 个 Token 的文本,那它对第 5000 个位置的位置编码就没有学过。虽然可以通过外推来处理更长的位置,但效果会下降。
这就解释了:
- 为什么上下文窗口有硬上限:超出训练时见过的位置范围,位置编码就不可靠了。
- 为什么超长上下文质量会下降:即使模型声称支持 200K 上下文,后半部分的注意力质量也不如前半部分。
- 为什么重要信息要放在 Prompt 开头或结尾:模型对中间位置的信息关注度天然较低——这就是”中间迷失”(Lost in the Middle)问题。
Encoder vs Decoder vs Decoder-Only
这是 Transformer 架构最重要的分支,直接决定了模型能干什么、怎么用。
| 维度 | Encoder-Only | Encoder-Decoder | Decoder-Only |
|---|---|---|---|
| 代表模型 | BERT | T5、BART | GPT、Claude、LLaMA |
| 注意力方式 | 双向注意力 | Encoder 双向 + Decoder 单向 | 单向注意力(因果注意力) |
| 能看到什么 | 整个输入 | Encoder 看全部,Decoder 只看前面 | 只看前面的 Token |
| 擅长什么 | 理解、分类、抽取 | 翻译、摘要、转换 | 生成、对话、推理 |
| 生成能力 | 弱 | 强 | 最强 |
为什么现在大模型都用 Decoder-Only?
三个原因:
Scaling 效果最好:同样的参数量和数据量,Decoder-Only 在扩大规模时收益最大。GPT 系列从 1.17 亿参数到 1.8 万亿参数,效果持续提升。
生成和理解都能做:虽然 Decoder-Only 天然是生成式的,但通过 Prompt 设计,它也能做理解任务。反过来,Encoder-Only 就做不了生成。
训练更高效:Decoder-Only 每个位置的预测目标都是”下一个 Token”,训练目标统一。
对应用开发的启示
为什么大模型都是”你给它一段文字,它接着往下写”的模式?因为 Decoder-Only 的本质就是”给定前面的内容,预测下一个 Token”。你发一段 Prompt,模型就是在”续写”。
这就解释了:
- 为什么 Prompt 的最后一句特别重要:模型是接着你最后一句话往下写的。
- 为什么 Few-shot 有效:给几个示例,模型就会”续写”出类似格式的内容。
- 为什么 System Prompt 要放在最前面:最先出现的内容对整个生成过程都有影响。
Transformer 的局限性
O(n²) 计算复杂度
Self-Attention 的计算量和序列长度的平方成正比。序列长度翻一倍,计算量翻四倍。
| 序列长度 | 注意力计算量 |
|---|---|
| 1K Token | 100 万次 |
| 2K Token | 400 万次 |
| 4K Token | 1600 万次 |
| 128K Token | 163 亿次 |
这就是为什么 Token 成本随序列长度平方级增长,上下文窗口不能无限大,长对话会越来越慢。
位置编码的外推问题
模型对训练时没见过的位置编码不可靠。目前的缓解方案有 RoPE(旋转位置编码,GPT-4、LLaMA 在用)、YaRN / NTK-Aware(通过调整频率扩展有效范围)、滑动窗口注意力等。但这些是缓解,不是根治。
中间迷失(Lost in the Middle)
Transformer 对输入中间部分的信息关注度明显低于开头和结尾。无论模型多大、上下文多长,这个现象都存在。关键信息别放在 Prompt 中间,放开头或结尾。
生成是串行的
Decoder-Only 模型生成 Token 是一个一个来的,第 N 个 Token 必须等前 N-1 个 Token 生成完。Speculative Decoding 是一种加速方案,但本质还是没改变串行生成的事实。需要大量输出的场景要考虑流式返回。
面试高频问题速览
Q:Transformer 为什么能取代 RNN?
两个核心优势:① 全局建模——每个 Token 直接和所有其他 Token 建立关系,解决了长距离依赖;② 并行计算——所有 Token 的注意力可以同时计算,训练速度快了几个数量级。
Q:Self-Attention 的 Q、K、V 分别是什么?
Q(Query)是当前词在找什么,K(Key)是每个词能提供什么,V(Value)是每个词的实际内容。通俗说:Q 找对象,K 判断匹不匹配,V 提供实际内容。
Q:为什么要 Multi-Head Attention?
单头注意力只能学一种关系模式,但语言里有多重关系。多头让不同的头关注不同类型的关系,最后综合判断。
Q:为什么现在大模型都用 Decoder-Only?
三个原因:Scaling 效果最好、生成和理解都能做、训练更高效。
Q:Transformer 的 O(n²) 复杂度在应用开发中怎么应对?
四个策略:控制上下文长度(只给相关代码)、模型路由(长上下文用大模型,短上下文用小模型)、关键信息前置(避免中间迷失)、流式返回(缓解串行瓶颈)。
写在最后
Transformer 的架构决定了大模型能做什么、不能做什么、擅长什么、弱在哪里。
不懂架构,你用大模型只能靠经验去”试”;懂了架构,你能从原理出发去”推”。
Self-Attention 告诉你上下文质量为什么重要,多头注意力告诉你结构化 Prompt 为什么有效,位置编码告诉你长上下文为什么质量下降,O(n²) 复杂度告诉你 Token 成本为什么这么高。
这些不是理论,是你在每天开发中都会遇到的决策依据。