站在服务端视角看AI
白话大模型原理
近几年以 ChatGPT 为代表的 AI 模型大火,日常使用中大模型仿佛“无所不知、无所不能”,有任何问题直接询问 GPT 就能得到答案,但在服务端开发者眼里,它不应是魔法,而是一个能够进行数值运算的复杂系统。本文将以服务端技术视角对其架构进行链路分析,包含以下三个步骤
输入 -> 处理:由“静态查表的局限性”引出“动态计算的必要性”,解析 token 是什么、为什么需要token。
处理 -> 输出:由“机器懂了”转折到“如何让人懂”,白话分析大模型的核心处理过程。
输出 -> 优化:由“原理上的低效”引出“工程上的优化”,分析模型在工程层面做了哪些优化。
这篇文章可能会解答一些疑惑如:
- 模型都训练完拿到最终参数了为什么使用的时候还要依赖显卡进行计算?
- 为啥提示词会显著影响模型的返回?
- 大模型知道那么多内容,为啥有时候会胡编乱造,只有在用户指出错误后它才能发现?
- 大模型为啥一个字一个字的进行输出?
- DeepSeek 是怎么带来一场革命的?
模型的输入:从“人话”到“数值”
Q:为什么模型看起来能够理解人类输入的不同内容呢?
A:一句话来说,模型是无法理解自然语言的,计算机的本质是一台能够进行数值运算的机器,它需要通过一套编码方案将自然语言“序列化”为数值矩阵。
独热编码 (One-Hot):最原始的枚举
如果有 5 个词,每个词都需要用一个 5 维的向量表示:【我, 爱, 吃, 苹果, 柠檬】。
- “我”: [1, 0, 0, 0, 0]
- “爱”: [0, 1, 0, 0, 0]
- “苹果”: [0, 0, 0, 1, 0]
独热编码具有以下缺点:
- 维度灾难:需要预先定义词表,维度等于词表大小。如果有 10 万个词,维度就是 10 万,且极其稀疏(Sparse)。
- 大量内存被 0 占用,数据太过稀疏。
- 语义孤岛:任意两个向量的点积都是 0,没办法在数学维度体现出“苹果”和“柠檬”都是水果这种关系。
稠密向量 (Dense Vector):特征压缩
为了解决上述问题,模型改为使用一组连续的浮点数来表达一个对象,维度通常固定(如 768)。这就像我们在数据库设计中,用一个宽表来存储用户的多种特征标签。 比如小明: [0.12, -0.5, 0.88, …] ,其中
- 维度 1 :软件开发能力
- 维度 2:工作时间
- 维度 n:其他特征
思考:为什么稠密向量能够压缩这么多,768个数字就能存储全部特征?
- 压缩信息: 独热编码是非常低效的,因为它假设所有词都是完全独立的。但实际上,“猫”和“狗”有很多共同点。
- 特征复用: 在 768 维的稠密空间里,每个维度并不代表一个词,而是代表一个抽象特征(如:生物性、性别、情感正向度等)。
- 组合爆炸: 就像三原色(红、绿、蓝)可以组合出数百万种颜色一样,768 个连续的浮点数可以组合出的坐标位置,远远超过了人类语言中词汇的数量。
Embedding 矩阵:静态的“语义数据库”
大模型通过 Embedding 矩阵来实现稠密向量的转换,转换步骤如下:
- Subword 分词:为了平衡词表大小,不再存储完整的“长单词”,而是存储词根。例如“小明喜欢Java”被拆分为:小明、喜欢、Java 三个 token。
- 查表 :模型拿着 token ID 去 Embedding 矩阵中查找对应的行,词表决定了模型能理解哪些词。
- 获取对应编号在Embedding 矩阵中对应的维度向量,Embedding 向量是 Token 的数学表达,维度向量真正包含了这个 token 的语义、特征等信息。
Embedding矩阵是怎么来的?
它是模型在海量数据中训练出来的经验统计投影。训练结束后,这就变成了一个包含了人类语义经验的“高维坐标系”,训练经历两个阶段:
- 阶段一:随机初始化一个矩阵
- 阶段二:使用反向传播算法微调这个矩阵,当训练结束后就得到了包含不同语义的“档案库”,它就像个高纬度的坐标系,在这个坐标系内具有相关性的词会有空间上的体现,可以把训练好的Embedding 矩阵看作是人类经验的统计投影。
可以把Embedding矩阵当做一个静态的词典,不同的词独立查表、互不干扰。
Q:既然训练后得到的Embedding矩阵已经包含了互联网内容的相关性,为啥还需要继续进行模型计算呢?
A:Embedding矩阵确实包含了丰富的语义相关性,但是人类语义中有很多”黑话”,这些黑话包含在语句的上下文中,无法直接在矩阵中提取到,因此需要继续处理。
为了使不同的词能够根据上下文区分语义,就进到了模型的下一层–动态处理层
模型核心:transformer 的动态处理
如果说 Embedding 是静态查表,那么 Transformer 层就是一套动态的加工流水线。它的核心任务是:根据上下文动态修正向量的含义,把每个从Embedding矩阵得到的向量根据其上下文语义进行修改补充。
Attention:捕获上下文信息
处理当前词上下文的机制被称为了 Attention 机制,简单来说当模型处理“苹果”这个词时,它不能只看自己,必须结合上下文“左顾右盼”,最终得到【水果的中的苹果】或【手机中的苹果】。
计算机制:模型计算“苹果”与句子里其他词(如“手机”、“好吃”)的相关性权重。这就像在内存中做了一次全量的 Join 操作。如果上下文出现了“发布会”,Attention 机制会把“科技”的属性加权注入到“苹果”的向量里。
模型的处理本质上是一个计算过程,接下来简单介绍一下 Transformer 的计算逻辑
Q, K, V:语义计算
Transformer 层核心的部分在于计算Q、K、V三个向量,计算方式如下,其中X就是Embedding变量,W就是模型在训练中学习的参数矩阵
- $Q = X \cdot W^Q$ (查询矩阵:变量,代表当前词的意图,每增加一个词,意图都会发生变化)
- $K = X \cdot W^K$ (键矩阵:常量,历史词的标签,供意图来查询)
- $V = X \cdot W^V$ (值矩阵:常量,历史词的内容,供意图来查询)
模型通过 Q 和 K 的点积计算算出权重(这里需要遍历1-t全部内容),再根据权重把 V 聚合起来。这就是为什么大模型能理解复杂的长难句,因为它在不断地做“语义匹配”,把分散的信息聚合在一起。
多头机制
通过矩阵计算后,模型已经可以知道词的真实意图,接下来需要提高意图的准确性。模型使用多组Q、K、V矩阵来承接多维Embedding矩阵计算,其中每组成为一个注意力头,好处如下:
- 不同的头关注不同的方向,防止关注方向过多导致敏感度下降。
- 不是简单的增加模型层深,增加层深需要更多的训练时间,多头机制不具有前后依赖关系,可以并行计算
经过动态处理后,输入的【苹果】向量已经被多次修改,变成了一个包含丰富上下文含义的【超级向量】
模型的输出:概率竞争与反序列化
通过Transformer层的计算之后,模型拿到了一个最终向量矩阵,接下来就需要把该矩阵转化为自然语言集训输出。有了对输入的理解,模型的输出是输入的一个逆过程。输入是把词变为向量,输出则是把向量重新变成词,但是变回词的过程不是简单的查字典,而是一个概率竞争的过程,转化过程如下:
- 输入经过transformer 层的处理后,原始向量值被不断修改,最终得到的向量已经不仅仅代表某个词,而是代表在当前语境下,下一个词最应该是什么
- 线性投影 (Linear Projection): 模型将那个抽象的超级向量,与输出矩阵相乘,将维度映射回词表大小,得到该向量与词表里每个单词的相似度
- 投影之后,模型会得到一个和词表一样长(比如 50,000 维)的数列,并进行Softmax函数处理,处理后数列的数值代表了每个词的概率。
- 模型使用不同的采样策略结合概率结果选择一个 id 并去词表反查得到人类能够看懂的结果进行输出
到这里单个文字的生成就结束了,可以看到模型本质上是一个概率竞争模型,模型可以通过不同的取样策略对概率结果进行处理。
一些思考与疑问
思考1:为什么GPT 等大模型在输出答案的时候是一个个字生成的?
这个概念叫做流式输出,核心原因是因为大模型本质是在做概率预测,模型在生成第 N 个字时,必须依赖前 N-1 个字提供的上下文。当前内容能够缩减下一个输出的概率,如果一次生成多个文字,模型的准确性会下降。也就是说输入内容越多,模型“猜”的准确性越高
模型的计算链条如:原始输入语句 -> 模型 -> 第 1 个 输出Token -> 拼接到输入 -> 模型 -> 第 2 个 输出Token -> ……
思考2:一个一个循环计算,大模型的耗时怎么控制?
模型采用以下几种优化方式:
- 大模型使用空间换时间的策略。 每次计算完一个 token 后,模型把它的计算结果缓存起来。模型把前 999 个字的 K 和 V 矩阵(这俩矩阵是固定的)存在显存里,当生成第 1000 个字时,模型只走一遍完整流程算出这一个字的 Q, K, V。
- 并发提前计算。 一次性读取所有输入,并把这些输入中能够提前计算出来的内容进行并发处理
- 大小模型结合(投机取样)。 使用一个小模型(比如 1B 参数,极快)和一个大模型(比如 175B 参数,很慢)互相配合。
- 小模型跑得飞快,一口气“盲猜”后面 5 个词。
- 大模型(专家)出来看一眼:这 5 个词里,前 3 个词猜对了,第 4 个词语法不对。
- 大模型纠正第 4 个词,然后这一轮推理直接一次性吐出 4 个词。
思考3:模型为什么会有上下文大小的限制?
空间换时间的代价
思考4:大模型为什么会胡说八道(出现幻觉)?
明白了大模型的本质是一个概率模型,模型在做输出时通过概率取样得到最终结果,幻觉其实就是在采样时选到的词虽然符合语法但违背人类事实。
当你指出模型的错误后,相当于给模型了更多的上下文,它就可以激活更多的【头专家】,自然就能发现之前的错误并进行纠正。
思考5:DeepSeek 强在哪里?
- 进一步优化了KV逻辑(改进了注意力计算机制),使得相同显存能够承接更多上下文,精准度自然提升
- 强制输出逻辑推理过程并把推理过程加入到上下文中,这种方式加强了后续内容概率预测的准确性