
这年头只要打开手机几乎到处都能看到大模型这三个字。你可能用过各种AI助手让它写文案、改代码、解释一道数学题甚至陪你聊天解闷。但很多人心里其实一直有个疙瘩这东西到底是怎么工作的为什么它好像什么都懂有时候又错得离谱网上讲大模型底层原理的文章不少可绝大多数要么堆满公式要么只讲概念看完了还是云里雾里。这篇文章想做的事很简单把大模型的底层原理当成一台机器的说明书来拆用最直白的人话配合一些能上手算的小例子把从输入一句话到输出一段回答的完整过程讲清楚。不管你是完全没接触过AI的文科生还是刚入门想搞懂技术细节的开发者这篇文章都值得花十几分钟慢慢看。看完之后你再看到TokenTransformer注意力机制微调这些词就不会再觉得它们是什么高深莫测的黑话了。1. 大模型的本质一台庞大的猜词游戏机器先放下所有复杂的术语记住一句话大模型本质上就是一个极其庞大的猜词游戏机器。你给它前半句话它负责猜下一个最可能出现的词是什么。就这么简单。1.1 语言模型的真正任务预测下一个词你可能觉得这个说法太轻描淡写了但事实就是这样。2018年前后的第一代大规模语言模型核心训练任务就是根据前面的文字预测下一个词。比如你给它今天天气真它会根据海量文本中学到的规律算出下一个字是好的概率最大。这个任务听起来幼稚但当训练文本达到数十亿甚至数万亿字的规模后一件神奇的事情发生了为了做好猜词这个简单任务模型不得不把语法、逻辑、常识、各领域知识全部压缩进参数里。你可以把大模型想象成一个看过全世界所有书籍的人。他并没有刻意去背每本书的内容但他通过反复做填空练习把语言的使用规律深深印在了脑子里。这个猜词任务就是整个大模型的立身之本。1.2 一次推理的完整链路模型内部做了什么当你向大模型提问时它内部执行的过程可以拆成五步把你输入的文本拆成一串Token可以暂时理解为词的碎片。把这串Token转换成数字向量表示。让这串数字向量流经数十层Transformer层每层都在重新计算词与词之间的关系。在最后一层输出一个概率表给出词表中每个词作为下一个词的概率。根据概率用一定的策略挑一个词输出然后把这个词拼到原文后面再重复第3到第5步直到输出结束。这个过程就是自回归生成一个词接一个词地往后猜。你看到的几百字回答其实是模型循环了几百次猜词的结果。提示很多新闻里说某某模型有几百亿参数参数可以粗略理解为模型的脑细胞连接数。参数越多模型能记住的规律就越复杂但也意味着训练成本和使用门槛越高。2. 从文字到数字Tokenizer与Embedding的底层拆解大模型是跑在计算机上的而计算机只认识数字不认识汉字和英文单词。所以第一步必须解决怎么把文字变成数字的问题。2.1 为什么必须先分词稀疏与稠密的差别在深度学习早期研究者确实试过把每个汉字或英文单词用一个独一无二的编号来表示比如我是1号、爱是2号。但这种表示方式有个严重的问题编号之间没有大小关系爱是2、恨是3但它们在语义上根本不是差一点的关系。而且词表可能达到几十万个每个词用一个几十万维的稀疏向量表示计算量巨大到无法训练。解决办法就是引入词嵌入Embedding技术把每个Token映射到一个低维的稠密向量里比如常见模型用768维或4096维。在这个向量空间里语义相近的词会落在彼此靠近的位置。苹果和香蕉会很近而苹果和火箭会离得很远。这种从离散符号到连续向量的转换是深度学习能处理自然语言的前提。2.2 三类主流分词方法从整词到子词现在的主流大模型基本都不再用整词作为基本单位而是用子词Subword。原因很简单整词词表需要覆盖所有单词太大而把词拆成更小的片段后模型可以通过组合字母片段的方式来理解生词。最常见的分词方法有三种它们的核心逻辑各不相同分词方法核心逻辑代表应用特点BPE字节对编码从字母/字节级别开始反复合并出现频率最高的相邻字符对GPT系列词表大小可控适合英文等多语言WordPiece类似BPE但合并依据是让语言模型整体概率提升最多BERT对词根和常见后缀的切分更精细SentencePiece把空格也当作普通字符处理直接对原始文本切分很多多语言模型不需要预分词对中文、日文更友好以BPE为例假设语料里经常出现low和lower这两个词分词器会先把low作为一个整体token保存遇到lower时切分为lower。这样做的好处是模型只用较小的词表就能覆盖几乎所有的词形变化遇到没见过的拼写比如新造的合成词也能拆成见过的子词组合来理解。2.3 嵌入矩阵每个Token出生时自带的一串数字当Token确定后模型会去查一张嵌入表Embedding Matrix。这张表本质上就是一个大矩阵行数是词表大小列数是设定的向量维度。比如词表有5万个Token向量维度为4096这张表就有5万乘4096个数。每个Token在这张表里对应的那一行向量就是这个Token最初的特征表示。在模型的训练过程中这张表会不断被更新让每个Token的向量位置逐渐反映出它在海量语料中的使用习惯。我第一次自己训练一个小型语言模型时打印过几个词的嵌入向量的余弦相似度发现猫和狗的相似度高达0.8以上而猫和编程几乎不相关。那一刻我才真正感受到Embedding不是人为设计的规则而是模型从数据里自己长出来的语义地图。3. 自注意力机制模型如何真正读懂一句话光有数字向量还不够。句子里的每个词不是孤立存在的意思要结合上下文才能确定。比如他拍了拍那个人的肩膀因为他觉得冷——这里的他到底指谁人一眼就能明白但计算机怎么做到呢答案就是Transformer的核心组件自注意力机制Self-Attention。3.1 为什么每个词不能孤立地看循环网络的困境在Transformer之前主流处理序列的方式是循环神经网络RNN。RNN的思路是把句子从左到右逐个词处理每处理一个新词时携带上一个词留下的记忆。但RNN有个致命弱点随着句子变长早期信息会逐渐被遗忘。你给它读一篇500字的文章它可能已经忘了第10个字是什么了。解决长距离依赖问题对RNN来说非常困难。Transformer用自注意力机制彻底抛弃了逐个处理的思路。它的做法是让句子里的每一个词同时与句子里的所有词进行交互直接计算它们之间的关联程度。这样一来句子首尾的单词可以直连不再需要层层传递。3.2 QKV三分量一场图书馆里的高效检索自注意力机制的实现涉及三个基本向量它们分别叫Query查询、Key键、Value值。为了理解这三者你可以想象自己去图书馆找书的过程Query就是你脑子里想找的主题比如如何做红烧肉。Key是每本书封面上的标签和简介。Value就是书架上书的内容本身。当你浏览书架时你会先把你的需求Query与每本书的标签Key进行比对算出每本书与你的需求有多匹配然后根据匹配程度把每本书的内容Value加权混合起来。匹配度高的书你记住的内容就多匹配度低的书基本忽略。在自注意力机制里每个Token都会生成自己的一套Q、K、V向量。句子中任意两个Token之间都要做一次需求-标签匹配得到的分数就决定了一个Token在理解另一个Token时应该给予多大的权重。3.3 一个具体的打分全流程从it看到animal来看一个经典的例子句子The animal didnt cross the street because it was too tired.。模型在处理it这个词时需要判断它指的是animal还是street。计算过程大致是将it的Query向量分别与animal和street的Key向量做点积得到原始分数。把分数除以一个缩放因子通常是向量维度的平方根防止数值过大。用softmax函数把分数转成和为1的概率权重比如animal得到0.9street得到0.1。用这两个权重对animal和street的Value向量做加权求和得到it这个位置更新后的表示。对比词原始点积示意softmax后权重对it的贡献animal高如100.90大部分语义指向animalstreet低如20.10语义贡献很小经过这一轮计算it这个位置的最终向量里就包含了animal的大部分语义信息。模型由此知道了it指的是那只动物。需要说明的是这里的数字只是帮助理解的示意值实际训练好的模型里权重分布会复杂得多。但核心机制就是这四步点积算分、缩放、softmax归一化、加权求和。整个过程在Transformer每一层里会并行地对所有Token执行一次。3.4 自注意力的代价平方复杂度自注意力机制有一个重要的代价——计算量随着序列长度呈平方级增长。如果句子有100个Token需要做1万次两两交互如果是1万个Token需要做1亿次。这就是为什么大模型的上下文窗口一次能处理的最大文本长度很难做得很大。后来的各种优化技术如稀疏注意力、线性注意力等本质上都是在想办法缓解这个平方复杂度问题而不是要抛弃注意力机制本身。4. 三大支柱多头注意力、位置编码、残差与归一化自注意力机制是核心发动机但一台发动机不能直接装在车上开。Transformer之所以能稳定工作还依赖三个关键组件多头注意力、位置编码、残差连接与层归一化。它们分别解决单视角不够用模型不知道顺序层数深了难训练这三个问题。4.1 多头注意力一组QKV不够那就并行多组单靠一组Q、K、V向量模型只能捕捉一种关系模式。但一句话里的关系有很多种有语法关系主语-谓语、有指代关系代词-名词、有位置关系前-后、有语义关联等等。只用一组参数很难同时照顾到所有关系。多头注意力Multi-Head Attention的做法是把相同的输入同时送入多个并行的注意力计算通道每个通道有自己的Q、K、V投影矩阵。以8个头为例输入会被切成8份分别计算8份注意力结果最后拼接在一起再做一个线性变换。每个头会自发地学习到不同的关注模式。我在训练完一个小型模型后把8个头的注意力权重可视化出来过一个头几乎固定关注句子的动词和宾语另一个头专门关注形容词修饰的名词还有一个头甚至学会了关注标点符号。这个现象不是谁事先设计好的而是多头海量数据自然涌现出的分工。4.2 位置编码怎么让模型知道谁在前谁在后自注意力机制本身对Token的顺序毫无感知。你把句子倒过来注意力分数的计算结果完全一样。所以必须额外给模型注入位置信息。早期的Transformer采用固定频率的正弦余弦函数编码用一组随位置变化的数字加到嵌入向量上让模型可以从数值上区分第1个词和第5个词。后来GPT系列改成了让模型在训练中自己学习位置向量。而现在的许多大模型则采用了旋转位置编码RoPE——它的思路更巧妙不直接给位置加数字而是对Token的向量做旋转操作两个Token之间的相对位置关系可以通过向量夹角体现出来。用人话说位置编码就是给每个Token发一张排队号让模型在理解句子时知道元素的先后顺序。没有位置编码Transformer就跟一袋子词没有区别根本组不成句子。4.3 残差连接与层归一化深层次的稳定器大模型动辄几十层甚至上百层网络。如果每一层都进行复杂的非线性变换梯度在反向传播时很容易消失或爆炸导致模型根本训不动。两个工程上的关键设计解决了这个问题残差连接把上一层的输出直接加到本层输出上。这样即使本层变换没学到有用的东西信息也有一条高速公路原封不动地传到下一层。梯度也可以顺着这条高速公路回流解决了深层训练中梯度消失的问题。层归一化对每个Token的向量做标准化处理让每一层的输入数据分布保持稳定。就好比每过一段路就设一个服务区让所有数据都休整成统一尺度再继续上路。这两个设计看起来平平无奇但却是整个深度学习领域的基建级操作。没有它们今天所有的大规模神经网络都跑不起来。5. 训练三部曲预训练、微调与人类反馈对齐了解了模型结构还远不是全貌。真正让大模型无所不知的关键在于它的训练方式。现代大模型的训练过程可以拆成三段预训练、监督微调、人类反馈对齐。5.1 预训练在海量语料里做没完没了的完形填空预训练是耗时最长、成本最高的阶段。模型会被喂入数万亿字的互联网公开文本包括书籍、文章、代码、论坛讨论等等。它要做的任务很简单一边读前面的文字一边预测下一个词预测错了就调整参数如此反复迭代。这个过程没有任何人工标注所以叫自监督学习。因为网络文本是现成的预测下一个词这个任务可以自动生成训练数据。预训练结束后模型已经获得了极强的语言能力和广泛的世界知识但它只会接话并不知道怎么像一个助手那样回答问题。你问它给我推荐一部电影它可能只会接着你的话头继续编故事。注意预训练语料的规模和质量直接决定了模型能力的上限。这也是为什么行业内流传一句话数据质量决定模型上限算力决定你能否达到这个上限。5.2 监督微调让接话机器变成答题助手为了让模型学会遵循指令需要第二步监督微调SFTSupervised Fine-Tuning。做法是人工准备一大批问题-标准回答对让模型在预训练基础上继续训练习得用户问什么我就答什么的行为模式。这一步的数据量通常只有几万到几十万条但质量要求极高。人工写答案的时候需要把表达方式、思考过程、拒绝回答的边界都示范出来。我在实际做微调实验时发现同样一个基础模型微调数据的风格会完全改变它的回答调性。你给它看什么风格的答案它以后就更倾向用什么风格回答。5.3 人类反馈对齐用打分机制让模型越来越懂你监督微调只能让模型模仿已有的答案但人类对好答案的判断往往很主观。所以还差最后一步让模型学会如何权衡回答质量。常见的技术路线是基于人类反馈的强化学习RLHF大致过程是由一个AI模型生成多个候选回答让人类在几个答案之间排序打分用这些打分训练一个奖励模型。这个奖励模型就像一个打分老师专门判断AI的回答好不好。然后把大模型接在这个奖励模型上用强化学习算法如PPO不断调整大模型参数让它学会输出奖励更高的回答。这整个过程就是大模型从什么都不知道的婴儿到懂规矩的助手的三段成长史。很多人误以为大模型是被人一段一段写出来的程序逻辑实际上它完全是在数据驱动下自己长出来的行为模式。5.4 参数规模与涌现能力为什么大就是不一样有个现象特别值得聊当模型参数规模越过某个临界点后会出现很多小模型不具备的能力比如上下文推理、思维链、代码生成这类能力被称作涌现能力。比如一个10亿参数的模型你问它一道三位数加法它经常算错但同架构的1000亿参数模型却能逐步推理把步骤写出来然后算对。模型架构和训练方法并没有本质区别差别只在于规模大了。这背后的原因学术界还在研究主流的一种解释是更大的模型有更多参数来存储分散的规律并且能把多步操作串联起来。这些现象告诉我们大之所以值得追求不只是量的提升更是质的改变。6. 大模型为什么会一本正经地胡说八道所有用过大模型的人都遇过它信誓旦旦给出一个完全错误答案的情况。这被称作幻觉。按理说一个读过万亿字的模型不应该犯常识错误才对但事实恰恰相反。要理解幻觉得先看清模型的本质。6.1 幻觉的根源模型记的不是事实是规律大模型的训练目标从来不是保证答案正确而是让预测的词最符合语言规律。它把海量文本压缩成参数后记住的不是确切的某条百科条目而是这类问题通常会搭配什么样的回答。比如你问一个冷门历史人物的出生年份如果语料里相关信息太少模型就会根据与这个人相关的文字风格脑补一个看起来合理的年份。它不会觉得自己在撒谎因为在它的训练目标里这个猜测就是最合理的下一个词。用一句话概括模型的优化目标与人类的事实正确目标之间存在天然鸿沟。6.2 知识截止与上下文限制大模型的记忆牢笼除了目标偏差还有两个客观限制与幻觉密切相关知识截止时间模型参数只包含训练数据截止之前的信息。你问它最近发生的事它只能基于以前学到的规律去编。除非它接入了外部搜索工具否则它确实不知道昨天发生了什么。上下文窗口上限一次对话里能放进去的文本总量有限。如果你让模型处理的信息超过了窗口上限更早的内容会被截断模型就只能根据剩余信息作答答案自然会偏离。6.3 降低幻觉的实操建议在使用大模型时有一些可以有效降低幻觉率的方法在提问中给出具体的背景信息和期望的回答格式而不是泛指地提问。让模型先检索再回答或接入外部知识库而不是让它单凭记忆作答。对关键事实让它给出依据或信息来源然后自己去核实。开启推理模式思维链让模型把分析步骤写出来推理过程本身能显著降低出错率。不要把模型的回答当成权威结论特别是医疗、法律、金融等高风险领域只把它的回答当作初稿或参考。我自己的习惯是把大模型当成一个知识面很广但偶尔犯浑的同事它的初稿质量高但重要信息一定要经过验证再用。7. 动手实操在个人电脑上真正跑起一个大模型原理讲了这么多不如自己动手跑一个。很多人觉得训练和运行大模型需要超级计算机那是针对训练而言。运行推理一个开源模型的门槛其实没有想象中那么高。7.1 模型体积与显存需求一张表算清楚先看模型的参数量和存储的关系。以70亿参数7B模型为例它的参数存储需求按不同精度有所不同精度每个参数占位7B模型占用内存13B模型占用内存FP32单精度4字节约28GB约52GBFP16/BF16半精度2字节约14GB约26GBINT88位量化1字节约7GB约13GBINT44位量化0.5字节约3.5GB约6.5GB这个表告诉我们两个关键信息第一显存大小直接决定你能跑多大的模型第二量化降低参数精度是个人用户运行大模型最重要的手段。INT4量化后一个7B模型只要3.5GB左右显存很多普通显卡都能跑起来。量化的代价是模型在某些任务上精度略有下降但日常聊天完全够用。提示除了模型本身运行时的KV Cache键值缓存还会额外占用一定显存实际需求通常比静态计算多出1到2GB。预算时记得留出余量。7.2 一套可以直接照抄的本地部署方案如果你有一块8GB显存的显卡或者一台16GB内存的普通电脑下面这套组合足够你跑起一个7B级模型安装好Python环境和显卡驱动如果用的是NVIDIA显卡需要装CUDA。安装一个开源推理框架它支持GPU加速和CPU推理两种模式。从开源社区下载一个量化好的7B模型文件GGUF格式选Q4_K_M这种平衡性好的量化版。修改框架的配置文件指定模型路径和监听端口。启动服务之后在浏览器或客户端里发起对话。第一次跑起来的时候那种我自己电脑上也有一个AI的感觉还是挺神奇的。虽然回答速度没有网页版快在8GB显卡上约每秒10到20个Token但优势是数据完全本地传输不依赖外部网络还能任意调试提示词、更换不同风格的模型。7.3 给零基础入门的路线建议很多人学到这儿就卡壳了不知道下一步该学什么。从我个人的经历来看比较顺滑的路径是这样先把本文提到的概念——Token、Embedding、自注意力、预训练、微调——彻底弄懂不懂就多读几遍或者上手跑一个开源小模型。动手把一个7B模型在本地跑起来试着调整采样温度、上下文长度等参数观察输出变化。用开源框架微调一个小模型用几百条自己准备的数据体验一把调教模型的过程。这一步会让你对所有概念的理解发生质变。读完Attention Is All You Need这篇Transformer原始论文以及BERT、GPT的原始论文。你会发现有了实操经验再读论文以前看不懂的部分能看懂了。对某个方向产生了兴趣比如多模态、Agent、检索增强再沿着那个方向的论文和开源项目深挖。我记得自己第一次跑微调时用错了数据集格式模型训练完只会重复反问句成了个复读机。排查了半天才发现是对话模板没配对。这种坑只有动手踩过才能真正理解模型内部的输入输出格式有多重要。关于学习这件事我的最大体会是不要试图先把所有数学原理都学完再动手。大模型的学习路径是理解概念、动手跑通、回头补数学、再深入原理这样螺旋式上升的。先跑起来让模型在你自己的电脑上吐出一句完整的话这个正反馈比看十篇文章都管用。剩下的问题等你真的遇到了自然会知道该补哪块知识。