跳到主要内容

Transformer 与文本生成:从数对子到注意力

这一章讲三件事: 「生成文本」这个问题怎么被驯化成「预测下一个标记」;注意力机制到底是什么(它是全书的最高点,我们会从检索三件事一步步搭出来);以及完整 Transformer 解码器块里每个零件分别在解决什么。 位置:Part 2 开门章。前九章的零件——嵌入、线性层、跳连、归一化——在这里全部召回。

1. 生成问题:没有标准答案的学习

1960 年代,MIT 的 ELIZA 程序就能和人「聊天」:你说「I am sad」,它回「Why are you sad?」——认关键词、套固定句式。很多人被骗了,但它对对话内容一概不懂:同一句话,不管你前面解释过什么,它都那样回1

ELIZA 的短板指出了生成和前几章的本质差别:分类有标准答案(鸟或飞机),回归有目标数值,而生成的输出理论上有无穷多个——「像样的名字」没有一张标准答案表。这类任务的出路是换目标:不学「正确答案是什么」,改学训练数据本身的分布,然后从这个分布里采样(按分布里各候选的概率随机抽一个)出新的、像模像样的样本。这类模型叫生成模型(generative model:学出数据的分布、能从中造新样本的模型)2

文本生成被进一步驯化成一个具体形式:给定前面所有标记,预测下一个标记的概率分布(给词表里每个候选各配一个「多大可能」的数,全部加起来正好是 1),从里面抽一个,接上去,再来一遍。 「抽一个」就是照着这组数掷一次骰子——数大的容易被抽中,数小的偶尔也能中。

这就是第 01 章 GPT-2 演示的那件事。这种「一个接着一个、后一个依赖前一个」的生成方式有个名字,叫自回归(autoregressive)2

2. 主走查第一棒:bigram,数出来的名字

任务:生成像样又虚构的英文人名。数据是美国社保局公布的 31915 个婴儿名字。词汇表 27 个符号:26 个小写字母加 $(名字的开始/结束标记)。名字「ada」就是序列 [0, 1, 4, 1, 0](0 是 $)3

最朴素的生成:每个字母等概率瞎抽,出来的是 zrcgahwsalcydnvq——不可读也不可读出来3

改进一:bigram 模型——数遍所有名字,统计「每个字母后面各接过什么字母」,得到一张 27×27 的概率表;生成时,看上一个字符是几,就从表的第几行抽下一个。生成结果:liahulideiannnisclde——能读了,但还是不像名字4

bigram 撞墙的地方值得细看,因为它是后面所有升级的理由4:

  • 组合爆炸:27 个字符有 27²=729 对——还行;但看前两个字符就要 27³=19683 项;换成几十万词的词表,「前两个词」就是天文数字。
  • 数据稀疏:绝大多数组合从来没在数据里出现过,概率表一大片零,零的地方模型无话可说。

而且注意这里发生了一件范式转移的事:训练数据没有「标注」。 输入是 $ada,目标就是错位一格的 ada$——标签从数据自己身上长出来。前几章那种「人给每张图标好类别」的学法叫监督学习;这种「答案本来就写在数据里、只需换个看法」的学法叫自监督(self-supervised)。它是大模型时代最重要的一个词:人工标注贵且慢,自监督让全部互联网文本都变成训练材料5

3. 第二棒:嵌入 + 线性层,参数不再随词表爆炸

第 03 章的嵌入在这里正式上岗:每个字符不再是孤零零的编号,而是先查表换成一串浮点数(书里演示用 3 维),这张表本身是参数、跟着任务一起学6

模型(书里叫 SequenceMLP):对序列里每个位置,取「开头到该位置」的前缀 → 每个字符查嵌入 → 拉直 → 线性层 → ReLU → 输出 27 个 logits(第 07 章定义过:softmax 之前的裸分数)。损失 2.61→2.34,生成的名字:jatiniceneykeisvta——形态和长度都像名字了6

副产品漂亮:训练后的 3 维嵌入画出来,元音聚成一堆、辅音聚成一堆、$ 独自站远处——没人告诉它什么是元音,这是「在名字里的用法」相似被学成了「位置相近」6。第 03 章那句「意思变距离」第一次有了肉眼可见的样子。

4. 注意力:让每个位置自己去查前文

