跳到主要内容

书里这一版和你今天打开的源码差在哪 — 八处差别,每处配一个可回核的地址

这一章讲一件事: 第 16 章那套「原汁原味」的编码器, 和你今天打开任何一个大模型源码看到的版本,差在哪八处。

它在全书链条里的位置: 第 16 章是底版,这一章是对照表; 第 20 章搭那个会写字的小模型时,会直接采用这一章的几处改造。

需要的基础: 第 16 章的组块结构;第 13 章的层规范化。

一个诚实声明:八处里只有五处是书里讲的(第 2、5、7、8、9 节); 第 3、4、6 节书里没提,是我们从书架里的源码补的,每一节开头都标了出处类别。

1. 先看现象:对着源码读书,前五段就对不上

第 16 章的组块长这样:正余弦位置编码加在输入上、先加再规范(Post-LN)、 逐位前馈是「升维 → 折线 → 降维」两个投影。

打开今天任何一个主流大模型的源码——书里点了三个名字:Llama、Qwen、GPT—— 你会发现几乎没有一处对得上1

书里自己用一节做了梳理,原话是: Transformer 架构后来经历了多轮工程化迭代, 许多大模型采用的已是经过改造的现代版本;本节挑出影响最深远的几个改造做一次梳理1

全章主走查:同一个组块,从第 16 章那一版改到今天那一版
═══════════════════════════════════════════════════════════════════
第 16 章那一版 今天那一版
───────────────────────────────────────────────────────────────────
§2 先加再规范(Post-LN) → 先规范再加(Pre-LN) [书]
§3 减均值、除标准差 → 不减均值,只除均方根 [书架]
§4 前馈层两个投影 → 前馈层三个投影 [书架]
§5 位置加在输入上 → 位置旋进查询和键里 [书]
§6 每个查询配一组键值 → 几组查询共享一组键值 [书架]
§7 编码器-解码器两半 → 只留解码器那一半 [书]
§8 一个大的逐位前馈层 → 一组小前馈层 + 一个分派器 [书]
§9 注意力按 N² 算 → 分块算 + 只看近处 [书]
═══════════════════════════════════════════════════════════════════
[书]=书里 8.4 节讲的;[书架]=书里没提,我们从源码补的

顺手钉两个后面要反复用到的词:稠密——张量里每一格都实打实存着一个数、没有大片空位的结构;第 16 章的逐位前馈层就是稠密的。

它的反面叫稀疏——绝大多数格子是 0、只存少数非零值;这个词到第 9 节(省计算的开销)和第 19 章(省显存)会各自再出场。

2. 差别一:规范化挪到直连边之前(书里)

第 16 章的写法是先加再规范:H = LN(H + X)。这叫 Post-LN。 今天的写法是先规范再加:x ← x + Sublayer(LN(x))。这叫 Pre-LN2

看似只是换了一处规范化的位置,但在层数很深时影响巨大3:

  • Post-LN 容易出现梯度爆炸/消失,必须配合细致的预热才能稳定训练;
  • Pre-LN 则形成清晰的「残差流」—— 输入沿直连边从第一层直达最后一层,中间不被任何规范化改写, 训练稳定性强、对学习率不敏感、不需要繁琐的预热设计3

对照第 16 章第 6 节那道思考题:「Pre-LN 更容易训练,但 Post-LN 上限更佳」—— 书里在这里给出了工业界的答案:稳定压倒上限,现代大模型几乎全部改用 Pre-LN3

3. 差别二:规范化本身也换了更省的一种(书架补的)

这一节是补充(不在书里,依据我们的 frontier 书架)。书里只讲了 LN,没讲它的替代品。

第 13 章的层规范化做两件事:减均值、除标准差。 今天的源码里,规范化只做一件:除以一个「平方的平均再开方」—— 不减均值。这种做法叫均方根规范化(RMSNorm)4:

层规范化(第 13 章) x̂ = (x − 均值) / 标准差
均方根规范化 x̂ = x / √(平方的均值)
────────────────────────────────────────────────
省掉「减均值」这一步,也少维护一份均值统计

为什么省得掉? 第 13 章说过,规范化的目的是把数值的「刻度」稳住; 而刻度主要由「平方的均值」决定,均值那一项的贡献很小——砍掉它, 效果接近,计算与内存访问都更省。(这一句是我们对动机的概括,书里与源码注释都没有展开。)

