全栈一览
本书很长,如果一开始只看目录,很容易把它读成一串互不相干的技术。这里先给读者一条可以反复回到的线索:一个寻常请求,从开放网络上的原始文本出发,一直走到最后作答的已部署智能体,沿途每一步落在哪一层、归哪一章。这里不求深入,只求定向;出现的每个机制都只是一个前向指针,具体内容留给它自己的章节。
为此,我们只围绕一个任务展开:一个用户请求助手在一个小型仓库里找出 bug、提出修复,再解释一遍。 这一个请求,触及本书覆盖的每一层。与其抽象地逐层介绍,不如跟着它走一遍,把它经过的每一层都看成一个环节;这样更容易看清这套栈为何形成现在的形状。还有两个模型贯穿这条线索,选它们,是因为它们用相反的工程回答了同样的问题:Llama 3 是稠密 Transformer(也就是那套标准的模型架构,详见 第 8 章)(Grattafiori and others 2024),DeepSeek-V3 是混合专家(MoE)模型,也就是每个词元只激活少数专家子网络的模型 (DeepSeek-AI 2024)。两条谱系后来都归到了稀疏一侧:Meta 的第一个混合专家家族 Llama 4 于 2025 年 4 月发布 (Meta AI 2025),DeepSeek-V4 也在 2026 年 4 月跟进 (DeepSeek-AI 2026);这一归并本身,就是本章后面那条下层约束给出的裁决。
环节一:从网络字节到词元
这个任务在用户敲下请求之前就已经开始:起点是一份语料。日后会读取仓库的那个模型,是从数万亿词元里学会代码长什么样的;这些词元从网络和公开仓库抓取而来,再经过过滤与去重。Llama 3 最大的模型在 15.6 万亿词元上预训练 (Grattafiori and others 2024),DeepSeek-V3 用了 14.8 万亿 (DeepSeek-AI 2024)。但真正重要的不是这些数字,而是原始字节在被算作一个词元之前要经过的那些处理:来源筛选、质量过滤、近似去重,还要针对模型日后受评的基准做去污染。这些工作由 第 6 章 展开。至于如何把过滤后的字节流变成模型真正消费的整数词元,以及那张词表如何决定一个变量名或一句中文从何处切分,则留给 第 7 章。
环节二:基座模型形成,把算力转化为模型
有了一条词元流,第一段大规模过程就是预训练:算力被用来最小化下一词元损失,并产出一个基座模型。说穿了,就是让模型去猜下文的下一小段,这一猜偏了多少,就是它要训练着压下去的损失。固定预算下该训多大的模型、喂多少词元,是 第 5 章 的问题:它最初被写成一组幂律,把损失同模型规模、数据和算力联系起来 (Kaplan et al. 2020),后来又收紧为参数与词元之间的算力最优平衡 (Hoffmann et al. 2022)。至于网络本身由什么搭成,也就是注意力、残差流和归一化,可以一直追到最早那篇 Transformer (Vaswani et al. 2017),这是 第 8 章 的主题。
到这里,两个贯穿全书的例子已经出现分化,而这道分化正是全书的缩影。Llama 3 的 405B 模型是稠密 Transformer,每个参数都参与每个词元 (Grattafiori and others 2024)。DeepSeek-V3 是混合专家模型,总参数 671B,每个词元却只激活 37B,再配上多头潜在注意力(MLA)(多头潜在注意力)这种压缩推断时缓存的注意力设计 (DeepSeek-AI 2024)。稠密还是稀疏,这道选择留给 第 9 章。把其中任一训练作业铺到数千个加速器上运行,既不让训练发散、也不让硬件空转,是 第 10 章;DeepSeek-V3 的 FP8 混合精度配方,连同它全程 278.8 万 H800 GPU 小时的训练量,也都在那一章 (DeepSeek-AI 2024)。
许多现代训练不会从这个宽泛基座直接跳到后训练,而是插入一段 中段训练(mid-training):后期高质量退火、代码或数学的专门混合、指令格式的下一词元数据,或者长上下文扩展。这座桥放在 第 11 章。它仍属于基座构造,因为它改变的是模型在适配开始前已经内化的分布。
环节三:适配让模型学会执行任务
基座模型只会预测文本的合理续写,还不会执行修 bug 这个任务。把一个下一词元预测器,变成会遵循指令、尊重行为规格、拒绝有害请求,并在任务允许时使用可验证奖励的系统,这就是适配,是继基座模型形成之后的第二大开销。在示范数据上做监督微调(SFT),是 第 17 章。偏好数据背后的制度,是 第 18 章。从人类或自动的偏好信号里学习,分两条路:一条走奖励建模加策略优化,一条走跳过显式奖励模型的直接偏好,分别留给 第 19 章 和 第 20 章。安全调优与指令层级是 第 22 章。教模型在落定答案前先花一些词元来思考,再决定这份思考该由提示引出、由搜索组织、由验证器筛选、由数据蒸馏,还是在推断时逐请求付费,这条线就是第四部分,从 第 24 章 一直走到 第 30 章。
环节四:服务把权重转化为一项服务
到这一步,模型已经就绪,用户也敲下了请求。可把它服务出去,本身就是一门工程学科,因为训练好的模型只是一堆权重,还不是一项服务。核心矛盾在于:生成是内存受限的,而 KV 缓存(key-value cache)(键值缓存)随每个词元不断变大,这正是 第 31 章。把许多用户请求合到一起、再给缓存分页,是 第 32 章。一次前向里解码不止一个词元,是 第 33 章。用更低的精度让每个权重、每条缓存项更便宜,是 第 34 章。
环节五:智能体循环形成
最后,循环形成。助手不会光凭记忆来回答这份 bug 报告。它读文件、跑测试套件、看到失败、动手修改、再重跑,一步一步交替进行观察与动作。这套控制结构是 第 38 章,驱动它的运行时是 第 41 章,而把该读的文件拉进上下文窗口的那层检索,是 第 44 章。至于在这个有限的窗口里该留下什么、又该总结或丢掉什么,是 第 46 章。
把这道纵切面画成对整个栈的一次穿行,就是 图 1.2。
一次穿行之后:三个嵌套的循环
上面的环节在空间上一层接一层排开,但这套栈同时也在时间中运行,而它的时序里有一个会在全书反复出现的结构。这套栈由三个嵌套的循环搭成,每个循环都是一种控制结构,靠消耗算力来削减一种不同的误差。
训练循环在一份语料上运行,靠梯度下降调整权重,把损失压下去。它只付一次费,跑上数周,产出一个工件。推断循环在一个提示上运行,从冻结的权重里一次生成一个词元。它每个请求都要付费,而且永远如此,这正是为什么每词元一分钱的零头,就能决定一个产品的经济性。智能体循环在一个环境上运行,交替地调用模型和工具,直到任务完成。它把许多次推断循环包含在一次可交付任务里,也正是在这里,模型不再只是文本预测器,而开始成为基础设施。
这种包含关系本身就是要点,图 1.3 把它画了出来。训练循环只运行一次,冻结出一个工件。推断循环读取这个冻结的工件,每个请求都要付费。智能体循环把许多次推断循环包含在一次可交付任务里。先看清一次、每请求、每任务这三种付费节奏,下面那条下层约束才容易理解。
这些循环并非各自独立。本书最有用的洞见,恰恰在于其中一个怎样影响另一个的设计。
最清晰的例子就出现在最底下那一层。预训练的经济账看上去是说:给定一个固定的训练预算,挑那个让损失最小的模型规模 (Hoffmann et al. 2022)。可一个一生要服务数十亿词元的模型,反而应当做得更小、再刻意过度训练,因为推断循环要永远付费,训练循环只付一次。第 31 章 里的服务成本会沿栈向上影响一个看上去纯属预训练的决策,也就是 第 5 章 的主题。DeepSeek-V3 的混合专家设计,是把同一条约束写进硬件:每个词元只在 671B 里激活 37B,让推断循环保持便宜,代价则改用训练和服务的复杂度来付 (DeepSeek-AI 2024)。按顺序读这套栈,才看得清这些约束关系。
试着把这条约束关系落到实处:给每个设计算一次训练 FLOPs(算术运算的次数),再按服务出去的每个词元算一次推断 FLOPs。两笔账都随激活参数走,所以无论服务量多大,稀疏设计在两个循环里都更便宜;这里记给 DeepSeek-V3 的约 训练 FLOPs,与环节二提到的 278.8 万 H800 GPU 小时正好对得上。MoE 付出的不是 FLOPs,而是内存、路由与通信:671B 参数要全部驻留在加速器内存里,每个词元才能从中激活自己的 37B,也就是上面框注点出的那种复杂度。
import numpy as np
import matplotlib.pyplot as plt
# 两种能力相当的设计,各自的生命周期 FLOPs。
# 两个循环都随激活参数走:训练约为 6*N_act*D(只付一次);
# 推断约为每服务一个 token 2*N_act。总参数 N 决定的是内存账单
# 而非 FLOPs 账单:所有专家都必须驻留。
designs = {
"Llama 3 405B dense": dict(N=405e9, N_act=405e9, D=15.6e12),
"DeepSeek-V3 MoE 37B": dict(N=671e9, N_act=37e9, D=14.8e12),
}
served = np.logspace(11, 16, 200)
for name, d in designs.items():
train = 6*d["N_act"]*d["D"]
plt.plot(served, train + 2*d["N_act"]*served, label=name)
print(f"{name}: 训练约 {train:.1e} FLOPs,"
f"服务约 {2*d['N_act']:.1e} FLOPs/token")
plt.xscale("log"); plt.yscale("log")
plt.xlabel("生命周期内服务 token 数"); plt.ylabel("总 FLOPs")
plt.legend(); plt.tight_layout(); plt.show()
评判任一环节:能力、效率、信任
三个循环讲的是这套栈怎么运行,第二条主线讲的是怎么评判其中的任一决策。本书里的每一项技术,改变的都是三样东西的某种组合,而且往往要拿一样去换另一样。
能力是系统到底能不能完成任务:模型找不找得出 bug、跟不跟得上多步计划、推不推得出修复。效率是这份能力在算力、内存、延迟和金钱上要付的代价。信任是能不能把结果部署出去并放心依赖:它正不正确、安不安全、是否如实表达不确定性、可不可度量。DeepSeek-V3 和 Llama 3 都在争同一件事:把能力往上推,同时把成本往下压,而混合专家模型是偏向效率的一种设计,每激活一份参数就换来更多能力 (DeepSeek-AI 2024)。炒作周期总会忘掉信任,运维者却不能。智能体到底有没有真把 bug 修好,而不是产出一个表面合理、却弄坏了另一个测试的补丁,这要靠度量:第 47 章 讲一个静态分数能说明什么、又不能说明什么,第 48 章 讲观察到的差距是否真的站得住,第 51 章 讲流畅输出是否有证据支撑,第 52 章 讲怎么给一条多步轨迹打分,第 55 章 讲怎么把一个有能力的系统约束在它的边界内。至于把能力和效率系到用户愿意付的价格上的那本经济账,是 第 76 章。
图 1.5 把这副视角放到那两个贯穿全书的模型上。两者都在争能力,但混合专家模型用更少的激活 FLOPs 就达到了同样的能力,于是向效率那个顶点靠拢;而在有评测度量它们各自产出的补丁之前,两者都还谈不上可信。
各章收尾时,都会回到同一个判断:这项技术对能力、效率、信任各做了什么。把这副视角用于那个贯穿全书的任务,就能看到同一个权衡:稠密模型和稀疏模型可以达到同样的能力,稀疏的那个只用更少的激活 FLOPs,而在有评测度量它产出的补丁之前,两者都还谈不上可信。
从这里如何往下读
下一章 第 2 章 会铺开这道纵切面穿过的整个领域,给各个部分起名、讲它们如何相连,让上面那些前向引用解析成一张地图。再往后,本书就顺着这道纵切面走:先是数据与架构,然后是训练、适配与推理,再是服务,再是智能体,最后是把这一切撑起来的评估、治理与基础设施。读者可以顺着这个次序一路读下去,也可以直接跳到当前问题所在的章节,再借交叉引用回到主线。只要记得这次端到端的穿行,就不会把眼前那一层误读成故事的全部。
延伸阅读
- DeepSeek-AI, “DeepSeek-V3 Technical Report,” 2024. arXiv:2412.19437
- Grattafiori & others, “The Llama 3 Herd of Models,” 2024. arXiv:2407.21783
- Kaplan et al., “Scaling Laws for Neural Language Models,” 2020. arXiv:2001.08361
- Hoffmann et al., “Training Compute-Optimal Large Language Models,” 2022. arXiv:2203.15556
- Vaswani et al., “Attention Is All You Need,” 2017. arXiv:1706.03762
评论
登录后评论