从 Transformer 到 LLM 全景图
第 6 课:从 Transformer 到 LLM 全景图
前五课我们把 Transformer 拆到了零件级:注意力、位置编码、归一化、Tokenization、逐层参数。现在把镜头拉远——从"一个 7B 模型"扩展到"整个 LLM 家族",看清参数量级、训练三阶段、推理两阶段、开源与闭源的分岔,以及模型能力的硬边界。
② 画出 LLM 从随机权重到"能对话"的三阶段训练流程,标出每阶段的数据量与算力占比
③ 解释为什么首字要等、后续越吐越快,并判断一个模型"标称上下文"与"有效上下文"的差距
上一课我们逐层解剖了一个 7B 模型,把 6.74B 参数拆到了每一层。现在把镜头拉远:同样是 Transformer,为什么有的模型只有 1 亿参数,有的能到 2.78 万亿?因为决定"大小"的从来不是一个数——因此必须先分清两个口径,否则连"这个模型能不能跑在我的机器上"都答不出来。
关键在一个反直觉的事实:模型的"大小"有两个口径。可以把 MoE 模型类比成一家有 896 位专科医生的大医院——挂号时只叫其中 16 位进诊室,但医院里所有医生的编制都得占地方。这就是"总参数"(编制)与"激活参数"(进诊室的人)的区别。
为什么要费劲做这种稀疏结构?因为稠密模型每 token 都要把全部参数算一遍:同样 671B 参数的稠密模型,单 token 前向约 2 × 671e9 = 1.34 TFLOPs,而 MoE 只激活 37B(约 74 GFLOPs)——差约 18 倍。MoE 正是用「多存参数、少算参数」把大模型的推理算力压下来。
| 模型 | 架构 | 总参数 | 每 token 激活 | 激活占比 |
|---|---|---|---|---|
| Llama 2 7B | Dense | 6.74B | 6.74B | 100% |
| Llama 3.1 70B | Dense | 70B | 70B | 100% |
| Llama 3.1 405B | Dense | 405B | 405B | 100% |
| DeepSeek-R1 | MoE | 671B | 37B | 5.5% |
| Kimi K3 | MoE | 2.78T | ≈104B | 3.7% |
| 层 | Dense 模型 | MoE 模型(以 Kimi K3 为例) |
|---|---|---|
| Attention | 每层一份,全部参与 | 每层一份,全部参与(不稀疏) |
| FFN | 每层 1 个,全部参与 | 每层 896 个专家,路由选 16 个 |
| 每 token 计算量 | 正比于总参数 | 正比于激活参数(≈ 总参数的 3.7%) |
| 模型 | fp16 权重 | 4-bit 量化权重 | 消费级显卡能否单卡跑 |
|---|---|---|---|
| 7B | ≈14 GB | ≈4.0 GB | 能(8GB 显存起) |
| 70B | ≈140 GB | ≈43 GB | 不能(需 2×24GB 或 A6000) |
| 671B (MoE) | ≈1.3 TB | ≈404 GB | 不能(服务器级,约 8×H100-80GB) |
MoE 把"总参数"与"激活参数"解耦:总参数决定显存门槛,激活参数决定每 token 的算力成本。所以 671B 的 MoE 模型推理算力可能接近一个 37B dense 模型,但显存需求仍是 671B 级别——这就是为什么"MoE 让大模型变便宜了"这句话只对了一半。
上一张卡片我们看清了模型的规模。但规模只是"容量",一个刚预训练完的模型只会做一件事:预测下一个词。它不会听指令、不会拒绝有害请求、也不会按格式输出——因为它的训练目标里根本没有"回答用户"这一项,所以必须再训一遍。
把这三段训练类比成培养一名医生:预训练是读完整个医学院(海量知识),后训练是规培(学会按规范问诊、写病历),长上下文扩展是进修(能一次看完一整套病历)。
这一步的必要性有一个经典反例:OpenAI 的 InstructGPT 工作中,13 亿参数的 1.3B 模型经后训练后,其回答被人类标注员偏好的比例超过了 1750 亿参数的 GPT-3 基座——参数量差 100 倍以上,赢的却是「听得懂指令」这一项(Ouyang et al., 2022, arXiv:2203.02155)。
| 阶段 | 目标 | 数据量 | 算力占比(量级) | 产出 |
|---|---|---|---|---|
| ① 预训练 | 学语言结构与世界知识 | ≈15.6T token | ≈99% | 基座模型(Base) |
| ② 后训练 | 学会听指令、对齐偏好 | 百万级指令样本 | <1% | 对话模型(Instruct) |
| ③ 长上下文扩展 | 把窗口从 8K 撑到 128K | 长文档语料 | <1% | 长上下文模型 |
| 项目 | 数值 | 说明 |
|---|---|---|
| 训练 FLOPs | 3.8 × 10²⁵ | 约为 Llama 2 最大版本的 50 倍 |
| 训练 token | 15.6T | 约为 Llama 2(2T token,Meta 官方口径)的 7.8 倍(Llama 3 论文曾按 1.8T 自述) |
| GPU 规模 | 最多 16K 张 H100 | 单集群,约两个月完成 |
| 经验公式 | C ≈ 6 × N × D | N=参数量,D=token 数;系数 6 = 前向 2 + 反向 4 |
| 方法 | 需要什么数据 | 解决什么 |
|---|---|---|
| SFT(监督微调) | 指令-回答对 | 让模型学会"按指令回答"的格式与风格 |
| RS(拒绝采样) | 模型自采样 + 筛选 | 用"答得好的样本"再训一轮,提升质量 |
| DPO(直接偏好优化) | 偏好对(好答案 / 差答案) | 不用单独训 Reward Model,直接优化偏好 |
预训练决定模型的能力上限(知道多少、能推多深),后训练决定模型的可用性(听不听话、格式对不对、安全不安全)。同一个基座 + 不同后训练 = 完全不同的产品——这就是为什么开源社区能基于同一个 Llama 基座做出几百个风格迥异的助手。
上一张卡片讲完训练,现在模型要上线服务了。用户按下回车后,会经历两段体感完全不同的等待:首字延迟(等第一个字出来)和吐字速度(后面每个字多快)。因为这两段落在 GPU 性能曲线的两侧,所以优化手段完全相反——先判断瓶颈在哪一侧,再决定加什么。
这两段类比成餐厅出餐:prefill 是"一次性把整桌菜备齐"(后厨火力全开,比的是灶台功率),decode 是"一道一道端上桌"(比的是传菜通道有多宽,灶台反而闲着)。
| 阶段 | 一次处理多少 token | 瓶颈 | 决定什么指标 |
|---|---|---|---|
| Prefill | 整段提示(如 2048 个) | 计算(Tensor Core 打满) | TTFT(首字延迟) |
| Decode | 1 个(每步) | 显存带宽(HBM 打满) | TPOT(每 token 延迟) |
| 阶段 | 算术强度(FLOP/byte) | 与 ridge point(≈295,以 H100 SXM 为例:989 TFLOPS ÷ 3.35 TB/s ≈ 295)比较 | 结论 |
|---|---|---|---|
| Prefill | ≈ 提示长度 S(如 S=2048 → ≈2048) | 远高于 ridge | 计算受限 |
| Decode | ≈ 批大小 B(B=1 → ≈1) | 远低于 ridge | 带宽受限 |
| TTFT 的组成部分 | 占比量级(二手/估算,随场景浮动、非同一时刻相加) | 加显卡能改善吗 |
|---|---|---|
| 排队等待 | 常为首要项 | 否(要靠调度与扩容策略) |
| KV Cache 传输(PD 分离时) | PD 分离时可居首 | 否(受互联带宽限制) |
| Prefill 计算本身 | 约 2%~23%(二手,需人工核实) | 是(但只影响这一小块) |
推理优化的第一步永远是先判断瓶颈在哪一侧:decode 阶段 Tensor Core 利用率常常只有个位数百分比,显存带宽却已打满——此时加算力毫无用处,该做的是减少每步要搬的字节数(KV Cache 量化、GQA(把多个 Query 头分成几组、每组共享同一份 K/V)/MLA(把 K/V 压缩成一个更小的向量、用时再还原)、投机解码提高算术强度)。
上一张卡片我们看到自托管有显存与带宽门槛。于是选型问题就来了:到底该调 API,还是自己部署?
这不是"技术先进 vs 落后"的问题,而是约束匹配问题——类比成出行:API 像打车(随叫随到、按里程付费、车不是你的),自托管像买车(前期投入大、但跑得越多越划算、且完全由你掌控)。
| 维度 | 闭源 API | 开源权重自托管 |
|---|---|---|
| 数据合规 | 数据需出域到厂商 | 数据不出内网 |
| 成本结构 | 按 token 计费,随调用量线性增长 | 前期 GPU 投入 + 运维人力,边际成本低 |
| 能力上限 | 通常是最强档(尤其复杂推理、多模态) | 接近但一般略低,可自主微调补齐垂直场景 |
| 迭代速度 | 厂商升级,你自动受益 | 自己决定何时升级、升到哪版 |
| 运维门槛 | 几乎为零 | 需要 GPU 运维、推理优化、监控能力 |
| 模型规模 | 4-bit 权重 | 最低可用硬件 | 典型场景 |
|---|---|---|---|
| 7B~8B | ≈4.0~4.8 GB | 单张 8GB 消费卡 | 个人实验、轻量客服 |
| 32B | ≈20 GB | 单张 24GB(3090/4090) | 垂直领域微调、私有知识库 |
| 70B | ≈43 GB | 2×24GB 或 A6000 | 企业级私有部署 |
| 671B (MoE) | ≈404 GB | 约 8×H100-80GB | 前沿能力私有化 |
| 你的约束 | 优先选择 | 理由 |
|---|---|---|
| 数据不能出域 / 强合规 | 开源自托管 | API 路线直接不满足硬约束 |
| 调用量小、要快速验证 | 闭源 API | 零运维、零前期投入 |
| 长期高并发、成本敏感 | 开源自托管 | 边际成本低,规模越大越划算 |
| 需要最强复杂推理 / 多模态 | 闭源 API | 能力上限通常更高 |
| 需要深度定制(垂直微调) | 开源自托管 | 能拿到权重才能改 |
选型的第一原则是先看硬约束,再看性价比:如果数据不能出域,那么"闭源 API 分数更高"这个论据根本不成立。反过来,如果只是做个原型验证,自建集群的运维成本会远超 API 账单。没有绝对更优的路线,只有约束匹配与否。
上一张卡片我们选好了模型。但上线前必须知道它会在哪里翻车——否则第一次事故就会教你。
把模型类比成一位口才极好但从不查资料的专家:他讲得头头是道,但被问到不熟的领域时,他不会说"我不确定",而是顺着话头编一个听起来最合理的答案——因为他的训练目标就是"说出最像正确答案的话"。
要压住这类编造,工程上常见的做法是 RAG(先去外部知识库检索相关材料、再让模型照着检索结果回答)与工具调用。
| # | 限制 | 根因 | 工程对策 |
|---|---|---|---|
| 1 | 知识截止 | 训练数据有时间边界 | 检索(RAG)注入最新信息 |
| 2 | 幻觉 | 目标是"生成最像的文本",非"查证事实" | 强制引用来源 + 输出校验 |
| 3 | 多步推理衰减 | 误差逐步累积 | 思维链 + 外部工具(代码执行) |
| 4 | 上下文窗口上限 | 注意力成本随长度增长 | 分块 + 摘要 + 检索 |
| 5 | 无持久记忆 | 推理是无状态的 | 应用层存状态并注入 |
| 6 | 无法作用于现实 | 模型只能输出文本 | 工具调用 / 函数调用 |
| 7 | 训练数据偏见 | 语料本身有偏 | 领域上下文 + 人工审核 |
| 8 | 无法自校验 | 没有真值访问权 | 独立验证层 / 第二模型复核 |
| 来源口径(二手,需人工核实) | 模型 | 幻觉率 | 准确率 |
|---|---|---|---|
| Artificial Analysis 聚合 | Gemini 3 Pro | ≈88% | ≈55.9% |
| Artificial Analysis 聚合 | Gemini 3 Flash | ≈91% | — |
| 开发者论坛贴 | Gemini 2.5 Pro | ≈88% | — |
| 开发者论坛贴 | Gemini 3 Pro | — | ≈53% |
| 口径 | 数值 | 说明 |
|---|---|---|
| 标称上下文 | 1,000,000 token | 厂商宣传的窗口上限 |
| 换算成字符 | ≈300 万~400 万字符 | 按 1 token ≈ 3~4 字符(英文)换算 |
| 实测失稳点 | ≈30,000 字符 | 开发者实测开始失去连贯性(仅见论坛贴,二手,需人工核实) |
| 差距 | 约 100 倍(2 个数量级) | "能装下"不等于"能用好" |
这八条限制没有一条能靠"换个更好的提示词"解决——它们是架构与训练目标带来的结构性后果。正确的做法是在系统层补:检索代替记忆、执行代替估算、验证代替信任、外部状态代替上下文内状态。这正是第四部分「Agent 工程」要解决的问题。
上一张卡片我们看到模型会一本正经地胡说(幻觉)。但幻觉只是「看起来懂却不可信」的一种表现;把镜头再拉远一层,还有一批事是这一代大模型在原理上就做不到的——不是提示词没写好,也不是没喂数据,而是它的输入/输出形式、注意力机制、训练数据边界共同决定的。
打个比方:模型只认 token、没学过字符,也没长出手脚——读得再流利,也数不清一句话里有几个字母,更没法替你按下发送键。下面把这类事列成一张清单,并逐条标出「后面哪一课解决它」,它同时就是这一部分的学习地图。
| # | 做不到的事 | 现象(可复现) | 根因 | 去向(哪一课解决) |
|---|---|---|---|---|
| 1 | 字符级计数与精确算术 | 让模型数 strawberry 里有几个 r,会常常出错 | 模型看到的是 token,不是字符 | 《工具调用》——把计数与算术外包给代码执行 |
| 2 | 长上下文的「中间遗忘」 | 关键信息放中段,回答质量明显下降 | 注意力对首尾有偏好(U 形曲线) | 《记忆与 RAG 工程化》 |
| 3 | 知识停在训练截止日 | 不知道训练之后的事,也不知道你的私域文档 | 知识冻结在权重里,更新要重训 | 《记忆与 RAG 工程化》 |
| 4 | 多步推理累积误差 | 单步 95% 对,十步之后常常做不完 | 误差乘性累积,且不会自我纠正 | 《推理模型与 RLVR(用可验证奖励做强化学习)》《从 Prompt 到 Agent》 |
| 5 | 不能自己动手 | 不会真的发邮件、查数据库、下单 | 模型只输出文本,动作靠外部执行 | 《工具调用》 |
| 步数 | 单步 95% 正确 | 单步 99% 正确 | 算式 |
|---|---|---|---|
| 1 步 | 0.950 | 0.990 | —— |
| 5 步 | ≈0.774 | ≈0.951 | 0.95⁵ |
| 10 步 | ≈0.599 | ≈0.904 | 0.95¹⁰ |
| 20 步 | ≈0.359 | ≈0.818 | 0.95²⁰ |
| 关键信息放的位置 | 模型用得怎么样 | 原因 |
|---|---|---|
| 开头(首因) | 好 | 最先被注意到 |
| 中间 | 最差 | 被大量内容稀释,容易被跳过 |
| 结尾(近因) | 好 | 离生成位置最近 |
这五条的共同点是:没有一条能靠「换个更好的提示词」解决。字符级问题要把计算外包给代码执行,知识截止要靠检索、记忆要靠外部存储,多步误差要靠推理模型与外部校验,动手能力要靠工具调用。所以这张卡既是「能力边界清单」,也是这一部分的学习地图——每条边界的正下方,都压着后面某一课。