Llama 源码里这个类就叫 LlamaRMSNorm, 它的前向只有两行核心:先算平方的均值,再乘上均方根的倒数——整段没有减均值4

4. 差别三:前馈层从两个投影变成三个(书架补的)

这一节同样是补充(不在书里,依据我们的 frontier 书架)。

第 16 章的逐位前馈是两个投影:升维一个、降维一个。 今天的前馈层是三个投影5:

第 16 章那一版 FFN(x) = W₂ · 折线(W₁·x)
今天那一版 FFN(x) = 降维( 激活(门控(x)) ⊙ 升维(x) )
────────────────────────────────────────────────
多出来的「门控」那一支:
它不过是一个投影加一道激活,输出与升维支逐元素相乘——
相当于给每一维特征装一个「开多少」的闸门

「乘一个 0 到正无穷的数来决定放多少过去」这个结构,你在第 11 章见过—— 三道门用的就是同一个思路,只是那次的门在时间上,这次的门在特征上。 这个结构的名字叫门控前馈层(也常按激活函数叫 SwiGLU 一族)。

Llama 源码里,这一层的构造函数里排着三个投影: gate_projup_projdown_proj, 前向正是「激活(门控(x)) 乘 升维(x),再降维」5

5. 差别四:位置不加到输入上,旋进查询和键里(书里)

第 16 章把位置编码按位置加到输入向量上。 今天的做法(Llama、GPT-NeoX 等选用的方案)是把查询和键向量直接在平面上转一个角度6: 这种方案叫旋转位置编码(Rotary Position Embedding,缩写 RoPE)。

把 d 维向量按相邻两维分成 d/2 对
第 i 对在 2D 平面上旋转角度 m·θᵢ
m 是位置编号,θᵢ = 10000^(−2i/d)
────────────────────────────────────────────────
一个四维例子(按书里的公式算):
第 1 对转 m·1 弧度,第 2 对转 m·0.01 弧度
——不同维度转不同的角速度,与第 16 章的正余弦同出一辙

注意它只旋查询和键,值不旋7——因为位置只需要影响「谁和谁匹配」, 不需要影响「匹配之后取走什么」。

先钉两个马上要用的词:外推——在比训练时见过的更长的序列上继续正常工作;第 9 节讲长上下文时它是主角。

实现外推的常见手段是插值——把位置频率按比例缩放,让旧位置平滑地映射进没见过的范围;书里点名的 NTK、YaRN 都属这一族。

书里给了三条好处8:

  1. 相对位置自然成立——旋转后任意两个词元的注意力打分只取决于它们的相对距离, 不受绝对位置影响;
  2. 长上下文外推友好——训练时只见过较短序列, 推断时可借助 NTK 插值、YaRN 等手段外推到长得多的上下文 (「外推」就是「在没见过的长度上继续用」);
  3. 零额外参数——纯几何变换,不占用任何可学习参数。

6. 差别五:几组查询共享同一组键值(书架补的)

这一节同样是补充(不在书里,依据我们的 frontier 书架)。

第 15 章的多头是「每个头各有一份查询、键、值」。 层一多、头一多,键和值的存储与读取就成了大头——尤其推断时要一直留着它们。 今天的源码里常见的省法:键和值只用少数几组, 多组查询共享同一组键值9

第 15 章那一版 8 个头 = 8 组 Q + 8 组 K + 8 组 V
今天这一版 8 个头 = 8 组 Q + 2 组 K + 2 组 V
——每 4 组 Q 共享 1 组 K、V
────────────────────────────────────────────────
这个做法叫分组查询注意力(GQA);
极限情形只剩 1 组键值,叫多查询注意力(MQA)

Llama 源码里有一个专门干这件事的函数 repeat_kv: 把「(批, 键值头数, …)」的张量沿头维复制扩展成「(批, 查询头数, …)」—— 几组查询就这样共用同一组键值9

省的是什么? 推断时要把所有层的键和值一直留在显存里, 键值组数砍成四分之一,这部分显存就砍成四分之一—— 这与第 9 节要讲的「读更长的文字」是同一场战争的两条战线。

7. 差别六:三种搭法,大模型只留了中间那种(书里)

