跳到主要内容

一次一个字:它手上没有现成答案

这一章讲三件事: 你问它一句话之后,幕后到底发生了什么; 为什么这么笨的做法能答得像模像样;以及这个做法自带哪三个副作用。

它在全书链条里的位置: 这是第一级台阶。 后面十九章讲的所有东西——练它、用它、算它的账、判断它会不会出错—— 全都建立在「它在一个字一个字往下猜」这一件事上。

1. 先看现象:你和它中间隔着两道门

这一节先把场面摆出来,不讲原理。

书里用了一出情景剧来讲这件事,三个角色: 小二,一个对话机器人,工号 5582,负责跟人对话1; 老莫,负责生成对话内容2;小毕,负责搜索网络信息3

你在屏幕上打一句话,它不是直接交给老莫。中间有两道门。

第一道门是话术本。 有人问「你是谁?」,小二并不自由发挥—— 他翻开一本常用话术本,找到这个问题的标准答案,照着抄了一遍4。 书里为这一处专门加了一条注:话术本只是筛选用户问题的实现方式之一5

第二道门是排队。 遇到话术本里没有的问题(比如「怎么给朗朗过十岁生日?」), 小二把这个问题的 10 个字和 1 个标点符号抄在小纸条上6, 跑到一条走廊上排队,队伍尽头的门上写着「给大模型传话的全部在此等候」7

这两道门在真实系统里对应什么,第 6 节讲。 先记住画面: 你写的字要先被检查、再被排队,才轮到那台机器动手。

2. 顶层全景:一条只有三个动作的循环

这一节给出全章的骨架,后面每一节都是在这条循环上补细节。

你的问题(已经写出来的字)


① 看一遍手上已经有的全部文字


② 算「下一个字是什么」最有可能


③ 写下那个字 ──┐
│ │
└───────────┘ 把刚写下的字也算进「已经有的文字」,回到 ①

这张图在讲:它没有一次成型的答案,只有一个不停重复的动作。 每写一个字,条件就变长一点,再算一次。

书里那句最要紧的话是它自己说的:「博览群书没错,可我并没有现成的答案。 这些答案都是我猜的。」8

3. 主走查:「怎么给朗朗过十岁生日?」

这是本章的主走查,后面每一节的机制都要在这条走查上占一步。

书里让那个角色接过纸条,掐指一算,写下第一个字「可」;再一算,写下「以」; 再一算,写下「通」9。我们把这三步的条件文本补全:

第几步手上已经有的文字(条件)它在算什么写下来的
0(空)
1怎么给朗朗过十岁生日?下一个字是「可」的可能性、是「今」的可能性……
2怎么给朗朗过十岁生日?可在多了一个「可」的前提下,再算一遍
3怎么给朗朗过十岁生日?可以再算一遍
……每一步都把上一步写下的字并进条件里

注意第 2 步和第 1 步的区别:条件变了。 第 1 步的条件是那 11 个符号, 第 2 步的条件是那 11 个符号加上一个「可」

书里让那个角色把这件事讲得很清楚:它算的是每一个字的条件概率—— 「当文本里已经出现『怎么给朗朗过十岁生日?可』了,在这个前提条件下, 我又算出来下一个字是『以』的概率最大」10。 所谓概率,就是「一百次里大概会出现几次」这个数,不是「对不对」,是「常不常见」

小二当场给了一个准确的外行说法:「你玩的是文字接龙啊!」11

为什么这么笨反而简单? 书里那个角色自己解释:看起来步骤多, 但都是在重复做类似的一件事,反倒简单12一个动作重复几千次,好过几千个各不相同的动作。

4. 副作用一:它不总挑最有把握的那个字

这一节回答一个你一定遇到过的现象:同一句话问两遍,答案不一样。

按第 3 节的走查,每一步都算出了「哪个字最有可能」。 那最自然的做法当然是挑那个最高的。可它偏不总这么做。

理由书里写得很直白:如果只选可能性最高的那一个,生成出来的回答会比较保守和重复13

于是它在这里故意掺了一点随机。书里给的比方是掷骰子: 在可能性高于某条线的那些候选字里面随机挑一个,可能性大的被挑中的机会大一些14这个「掺多少随机」的设定有名字,叫温度(temperature)。

这个数调大这个数调小
更容易挑到不是最高的那个字几乎总是挑最高的那个
回答更多样,也更容易跑偏、说得不合理回答更保守合理,也更单调

书里说这个数由开发者按场景调15这是全书唯一一个被点名的调用选项—— 你以后在任何一家的开发文档里都会再见到 temperature 这个词,它说的就是这件事。 注意它是在调用的时候设定的,普通聊天框里通常调不到,书里也没有再讲怎么用它。

