跳到主要内容

模型眼中的文字 — 标记、一次一个与温度

这一章讲三件事: 你打进去的字,在它眼里变成了什么;它往外吐字时遵守的 古怪纪律(一次一个,不许后悔);以及你为什么能用它「问两遍出两个答案」。 这一章是全书所有「算账」的基础——钱、速度、窗口大小,从这一章开始都要按 它的单位来算。

1. 这一章讲什么

上一章说了它是「续写机器」。这一章剥开第二层:它读的、写的都不是你以为的「文字」。

主走查是一句儿歌:「One, Two,」→「 Buckle My Shoe」。 我们会看着它被切成块、被一块块续出来、再看着同一个开头在另一种脾气下 续出完全不同的东西。中途再插入一次辅走查:「strange new worlds」这句话, 在大写转换任务里是怎么把模型难住的。

2. 顶层全景:先进切词器,才轮到模型

你发一段文字过去,在到达模型本体之前,先过一道切词器(tokenizer): 它把文字切成一串标记(token)——模型读写文字的最小单位,通常三四个字符一块, 可能是整个词,也可能是半个词。一个模型认识的所有标记,叫它的词表(vocabulary)1

模型本体只跟标记打交道:吃进一串标记,吐出一串标记, 最后再由切词器把标记翻译回文字还给你1

你打的: One, Two,
切成: [One] [,] [ Two] [,] 四个标记
模型干的: 这四个后面,第五个是什么? → [ Buck]
再切成: [One] [,] [ Two] [,] [ Buck] 五个标记
模型干的: 第六个是什么? → [le]
还给你: 「 Buckle」……继续

图说:本章主走查。注意 [ Two] 和 [ Buck] 前面都带空格——
空格被焊进了标记里,这一点到第 08 章组装提示词时会回来咬人。

后面每一节都回到这张图:第 3.1–3.3 节看「切」,第 3.4 节看「一块一块吐」, 第 3.5 节看「吐哪一块」。

3. 核心原理

3.1 切词器是台死板的机器——错别字在它眼里无处遁形

人读文字也按块读,不按字母读——所以你能毫不费力读懂打乱字母顺序的句子, 大脑自动帮你改了错别字。

模型的切词器是确定性的:同一串字母,永远切成同一串标记。 ghost 在 OpenAI 的词表里是一个标记;打错的 gohst 会被切成 g-oh-st 三个标记—— 在它眼里,这不是「一个词写错了」,这是「另一串零件」2

这带来两个直接后果:

  • 它容易发现错别字(零件对不上,一眼可见),但因为它在训练语料里见惯了错别字, 通常也能理解你的意思;
  • 它很难做「拆开字母再拼回去」的操作。 让 ChatGPT 把单词的字母倒过来写, 两个方向都错得离谱;「strawberry 里有几个 r」这种问题,在 2024 年秋天还能难倒 最先进的模型3

对做应用的人,这一节的落点是一条规矩: 任务里凡是要「在字母级别动手」的部分(反转、数字母、按首字母筛词), 别让它硬扛——拿代码在前后处理里做掉。 书里的例子:玩「说一个 Sw 开头的欧洲国家」的游戏,SwedenSwitzerlandSomalia 在词表里各是一整个标记,它根本「看不见」里面的 Sw—— 所以正确做法是让模型只管列国家,首字母筛选交给程序4

3.2 辅走查:「strange new worlds」怎么难住了模型

拿一个看似幼儿园级的任务:把这段话转成全大写。

辅走查开始,这些切分是书里给的真实数据。 小写时,切词器切成 4 个标记:

strange new worlds → [str][ange][ new][ worlds] 4 个标记

全大写之后,同样的字母,切出来是 6 个:

STRANGE NEW WORLDS → [STR][ANGE][ NEW][ WOR][L][DS] 6 个标记

再看一个:gone 小写是 1 个标记,GONE[G][ONE] 两个5

人眼里 aA 是同一个字母的两种写法;在它眼里, 含大写的标记和含小写的标记是另一批零件,对应关系还不整齐。 所以「转大写」这种你觉得顺手的事,它要费很大劲—— 而大模型省下的每一点劲,都该花在你要它干的正事上。 书作者的忠告:别没事让它在大小写之间来回翻译,反正你也不需要它干这个6

顺带一提那个著名的反例:unicode 笑脸 ☺ 这种稀罕字符,一切就是两个标记。 Unicode——给全世界每个字符统一编号的国际标准——里的生僻字, 因为没有现成的整块,只能拆成更碎的零件7

3.3 数标记,就是数钱

为什么要跟这些零件较劲?因为这个行业的所有账都按标记算8:

怎么算
时间读提示词、写补全,耗时都随标记数成正比地增长
绝大多数服务商按标记计费;2024 年成书时,1 美元大约买 5 万到 100 万个输出标记,视模型而定
窗口上下文窗口——模型一次能看到的标记总数上限——提示词加补全不能超

英文自然文本,OpenAI 系切词器大约 4 个字符一个标记;随机数字串只有 2 个多一点; 密码那种字母数字混合串不到 2 个——同一段「长度」,换成标记可能差出两三倍9

词表里还有一种隐藏角色:特殊标记。最常用的是「文本结束」标记—— 训练时每份文档末尾都焊一个,好让模型学会「什么时候该停」; 它一吐出这个标记,补全就在那里截断10。到第 04 章你会看到, 聊天格式全靠几个特殊标记撑着;第 09 章你会看到,「让它停」是门手艺。

3.4 一次一个,不许后悔

现在看生成侧。模型每跑一遍,只算「下一个标记是什么」; 把这个标记接到末尾,再整个跑一遍,算再下一个。 自回归——每次预测都依赖前面所有预测,一步一标记地往前走11

书里的类比:像不停按手机输入法的中间那个候选词。

这个节奏带来三条铁律,每一条都在后面章节里有回响:

一,它不能停下来想。 人卡壳了可以停,它每一步都必须吐一个标记, 没有「让我想想」这个选项(书里注明:有研究在想办法给它这个选项,成书时尚未成熟)12

二,它不能改。 吐出去的标记泼出去的水。训练文档里几乎见不到 「上面那句写错了,收回」——因为人写错了会直接改原文,成品里不留痕。 所以它常常一条错路走到黑,显得又犟又滑稽。 「发现错了、退回去重来」这个能力,要你这个应用设计者给它补上13

三,它会掉进自己造的模式里。 它太擅长认模式了,以至于一旦偶然写出个模式, 「继续这个模式」在每一步都比「打破它」更像训练集——于是无限复读。 书里那个案例:让模型列「喜欢某剧的理由」,列到后面 legacy、following、future、foundation、fanbase 几个词翻来覆去, 清单永远列不完——因为每多列一条,「再来一条」都更像正确答案, 而模型不会腻14

主走查,接上文的儿歌:
[One] [,] [ Two] [,] [ Buck] [le] [ My] [ Shoe] …
每接一个,全体重算一遍;第 8 步想停?
「再写一个」和「写结束标记」两选一,全看哪边分数高

图说:清单停不下来,不是它想啰嗦,是「继续」在每一步都赢了「收尾」。

3.5 它不挑「最好的」——温度与那张家底清单

剥开最后一层:模型每一步算的不是「下一个标记是哪个」, 而是全部五万个候选标记各自的分数

这个分数叫 logprobs——给每个候选标记的把握程度取对数(把乘除变成加减的一种数学刻度)之后的分数

概率——某件事发生的可能性,0 到 1 之间;最可能那个标记一般在 -2 到 0 之间。

对数——把概率换成另一种刻度,0 代表「十拿九稳」,越负越没戏

很多 API——应用程序之间互相打交道用的通道,你通过它发文字、收文字—— 允许你把这张清单要回来,第 09 章会拿它做文章15

这张清单(全部候选,各自带概率)有个名字,叫概率分布

有了清单,怎么挑由一个旋钮管着。温度——控制「多大程度上照分数老实挑」的设定, 0 表示永远挑最高分,越高越敢挑冷门。 挑的过程叫采样——按分数高低加权地随机抽一个16

书里给了一张按用途选温度的表,值得整存17:

温度它怎么挑什么时候用
0永远最高分,接近确定性(但不完全——浮点舍入能让分数漂几个百分点)正确性第一;要可复现
0.1–0.4偶尔给第二名一点机会想要几个候选,再自动筛最好的
0.5–0.7运气成分明显要 10 个以上互相独立的解
1忠实还原本家的概率分布想让输出和训练集「同款脾气」
>1比训练集还野基本只剩观赏价值

主走查最后一站。 还是那句「One, Two,」。 假设训练集里 51% 接 [ Buck]、31% 接 [ Three](书里的设定)。 温度 0 时,一百遍都是「Buck」;温度 1 时,跑一百遍,大约 51 遍「Buck」、31 遍「Three」—— 它把训练集里的概率分布原样搬给你18

温度超过 1 会发生一件很损的事:它开始「喝醉」。 温度只动最后一层「怎么挑」,不动前面「怎么算」—— 所以它把自己刚写错的字当成「这段文字的风格」,接着模仿自己的错误, 错误越滚越多,写到后面单词都不成形19