Transformer 家族有三种典型架构:只读的编码器、只写的解码器(负责一个字一个字往外写的那一半)、以及两半都留的搭配。书里给了一张对照表10:

搭法典型模型注意力适用任务
只留编码器BERT、RoBERTa双向(全局)理解:分类、抽取、检索
只留解码器GPT、Llama、Qwen因果(单向)生成:续写、对话、推理(按上文一步步想出答案的任务)
编码器-解码器原始 Transformer、T5、BART双向 + 因果 + 交叉序列到序列:翻译、摘要

「解码器」就是这种结构里负责「一个字一个字往外写」的那一半—— 第 16 章只用了「读懂」的那一半;第 20 章会只用「写」的这一半。 「因果(单向)」的意思是:每个位置只许看自己左边的词元,不许看右边—— 第 20 章会专门讲这条约束。

从理论容量看,编码器-解码器组合的表达力更强; 但书里给了工程上偏向只留解码器的四条理由11:

  1. 结构最简——所有词元共享同一套参数,工程实现最直观;
  2. 训练目标统一——「猜下一个词元」可以直接吃任意原始文本,不需要平行语料;
  3. 使用方式统一——一个模型用几个示例的提示即可覆盖大部分任务;
  4. 推断高效——自回归(吐一个词元、把吐出的接回去继续)生成天然适合把算过的键值存下来复用。

8. 差别七:一个大的前馈层,换成一组小的加一个分派器(书里)

随着模型规模膨胀,稠密结构的计算量跟着参数同步涨。 混合专家(MoE,即 Mixture of Experts 的缩写)的解题思路是:把单一大前馈层替换成一组小前馈层 + 一个路由器—— 每个词元动态挑选其中 1~2 个参与计算12:

一个 token 进来


路由器(一个小投影)给 E 个专家各打一个分


只留分数最高的 1~2 个专家(其余分数归零)


输出 = Σ 归一化后的分数 × 被选中专家的输出
────────────────────────────────────────────────
演示:4 个专家,某 token 得分 [0.5, 0.1, 0.3, 0.1]
→ 只走专家 1 和 3,权重归一化为 [0.625, 0.375]
(这组分数是为演示编的,不是真实数值)

关键账本:总参数是全部专家的和,但每个词元只激活 1~2 个—— 激活参数远小于总参数,在保持模型容量的同时控制单步计算量12。 书里的代表模型:Mixtral 8x7B(8 个专家,每个词元选 2 个)、DeepSeek-V312

书里也给了真实训练的三个工程难点13: 负载均衡(要加约束,避免所有词元都路由到同一个专家)、 分布式通信(专家在不同显卡上,路由引入大量数据交换)、 专家容量(每个专家有吞吐——单位时间能处理的词元量——上限,超出部分被丢弃)。

9. 差别八:注意力不再按 N² 硬算(书里)

注意力的真正瓶颈来自 N²:序列变长,每个位置都要看所有位置, 计算量和显存都随之爆炸。书里的优化思路分两层14:

算法层——稀疏注意力:让大多数位置对根本不算14:

  • 滑动窗口:每个词元只关注前后 w 个邻居(代表 Longformer、Mistral);
  • 扩张窗口:注意力窗口按层次扩张,兼顾局部和全局(代表 LongNet);
  • 压缩注意力:把远距离上下文压缩成少量摘要词元(代表 Compressive Transformer)。

系统层——数学语义不变,只是不在显存里存那张 N×N 的大表(FlashAttention)15:

把 Q、K、V 沿序列维拆成小块
逐块算注意力,用一种「在线归一化」技巧滚动更新中间结果
中间结果常驻显卡的片上高速内存,不碰显存
────────────────────────────────────────────────
IO 开销显著降低,端到端速度通常提升 2~4 倍

PyTorch 2.0 之后,这个优化已经集成进一个内置函数, 对受支持的硬件会自动启用16—— 所以部署时调内置接口(框架预留好的调用入口),比手写注意力矩阵乘法快得多17

长上下文在推断时还有一件配套的事:逐字往外写的时候, 前面位置算过的键和值其实不用重算——存下来就行。 这件事第 20 章第 7 节讲。

10. 作者的判断与证据

书里给了梳理、但明确是「介绍现状」而非实验的: 这一节通篇没有实验,五处改造(第 2、5、7、8、9 节)都是书里对工业界现状的总结1其中给出具体数字的只有两处:FlashAttention 的 2~4 倍提速15、 Mixtral 的 8 选 212——都是转述,不是书里跑的。