嵌入+线性层还有个结构性缺陷:同一个字符,不管出现在哪,嵌入都一样——「car」里的 a 和「care」里的 a 发音不同、作用不同,静态嵌入没法区分7。我们需要一个能「看场合」的机制。

先给直觉:聚光灯与检索

书里的比喻是剧场的聚光灯:没有注意力时,灯光均匀洒在所有人身上;有了注意力,灯跟着当前最重要的角色走7

机制本身借的是信息检索的三个词。查询(query):这个位置「在找什么」;(key):每个位置「我有什么」;(value):匹配上了之后,真正被取走的内容。Google 搜索就是这套:你的查询文本,对上网页的索引,返回的是结果7

自注意力(每个位置自己给别的位置打分)的四步,带数走一遍

自注意力(self-attention:序列自己查自己)的完整流程8:

输入:每个位置先带着自己的嵌入(比如 3 维)
① 每个位置的嵌入,分别过三组可学习的线性层,得到它的 Q、K、V 三份向量
② 对每个位置 n:拿它的 Q,去和每个位置 m 的 K 做点积(对应分量相乘再相加,
越大越「匹配」)——得到 n 对所有 m 的一排打分
③ 这排打分过 softmax,变成总和为 1 的权重——这就是「注意力权重」
④ 位置 n 的新表示 = 所有位置的 V 按这组权重加权求和

图说:每个位置都在问「前文谁跟我有关」,按相关程度把别人的内容掺进自己。
全部操作都是矩阵乘和 softmax——可微,能进训练机器。

拿「john」把四步走一遍,每步带数

骨架有了,现在填数。下面这组数是为演示编的,不是书里的实测值——书里对「john」只印了一张热图(没有数字),但热图的方向是实测的:处理到 o 时,权重最高给 o 自己,其次是开头的 $,再其次是 j9。下面这组数就是照这个方向编的,前后对得上,你可以拿计算器逐行核。

场景:序列是 $ j o h n,正在处理第 3 个位置的 o。因果掩码管着,它只看得见 $jo 三个位置(hn 排在它后面,不许偷看)。嵌入是 3 维的。

① 各自过三组线性层,拿到 o 位置的 Q,和三个可见位置的 K:
Q(o) = [ 1.0, 2.0, -1.0]
K(o) = [ 0.6, 1.2, -0.6] K($) = [ 0.3, 0.7, -0.4] K(j) = [ 0.2, 0.2, -0.2]

② 点积打分(对应分量相乘,再全部相加):
Q(o)·K(o) = 1.0×0.6 + 2.0×1.2 + (-1.0)×(-0.6) = 0.6 + 2.4 + 0.6 = 3.6 ← 自己
Q(o)·K($) = 1.0×0.3 + 2.0×0.7 + (-1.0)×(-0.4) = 0.3 + 1.4 + 0.4 = 2.1 ← 开头标记
Q(o)·K(j) = 1.0×0.2 + 2.0×0.2 + (-1.0)×(-0.2) = 0.2 + 0.4 + 0.2 = 0.8 ← j

③ 除以 √d(这里 d=3,√3≈1.732),再过 softmax(每项取 e 的幂,再各自除以总和):
3.6 ÷ 1.732 = 2.08 → e^2.08 = 8.00 → 8.00 ÷ 12.95 = 0.62
2.1 ÷ 1.732 = 1.21 → e^1.21 = 3.36 → 3.36 ÷ 12.95 = 0.26
0.8 ÷ 1.732 = 0.46 → e^0.46 = 1.59 → 1.59 ÷ 12.95 = 0.12
(总和 12.95 = 8.00+3.36+1.59;三个权重加起来正好 1.00)

④ 按这组权重把三份 V 混成 o 这一步的新表示:
V(o) = [ 0.9, -0.2, 0.4] V($) = [-0.5, 0.8, 0.1] V(j) = [ 0.2, 0.3, -0.7]
新表示 = 0.62·V(o) + 0.26·V($) + 0.12·V(j)
= [0.558-0.130+0.024, -0.124+0.208+0.036, 0.248+0.026-0.084]
= [ 0.45, 0.12, 0.19]

图说:进去的是 o 那份「跟上下文无关」的静态嵌入,出来的是掺了 62% 自己、26% 开头、
12% j 的新表示。同一个字母 o 换到别的名字里、前文一变,这三个权重就变,
出来的数也就变了 —— 这正是静态嵌入做不到的「看场合」。

