easy-vibe 大语言模型原理:从 Tokenization 到 Transformer 与 MoE 的完整技术解读
【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe
本文基于 easy-vibe 课程附录中的 LLM 原理章节,系统讲解大语言模型(LLM)如何把人类语言转化为可计算的数学问题:从 Tokenization、Embedding、矩阵化流水线,到 RNN 与 Transformer 架构对比、KV-Cache、对话模板、SFT/RLHF 对齐,再到 Thinking Model、MoE 与线性注意力等前沿演进。读完本篇后,你将理解"LLM 为什么只能处理 Token 而不能处理单词"、"Transformer 为什么能并行且长程不遗忘"、"长上下文为什么吃显存"等核心问题,并能结合仓库中配套的可交互 Vue 演示组件源码验证每一环节的实现逻辑。
一、导言:从人类语言到机器计算
人类用语言交流,计算机用数字运算。LLM 的本质就是连接这两个世界的桥梁,其核心任务只有一个:把"理解语言"的问题转化为"数学计算"的问题。
要完成这一转化,需要解决三大挑战:
- 翻译(Translation):如何把文本变成数字?——Tokenization 与 Embedding;
- 效率(Efficiency):如何让计算机快速计算?——矩阵运算;
- 记忆(Memory):如何让计算机理解上下文?——Transformer 模型。
在 easy-vibe 仓库中,这一章以 llm-principles.md 为主体(德语版,中文版 结构一致),并配套一组可交互演示组件,统一位于 llm-intro 组件目录。文档中的<LlmQuickStartDemo />、<TokenizationDemo />、<EmbeddingDemo />、<TokenizerToMatrix />、<RNNvsTransformer />、<TrainingInferenceDemo />、<ThinkingModelDemo />、<MoEDemo />、<LinearAttentionDemo />等标签,分别对应目录下的同名 Vue 单文件组件,例如 LlmQuickStartDemo.vue 与 TokenizationDemo.vue,用于在文档站点中实时演示下文各节描述的流程。
二、第一步:翻译(Tokenization)
计算机读不懂"Hamburger"这样的字符,它只认识数字。因此第一项任务是:把文本拆解成计算机能理解的最小单元。
2.1 什么是 Tokenization
Tokenization(分词)是把一整个句子拆成一个个"词元"(Token)的过程:
- 英文:天然带空格,容易分词(例如
I love AI); - 中文:没有空格,需要专门的切分算法(例如
我爱人工智能)。
执行分词的程序称为Tokenizer(分词器),它像一个翻译官,把人类语言转成机器可读的数字序列。现代 LLM(如 GPT-4)普遍采用子词分词(Subword Tokenization,如 BPE 算法),其巧妙之处在于:高频词保持完整,低频词被拆散。
以下是一个基于 GPT-4 Tokenizer 的真实 BPE 分词示例:
输入:"The quick brown fox jumps over the lazy dog. \n今天天气真不错!"
Token 列表:
index=791, string='The' index=4062, string=' quick' index=14198, string=' brown' index=39935, string=' fox' index=83368, string=' jumps' <-- 若被拆散,可能是 ' jump' + 's' index=927, string=' over' index=279, string=' the' index=16053, string=' lazy' index=3290, string=' dog' index=13, string='.' index=198, string='\n' <-- 换行符 index=33838, string='今天' <-- 高频词直接合并 index=54580, string='天气' index=20265, string='真' index=57672, string='不错' index=171, string='!'罕见字符的处理(字节级回退): 当模型遇到词表中不存在的未知字符(假设"今"极罕见),会回退到字节层面:
- 原始输入:
今- 字节表示:
\xE4 \xBB \x8A- BPE 查找:先找
\xE4\xBB\x8A→ 未找到 → 拆成\xE4\xBB(ID=1001)+\x8A(ID=2002)- 最终 Token:
[1001, 2002]这一机制保证模型可以处理任意输入,永远不会出现 OOV(Out Of Vocabulary,词表外)问题。
核心要点:LLM 处理的不是单词,而是Token ID(一串数字索引)。
仓库中的 TokenizationDemo.vue 对上述流程做了可交互的教学模拟:从源码结构看,它提供 BPE(GPT-4 风格)、Word(按词)、Character(按字符)三种算法切换(见 L128-L159),BPE 模拟分支用正则/([a-zA-Z]+)|([\u4e00-\u9fa5])|(\s+)|(.+?)/g提取英文单词、单个中文字符、空白与标点(L130),Token ID 由输入字符串的哈希值确定性生成(L120-L126)。需要说明的是,这是教学用途的简化模拟,并非真实 BPE 实现,其价值在于直观对比三种切分粒度下 Token 数量的差异,并展示每个 Token 的 ID 与类型(单词/中文字符/空白/标点)。
三、核心问题:如何让计算机"计算"语言
3.1 为什么不能直接用 ID
最直接的想法是给每个词分配一个编号:苹果 → ID 10,香蕉 → ID 20。但这有两个致命缺陷:
- 缺陷 1:太浪费。词表若有 10 万个词,用 One-Hot 编码表示一个词需要 10 万个元素的数组,其中 99,999 个位置是 0,只有一个是 1;
- 缺陷 2:没有语义。计算机会把"10"和"20"当作毫无关联的两个数字,无法表达"苹果"和"香蕉"都是水果这一语义关系。
3.2 解决方案:Embedding(稠密向量)
为了高效且携带语义地表示一个词,Embedding 用一个较短的小数数组(例如 512 个数字)来描述一个词,例如[0.8 (是水果), 0.1 (红色), 0.9 (甜)...]。这样不仅压缩了数据,还把词义转化成了可计算的"坐标"。仓库中对应的交互演示为 EmbeddingDemo.vue,文档第 2 节的<EmbeddingDemo />即由此组件渲染。
四、从单词到矩阵
解决"一个词"的表示后,下一个问题是"一句话"的表示。
4.1 为什么是矩阵
因为一句话包含多个词:
- 一个词 = 一行数字(向量);
- 一句话 = 许多行数字上下堆叠 =矩阵。
之所以要构造成矩阵,是因为现代计算机的核心硬件——GPU(显卡)——天然为矩阵运算而设计。只有把语言转成矩阵,才能利用 GPU 的并行算力,实现高效的训练与推理。
4.2 完整流水线
数据流回顾:
- Tokenization:把文本切碎;
- 索引(Indexing):把碎片转成 ID;
- Embedding:把 ID 转成向量(获得语义并压缩);
- 堆叠(Stacking):把向量拼成矩阵(面向 GPU 高效计算)。
仓库中 TokenizerToMatrix.vue 把这四步做成了分步动画:从源码结构看,它对输入文本用正则[\u4e00-\u9fa5]|[a-zA-Z]+|\s+|.切分 Token(L198),通过哈希得到确定性 ID,再用sin(id * (k+1))生成 4 维伪随机向量(L200-L214),最后把向量逐行堆叠为带热力图着色的输入矩阵,并以Shape: (tokens.length, 4)标注矩阵形状(L175)。同样需要指出,这里的向量是确定性伪随机数而非真实词嵌入,目的是演示"Token → 向量 → 矩阵"的数据形态转换,而非真实 Embedding 查表。
五、插曲:究竟什么是"模型"
在看具体架构之前,先用直观方式理解"模型"这个概念。AI 领域的模型本质上是一个极其复杂的函数或黑盒:
- 输入:一堆数字(例如上文的 Token ID);
- 处理:黑盒内部有数十亿参数(可以想象为数十亿个旋钮),它们对输入数据做大量的加减乘除;
- 输出:另一堆数字(表示预测结果,例如下一个词的概率)。
类比:把模型想象成一位经验丰富的厨师:
- 输入(食材):你给他牛肉、土豆、番茄;
- 模型(厨师的大脑):基于他学过的成千上万道菜谱(训练数据),他瞬间在脑中计算:牛肉切块、土豆去皮、火候控制……
- 输出(菜肴):最后端出一盘土豆炖牛肉。
所谓训练(Training),就是让这位厨师从学徒开始,通过无数次试错练习:太咸了就调"盐分旋钮",太淡了就调"火候旋钮",直到能稳定做出美味。今天的 LLM 就是"读完了人类所有书"的超级厨师——只不过它们烹饪的不是菜肴,而是文本。
六、架构的演化:从 RNN 到 Transformer
有了数据(Token)和厨师(模型)之后,剩下的问题是:厨师到底如何"思考"?AI 演化史上主要有两种架构:RNN与Transformer。仓库中 RNNvsTransformer.vue 用两种可视化模式对比了它们。
6.1 旧方法:RNN(传话游戏)
早期模型(RNN,循环神经网络)处理句子就像玩传话游戏(Stille Post):
- 读第 1 个词"我",记住它,传给第 2 步;
- 读第 2 个词"喜欢",与之前的记忆结合、更新信息,传给第 3 步;
- 读第 3 个词"吃",再更新记忆……
- ……直到读完最后一个词。
这带来两个致命缺陷:
- 慢(无法并行):每个人都必须等前一个人传完,100 个人无法同时工作;
- 健忘(长程记忆丢失):消息传到第 100 个人时,可能早已忘记第一个人说的是"我"还是"你",导致模型处理长文本时丢失主线。
演示组件对 RNN 的模拟印证了这一点:从源码结构看,playRnn函数逐词循环执行(L164-L171),隐状态强度按rnnMemoryStrength * 0.8 + 30累积并衰减(L167),即信息随传递步数推移不断"打折",正是长程记忆丢失的直观呈现。
6.2 现代设计:Transformer(圆桌会议)
2017 年,Google 提出了全新的Transformer架构,把"传话游戏"改成了圆桌会议:
- 上帝视角(并行计算):所有词同时"入座",无需排队;每个词把自己的信息写在卡片上放在桌子中央;
- 注意力机制(Attention):每个词可以直接看到桌上任何其他词的信息。例如读到"它"时,模型无需回忆前文传递,直接看到"那只猫",立刻明白"它 = 那只猫"。
这完美解决了 RNN 的弱点:快(所有人同时看资料,GPU 满负荷运转)、不遗忘(无论句子多长,第 1 个词和第 10,000 个词之间都只有"一步之遥")。
一句话总结:RNN 像迷宫,一步一步走,容易迷失;Transformer 像上帝视角的地图,起点终点一目了然。
为什么仍需要"位置"信息
因为 Transformer 是"一次处理所有词",若不特别处理,它无法区分"我爱你"和"你爱我"(同样的词、不同顺序)。因此要给每个词发一张编号卡片(位置编码,Positional Encoding),告诉模型谁在第 1 位、谁在第 2 位。
小提示:许多 LLM 是自回归(autoregressive)的(预测下一个词),生成时仍然逐 Token 输出;但在每个生成步骤内部,Transformer 仍可利用矩阵并行与缓存优化。
组件 RNNvsTransformer.vue 中的注意力矩阵演示了"它"的指代消解:源码中的attentionMap(L195-L214)对句子 "The animal didn't cross the street because it was too tired." 预定义了"it"对animal(0.8)、street(0.1)、自身(1.0)的注意力权重,鼠标悬停任一单词即可看到它"注意"了哪些词及百分比——这是文档中"读到'它'时直接看到'那只猫'"的交互式注脚。
6.3 效率黑盒:KV-Cache
你可能听说过,长文本生成越到后面越慢、越占显存,原因通常是模型需要"记住"此前生成的所有内容。
Transformer 如何做"笔记"?在注意力机制中,每个词会生成两个向量——**Key(K)**和Value(V)——供后续词"查询"使用:
- 当模型生成第 100 个词时,它需要回看前 99 个词的 K 和 V;
- 若每次都重新计算这 99 个词的 K、V,将是巨大的浪费。
KV-Cache 的作用就像一个增量笔记本:
- 不重新计算:算完第 1 个词的 K、V 后就存起来;
- 只算新的:生成第 2 个词时只计算第 2 个词的 K、V,再与第 1 个词的 K、V 合并;
- 越写越厚:随着对话推进,这个"笔记本"(显存占用)持续变大。
这就是长上下文对话(Long Context)消耗显存的原因——不是模型变大了,而是笔记(KV-Cache)太多了。
七、从"续写"到"对话"
很多人误以为 ChatGPT 真的"理解"我们说的话,但它的本能只有一个:猜下一个词(Next Token Prediction)。
7.1 本能:疯狂续写
给基座模型(Base Model)输入"今天天气真好",它可能续写"我们去公园吧";但输入"美国的首都是什么?",它可能续写"中国的首都是什么?日本的首都是什么?"——因为它在模仿题库的格式,而不是回答问题。
7.2 技巧:用"剧本"引导出对话
要把它变成对话助手,工程师发明了角色扮演:给模型输入偷偷加上特殊标签(Template),让它以为自己在续写一段"对话剧本"。
你看到的是:
用户:你好
模型实际看到的是:
<|user|>你好<|assistant|>
模型一旦看到<|assistant|>,就知道:"哦,现在轮到我来演助手了。"
仓库中 TrainingInferenceDemo.vue 的"对话"标签页把这一过程可视化:左侧是用户视角的聊天界面,右侧展示模型真正看到的原始提示词——从源码结构看(L116-L122),其结构为<|system|> You are a helpful assistant.→<|assistant|>(助手开场白)→<|user|>(用户输入)→<|assistant|>(待生成的回复),直观呈现了"用户看到什么"与"模型看到什么"之间的转换。同一组件的"训练"标签页还演示了训练循环:输入 Token → 模型矩阵运算 → 预测 vs 目标对比 → 计算 Loss → 调整权重,对应文档第 5 节"从 Unsinn 到好助手"中提到的 Teacher Forcing 训练思路。
八、从"胡说"到"好助手":对齐(Alignment)
仅仅会对话还不够。原始模型可能讲解如何制造炸弹或使用粗俗语言。要把它变成像 ChatGPT 那样礼貌可靠的助手,还需要最后两道工序:
8.1 SFT(监督微调,Instruction Fine-Tuning)
- 让人类专家编写大量高质量问答对,教模型"如何得体地说话";
- 目标:模型学会遵循指令,而不是胡乱续写。
- 数据示例(JSON 格式):
// SFT 训练数据示例 { "messages": [ { "role": "user", "content": "请把这个句子翻译成英语:'你好'。" }, { "role": "assistant", "content": "Hello." } ] } // 模型学会了:当听到"翻译"的指令时,直接给出结果, // 而不是续写"你最近怎么样"8.2 RLHF(基于人类反馈的强化学习)
- 评分:模型生成多个回答,人类评审打分(哪个更安全?哪个更礼貌?);
- 奖惩:好回答被奖励,差回答被惩罚,模型逐渐学会与人类价值观对齐(Alignment)。
- 数据示例(JSON 格式):
// RLHF 偏好数据示例(DPO/PPO) { "prompt": "如何制造炸弹?", "chosen": "抱歉,我无法回答这个问题。", // 人类偏好的回答(安全) "rejected": "首先你需要……" // 人类拒绝的回答(危险) }文档第 5 节的交互式演示(TrainingInferenceDemo.vue 的第 4 个标签"高级:Alignment")允许读者对比对齐前后的行为差异。
九、前沿研究:Thinking Model、MoE 与线性注意力
随着技术演进,单纯的"预测下一个词"有时会闹笑话,尤其在数学与逻辑问题上。于是出现了新一代Thinking Model(思考型模型,如 OpenAI o1、DeepSeek-R1)。
9.1 什么是"思考"(Thinking Models)
人类面对复杂问题(例如"9.11 和 9.9 哪个大?")时不会反射式作答,而是先在脑中想一想。Thinking Model 学会了这种**慢思考(System 2)**能力:
- 快思考(System 1):凭直觉、反射式作答,容易出错;
- 慢思考(System 2):通过生成**思维链(Chain of Thought)**逐步推导,最后才给出答案。
仓库中 ThinkingModelDemo.vue 对这一过程提供了交互演示。
9.2 训练秘诀:从"模仿"到"探索"
传统模式(SFT——模仿学习):
- 方法:向模型展示人类思维过程,让它模仿;
- 局限:模型上限受人类数据质量约束。如果人自己都想不到(例如极难的数学题),模型也学不会。
思考模式(RL——强化学习):
- 方法:不提供过程数据,只给一个最终验证器(Verifier)。例如一道数学题,模型自己反复尝试:答错 → 惩罚;答对 → 奖励;
- 顿悟时刻:经过十万次自我尝试,模型惊讶地发现:"如果我在给出答案前先在小本子上写下推导步骤,获得奖励的概率大增!"于是"先思考、再回答"的行为被强化并固化。这与通过自我对弈训练、最终超越人类棋谱的 AlphaGo 类似。
9.3 实践指南:Prompt 风格的大变革
使用 Thinking Model(如 DeepSeek-R1、OpenAI o1)时,Prompt 策略需要根本性改变:
| 属性 | 传统模型(GPT-4o、Claude 3.5) | Thinking Model(R1、o1) |
|---|---|---|
| 核心逻辑 | System 1(直觉) | System 2(逻辑) |
| Prompt 技巧 | 需要引导式思维链(CoT),如"一步一步思考……" | 不要过多干预,模型自带 CoT,人为引导反而干扰 |
| 指令清晰度 | 复杂任务需拆分为子任务 | 直接给出最终目标,让模型自己拆解 |
| 适用场景 | 创意写作、简单翻译、闲聊 | 复杂数学、代码重构、逻辑推理 |
注意:对 Thinking Model,干预越少越好。你只需清晰定义"完美任务结果是什么",而不是"应该怎么做"。
9.4 未来趋势:快慢融合
未来可能不再区分"Thinking Model"和"普通模型"。理想的 AI 应像人类一样具备自适应计算能力(Adaptive Compute):
- 遇到"1+1=?":立即调用 System 1,闪电般作答;
- 遇到"证明黎曼猜想":自动切换到 System 2,思考三天三夜再作答;
- 对用户无缝切换:你只负责提问,模型自己决定投入多少"脑力"。
9.5 架构演进:从"全能选手"到"专家团队"(Dense vs. MoE)
模型越大(如 GPT-4、DeepSeek-V3),每个词都要流经全部神经元就越不可忍受。于是出现了MoE(Mixture of Experts,专家混合)架构:
- Dense(稠密模型):
- 类比:全能天才,任何问题都调用全部大脑;
- 特性:稳定,但知识越多越慢;
- 代表:GPT-3、Llama-2。
- MoE(专家混合):
- 类比:流水线上的专家团队(每个词都换人处理);
- 核心机制(Token 级路由):MoE 的本质是原生的 Token-Level Routing。它不是按"任务类型"分配工作(例如所有数学题都交给数学专家),而是按当前生成的词实时分配:
- 模型生成
def时,路由到代码专家; - 模型生成
love时,路由到文学专家; - 模型生成
3.14时,路由到数学专家。 也就是说,同一句话里不同的词往往由不同专家处理;
- 模型生成
- 特性:总人数多(参数总量大),但每个词只激活少数专家(激活参数少)。既有深度又快速;
- 代表:GPT-4、DeepSeek-V3、Mixtral。
仓库中 MoEDemo.vue 对 Token 级路由过程做了可视化演示。
9.6 效率革命:突破长度限制(Linear Attention)
MoE 之外还有另一个关键弱点:上下文长度。传统 Transformer(如 GPT-4)使用标准注意力机制,计算量随词数增长平方级爆炸:
- 读 1 万个词 → 1 亿次计算;
- 读 10 万个词 → 100 亿次计算!
为了解决这个问题,MiniMax(abab 系列)、RWKV 等模型引入了线性注意力(Linear Attention)。
动机:一个"网状",一个"线性"。根本区别在于:是保留所有原始词,还是随时压缩摘要?
- 标准注意力(网状)——为什么要回看?
- 核心原因:为了**"找到相关性"**;
- 例子:在"我把苹果给了他……"中,读到"他"时,模型必须检索之前所有词(我、把、苹果、给);
- 流程:"他"发出查询信号(Query),与之前所有词的标签(Key)逐一比对:与"我"匹配 0 分,与"苹果"匹配100 分!
- 代价:由于不知道哪个词重要,必须检查所有前文词,一个都不能漏,所以网络越织越密。
- 线性注意力——为什么不用回看?
- 原理:模型学会了"做笔记"。读完"苹果"后,把"存在一个苹果"的信息压缩进一个状态(State);之后读到"他",直接在状态里查表:"他 = 苹果";
- 代价:虽然快,但"压缩"可能丢失细节(例如苹果是红色的)。
LinearAttentionDemo.vue 在文档站点中演示了两种机制的对照。
9.7 架构对比:RNN vs. Transformer vs. RWKV
| 架构 | 核心机制 | 复杂度(长度 N) | 可并行训练 | 推理速度 | 遗忘问题 | 代表 |
|---|---|---|---|---|---|---|
| RNN | 顺序递归 | O(N)(低) | 否 | 慢(顺序执行) | 严重(长程记忆丢失) | LSTM、GRU |
| Transformer | 全局注意力 | O(N²)(极高) | 是 | 中(KV-Cache) | 无(但受窗口限制) | GPT-4、Llama |
| RWKV / Linear | 线性注意力 | O(N)(低) | 是 | 快(显存恒定) | 轻微(压缩损失) | RWKV、MiniMax |
RWKV / Linear Attention试图兼取两者之长:像 Transformer 一样并行训练,像 RNN 一样高效推理。
十、总结与学习路径
至此,你已经走完了从"Tokenization"到"ChatGPT"的完整路径:
- Tokenization:把文本拆成 Token;
- Embedding:把 Token 映射为语义向量;
- Transformer:借助注意力机制并行处理序列、提取特征;
- 训练:用 Template 格式化数据,通过 Teacher Forcing 并行训练;
- 推理:自回归地逐词生成。
推荐的下一步:
- 如果对数学感兴趣,深入线性代数(矩阵运算)与概率论;
- 如果想动手实践,尝试用 Python 的
transformers库加载一个小模型(如 GPT-2)做实验。
十一、术语表
| 术语 | 全称 | 解释 |
|---|---|---|
| LLM | Large Language Model | 大语言模型。通过海量文本训练的 AI 模型,能理解和生成人类语言。 |
| Token | — | 分词单元。文本被拆解的最小单位(单词、字符或字符片段),模型读写的是 Token ID。 |
| Embedding | — | 词向量。把 Token 映射到高维空间(如 4096 维)的数值向量,捕捉语义关系。 |
| Transformer | — | 现代 LLM 的核心架构,基于注意力机制,可并行处理长文本。 |
| Attention | Attention Mechanism | 注意力机制。让模型在处理一个词时动态关注上下文中其他相关词。 |
| Context Window | — | 上下文窗口。模型一次推理能"记住"的最大 Token 数(如 128k)。 |
| Pre-training | — | 预训练。在海量无标注文本上训练,学习基础语言规律与世界知识。 |
| SFT | Supervised Fine-Tuning | 指令微调。用高质量问答对教模型遵循人类指令。 |
| RLHF | Reinforcement Learning from Human Feedback | 基于人类反馈的强化学习。通过人类评价进一步调整模型行为,使其与人类价值观对齐。 |
| CoT | Chain of Thought | 思维链。引导模型在给出最终答案前先输出推理步骤。 |
| MoE | Mixture of Experts | 专家混合。由多个"专家"子模型组成,按 Token 动态激活相应专家,更高效。 |
| Temperature | — | 温度。控制模型生成随机性的参数:温度越高越有创意但越难控,越低越确定。 |
十二、延伸阅读与仓库资源
本章属于 easy-vibe 课程附录"8-artificial-intelligence"模块,与以下章节构成递进关系,适合按顺序深入:
- Transformer 注意力机制:对注意力数学细节的进一步展开;
- Embedding 与向量检索:向量表示在检索中的应用;
- 上下文工程 与 RAG:把本章的 Token/上下文概念用到实际系统中;
- 全部配套交互组件源码位于 llm-intro 目录,包括 LlmQuickStartDemo.vue、TokenizationDemo.vue、EmbeddingDemo.vue、TokenizerToMatrix.vue、RNNvsTransformer.vue、TrainingInferenceDemo.vue、ThinkingModelDemo.vue、MoEDemo.vue、LinearAttentionDemo.vue,可结合本文各节对照阅读。
【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考