我们补的三处(第 3、4、6 节),证据是书架里的源码本体, 每一处都给了可以直接跳过去回核的文件与行号459

判断(我们的,不是书里的):这一章是全书信息密度最高的一章,也是最容易读成「清单」的一章。 八处差别其实只有两条主线。 第一条是「让深度便宜」:第 2、3、4 节——规范化挪位、砍步骤、前馈加门, 都在让同样的层数训得更稳、算得更省; 第二条是「让长度便宜」:第 5、6、9 节——位置旋进去、键值共享、分块(把长序列切成小段逐段处理)算, 都在让更长的序列进得来。 第 7、8 节是这两条的合流:只留写的那一半、把大层换成小队。 如果错,会错在: 第 8 节的 MoE 归为「合流」是我们的解读, 它同样可以被读成「让宽度便宜」。判据是:MoE 省的是单步计算量还是内存——是前者,所以归「便宜」主线成立。

11. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
六处改造的消融实验(逐项关掉一个部件、看成绩掉多少)书里一节之内全部只作梳理,无实验1
NTK 插值、YaRN 的细节书里只点了名8
交叉注意力(编码器-解码器之间那一层)表里只点了名10;本书不做翻译任务,用不上
路由器怎么训书里只给了最小可运行实现与三个难点13
FlashAttention 的「在线归一化」具体怎么滚动书里只给了思路15

出门会撞见的名字:

  • Pre-LN / Post-LN —— 第 2 节;
  • RMSNorm —— 第 3 节,Llama 源码里 LlamaRMSNorm4;
  • SwiGLU / 门控前馈(gated FFN) —— 第 4 节5;
  • RoPE(旋转位置编码) —— 第 5 节6;
  • GQA / MQA —— 第 6 节:几组查询共享一组键值的做法叫分组查询,极限到只剩一组时叫多查询9;
  • encoder-only / decoder-only / encoder-decoder —— 第 7 节10;
  • MoE(混合专家)、top-k 路由 —— 第 8 节12;
  • 稀疏注意力、FlashAttention、scaled_dot_product_attention —— 第 9 节16

12. 可带走的

  1. 今天的大模型几乎全部用 Pre-LN——稳定压倒上限;
  2. 规范化可以只除均方根、不减均值——效果接近,更省;
  3. 前馈层多一个「门控」投影——和第 11 章三道门同一个思路,只是门在特征上;
  4. 位置信息旋进查询和键里,不加到输入上;值不旋;
  5. RoPE 打分只看相对距离,所以外推到更长的序列更友好,而且零参数;
  6. 键值可以只有几组、查询共享——省的是推断时一直留着的那块显存;
  7. 三种搭法里大模型只留解码器——四个理由全是工程理由,不是容量理由;
  8. MoE 的账本是「总参数大、激活参数小」;它有三个工程难点,负载均衡排第一;
  9. N² 的解药有两层:算法层少算(稀疏)、系统层换个算法同样的算(FlashAttention);
  10. 内置的 scaled_dot_product_attention 自动启用 FlashAttention——部署别手写。

13. 原文地图

主题原书章原文位置
八处的由来第8章 注意力机制text/09-ch08.txt:2138(搜「多轮工程化迭代」)
Pre-LN第8章 注意力机制text/09-ch08.txt:2148(搜「几乎全部改用 Pre-LN」)
残差流第8章 注意力机制text/09-ch08.txt:2153(搜「残差流」)
RoPE第8章 注意力机制text/09-ch08.txt:2157(搜「旋转位置编码」)
RoPE 三条好处第8章 注意力机制text/10-ch09.txt:5(搜「相对位置自然成立」)
三种架构范式第8章 注意力机制text/10-ch09.txt:48(搜「三种典型架构」)
为什么只留解码器第8章 注意力机制text/10-ch09.txt:63(搜「从理论容量看」)
MoE第8章 注意力机制text/10-ch09.txt:73(搜「一组小 FFN」)
MoE 三个难点第8章 注意力机制text/10-ch09.txt:121(搜「负载均衡」)
长上下文两层思路第8章 注意力机制text/10-ch09.txt:129(搜「真正瓶颈」)
FlashAttention第8章 注意力机制text/10-ch09.txt:137(搜「分块计算」)

