
前阵子把 Transformer 的整个数据流程从头到尾梳理了一遍,发现这玩意儿的设计比我想象中精巧得多。这篇文章就把从文本输入到模型输出的完整链路拆开来讲,配合具体例子,争取让没接触过 NLP 的后端也能搞懂 ChatGPT 这些大模型到底在"想"什么。
先说个背景。现在我们用 ChatGPT、通义千问这些对话模型时,本质上是在和一套序列预测算法打交道。人类说话是从想法到文字,而大模型走的是完全不同的路——它把文字转成数字、算来算去、再转回文字,中间这套转换逻辑才是理解 LLM 的关键。
大多数现代大语言模型的核心都依赖 Transformer 架构。这套东西 2017 年被 Google 提出后,几乎一统江湖。它的结构说简单也简单,就三块:
把词转成数字的嵌入层、堆叠在一起做计算的 Transformer 层、把结果转回文字的输出层。

Transformer 的核心能力是并行处理所有词——不是挨个处理,而是一起算。这就让它能从海量文本里学到词和词之间的复杂关系,比传统 RNN 那套顺序处理强了不止一个量级。
下面进入正题,逐一拆解这五个步骤。

模型拿到文本后,第一步得把它变成能计算的东西。这个过程叫分词(Tokenization),就是把句子拆成最小单元——Token。但要注意,Token 不一定等于完整单词。它可能是子词、词片段,甚至单个字符。
举个例子,输入 "我爱大模型!" 分词器可能拆成:["我", "爱", "大", "模型", "!"]。"模型" 可能本身就是一个 Token,也可能被拆成 ["大", "模型"],取决于训练时用的词表。
每个唯一的 Token 都会被分配一个整数 ID:
这些 ID 就是随意编的,150 和 151 之间没什么关系,纯粹是查表用的标识符。一个词表通常包含 5 万到 10 万个不等的 Token,都是模型在预训练阶段从海量文本里统计出来的。
Token ID 直接喂给神经网络是行不通的——它们只是孤零零的编号,彼此之间没有任何语义关联。模型真正需要的是连续的数值向量。
Embedding 就是干这个的:把每个 Token ID 映射成一个多维向量,实数表示,维度从几百到几千不等。GPT-3 用的就是 12288 维的 Embedding。

下面是个五维简化示例(真实模型往往是 768 到 4096 维):
看出来了没?"狗"和"狼"的向量非常接近,因为都是动物,而"汽车"的向量完全不在一个频道上。这就是 Embedding 的魔力——它把语义相似的词映射到向量空间里相近的位置。
为什么需要这么多维度?单维根本不够用。举个例子:
问题来了:"稀有"和"债务"都是负数,数值还相近,意味着它们"相关"?这显然不对。数百个维度让模型能在不同方向上编码不同属性,避免这种冲突。
Embedding 空间里甚至能做数学运算。"国王"的向量减去"男人"的向量,加上"女人"的向量,结果约等于"女王"。这些关系不是人为设定的,而是模型从海量文本中自己学出来的。
Transformer 本身是不理解词序的。"狗追猫"和"猫追狗"在它看来就是同一组 Token,光看向量完全分不清。
解决办法是 Positional Encoding(位置编码)。每个位置都有对应的位置向量,和 Token 的词义向量加在一起。
比如"狗"出现在位置 2:
这样既保留了词的含义,又包含了它出现在句子里哪个位置的信息。这个合并后的向量才会流进后面的 Transformer 层。
这是 Transformer 最核心的部分,叫自注意力机制(Self-Attention)。每个 Transformer 层都会执行 Attention 操作,对每个 Token 都要算出三样东西:Query(查询)、Key(键)、Value(值)。
可以把这个过程理解成"模糊匹配查字典":Query 是你想找什么,Key 是字典里有哪些词条,Value 是每个词条对应的内容。Attention 就是把 Query 和所有 Key 比一遍,算出相似度,再用相似度做权重,把所有 Value 加权求和。