它在主走查上是哪一步? 是第 1 步到第 3 步里「写下来的」那一列—— 每一步不一定写下可能性最高的那个字。

5. 它其实不是只算一条路

这一节补一个书里在扩展阅读里给的细节,它会改变你对第 3 节那张表的理解。

第 3 节的走查像是一条直线:算一个字、写下来、再算下一个。 书里在扩展阅读里说,实际做法比这复杂一点。

书里给了两句。第一句是第 3 节那张表的学名: 每写一个字都要把前面已经写出来的全部算进去——这种做法叫自回归16。 书里说,这样能保证写出来的东西前后连贯、意思一致

第二句才是新东西:它还使用了「束搜索」这类做法, 一次算出好几个可能性较高的候选、生成好几条候选回答, 最后挑其中可能性最高的那一条作为最终输出16

把这句话摊开,它说的是:

直线版(第 3 节那张表) 多路版(书里的补充)

可 → 以 → 通 可 ┬─→ 以 ┬─→ 通
│ └─→ 这
└─→ 能 ─→ 请
算完几条,挑整体上最像的那一条交出去

为什么要多算几条? 因为每一步都挑当下最高的,连起来未必是整段里最好的—— 就像下棋时每一步都吃眼前最大的子,整盘未必赢。

这和第 4 节那个设定不冲突: 一个管「同一条路上要不要掺随机」, 另一个管「一次算几条路」。两个都调,你才能理解为什么它的输出这么难复现。

6. 副作用二:你的话先过一道筛子,它答完还要再过一道

这一节把第 1 节那两道门换成真实系统里的说法。

书里在情景剧后面的扩展阅读里,把一次对话拆成了四步:接收输入、处理输入、进行推理—— 指的是它已经练完、正在干活的那个阶段,这时候它不再改自己身上的那些数, 只是拿已经学到的东西来答17——最后生成输出18。 这个词和日常说的「推理破案」不是一回事,但你出门一定会撞见它

两道筛子分别在哪儿:

位置干什么书里的原话
输入之后、推理之前不合规、不合法、不道德的问题直接拒绝回答19
同上特定的、不该随意发挥的问题,直接给出官方标准回答20
输出之后、给你之前生成的回答再过一遍合规检测21

所以第 1 节里的「话术本」不是笑话,它对应的是真实系统里的预筛与标准答案。

顺带交代一件事:它拿到你的话之后,第一件事是把这句话变成一串数, 机器才处理得了22这串数长什么样、凭什么能代表意思,第 13 章讲。

7. 副作用三:中文一个字一块,英文不是

这一节解释一个你在计费页面和文档里天天见到的词。

第 3 节的走查里,我们说的是「下一个字」。这是中文的说法。 书里明写:实际上它预测的是下一个 token——它自己数数的那一格; 在中文的条件下,一个 token 等于一个汉字23

英文不一样。书里说,处理英文时通常会把句子里的单词切出来,每个单词当一个 token; 也可以切得更碎,按词根词缀这一级切24切得更碎有个实际好处:遇到缩写、不规则形式和新词时更好使,还能压缩词库的大小25

一句话记住它:token 就是它数数的单位——不是字,不是词,是它自己那把尺子上的一格。

中文英文
一个 token 大概是一个汉字一个单词,或一个词根/词缀
「你好世界」4 个
unhappiness可能是 1 个,也可能被切成 3 个

(上面这一行英文的切法是我们为演示编的,不是书里的数值。)

为什么非记它不可? 因为你以后看到的每一个价目表、每一条长度上限, 单位都是它,不是字数。(它和「读了多少书」这个数怎么换算,第 02 章讲。)

8. 它不记得你

这一节说一件书里没有解决的事,而且要说得比书更明白。

回到第 3 节的走查。每一步的条件是什么?是这一轮里已经写出来的那些字。 换句话说,它能看见的东西,全都在这一轮的文字里—— 这一堆「它当前看得见的文字」有个名字,叫上下文

于是有一个直接的后果:上下文之外的东西,它一概不知道。 你上周告诉过它你对花生过敏,这一轮如果没有人把这句话再写进去,它就不知道。

书里对这件事的态度是坦白但被动的。它到最后也没给出解决办法—— 全书唯一一次正面处理,是把「记不住上一次说过什么」列进缺陷清单里26这件事我们不替书圆场:书里没有答案。(它作为缺陷被再提一次,第 20 章讲; 今天外面是怎么绕开它的,第 13 章讲。)

9. 作者的判断与证据:哪些是剧情,哪些是机制

这一节把这一章里三种不同性质的东西分开。