Footnotes

  1. 出处:「第8章 注意力机制」第 2138 段(text/09-ch08.txt:2138,搜「多轮工程化迭代」)。原文:前文实现的是「原汁原味」的 Transformer 编码器——使用正余弦位置编码、Post-LayerNorm 和纯 dense FFN;但 Transformer 架构后来经历了多轮工程化迭代,许多大模型(Llama、Qwen、GPT 等)采用的已是经过改造的现代版本;本节挑出影响最深远的几个改造做一次梳理。注意:书里实际梳理的是五处(Pre-LN、RoPE、三种架构范式、MoE、长上下文),RMSNorm、门控前馈层、GQA 三处书里未提,是本节从书架源码补的。 2 3 4

  2. 出处:「第8章 注意力机制」第 1793 段(text/09-ch08.txt:1793,搜「Post-LN」)。原文:原始 Transformer 采用 Post-LN:x ← LayerNorm(x + Sublayer(x));现代大模型几乎全部改用 Pre-LN:x ← x + Sublayer(LayerNorm(x))。

  3. 出处:「第8章 注意力机制」第 2153 段(text/09-ch08.txt:2153,搜「残差流」)。原文:看似只是换了一处规范化的位置,但在层数很深时影响巨大——Post-LN 容易出现梯度爆炸/消失,必须配合细致的预热才能稳定训练;Pre-LN 则形成清晰的「残差流」(residual stream),训练稳定性强、对学习率不敏感、不需要繁琐的预热设计。 2 3

  4. 补充(不在书里,依据我们的 frontier 书架):均方根规范化只算平方的均值、不减均值。依据: shelf=ai-frontier-reference/transformers@src:src/transformers/models/llama/modeling_llama.py:65 @b6c0bfe04c823a7b2ca48f91b8b91b2a7741f309 事实=LlamaRMSNorm 的 forward 里只有 variance = hidden_states.pow(2).mean(-1, keepdim=True)hidden_states * torch.rsqrt(variance + eps) 两步核心计算,整段没有减均值;类的文档字符串注明它与 T5LayerNorm 等价。 2 3 4

  5. 补充(不在书里,依据我们的 frontier 书架):门控前馈层是三个投影而不是两个。依据: shelf=ai-frontier-reference/transformers@src:src/transformers/models/llama/modeling_llama.py:175 @b6c0bfe04c823a7b2ca48f91b8b91b2a7741f309 事实=LlamaMLP 的 forward 是 down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))——门控投影过激活后与升维投影逐元素相乘,再降维;构造函数里依次定义 gate_proj、up_proj、down_proj 三个线性层。 2 3 4

  6. 出处:「第8章 注意力机制」第 2157 段(text/09-ch08.txt:2157,搜「旋转位置编码」)。原文:旋转位置编码(RoPE)是 Llama、GPT-NeoX 等模型选用的位置编码方案;与正余弦位置编码「加到输入」不同,RoPE 直接对查询和键向量进行旋转来注入位置信息——把 d 维向量按 d/2 对分组,在 2D 平面上各自旋转角度 m·θᵢ(m 为位置索引,θᵢ = 10000^(−2i/d),不同维度对应不同频率)。 2

  7. 出处:「第8章 注意力机制」第 35 段(text/10-ch09.txt:35,搜「分别作用在每一层注意力」)。这是动手练习 8.9:注意 RoPE 的接入位置与正余弦编码不同——正余弦编码是加到输入词向量上,而 RoPE 要分别作用在每一层注意力的查询 Q 和键 K 上(值 V 不旋转)。

  8. 出处:「第8章 注意力机制」第 5 段(text/10-ch09.txt:5,搜「相对位置自然成立」)。原文三条:相对位置自然成立——旋转后任意两 token 的注意力打分仅取决于它们的相对距离,不受绝对位置影响;长上下文外推友好——训练时只见过较短序列,推断时可借助 NTK 插值、YaRN 等手段外推到长得多的上下文;零额外参数——纯几何变换,不占用任何可学习参数。 2

  9. 补充(不在书里,依据我们的 frontier 书架):少数几组键值被多组查询共用。依据: shelf=ai-frontier-reference/transformers@src:src/transformers/models/llama/modeling_llama.py:187 @b6c0bfe04c823a7b2ca48f91b8b91b2a7741f309 事实=repeat_kv 函数把形状 (batch, num_key_value_heads, seqlen, head_dim) 的张量沿头维扩展为 (batch, num_attention_heads, seqlen, head_dim),其文档字符串说明这就是 repeat_interleave 的等价物,即让多组查询共享同一组键值。 2 3 4

  10. 出处:「第8章 注意力机制」第 48 段(text/10-ch09.txt:48,搜「三种典型架构」)。原文表 8.1:Encoder-only(BERT、RoBERTa,双向全局注意力,理解任务——分类、抽取、检索);Decoder-only(GPT、Llama、Qwen,因果单向注意力,生成任务——续写、对话、推理);Encoder-Decoder(原始 Transformer、T5、BART,序列到序列——翻译、摘要)。 2 3

  11. 出处:「第8章 注意力机制」第 63 段(text/10-ch09.txt:63,搜「从理论容量看」)。原文:从理论容量看,encoder-decoder 组合的表达力更强;但从工程视角,decoder-only 具备几个直接优势——1) 结构最简,所有 token 共享同一套参数;2) 训练目标统一,next-token prediction 可以直接吃任意原始文本,不需要平行语料;3) 使用方式统一,结合 in-context learning,一个 decoder-only 模型用 few-shot prompt 即可覆盖大部分 NLP 任务;4) 推断高效,自回归生成天然适合 KV 缓存,吞吐率显著高于 encoder-decoder。

  12. 出处:「第8章 注意力机制」第 73 段(text/10-ch09.txt:73,搜「一组小 FFN」)。原文:随着模型规模膨胀,dense Transformer 的计算量按 O(N·d_model) 迅速增长;混合专家(MoE)的解题思路是——把单一大 FFN 替换成一组小 FFN + 一个路由器,每个词元动态挑选其中 1∼2 个专家参与计算,激活参数远小于总参数,从而在保持模型容量的同时控制单步计算量;代表模型有 Mixtral 8x7B(8 专家,每 token 选 2 个)、DeepSeek-V3 等。 2 3 4 5

  13. 出处:「第8章 注意力机制」第 121 段(text/10-ch09.txt:121,搜「负载均衡」)。这是书里的提醒框,真实 MoE 训练有三个工程难点:负载均衡——必须加 auxiliary loss 约束各专家的 token 使用率,避免所有 token 都路由到同一专家;分布式通信——专家分布在不同 GPU 上,路由会引入大量 all-to-all 通信;专家容量——每个专家的 token 吞吐上限有限,超出部分会被 drop。 2

  14. 出处:「第8章 注意力机制」第 129 段(text/10-ch09.txt:129,搜「真正瓶颈」)。原文:注意力的真正瓶颈来自 O(N²) 复杂度——序列变长时,计算量和显存都会随之爆炸;常见的优化思路有两类——算法层面的稀疏注意力(Sliding Window Attention 每个词元只关注前后 w 个邻居,代表如 Longformer、Mistral;Dilated Attention 将注意力窗口按层次扩张,代表如 LongNet;压缩注意力把远距离上下文压缩成少量摘要 token,代表如 Compressive Transformer)。 2

  15. 出处:「第8章 注意力机制」第 137 段(text/10-ch09.txt:137,搜「分块计算」)。原文:FlashAttention 不改变注意力的数学语义,而是通过分块计算 + 在线 Softmax 避免显存中存放完整的 N×N 打分矩阵——将 Q、K、V 沿序列维拆成大小为 Br、Bc 的块,逐块算注意力并用 online softmax 技巧滚动更新中间结果;中间结果常驻 GPU 片上 SRAM 而非 HBM,IO 开销显著降低,端到端速度通常能提升 2∼4 倍。 2 3

  16. 出处:「第8章 注意力机制」第 145 段(text/10-ch09.txt:145,搜「scaled_dot_product_attention」)。原文:PyTorch 2.0+ 已将 FlashAttention 集成到 scaled_dot_product_attention 里,对受支持的硬件会自动启用。 2

  17. 出处:「第8章 注意力机制」第 149 段(text/10-ch09.txt:149,搜「快得多」)。原文:在实际部署大模型时,调用这个内置 API 要比手写注意力矩阵乘法快得多。