拿个具体例子跑一遍。句子:"小猫坐在垫子上,因为它很舒服。"
模型处理到"它"的时候,必须搞清楚"它"指什么。流程是这样的:
"它"的 Embedding 生成一个 Query 向量,大意是在问:"我在指哪个名词?"
这个 Query 和前面所有 Token 的 Key 逐一比对,算出相似度得分:
这些原始分数通过 Softmax 转成加起来等于 1 的权重:
最后,模型把每个 Token 的 Value 向量按权重相加:
Output = (0.75 × Value_猫) + (0.20 × Value_垫子) + (0.03 × Value_小) + ...
结果就是"猫"的 Value 贡献了 75%,"垫子"贡献了 20%,其他的基本被忽略。这个加权结果就成了"它"的新向量表示,包含了上下文信息——"它"最可能指的是"猫"。
这个 Attention 过程在每个 Transformer 层都会发生,但每层学到的模式不一样:
浅层学基础pattern:语法、常见词搭配。处理"猫"时,浅层可能重点关注"小",因为它们学到冠词和名词经常一起出现。
中间层学句法结构:主谓关系、短语结构。中间层会搞清楚"猫"是"坐"的主语,"在垫子上"是介词短语表位置。
深层提取抽象语义:整句在说什么、蕴含什么信息。深层可能理解这是在描述一个物理场景,暗示猫处于舒服或休息的状态。
每一层都在前一层的基础上精炼表示,上一层的输出作为下一层的输入,逐步叠加上下文理解。
有一点要注意:只有最后一层 Transformer 层才负责预测下一个 Token。所有中间层都在做同一件事——把表示转成对后面更有用的形式,但它们自己并不输出 Token。中间层输出的还是向量,这些向量流向下一层,直到最后一层才做预测。这个层层叠加、每层专注不同层面的设计,让大模型能捕捉极其复杂的语言规律。
经过所有 Transformer 层后,得到的向量要转换成文字。这一步叫 Unembedding(或叫解码层):把向量和所有 Token 的 Embedding 比对一遍,给每个 Token 打分。
比如要补全"我喜欢吃",模型输出的分数可能是:
"米饭":65.2
"面条":64.8
"饺子":64.1
"食物":58.3
"火锅":57.9
"汽车":-12.4
"42":-45.8
这些分数通过 Softmax 转成概率:
"米饭":28.3%
"面条":24.1%
"饺子":18.9%
"食物":7.2%
"火锅":6.1%
"汽车":0.0001%
"42":0.0000001%
分数接近的 Token 概率也接近(65.2 和 64.8 → 28.3% 和 24.1%),分数低的 Token 概率趋近于零。
关键来了:模型并不是选概率最高的那个,而是按照这个概率分布随机抽一个。就像转盘抽奖,每个 Token 占的扇形大小和它的概率成正比。"米饭"占 28.3%,"饺子"占 18.9%,"42"占的面积小到几乎看不见。
为什么不直接选最高概率的?因为这样输出会变得单调重复。每次都选"米饭",生成的文章就千篇一律了。随机采样让模型有时选"面条"、有时选"火锅",偶尔还能抽到低概率的选项产生意想不到的效果——这正是大模型看起来有"创意"的原因之一。
上面的过程是生成一个 Token,但实际上模型要一个 Token 一个 Token 地往外吐,直到凑成完整句子。每生成一个 Token,都要完整走一遍上面的流程。
拿"法国的首都是哪里"做例子:
第一轮:
输入:["法国", "的", "首都", "是"]
所有层处理一遍
随机采样:"北京"(80%)
目前输出:"法国的首都是北京"
第二轮:
输入:["法国", "的", "首都", "是", "北京"]
所有层重新处理一遍(5个 Token)
采样:"巴黎"(92%)
输出:"法国的首都是北京巴黎"
第三轮:
输入:["法国", "的", "首都", "是", "北京", "巴黎"]
所有层处理
采样:"。"(65%)
输出:"法国的首都是北京巴黎。"
第四轮:
输入:["法国", "的", "首都", "是", "北京", "巴黎", "。"]
处理一遍
采样:[EoS] 结束符(88%)
停止,输出完整句子
这个 [EoS](End of Sequence)就是告诉模型"说完了"的标记。每生成一个新 Token,之前所有的 Token 都要重新过一遍 Transformer,所以回复越长,生成越慢——这是 Transformer 的平方复杂度决定的。
这种"用前面的输出接着生成"的方式叫自回归(Autoregressive)生成。前面一旦有个 Token 选得意外(比如"我喜欢吃粉笔"这种低概率词),后面的所有 Token 都会被这个选择影响。就像蝴蝶效应,一开始的偏差会传导到整句话。
Transformer 运行有两种场景:训练(Training)和推理(Inference)。
训练阶段,模型从海量文本里学语言规律。参数从随机值开始,边看文本边调整。就像小孩学说话,看的例子多了,自己就能总结出规律。
训练过程是这样的:
随机初始参数下,模型瞎猜:
"香蕉":25%
"汽车":22%
"垫子":3%(正确答案概率极低)
"大象":18%
算出来"垫子"应该有更高概率才对,差了多少?用反向传播(Backpropagation)把这个误差往回传,调整所有参数:
每次调整的幅度都很小(0.245 → 0.247),但架不住见过的文本多。"坐""在""垫"这几个 Token 反复以各种姿势出现,模型慢慢就学会了它们的搭配关系。训练一次要几周时间,烧掉几百张 GPU,花费几百万美元。训完以后参数就固定了,不再改了。
推理阶段就简单了,模型用已经冻结的参数跑:
推理过程只是"回忆"训练时学到的知识,并不会产生新的学习。你跟 ChatGPT 聊再多,它也不会因此变得更懂你——那些对话记录不会改写模型权重。想让它学会新东西,只有重新训练一条路,而这就需要天文数字的算力了。

Transformer 架构用一套很优雅的方式解决了"理解和生成人类语言"这个问题。文字转成向量表示、用 Attention 机制捕捉词与词之间的关系、多层叠加逐步提取越来越抽象的特征——靠着这三板斧,现代 LLM 能输出连贯、有用的文本。
生成每个 Token 的完整链路包括七个步骤:分词 → 生成 Embedding → 加入位置编码 → 流经 Transformer 层做 Attention → Unembedding 成分数 → 按概率采样 → 转回文字。每个步骤承接上一步的结果,把原始文本变成模型能操作的数学表示,最后再变回人能读的文字。
搞清楚这个流程,就能理解大模型的能力边界在哪。本质上,LLM 是一个复杂的模式匹配机器——它从海量数据里学到了"这个词后面通常跟什么",然后按照学到的规律不停地预测下一个最可能的 Token。说到底,还是统计。
原文链接:https://dev.to/gaborcselle/how-transformers-architecture-powers-modern-llms-4ddn