书里对这张图的解读和数字给出的是同一件事:模型认为「o 在这个位置上,主要由它自己是什么、以及名字从哪儿开头决定」9。训练后它生成的名字是 venenkaroriamylas

但这里有一个数会让你以为看错了:损失 2.43,比上一代 MLP 的 2.34 还高。 没看错,也不是回退——注意力这一步买到的不是分数,是结构。上一代要把每个前缀($$j$jo……)逐条展开、拉平成一根长向量再送进线性层,序列一长就撑不住;注意力用一次加权求和拿到同样的效果,不必展开9。真正的分数收益在下一节把它装进完整 Transformer 之后才兑现(1.93)。

三个工程补丁

裸注意力要进真实模型,还差三处10:

  1. 因果掩码(causal mask):生成任务里,位置 n 不许看 n 之后的内容(否则等于偷看答案)。做法:打分矩阵的上三角填 −∞,softmax 之后那些位置权重归零。矩阵下三角保留——每个位置只看得到自己和过去。

    还拿上面那一行数说:o 后面的 hn 其实也各有一个打分——假设 h 打了 2.9,比 $ 的 2.1 还高。不掩码,它就会抢走一大份权重,而模型等于提前知道了答案是 h。掩码把这两个位置的打分换成 −∞,e 的 −∞ 次方是 0,权重就正好是 0,剩下三个归一化后还是 0.62 / 0.26 / 0.12。这就是为什么掩码要加在 softmax 之前而不是之后:加在之后要重新归一化,加在之前 softmax 自己就把账算平了。

  2. 缩放:打分除以 √d(d 是键向量的维度)。维度一大,点积(两组数对应相乘再相加)的数值天然变大,softmax 被顶进饱和区(第 06 章:梯度归零的地方)——除以 √d 把打分拉回敏感区。

  3. 批量:所有运算按三维张量组织,一批序列一起算。

这三处加上去,就是书里手写实现的那版;它和 PyTorch 内置的 F.scaled_dot_product_attention 数值等价——书里用 allclose 当场验过10

5. Transformer 解码器:四个补丁拼装成块

2017 年的论文《Attention Is All You Need》(Vaswani 等)把注意力扶正为主角,架构就叫 Transformer11。原论文是编码器+解码器的翻译机器;今天统治文本生成的是只用解码器的一支(GPT 系、Claude、Llama 都是),书里先讲它11

一个 Transformer 解码器块 = 在我们已有的注意力外面包四样东西12:

零件解决什么哪儿见过
多头注意力(multi-head attention)一个注意力头只能学一种「相关」;把头维切成 4 份,4 组 Q/K/V 并行各学各的(一个头盯词怎么搭配、一个头盯词是什么意思……),再拼回来新增
残差连接输出 = 注意力(x) + x;给梯度留直达近路第 09 章的跳连,同物
层归一化(layer normalization)和 batch norm 同族,但沿「特征维」而不是「批量维」归一——文本批量里各序列长短不一,批量统计不靠谱batch norm 的变体
前馈(feed-forward,只往前算不回头看)两层 MLP,对每个位置独立做非线性变换,管「想」而不是「查」第 06 章

还有一个看不见的补丁:位置嵌入(positional embedding)。注意力对整段序列并行处理,天生不知道谁先谁后——不打补丁,「dog」和「god」对它是一样的。做法是给每个位置编号也学一份嵌入,加进内容嵌入里12

书里把完整模型搭了出来:字符嵌入 + 位置嵌入 → 6 个解码器块 → 线性层出 27 个 logits。同样一万步训练,损失从 2.29 一路降到 1.93——上一节那笔「结构先行、分数后补」的账,在这里兑现了(MLP 2.34、注意力 MLP 2.43),生成的名字:journegreenhuxsonbrycejazleah——像样、独立、不是抄数据集13

主走查全程对照(同一份名字数据,同样训练量):

代次 生成样本 损失 买到了什么
均匀瞎抽 zrcgahwsalcydnvq — 不可读
bigram liahuli / cl / de — 可读,但短怪
嵌入+MLP jatini / ceney 2.34 像名字了
注意力 MLP venen / karori 2.43 分数没涨,涨的是结构:不必再展开前缀
Transformer journe / green 1.93 有真实感