说法性质
一个字一个字预测、条件在变长机制。书里在情景剧和扩展阅读里各讲了一遍
输入预筛、输出合规检测机制。扩展阅读里明写的四步流程之一
小二、老莫、小毕三个角色,以及排队、扣工分、手指头发烫剧情。作者自己声明纯属虚构
「话术本」这个说法比喻。书里加注说明它只是实现方式之一
「文字接龙」这个说法比喻,而且是全书最好用的一个

一句必须说清的话:书里没有讲它内部是怎么算出那个概率的。 从第 1 个字到第 2 个字之间发生了什么,这本书自始至终没打开。 想看内部,要去读别的书。

10. 边界与局限

  • 书里没给任何一个真实的概率数值。 图 1.4 画了候选词,但正文里没有数字, 所以本章的走查只能给出「哪个字被写下来」,给不出「它的可能性是多少」。
  • 「一个 token 等于一个汉字」是 2023 年的说法。 它对当时的做法成立, 但这是个会变的实现细节,不是原理。
  • 温度这个设定的具体取值书里一个都没给。 只说了大和小各自的倾向。
  • 书里把「推理」和「训练」分成两个阶段来讲,这是简化。 真实系统里两者常常交替进行,书里没提这一层。

11. 可带走的

  1. 它没有答案库。 每一个字都是当场算出来的,算的时候只看「已经写出来的那些字」。
  2. 它每写一个字,都要把前面所有内容重看一遍。 这是它慢、它贵的根源—— 这一条会在第 18 章变成钱。
  3. 同一句话问两遍答案不一样,是设计,不是故障。 那个设定叫温度。
  4. 你的话不会直接进它脑子。 前面有预筛,后面有合规检测,两头都可能被拦。
  5. 它数数的单位是 token,不是字。 中文一个汉字大致一个,英文按词或词根切。
  6. 它当前看得见的全部文字叫上下文;上下文之外它一概不知道。
  7. 它不记得你,而这本书没有解决这件事。 别把「它上次说过」当成它记得。

12. 原文地图

主题原书章原文位置
三个角色的分工01 我是一个传话筒text/03-ch01.txt:5(搜「工号为5582」) · text/03-ch01.txt:7(搜「负责生成对话内容」)
话术本与标准答案01 我是一个传话筒text/03-ch01.txt:20(搜「翻开常用话术本」) · text/03-ch01.txt:22(搜「我照着抄了一遍」)
10 个字 1 个标点、排队01 我是一个传话筒text/03-ch01.txt:32(搜「个字和1个标点符号抄在小纸条」)
一个字一个字掐算02 我是一个大模型text/04-ch02.txt:15(搜「写下回答的第一个字」)
「答案都是我猜的」02 我是一个大模型text/04-ch02.txt:21(搜「这些答案都是我猜的」)
条件概率、文字接龙02 我是一个大模型text/04-ch02.txt:34(搜「我是在计算每一个字的条件概率」) · text/04-ch02.txt:41(搜「文字接龙」)
推理阶段不改自身02 我是一个大模型text/04-ch02.txt:69(搜「此时其不再调整自己的参数」)
输入预筛与标准答案02 我是一个大模型text/04-ch02.txt:82(搜「直接拒绝回答」) · text/04-ch02.txt:83(搜「直接给出官方标准回答」)
中英文的 token02 我是一个大模型text/04-ch02.txt:111(搜「一个token等于一个汉字」) · text/04-ch02.txt:115(搜「子词级别的token」)
温度与掷骰子02 我是一个大模型text/04-ch02.txt:123(搜「生成的响应会比较保守和重复」) · text/04-ch02.txt:125(搜「就像掷骰子一样」)