另一种挑法叫 beam search:不一步步赌,而是向前多看几步、 保证后面还有好路可走。更准,但贵得多,应用里少用20

4. 作者的判断与证据

有硬证据的:

  • 切分实例(ghost/gohst、4 标记对 6 标记、gone/GONE)是作者拿 OpenAI 切词器跑的真实结果25;
  • 字母反转失败、Sw 国家失败、大小写转换出错,都有书中截图作证, 作者也坦白是用小模型或旧模型演示的,「新模型没那么容易栽」346;
  • 「温度只动最后一层,所以高温会自我模仿错误」是作者给出的机制解释, 配有 text-davinci-003 在不同温度下逐条恶化的输出19

作者的坦白与存疑:

  • 「一次一个、不能停」这条,书里专门加注:有研究在尝试让模型可以「多想一会儿」, 未来可能变12;
  • 温度 0「接近确定性而非完全确定性」——原因是浮点舍入误差(小数在计算机里存不尽,末位会抖), 重跑时概率可能漂几个百分点17

判断(我们的,不是书里的): 「字进字出、一次一块、不许后悔」这三条, 是全书后面一半技巧的根:第 08 章「替它写答案开头」利用的是它不能改; 第 09 章「设计停止信号」补的是它不会停;第 10 章「让它把思考喊出来」补的是它不能停想。 读这本书时值得把这三条写在手边,遇到任何技巧先问「它补的是哪一条」。 如果错,会错在: 如果未来架构允许模型在生成中途暂停、重算或编辑 (书里已经提到这类研究),这三条对应的技巧会失效一批——但「按标记算账」不会失效。

5. 边界与局限

  • 本章的一切都以「OpenAI 系切词器」为主要标本。 别家切词器细节不同 (有的不把空格焊进标记),但「确定性、按块、不可加」这三条是普遍的; 用哪家模型,就装哪家的切词库(tiktoken、Hugging Face)自己数8
  • 「4 字符一标记」只是英文的粗口径。 中文、代码、数字串、表情符号全都不一样, 提示词里混了这些,先数再信。
  • 重复陷阱在新模型上已大为缓解——书里明说特意挑了旧模型演示; 但「它不会自己刹车」这条没有变,停止策略永远是你的责任14

6. 可带走的

主走查一行回顾:「One, Two,」→ 切 4 块 → 逐块续出 [ Buck][le] → 温度 0 永远「Buck」,温度 1 时 51%「Buck」、31%「Three」——清单没变,变的是挑法

  1. 它读写的最小单位是标记,不是字母、也不是词——三四个字符一块,可能横跨词界;
  2. 切词是确定性的: 错别字、大小写、生僻字符在它眼里是完全不同的零件;
  3. 字母级任务别让它做: 数字母、反转、首字母筛选,一律放前后处理;
  4. 一切按标记算账: 时间、钱、窗口;英文约 4 字符一标记,其他内容只会更碎;
  5. 「文本结束」标记是它唯一的刹车,而且你要学会用(第 09 章);
  6. 它不能停、不能改、不会腻——后悔药和刹车片都得你装;
  7. 复读不是犯傻,是「继续」每一步都赢了「收尾」;
  8. logprobs 是它的家底清单,能要就要(第 09 章有大用);
  9. 温度 0 求对、1 求像、>1 求醉;要多个候选时用 0.1–0.7 再筛;
  10. 同一段文字,不同模型切法不同——换模型,一切数字重数。

7. 原文地图

主题原书章原文位置
切词器、标记、词表Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:258(搜「three to four characters」)
ghost/gohst、确定性切词Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:281(搜「gohst」)
字母反转、strawberry、Sw 国家Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:240(搜「strawberry」) · :316(搜「Sweden」)
大小写切分对照Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:343(搜「strange new worlds」)
按标记算账、字符比Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:367(搜「50,000 and 1,000,000」) · :382(搜「four characters per token」)
特殊标记、文本结束Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:392(搜「end-of-text token」)
自回归、不许后悔、复读Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:409(搜「autoregressive」) · :434(搜「take backs」) · :465(搜「nauseam」)
logprobs、温度表、51/31Chapter 2text/05-ch02-chapter-2-understanding-llms.txt:494(搜「logprobs」) · :541(搜「51%」)
高温醉酒、beam searchChapter 2text/05-ch02-chapter-2-understanding-llms.txt:553(搜「drunk」) · :587(搜「beam search」)