图说:五代模型,一条链:每一代都在修上一代的结构性缺陷。
注意第四代的损失是往上走的 —— 它换到的是可扩展的结构,分数在第五代才收。

6. 另外三极:编码器、编码器-解码器、ViT

同一块积木还能摆出别的形状14:

  • 编码器(encoder):去掉因果掩码——每个位置可以看全句。产出的是「整句话的表示」,管理解不管生成;代表是 Google 2018 年的 BERT(Bidirectional Encoder Representations from Transformers 的缩写,一个理解型模型),用于文本分类、判断一段文字是夸还是骂这类任务。
  • 编码器-解码器:原论文的完整形态,为翻译设计;解码器里有一层的 K、V 来自编码器的输出(「跨注意力」)——解码时随时回头看原文。
  • ViT(Vision Transformer,2020):把图像切成 16×16 的小块,每块当一个标记,后面就是一套编码器——Transformer 不是文本专用,任何能切成标记序列的数据都能进。第 01 章里那条 86% 认准金毛的 vit_b_16 就是它;它在这串小块的最前面额外接一个可学习的 [CLS] 标记,靠自注意力聚合全图信息,最后只读它做分类14

切词这件事本身

第 03 章埋的线在这里收:真实系统不按字符也不按整词切,用 BPE 这类子词(比词小、比字符大的片段)切法。书里用 Hugging Face 的 tokenizers 库在《奥德赛》全文上训了一个词级切词器,再用同一个 Transformer 类训了 500 步——生成的假史诗里满是 Ulysses、Troy,证明:模型代码对「标记是字符还是词」完全无感,换的只是词典15

7. 作者的判断与证据

说法性质
bigram 的 729/19683、词级爆炸算术,可自验4
嵌入聚类(元音/辅音/$)有据,书里 3D 可视化6
手写注意力 ≡ 官方 scaled_dot_product_attention有据,torch.allclose 返回 True10
「多头里一个盯搭配一个盯意思」作者给的示意性想象(原文用了 might),不是对特定模型的实测12
「decoder-only 是当下 LLM(large language model,用海量文本训出来的语言模型)主流形态」成书时(2025–2026)属实;GPT/Claude/Llama 都是11
各代模型的损失数字(2.34/2.43/1.93)有据,同数据同步数;但注意训练量很小,差距的方向比数值重要13

8. 边界与局限

  • 本章的 Transformer 是教学版:几百 KB 数据、几千步;它证明的是机制,不是规模。「规模起来之后发生什么」是另一本书的事。
  • 书里没讲训练大模型的工程(混合精度——一部分计算改用低精度省显存、分布式)——第 16 章管分布式那一半。
  • 注意力权重可视化解释,但「这一行权重高」不等于「原因就是它」——书里只做到展示,没做因果断言,我们也别替它做。
  • 词级切词的缺陷(未登录词——词表里没有的词、形态变化)书里留在习题;真实系统是 BPE 子词。

9. 可带走的

  1. 生成 = 学数据的分布再采样;文本生成的具体形式是自回归地「预测下一个标记」。
  2. 自监督 = 标签从数据自身长出来——这是互联网规模训练的入场券。
  3. bigram 的天花板是组合爆炸与数据稀疏;神经网络的答案是:稠密嵌入 + 参数量与词表脱钩。
  4. 注意力 = 检索三件套:Q 问「我要什么」、K 答「我有什么」、V 是「被取走的内容」;softmax(Q·K/√d) 出权重,加权取 V。
  5. 因果掩码 = 不许看未来;缩放 = 别把 softmax 顶进饱和区。
  6. Transformer 解码器块 = 多头注意力 + 残差 + 层归一化 + 前馈;位置嵌入补顺序感。
  7. 编码器看全句(BERT)、解码器望过去(GPT)、编码器-解码器管翻译;ViT 证明这套对图像同样成立。
  8. 同一套模型代码,标记是字符还是词都可以——切词器是可替换的前端。

10. 原文地图