Footnotes

  1. 出处:「01 我是一个传话筒」第 5 段(text/03-ch01.txt:5,搜「工号为5582」)。原文的设定是:小二是一个对话机器人,工号 5582,负责跟人类进行对话。

  2. 出处:「01 我是一个传话筒」第 7 段(text/03-ch01.txt:7,搜「负责生成对话内容」)。老莫在剧里的身份是那台大模型本身。

  3. 出处:「01 我是一个传话筒」第 9 段(text/03-ch01.txt:9,搜「负责搜索网络信息」)。小毕在剧里的身份是搜索组件——这个角色到第 06 章会变成「信息插件」的例子。

  4. 出处:「01 我是一个传话筒」第 22 段(text/03-ch01.txt:22,搜「我照着抄了一遍」)。原文说他找到回答「你是谁?」的标准答案,照着抄了一遍。

  5. 出处:「01 我是一个传话筒」第 20 段(text/03-ch01.txt:20,搜「大模型系统进行用户」)。这是原书作者自己加的一条注:常用话术本只是大模型系统进行用户问题筛选的实现方式之一。

  6. 出处:「01 我是一个传话筒」第 32 段(text/03-ch01.txt:32,搜「个字和1个标点符号抄在小纸条」)。原文数的是「怎么给朗朗过十岁生日?」这句话:10 个字加 1 个标点符号。

  7. 出处:「01 我是一个传话筒」第 34 段(text/03-ch01.txt:34,搜「给大模型传话的全部在此等候」)。

  8. 出处:「02 我是一个大模型」第 21 段(text/04-ch02.txt:21,搜「这些答案都是我猜的」)。前半句是「博览群书没错,可我并没有现成的答案」。这是全书对这件事最直接的一次交代。

  9. 出处:「02 我是一个大模型」第 15 段(text/04-ch02.txt:15,搜「写下回答的第一个字」)。三个字分别在第 15 段(「可」)、第 16 段与第 20 段(「通」,text/04-ch02.txt:20,搜「写下第三个字」)。

  10. 出处:「02 我是一个大模型」第 34 段(text/04-ch02.txt:34,搜「我是在计算每一个字的条件概率」)。同一段接着说,不断预测下一个字,整段话就出来了(text/04-ch02.txt:36,搜「不断预测下一个字」)。

  11. 出处:「02 我是一个大模型」第 41 段(text/04-ch02.txt:41,搜「文字接龙」)。这是剧中那个外行角色的原话。

  12. 出处:「02 我是一个大模型」第 37 段(text/04-ch02.txt:37,搜「反倒简单」)。原文说:看起来步骤多,但都是在重复做类似的一件事,反倒简单。

  13. 出处:「02 我是一个大模型」第 123 段(text/04-ch02.txt:123,搜「生成的响应会比较保守和重复」)。原文的完整意思是:如果只选概率最高的那一个,回答会比较保守和重复。

  14. 出处:「02 我是一个大模型」第 125 段(text/04-ch02.txt:125,搜「就像掷骰子一样」)。原文说,在概率高于临界点的候选里面随机选择,概率较高的被选中的可能性较大。

  15. 出处:「02 我是一个大模型」第 128 段(text/04-ch02.txt:128,搜「较大的temperature值」)。原文说,较大的值会有更多机会选到不是最高的那个,回应更多样,但也可能过于随机和不合理;较小的值反之。

  16. 出处:「02 我是一个大模型」第 94 段(text/04-ch02.txt:94,搜「自回归」)与第 97 段(text/04-ch02.txt:97,搜「多个概率较高的token候选集」)。书里对「束搜索」只给了名字,没有讲它怎么算。 2

  17. 出处:「02 我是一个大模型」第 69 段(text/04-ch02.txt:69,搜「此时其不再调整自己的参数」)。原文把它的工作分成训练和推理两个阶段,跟人聊天时处在后者。

  18. 出处:「02 我是一个大模型」第 73 段(text/04-ch02.txt:73,搜「人工智能系统会执行以下步骤的工作」)。四步是:接收输入、处理输入、进行推理、生成输出。

  19. 出处:「02 我是一个大模型」第 82 段(text/04-ch02.txt:82,搜「直接拒绝回答」)。

  20. 出处:「02 我是一个大模型」第 83 段(text/04-ch02.txt:83,搜「直接给出官方标准回答」)。这一句正是第 1 节那本「话术本」的真身。

  21. 出处:「02 我是一个大模型」第 105 段(text/04-ch02.txt:105,搜「合规性检测模块」)。

  22. 出处:「02 我是一个大模型」第 78 段(text/04-ch02.txt:78,搜「将输入的文本编码成数字向量」)。书里到这里为止,没有解释这串数是怎么来的。

  23. 出处:「02 我是一个大模型」第 111 段(text/04-ch02.txt:111,搜「一个token等于一个汉字」)。原文先说「上文故事里我们以中文为例,模型会预测下一个字」,再纠正成「实际上模型是预测下一个 token」。

  24. 出处:「02 我是一个大模型」第 113 段(text/04-ch02.txt:113,搜「使用分词技术」)与第 115 段(text/04-ch02.txt:115,搜「子词级别的token」)。

  25. 出处:「02 我是一个大模型」第 116 段(text/04-ch02.txt:116,搜「不规则形式和新词」)。原文说这种切法在处理缩写、不规则形式和新词时可能更有效,还能压缩词库中词的数量。

  26. 出处:「17 关于大模型产业的对话:第2集」第 110 段(text/19-ch17-17-2.txt:110,搜「缺乏长期记忆」)。原文把它和幻觉、规划能力差、无法持续学习并列,称为「不如人类的地方」。这是全书唯一一次正面提到这件事。