大模型工作原理剖析
上一篇咱们聊了大模型的基础概念——参数量、训练数据、和传统编程的区别。这篇来深入看看它到底是怎么工作的:为什么你问它一个问题,它能给出像模像样的回答?它是怎么"理解"你说的话的?又是怎么"组织"语言来回应的?
搞清楚这些原理,你会对大模型有更深刻的认识,也能理解为什么有些 Prompt 效果好、有些效果差,为什么大模型有时候会"胡说八道",为什么 RAG 能解决知识局限问题。
大模型的核心任务:预测下一个词
本质就是一个猜词游戏
如果用一句话概括大模型在做什么,那就是:给它一串文字,它来猜下一个最可能出现的词是什么。
听起来是不是有点"low"?但就是这个看似简单的任务,玩到极致之后,能写文章、能编代码、能翻译、能对话,几乎无所不能。
举个例子,你输入"今天的天气真",大模型的任务是猜下一个词。它内部会计算所有候选词的概率:
"好" → 概率 62%
"不错" → 概率 18%
"差" → 概率 8%
"热" → 概率 5%
"糟糕" → 概率 3%
其他 → 概率 4%
然后它会根据这些概率选择一个词输出。选完之后,"今天的天气真好"变成新的输入,它再猜下一个词……如此循环,直到生成完整的句子或达到设定的长度上限。
为什么预测下一个词这么有用
你可能觉得奇怪:只是预测下一个词,怎么就能回答复杂的问题?
关键在于:要准确预测下一个词,模型必须理解上下文的含义。
比如你问:"中国的首都是哪个城市?答案是"
要预测"答案是"后面的词,模型必须:
- 理解这是一个问答格式
- 理解问题问的是"中国的首都"
- 知道中国的首都是北京
- 理解应该输出城市名称作为答案
只有真正"理解"了这些,模型才能预测出"北京"这个词。如果模型不理解问题,它可能会输出"一个"、"在"这种语法上说得通但语义上答非所问的词。
所以,预测下一个词只是表面任务,理解语言才是底层能力。正是因为要做好预测,模型被迫学会了理解。
生成过程的完整示例
让我们完整走一遍大模型生成回答的过程。
输入 Prompt:
用户:请用一句话介绍一下 Python 这门编程语言。
助手:
生成过程:
第 1 步:模型看到上下文,预测"助手:"后面的第一个词
- 候选词概率:"Python"(35%)、"它"(25%)、"这"(15%)、"一"(10%)...
- 选择:"Python"
第 2 步:上下文变成"...助手:Python",预测下一个词
- 候选词概率:"是"(60%)、"这"(15%)、"作为"(10%)...
- 选择:"是"
第 3 步:上下文变成"...助手:Python是",预测下一个词
- 候选词概率:"一"(40%)、"一种"(30%)、"一门"(20%)...
- 选择:"一门"
... 继续这个过程 ...
最终输出:
Python是一门简洁易读、功能强大的高级编程语言,广泛应用于Web开发、数据分析、人工智能等领域。
整个过程就是一个词一个词地生成,每一步都是在做"预测下一个词"这个任务。但最终的输出是连贯、有意义的句子。
如果把这个过程抽象成一张图,本质上就是一个不断"预测-追加-再预测"的循环:
这不是搜索,是生成
很多人有个误解:以为大模型回答问题时,是去训练数据里"搜索"答案。
这是错误的理解。
大模型生成回答时,不是在做检索,而是在做生成。它根据学到的语言规律,一个词一个词地"创造"回答。这些回答可能和训练数据中的某些句子相似,但绝不是复制粘贴。
这就是为什么:
- 同样的问题,问两次可能得到不同的回答(因为选词有随机性)
- 模型可以回答训练数据中从未出现过的问题(因为它学会了举一反三)
- 模型有时候会"胡说八道"(因为它只是在预测"看起来合理"的词,不保证事实正确)
它是怎么学会预测的
训练的本质:完形填空
大模型是怎么学会预测下一个词的?答案是通过海量的"完形填空"练习。
训练过程大致是这样的:
第 1 步:准备数据
从互联网上收集海量文本:书籍、网页、代码、论文、对话……
第 2 步:制造训练样本
从文本中截取片段,遮住一部分,让模型预测被遮住的内容。
原文:人工智能正在改变我们的生活方式
训练样本:人工智能正在____我们的生活方式
正确答案:改变
第 3 步:训练和调整
模型一开始是"瞎猜"的,预测结果大概率是错的。但每次猜完,它会收到反馈:"正确答案是 xxx,你猜的 yyy 偏差了多少"。
根据这个反馈,模型调整自己内部的参数(那几百亿个数字),让下次遇到类似情况时猜得更准一点。
第 4 步:重复亿万次
这个过程在超级计算机上,用海量的文本片段,重复进行数十亿甚至上万亿次。每次重复,模型的预测能力都会提升一点点。
经过这样的训练,模型逐渐学会了:
- 在"今天天气"后面,"真好"出现的概率比"汽车"高
- 在"def function():"后面,应该是 Python 代码
- 在"苹果公司"后面,更可能是科技相关的词而不是水果相关的词
它不是记住了每个具体的句子,而是学会了语言的统计规律。
一个简化的数学视角
如果你想从数学角度理解,训练的目标可以表示为:
最大化 P(下一个词 | 上下文)
也就是说,给定上下文(前面的词),最大化模型预测出正确的下一个词的概率。
模型的参数(几百亿个数字)就是通过不断调整,来让这个概率尽可能高。
训练完成后,这些参数就固定下来,代表了模型学到的所有"知识"。
Transformer:大模型背后的架构
现在你知道了大模型在做什么(预测下一个词)和怎么学的(完形填空训练)。但还有一个关键问题:它内部是什么结构,让它能做到这些?
答案是 Transformer 架构。
为什么 Transformer 这么重要
2017 年,Google 发表了一篇划时代的论文《Attention Is All You Need》(注意力就是你所需要的一切),提出了 Transformer 架构。这篇论文彻底改变了自然语言处理的格局。
在 Transformer 之前,处理语言主要用 RNN(循环神经网络)。RNN 的工作方式是一个词一个词地按顺序处理,就像人阅读一样从左到右。
这种方式有两个大问题:
问题 1:容易"健忘"
想象你在读一本很长的书。读到第 500 页时,你还能清晰记得第 1 页的内容吗?大概率记不清了。
RNN 也有这个问题。处理长文本时,开头的信息会逐渐被"遗忘"。这在语言理解中是致命的——有时候理解句子后半部分的意思,必须要知道前面说了什么。
问题 2:没法并行
因为必须按顺序一个词一个词处理,RNN 无法利用现代 GPU 的并行计算能力。这导致训练速度很慢,很难扩展到大规模。
Transformer 用一种全新的思路解决了这两个问题。
Transformer 的核心思想
Transformer 的核心思想可以概括为:不按顺序读,而是同时看所有词,然后计算每个词和其他词之间的关系。
打个比方来说明两种方式的区别:
RNN 方式(像流水线工人):
想象你是一个流水线工人,产品一个一个传过来。你处理完当前这个,才能处理下一个。处理到后面的产品时,你只能靠记忆想起前面的产品是什么样的。记忆力好的时候还行,产品多了就容易记混。
Transformer 方式(像会议协调员):
想象你是一个会议协调员,所有参会者同时在你面前。你可以随时看任何一个人,可以同时比较任意两个人的观点,可以直接建立任意两个人之间的联系。不用按顺序,不用靠记忆。
这个"同时看所有词、建立任意词之间联系"的能力,就来自于 Transformer 的核心机制——自注意力(Self-Attention)。
自注意力机制:找出谁和谁有关系
什么是注意力
在深入自注意力之前,先理解"注意力"这个概念。
想象你在一个嘈杂的酒吧里,周围有几十个人在聊天。虽然所有声音都传到你的耳朵里,但你能"专注"于和你聊天的朋友的声音,把其他声音当作背景噪音。
这就是注意力:在众多信息中,有选择地关注最重要的部分。
在语言处理中,注意力机制让模型能够在处理某个词时,有选择地"关注"句子中最相关的其他词。
自注意力做了什么
自注意力(Self-Attention)的"自"是指句子对自己的注意力——句子中的每个词,都去"关注"句子中的其他词。
具体来说,对于句子中的每一个词,自注意力机制会回答这个问题:
"在当前的上下文中,句子里的其他词对理解这个词有多重要?"
然后给每个词打一个"重要性分数"。分数高的词,对理解当前词的影响更大。
用一个例子深入理解
假设我们有这样一个句子:
"小明把作业交给了老师,因为他要求必须今天交。"
当模型处理"他"这个词时,需要弄清楚"他"指的是谁——是"小明"还是"老师"?
自注意力机制会计算"他"和句子中每个词的关联分数:
"他" 与各词的关联分数(示意):
小明 → 0.15
把 → 0.02
作业 → 0.08
交给了 → 0.05
老师 → 0.35 ← 最高!
因为 → 0.03
他 → 0.10
要求 → 0.12
必须 → 0.04
今天 → 0.03
交 → 0.03
可以看到,"老师"的分数最高。这是因为在训练数据中,模型学到了"要求必须xxx"这种表达通常是上级或权威人物说的话,而在学生和老师的关系中,老师更可能是"要求"的发出者。
所以模型能判断出"他"指的是"老师",而不是"小明"。
自注意力的计算过程
从技术角度,自注意力的计算涉及三个关键概念:Query(查询)、Key(键)、Value(值)。
可以用一个图书馆查书的比喻来理解:
- Query(查询):你想找什么?——你的搜索关键词
- Key(键):每本书的标签——用来匹配搜索
- Value(值):每本书的内容——真正有用的信息
在自注意力中:
- 每个词都会生成自己的 Q、K、V 三个向量
- 某个词的 Q 会和所有词的 K 做匹配,计算相关性分数
- 根据分数对所有词的 V 做加权求和,得到最终的输出
用公式表示(简化版):
注意力分数 = softmax(Q × K的转置 / √d)
输出 = 注意力分数 × V
其中 √d 是一个缩放因子,防止数值过大。softmax 把分数转换成概率(总和为 1)。
为什么自注意力这么强大
自注意力有几个关键优势:
1. 能处理长距离依赖
在 RNN 中,如果两个相关的词隔得很远,中间的信息会逐渐丢失。但在自注意力中,任意两个词之间都有直接的连接,不管它们隔多远。
比如:"小明昨天在超市买了一个苹果,回家后他把苹果洗干净吃了。"
最后的"苹果"要和开头的"苹果"联系起来,在 RNN 中可能因为距离太远而丢失关联。但在自注意力中,它们可以直接建立联系。
2. 可以并行计算
因为是同时处理所有词,不需要按顺序,所以可以充分利用 GPU 的并行能力。这让训练大规模模型成为可能。
3. 关系建模灵活
每个词都会和所有词建立联系,这种灵活性让模型能学到各种复杂的语言模式。
多头注意力:从不同角度看问题
在实际的 Transformer 中,不是只做一次自注意力,而是同时做多次,这叫多头注意力(Multi-Head Attention)。
为什么需要多头
词和词之间的关系是多维度的。一次注意力可能只能捕捉到一种关系,但语言的复杂性需要同时捕捉多种关系。
比如这个句子:"程序员小王用 Python 写了一个爬虫程序。"
从不同角度看,词之间有不同的关系:
- 语法角度:"小王"是主语,"写"是谓语,"程序"是宾语
- 职业角度:"程序员"和"Python"、"爬虫程序"相关
- 工具角度:"用"连接了"Python"和"写"
- 指代角度:如果后文有"他",应该指"小王"
多头注意力就是让模型同时从多个角度分析词之间的关系。每个"头"专注于一种关系,最后把所有头的结果综合起来。
具体是怎么做的
假设我们用 8 个头(这是常见的设置):
- 把原始的 Q、K、V 向量分成 8 份
- 每份独立做一次自注意力计算
- 把 8 个头的输出拼接起来
- 通过一个线性变换,得到最终输出
如果画成流程图,多头注意力的处理过程大致如下:
多头的实际效果
研究者发现,不同的头确实学会了关注不同的模式:
- 有的头关注语法结构(主谓宾关系)
- 有的头关注位置关系(相邻的词)
- 有的头关注语义相似性(同类词)
- 有的头关注指代关系(代词指向)
这种分工让模型的理解更加全面和深入。
位置编码:告诉模型词的顺序
为什么需要位置信息
自注意力机制有一个问题:它只看词和词的关系,不考虑词的位置。
对于它来说,"猫追老鼠"和"老鼠追猫"可能没有区别——都是"猫"、"追"、"老鼠"三个词。但这两句话的意思完全不同!
词的顺序对语言理解至关重要,所以 Transformer 需要一种方式来记录位置信息。
位置编码是怎么做的
Transformer 的解决方案是位置编码(Positional Encoding):给每个位置生成一个独特的向量,然后加到词的向量上。
原始论文使用的是正弦/余弦函数来生成位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
其中 pos 是位置,i 是维度索引,d 是向量维度。
这种编码有几个巧妙的性质:
- 每个位置的编码都是唯一的
- 编码是有界的(-1 到 1 之间)
- 相对位置可以通过线性变换得到
现代方法:旋转位置编码
现代大模型(如 Llama、Qwen)更多使用旋转位置编码(RoPE)。它的核心思想是把位置信息编码到向量的旋转角度中。
RoPE 的优势:
- 更好地表达相对位置关系
- 可以外推到更长的序列
- 计算效率更高
作为应用开发者,你不需要深入理解位置编码的数学细节,只需要知道:模型是通过位置编码来理解词序的。
Transformer 的完整架构
把上面讲的组件组合起来,就是完整的 Transformer 架构。
整体结构
Transformer 由 编码器(Encoder) 和 解码器(Decoder) 两部分组成:
各组件的作用
词嵌入(Embedding)
把文字转换成数字向量。计算机不认识文字,所以要把每个词(或子词)映射成一个固定长度的向量。相似的词,向量也会比较接近。
位置编码(Positional Encoding)
前面讲过,用来告诉模型每个词的位置。
多头自注意力(Multi-Head Self-Attention)
前面详细讲过,用来捕捉词与词之间的关系。
前馈神经网络(Feed-Forward Network,FFN)
一个简单的两层神经网络,对每个位置的向量做进一步处理。可以理解为"消化"注意力层捕捉到的信息。
FFN(x) = max(0, xW1 + b1)W2 + b2
中间的 max(0, ...) 是 ReLU 激活函数(现代模型更多用 GELU 或 SwiGLU)。
残差连接(Residual Connection)
把输入直接加到输出上:output = layer(x) + x。这让信息可以"绕过"某些层直接传递,有助于训练深层网络。
层归一化(Layer Normalization)
对向量做标准化处理,让数值分布更稳定,有助于训练。
编码器 vs 解码器
编码器的任务是理解输入。它把输入文本转换成一系列向量,这些向量编码了输入的语义信息。
解码器的任务是生成输出。它一个词一个词地生成,每生成一个词都会参考编码器的输出(通过编码器-解码器注意力)。
在大语言模型(如 GPT)中,通常只使用解码器,因为它的任务就是根据上文生成下文,不需要单独的编码器。
GPT 的架构
GPT(Generative Pre-trained Transformer)只使用 Transformer 的解码器部分,但做了一个关键修改:掩码自注意力(Masked Self-Attention)。
在生成第 n 个词时,模型只能看到前 n-1 个词,不能"偷看"后面的词。这是通过在注意力计算时加一个掩码(mask)来实现的,把未来位置的注意力分数设为负无穷(经过 softmax 后变成 0)。
GPT 架构(简化):
输入 tokens
↓
词嵌入 + 位置编码
↓
┌─────────────────────┐
│ 掩码自注意力层 │
│ 前馈神经网络 │ × N 层(GPT-3 是 96 层)
│ 残差连接 + 层归一化 │
└─────────────────────┘
↓
线性层 + Softmax
↓
下一个词的概率分布
从输入到输出:完整的推理过程
让我们用一个具体例子,走一遍大模型从接收输入到生成输出的完整过程。
先从全局看,这个推理过程大致是下面这条链路:
输入
用户:什么是机器学习?
助手:
第 1 步:分词(Tokenization)
首先,把文本切分成 token。大模型通常使用子词分词(如 BPE),一个汉字可能是一个 token,也可能和其他字合成一个 token。
["用户", ":", "什么", "是", "机器", "学习", "?", "\n", "助手", ":"]
每个 token 都有一个唯一的 ID:
[1234, 567, 8901, 234, 5678, 9012, 345, 678, 9012, 567]
第 2 步:词嵌入
根据 token ID,查找嵌入矩阵,得到每个 token 的向量。假设向量维度是 4096,那就得到一个 10×4096 的矩阵。
第 3 步:加上位置编码
给每个位置加上对应的位置编码向量,让模型知道每个 token 的位置。
第 4 步:通过 N 层 Transformer 层
经过每一层,向量都会被更新:
- 自注意力让每个位置"吸收"其他位置的信息
- 前馈网络进一步处理信息
- 残差连接保留原始信息
- 层归一化稳定数值
经过几十层处理后,最后一个位置(":"后面)的向量,就编码了"应该输出什么"的信息。
第 5 步:生成第一个词
最后一个位置的向量,通过一个线性层映射到词表大小(比如 32000),再经过 softmax 得到概率分布。
"机器" → 0.35
"它" → 0.20
"简单" → 0.10
"一种" → 0.08
...
根据概率采样(或选概率最高的),得到第一个输出词:"机器"
第 6 步:继续生成
把"机器"加到输入末尾:
["用户", ":", "什么", "是", "机器", "学习", "?", "\n", "助手", ":", "机器"]
重复第 2-5 步,生成下一个词:"学习"
继续重复,直到生成完整的回答:
机器学习是人工智能的一个分支,它使计算机能够通过数据和经验自动学习和改进,而无需明确编程。
面试高频问题
关于大模型原理,面试中经常会问到以下问题:
Q1:大模型是怎么生成文本的?
参考答案:
大模型生成文本的核心是"预测下一个词"。给定一段上下文(前面的文字),模型会计算词表中每个词作为下一个词的概率,然后根据概率选择一个词输出。选完之后,这个词被加到上下文中,继续预测下一个词。这个过程叫做"自回归生成",一直重复直到生成完整的文本或达到长度限制。
Q2:什么是 Transformer?为什么它比 RNN 好?
参考答案:
Transformer 是一种神经网络架构,最初由 Google 在 2017 年提出,是现代大模型的基础。
它比 RNN 好在两个方面:
-
能处理长距离依赖:RNN 按顺序处理,句子越长,开头的信息越容易丢失。Transformer 通过自注意力机制,任意两个位置可以直接建立联系,不管距离多远。
-
可以并行计算:RNN 必须按顺序一个一个处理,无法并行。Transformer 同时处理所有位置,能充分利用 GPU 的并行能力,大幅加速训练。
Q3:解释一下自注意力机制
参考答案:
自注意力机制的作用是计算句子中每个词和其他词的关联程度。
对于每个词,它会生成 Query、Key、Value 三个向量。然后用当前词的 Query 和所有词的 Key 做点积,得到注意力分数,表示其他词对理解当前词的重要性。分数经过 softmax 归一化后,对所有词的 Value 做加权求和,得到当前词的新表示。
这样,每个词的输出都融合了整个句子的信息,而且是有选择性的——和当前词关系密切的词贡献更大。
Q4:为什么大模型需要位置编码?
参考答案:
因为自注意力机制本身是"位置无关"的——它只看词和词的关系,不知道词的顺序。对于"猫吃鱼"和"鱼吃猫",如果没有位置信息,自注意力会得到相同的结果。
但词序对语言理解至关重要,所以需要位置编码来告诉模型每个词的位置。常见的方法是给每个位置生成一个唯一的向量,加到词向量上。
Q5:GPT 和 BERT 有什么区别?
参考答案:
GPT 和 BERT 都基于 Transformer,但设计目标不同:
-
GPT(Generative Pre-trained Transformer)用于生成任务。它只使用 Transformer 的解码器,训练时预测下一个词,生成时从左到右一个词一个词输出。
-
BERT(Bidirectional Encoder Representations from Transformer)用于理解任务。它使用 Transformer 的编码器,训练时随机遮住一些词让模型预测(完形填空),能同时看到上下文。
简单说:GPT 擅长生成(写文章、对话),BERT 擅长理解(分类、问答)。现在的大语言模型(ChatGPT、DeepSeek 等)主要基于 GPT 架构。
小结
这篇咱们深入聊了大模型的工作原理:
1. 核心任务
- 预测下一个词(Next Token Prediction)
- 通过不断预测和输出,生成完整的文本
2. 学习方式
- 在海量文本上做"完形填空"训练
- 学习语言的统计规律,而不是记忆具体句子
3. Transformer 架构
- 自注意力机制:捕捉词与词之间的关系
- 多头注意力:从多个角度分析关系
- 位置编码:记录词的顺序信息
- 多层堆叠:逐层加深理解
4. 关键特性
- 能处理长距离依赖
- 支持并行计算
- 是生成而非搜索
理解了这些原理,你就能更好地理解:
- 为什么 Prompt 的写法很重要(因为它是模型生成的起点和上下文)
- 为什么模型会"幻觉"(因为它只是预测"合理"的词,不保证事实正确)
- 为什么上下文长度有限制(因为自注意力的计算复杂度是序列长度的平方)
下一篇咱们来聊聊大模型开发中的核心概念:Token、上下文窗口、Temperature、MoE 等等。这些概念在调用 API 时会频繁用到,搞清楚它们能让你更好地控制模型的行为。