主题原书章原文位置
ELIZAch9text/17-ch09-9-how-transformers-work.txt:22(搜「ELIZA」)
生成问题与自回归ch9text/17-ch09-9-how-transformers-work.txt:47(搜「theoretically infinite」) · :591(搜「Autoregressive means」)
名字任务与均匀采样ch9text/17-ch09-9-how-transformers-work.txt:120(搜「$abcdefghijklmnopqrstuvwxyz」) · :151(搜「zrcgahwsalcydnvq」)
bigram 与生成结果ch9text/17-ch09-9-how-transformers-work.txt:196(搜「31915」) · :258(搜「liahuli」)
自监督定义ch9text/17-ch09-9-how-transformers-work.txt:161(搜「self-supervised learning」)
bigram 极限ch9text/17-ch09-9-how-transformers-work.txt:287(搜「729」) · :297(搜「19,683」)
训练数据错位构造ch9text/17-ch09-9-how-transformers-work.txt:318(搜「$ada$」)
嵌入+MLP 与嵌入聚类ch9text/17-ch09-9-how-transformers-work.txt:482(搜「SequenceMLP」) · :644(搜「vowels」)
静态嵌入的缺陷ch9text/17-ch09-9-how-transformers-work.txt:666(搜「static for each character」)
Q/K/V 检索类比ch9text/17-ch09-9-how-transformers-work.txt:687(搜「key, and the value」) · :688(搜「Google」)
自注意力四步与代码ch9text/17-ch09-9-how-transformers-work.txt:710(搜「N inputs」) · :781(搜「q @ k.T」)
掩码/缩放/批量三补丁ch9text/17-ch09-9-how-transformers-work.txt:807(搜「Causal masking」) · :851(搜「tril」) · :863(搜「square root」)
与官方实现等价ch9text/17-ch09-9-how-transformers-work.txt:881(搜「allclose」)
john 的注意力可视化与「不必展开」ch9text/17-ch09-9-how-transformers-work.txt:954(搜「2.4377」) · :975(搜「without having to unroll」) · :983(搜「in row 3, for character o」)
Transformer 论文与 decoder-onlych9text/17-ch09-9-how-transformers-work.txt:1294(搜「Attention Is All You Need」) · :1015(搜「decoder-only」)
解码器块四件与位置嵌入ch9text/17-ch09-9-how-transformers-work.txt:1038(搜「Residual connections」) · :1079(搜「Positional embeddings」) · :1090(搜「Layer normalization」)
完整训练与生成结果ch9text/17-ch09-9-how-transformers-work.txt:1211(搜「2.2924」) · :1230(搜「journe」)
编码器/BERT/编码器-解码器ch9text/17-ch09-9-how-transformers-work.txt:1253(搜「does not use causal masking」) · :1260(搜「BERT」) · :1302(搜「keys and values」)
ViT 与 [CLS]ch9text/17-ch09-9-how-transformers-work.txt:1458(搜「Vision Transformer」) · :1481(搜「[CLS]」)
tokenizers 与奥德赛ch9text/17-ch09-9-how-transformers-work.txt:1364(搜「tokenizers」) · :1443(搜「Ulysses」)