Footnotes

  1. 出处:「Chapter 2. Understanding LLMs」第 256-266 段(text/05-ch02-chapter-2-understanding-llms.txt:258,搜「three to four characters」)。原文:「it's first broken down into a series of multiletter chunks called tokens…The set of tokens used by a model is called its vocabulary」。 2

  2. 出处:「Chapter 2. Understanding LLMs」第 276-284 段(text/05-ch02-chapter-2-understanding-llms.txt:281,搜「gohst」)。原文:「LLMs use deterministic tokenizers—which make typos stand out like sore thumbs」。 2

  3. 出处:「Chapter 2. Understanding LLMs」第 236-240 段(text/05-ch02-chapter-2-understanding-llms.txt:240,搜「strawberry」)与第 292-298 段(图 2-6 字母反转,:304,搜「reverse letters」)。作者注明:能数字母这件事,模型是靠语料里的相关内容「背」下来的,不是真会拆。 2

  4. 出处:「Chapter 2. Understanding LLMs」第 306-316 段(text/05-ch02-chapter-2-understanding-llms.txt:315,搜「Sweden」)。Scattergories 游戏例;「it might make sense for you to use your LLM as an oracle to obtain a large list…then use syntactic logic to filter down」。 2

  5. 出处:「Chapter 2. Understanding LLMs」第 342-346 段(text/05-ch02-chapter-2-understanding-llms.txt:343,搜「strange new worlds」)。 2

  6. 出处:「Chapter 2. Understanding LLMs」第 349-352 段(text/05-ch02-chapter-2-understanding-llms.txt:350,搜「detracts from the real meat」)。演示用的是很小的 text-babbage-001,作者注明大模型没这么容易栽。 2

  7. 出处:「Chapter 2. Understanding LLMs」第 385-389 段(text/05-ch02-chapter-2-understanding-llms.txt:389,搜「two tokens」)。

  8. 出处:「Chapter 2. Understanding LLMs」第 354-379 段(text/05-ch02-chapter-2-understanding-llms.txt:367,搜「50,000 and 1,000,000」)与(:370,搜「context window」)。「however long your context window, you'll be tempted to fill it and overfill it」。 2

  9. 出处:「Chapter 2. Understanding LLMs」第 380-389 段(text/05-ch02-chapter-2-understanding-llms.txt:382,搜「four characters per token」)。

  10. 出处:「Chapter 2. Understanding LLMs」第 391-395 段(text/05-ch02-chapter-2-understanding-llms.txt:392,搜「end-of-text token」)。

  11. 出处:「Chapter 2. Understanding LLMs」第 404-409 段(text/05-ch02-chapter-2-understanding-llms.txt:409,搜「autoregressive」)。「Running an LLM is like repeatedly pressing the middle button.」

  12. 出处:「Chapter 2. Understanding LLMs」第 422-424 段与脚注 9(text/05-ch02-chapter-2-understanding-llms.txt:424,搜「needs to think longer」)。 2

  13. 出处:「Chapter 2. Understanding LLMs」第 428-438 段(text/05-ch02-chapter-2-understanding-llms.txt:434,搜「take backs」)。书里那句「Oh wait, actually, takebacks is more commonly spelled as two words…」是作者故意当场演示「人类成品里不留收回痕迹」。

  14. 出处:「Chapter 2. Understanding LLMs」第 442-477 段(text/05-ch02-chapter-2-understanding-llms.txt:466,搜「nauseam」)。演示用的是旧模型 text-curie-001;正文里那两段一字不差的重复是作者的行为艺术,脚注 10 还拿《精灵宝钻》开了个玩笑。 2

  15. 出处:「Chapter 2. Understanding LLMs」第 490-497 段(text/05-ch02-chapter-2-understanding-llms.txt:494,搜「logprobs」)。

  16. 出处:「Chapter 2. Understanding LLMs」第 503-518 段(text/05-ch02-chapter-2-understanding-llms.txt:507,搜「temperature greater than 0」)。公式:p(token_i) = exp(logprob_i/t) / Σ_j exp(logprob_j/t)。

  17. 出处:「Chapter 2. Understanding LLMs」第 520-541 段(text/05-ch02-chapter-2-understanding-llms.txt:521,搜「recommended setting」)。脚注 11:温度 0 并非完全确定,「Computed probabilities can (depending on the model) vary by several percentage points on reruns」。 2

  18. 出处:「Chapter 2. Understanding LLMs」第 536-541 段(text/05-ch02-chapter-2-understanding-llms.txt:538,搜「51%」)。

  19. 出处:「Chapter 2. Understanding LLMs」第 553-567 段(text/05-ch02-chapter-2-understanding-llms.txt:553,搜「drunk」)。「the model recognizes the errors in the text it just generated as a pattern, and it tries to mimic that pattern」。 2

  20. 出处:「Chapter 2. Understanding LLMs」第 587-592 段(text/05-ch02-chapter-2-understanding-llms.txt:587,搜「beam search」)。