Footnotes

  1. 出处:「9 How transformers work」第 22 段(text/17-ch09-9-how-transformers-work.txt:22,搜「ELIZA」)与第 38 段(:38,搜「regardless of whether」)。ELIZA 由 Weizenbaum 在 MIT 开发,DOCTOR 配置模仿罗杰斯式心理治疗师;「不管病人此前是否解释过自己的感受,它都回同一句」。

  2. 出处:「9 How transformers work」第 47 段(text/17-ch09-9-how-transformers-work.txt:47,搜「theoretically infinite」)与第 591 段(:591,搜「Autoregressive means」)。生成问题的输出「理论上无穷」;自回归=一次生成一个标记、把前面的输出当下一步的输入。 2

  3. 出处:「9 How transformers work」第 120 段(text/17-ch09-9-how-transformers-work.txt:120,搜「$abcdefghijklmnopqrstuvwxyz」)与第 151 段(:151,搜「zrcgahwsalcydnvq」)。词汇表 27 个字符含边界符 $;均匀采样生成不可读的名字。 2

  4. 出处:「9 How transformers work」第 196 段(text/17-ch09-9-how-transformers-work.txt:196,搜「31915」)、第 258 段(:258,搜「liahuli」)与第 287 段(:287,搜「729」)。美国社保局 2022 年 31915 个名字;bigram 结果「可读但不真实」;27²=729、看前两个字符要 27³=19,683,词级词表下不可行——数据稀疏问题。 2 3

  5. 出处:「9 How transformers work」第 161 段(text/17-ch09-9-how-transformers-work.txt:161,搜「self-supervised learning」)。原文:「在自监督学习里,任务被构造成标准答案可以从无标注数据中推断出来」;它「免掉了昂贵耗时的人工标注」。

  6. 出处:「9 How transformers work」第 444 段(text/17-ch09-9-how-transformers-work.txt:444,搜「trainable lookup table」)、第 579 段(:579,搜「2.6099」)与第 644 段(:644,搜「vowels」)。nn.Embedding=可训练的查找表;损失 2.61→2.34;嵌入空间里元音相聚、辅音相聚、$ 独立。 2 3 4

  7. 出处:「9 How transformers work」第 666 段(text/17-ch09-9-how-transformers-work.txt:666,搜「static for each character」)与第 677 段(:677,搜「spotlight」)。car 与 care 里的 a;聚光灯操作员比喻。 2 3

  8. 出处:「9 How transformers work」第 687 段(text/17-ch09-9-how-transformers-work.txt:687,搜「key, and the value」)与第 710 段(:710,搜「N inputs」)。Q=这个位置在找什么,K=每个位置有什么可供匹配,V=匹配上真正取回的内容;四步:造 V、Q·K 打分、softmax 归一、加权求和。

  9. 出处:「9 How transformers work」第 954 段(text/17-ch09-9-how-transformers-work.txt:954,搜「2.4377」)、第 975 段(:975,搜「without having to unroll」)、第 983 段(:983,搜「in row 3, for character o」)与第 985 段(:985,搜「Attention weights for the name」)。注意力版第 9000 步平均损失 2.4377(上一代 MLP 同步是 2.3420),作者原话是「性能与上一个模型相仿,但不必再遍历每个子序列、把嵌入展开拉平」;图 9.9 是「john」的注意力权重热图,每一行的数加起来是 1,颜色越深权重越高,第 3 行(字符 o)权重最高给自己、其次 $、再其次 j书里只给了热图,没有印出具体数值——正文里那组数是我们为演示编的。 2 3

  10. 出处:「9 How transformers work」第 807 段(text/17-ch09-9-how-transformers-work.txt:807,搜「Causal masking」)、第 851 段(:851,搜「tril」)、第 863 段(:863,搜「square root」)与第 881 段(:881,搜「allclose」)。tril 下三角 + 上三角填 −inf;除以 √d_k 防梯度消失/爆炸;与 F.scaled_dot_product_attention 数值等价。 2 3

  11. 出处:「9 How transformers work」第 1294 段(text/17-ch09-9-how-transformers-work.txt:1294,搜「Attention Is All You Need」)与第 1015 段(:1015,搜「decoder-only」)。Vaswani 等 2017;原架构用于机器翻译;GPT、Claude、Llama 都是 decoder-only。 2 3

  12. 出处:「9 How transformers work」第 1038 段(text/17-ch09-9-how-transformers-work.txt:1038,搜「Residual connections」)、第 1043 段(:1043,搜「Multiheaded attention」)、第 1079 段(:1079,搜「Positional embeddings」)与第 1090 段(:1090,搜「Layer normalization」)。多头「可能」一头学句法一头学语义(原文用 might);位置嵌入让模型不把输入当无序集合;层归一化沿特征维。 2 3

  13. 出处:「9 How transformers work」第 1211 段(text/17-ch09-9-how-transformers-work.txt:1211,搜「2.2924」)与第 1230 段(:1230,搜「journe」)。Transformer 损失 2.29→1.93;生成 journe、green、huxson、bryce 等;「没有用任何人造规则或模板」。 2

  14. 出处:「9 How transformers work」第 1253 段(text/17-ch09-9-how-transformers-work.txt:1253,搜「does not use causal masking」)、第 1302 段(:1302,搜「keys and values」)与第 1458 段(:1458,搜「Vision Transformer」)。编码器不掩码;编码器输出做解码器注意力的 K 和 V;ViT(arXiv:2010.11929)把图像切块当标记,前置可学习 [CLS] 标记聚合全局做分类。 2

  15. 出处:「9 How transformers work」第 1364 段(text/17-ch09-9-how-transformers-work.txt:1364,搜「tokenizers」)与第 1443 段(:1443,搜「Ulysses」)。tokenizer 流水线:规范化→预切分→模型→后处理;「模型只认标记,标记是字符还是词对它没有区别」。