第二篇 — 给它接上算得准的工具
这一章讲三件事: 它错的时候错在哪(有规律)、怎么把工具接上去、 以及一把很实用的尺子 ——「这个场景里,出错的代价是什么」。
先摆正姿势:这同时是一篇产品文章。 这本书由两篇长文构成,前六章是第一篇。 第二篇的落点是作者自己的计算引擎产品。 但把产品名字划掉之后,论证本身是成立的 —— 而且它可能是「让模型调用外部工具」这件事最早的完整论证。
1. 先看现象:它错得理直气壮
这一节回答:它的错法有什么规律。
第二篇的主体是一组实测。这些例子的价值在于:错法是有规律的,不是随机犯错。
| 问它什么 | 结果 |
|---|---|
| 芝加哥到东京的距离 | 听起来相当有说服力,但是错的1 |
| 一道数学题 | 「很有趣的文章式回答,但实际结果是错误的」 |
| 稍复杂一点的数学题 | 「乍一看结果似乎很棒,我很容易相信它」—— 还是错的 |
| 让它解释「它是怎么得出答案的」 | 它编了一个非常像样的解释,而且解释里的错误正是不懂数学的人会犯的那种2 |
| 几个数字排序 | 基础数据学对了,但没有充分理解数据的含义,排不对 |
| 土耳其有多少只火鸡 | 看起来完全有道理,甚至引用了相关来源 —— 但数据基本上是捏造的3 |
| 需要多步计算的问题 | 「相当混乱的答案」,而且它自己在某种程度上「已经知道」结论不对 |
注意倒数第二行和倒数第三行: 它不只是算错, 它还会为自己的错误编一套像样的解释,会编造数据并附上看起来正规的来源。
主走查:芝加哥到东京,从头走到尾
这一章从头到尾只跟第一行那个例子。 先说清每个数从哪来:
书里这一段的具体数字印在插图里,清洗出来的正文没有, 所以下面「它答了多少」那个数是为演示编的; 正确值是我们补的常识(不在书里)。而每一步的做法,是书里真实描述的。
| 步 | 具体发生了什么 |
|---|---|
| ① 直接问 | 「芝加哥到东京有多远?」它答:「大约 6300 公里」(这个数是编的) |
| ② 对一下 | 正确值约 10 150 公里(两地之间的大圆距离;补充,不在书里,来自通用知识) |
| ③ 差多少 | 差了约 3850 公里,少报了将近四成 —— 而它答得毫不犹豫 |
| ④ 做法① | 把「芝加哥到东京 10 150 公里」这一行字附在原问题后面,一字不改地再问一遍 |
| ⑤ 它的反应 | 「非常礼貌地接受了更正」,这次答对了 |
| ⑥ 做法② | 先让它自己说:「我需要核对三件事:芝加哥的坐标、东京的坐标、大圆距离公式」 |
| ⑦ 拿回来注入 | 把这三条送去计算引擎,把算出来的结果塞回给它 |
| ⑧ 它改口 | 它自己修正原答案,并把改动的地方标成粗体 |
这条走查上,本章每个承重机制各占一步: 错在哪(①②③)、注入事实(④⑤)、让它主动要求核对(⑥⑦⑧)。 下面几节讲的就是这几步各自为什么这么做。
2. 为什么会错
作者对走查第 ①③ 步给出了机制层面的解释。先交代一个词——泛化: 从见过的例子里总结出规律,再套到没见过的情况上。这正是第 02 章讲的那件事。
他这句话值得单独记4:
如果它在训练时从某个地方看到了芝加哥和东京之间的具体距离,它当然可以答对。 但在本例中,仅仅依靠神经网络能轻松完成的泛化 (例如对许多城市之间距离的许多示例的泛化)并不够,还需要一个实际的计算算法。
落到那 6300 公里上就是: 它见过成千上万条「A 到 B 有多远」, 于是学会了「两个远处的大城市之间大概几千公里」这种量级感 —— 量级对了,具体那个数是凑出来的。
用第 05 章的语言说:这是一个「必须一步步算」的任务,不是「一眼能看出」的任务。
而计算引擎的做法完全不同:
自然语言问题 → 转成精确的计算语言 → 用内置的城市坐标和距离算法算出来
图说:坐标和算法是几十年积累下来的结构化知识,不是从文本里泛化出来的。
一个关键判断:修 bug 的方向是错的
这是第二篇最重要的一句论断5:
是的,可以找到一种方法来「修复这个特定的 bug」。但问题在于, 像 ChatGPT 这样基于生成语言的 AI 系统的基本思想并不适用于需要执行结构化计算任务的情况。 换句话说,需要「修复」几乎无穷多的「bug」,才能追赶上结构化方法所能实现的 几乎无穷小的成就。
「几乎无穷多的 bug」对「几乎无穷小的成就」——这个对比很尖锐,而且是对的: 逐个修复算错的题目,是在用有限的补丁去覆盖一个无限的空间。
3. 两条路线,一个接口
这一节回答:那正确的方向是什么。
作者先把 AI 领域几十年的分歧摆出来6:
| 路线 | 代表 | 做法 |
|---|---|---|
| 统计路线 | ChatGPT | 从海量样本里学统计规律,生成「像」的东西 |
| 符号路线 | 作者的计算引擎 | 把世界形式化成精确的符号表示,然后精确计算 |
几十年来这两条路互相看不上。而现在有了一个机会7:
虽然两者做的事情完全不同,做事的方式也完全不同,但它们有一个公共接口:自然语言。
这意味着模型可以像人一样,用自然语言向计算引擎「提问」, 引擎再把这句自然语言转成精确的计算语言去算。
判断(我们的,不是书里的): 这一段今天读最有价值的不是结论,而是接口的选择。 后来的工具调用(模型自己说出要调哪个工具,系统去调,再把结果给它) 几乎都走了另一条路 —— 让模型输出格式固定的调用,而不是一句大白话。 「格式固定」的意思是:调哪个工具、给它什么,只能照一种写法写出来,不能换着说。
原因 在这里: 模型说一句自然语言,引擎还要再猜一遍这句话是什么意思 —— 猜错的机会多了一次。 直接让模型写出格式固定的调用,就少了这一跳。 但作者的核心论点没变:像人的部分与要算准的部分应该分家,由接口连接。
如果错,会错在: 如果模型直接生成可执行代码的可靠性足够高, 「分家」这个前提就会被削弱 —— 那时工具不再是外挂,而是模型输出的一部分。
4. 怎么接:三种做法
书里实际演示了三种,由浅入深:
① 注入事实(走查第 ④⑤ 步)。 把正确答案从引擎里取出来, 原样附在提问后面,再问一遍:
第一次问: 芝加哥到东京有多远?
→ 它答「大约 6300 公里」(错,这个数是编的)
第二次问: 芝加哥到东京有多远?
芝加哥到东京的距离是 10 150 公里。
→ 它答「10 150 公里」
图说:多出来的就是中间那一行字。**问题一个字没改,只是后面多贴了一行事实。**
「它非常礼貌地接受了更正」,再问一次就答对了8。
② 让它自己要求核对(走查第 ⑥⑦⑧ 步)。 这一步更有意思: 它可以轻松地「请求事实来做检查」 —— 让它自己说出需要核对哪些事实。
在这个例子里它要的是三条:芝加哥的坐标、东京的坐标、大圆距离公式。 把这三条送去引擎、拿回结果注入回去,它就修正了原答案 —— 它甚至会把自己改动过的地方用粗体标出来9。
①和②差在哪: ① 是你知道该补什么,② 是它说出该补什么。 ② 才是今天那套做法的雏形。
③ 补它答不了的实时数据。 有些问题它根本答不了(比如需要当下的数据)。 把引擎的输出喂给它,它就能生成漂亮的文章式结果10。
判断(我们的,不是书里的): ② 就是今天所说的工具调用的雏形 —— 让模型自己决定「需要查什么」,而不是让人替它决定。 三者的分工在今天依然成立:模型负责措辞、组织与解释;工具负责事实与计算。 如果错,会错在: 让模型自己决定查什么,前提是它能意识到自己不知道; 而书里那个火鸡的例子恰恰说明它常常意识不到 —— 它编造得理直气壮,还附上了来源。 所以「主动核对」不能只靠模型自觉,得有外部策略强制触发。
5. 95% 这把尺子
这一节给出全篇最实用的一条判据。
第二篇末尾有一段关于机器学习本质的总结,值得完整带走11:
机器学习……在每个案例中,都会跨越一个门槛 —— 通常是突然之间。 一些任务从「基本不可能」变成了「基本可行」。
但结果从来不是「完美」的。也许有的东西能够在 95% 的时间内运作良好。 但是不论怎样努力,它的表现在剩下的 5% 时间内仍然难以捉摸。
关键在下一句:
对于某些情况来说,这可能被视为失败。但关键在于,在各种重要的用例中,95% 往往就「足够好了」。
什么时候 95% 够?作者给了两种情形:
- 输出本身没有「正确答案」(写作、建议、草稿);
- 人只是想挖掘一些可能性, 再由人或程序去挑选和改进。
反过来,什么时候不够?
当必须把事情做到完美时,机器学习并不是解决问题的方法 —— 就像人类也不是一样。
判断(我们的,不是书里的): 这一段是判断一个 AI 产品该不该做的最好的一把尺子: 先问这个场景里那 5% 的代价是什么。 代价是「用户重写一遍」—— 可以做; 代价是「一笔钱打错了账户」—— 不能做,除非有工具兜住, 或者在真正动手那一步插进一个人、由他点头才算数 (这个做法的名字叫「人在回路」,你在讲 AI 产品的文章里会反复撞见它)。 如果错,会错在: 有些场景的 5% 失败是隐性的(比如摘要漏掉了关键信息), 用户根本不知道自己踩到了那 5% —— 这类场景比「明显出错」的场景更危险, 而这把尺子量不出来。
6. 作者更远的野心
第二篇的最后一段讲的不再是打补丁,而是一个更大的构想12:
- 让模型直接用计算语言运行。 不是让它去学引擎已经会算的东西, 而是让它像人一样使用计算语言;
- 让它写「计算性文章」。 自然语言和计算语言混写的文章 —— 代码可以真的执行,同时代码本身也表达思想;
- 把计算语言当提示语言用。 作者的说法是: 计算语言「和自然语言一样富有表现力」,足以用来给模型写有意义的提示。
他给这件事找的历史类比是数学符号:数学符号被发明之后, 人类第一次有了「用数学思维思考」的精简媒介,很快导致了代数、微积分和所有数学科学的出现。 计算语言想为「计算思维」做同样的事。
7. 今天该怎么读这一篇
判断(我们的,不是书里的): 这一篇的产品部分已经是历史, 但它的三条骨架全部成为了现实:
书里的说法(2023 年初) 今天的名字 让模型「请求事实来做检查」 工具调用(上面第 3 节已经解释过) 把外部结果「注入」再让它修正 检索增强:先去资料库里查,把查到的塞回给它再让它答 像人的部分归模型,要算准的部分归工具 「让它自己接连做很多步事」的基本分工 如果错,会错在: 相似不等于因果 —— 这些做法多半是被同一个约束逼出来的, 而不是从这篇文章传承下来的。把它当成「早期论证」是恰当的,当成「起源」就过头了。
判断(我们的,不是书里的): 上面表里最后那一格,今天有个名字:agent —— 指的是让模型自己接连做很多步事:定计划、记住上一步、反复调工具。
补充(不在书里):第二条其实早有正式名字。 「把外部查到的内容注入,再让模型据此作答」这套做法, 出自 2020 年的《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》 (Lewis 等,2020-05-22 提交)。RAG 就是这套做法的通行缩写,来自这篇的标题。 来源:https://arxiv.org/abs/2005.11401(查阅于 2026-08-25)。
它比本书早近三年。 作者是从自己的产品出发独立走到同一个做法上的, 没有引用这条脉络。
8. 可带走的
- 两条路线(统计 / 符号)分家,由接口连接 —— 这是第二篇的全部主张;
- 它的错法有规律:凡是需要「实际的计算算法」而不是泛化的地方,它就会错;
- 错得很像真的:会编造数据、会附上来源、会为自己的答案编一个像样的解释;
- 逐个修 bug 是错的方向:几乎无穷多的 bug 对几乎无穷小的成就;
- 三种接法:注入事实 / 让它主动要求核对 / 用工具补它答不了的实时数据; 走查上就是:问「芝加哥到东京多远」→ 它凭量级感凑一个数 → 把正确那一行字贴在问题后面再问一遍,它就对了; 或者让它自己说出「我要核对哪三条」,查完塞回去,它自己改口;
- 95% 这把尺子:先问那 5% 的代价是什么,再决定该不该做;
- 必须完美的场合,机器学习不是答案 —— 作者补了一句「就像人类也不是一样」;
- 今天读它的价值在骨架,不在产品:工具调用、RAG、agent 分工都能在这里找到雏形。
9. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 两条路线与公共接口 | ChatGPT和Wolfram|Alpha | text/20-fm-chatgpt-wolfram-alpha.txt:36(搜「统计方法」) · text/20-fm-chatgpt-wolfram-alpha.txt:33(搜「公共接口」) |
| 作者的资历与立场 | ChatGPT和Wolfram|Alpha | text/20-fm-chatgpt-wolfram-alpha.txt:21(搜「43年」) · text/20-fm-chatgpt-wolfram-alpha.txt:27(搜「计算超能力」) |
| 距离算错与原因 | 一个简单的例子 | text/21-fm.txt:49(搜「芝加哥和东京」) · text/21-fm.txt:49(搜「计算算法」) |
| 注入事实后它接受更正 | 一个简单的例子 | text/21-fm.txt:46(搜「礼貌地接受了更正」) |
| 编解释、编数据 | 再举几个例子 | text/22-fm.txt:55(搜「编造」) · text/22-fm.txt:100(搜「捏造」) |
| 修 bug 方向错误 | 再举几个例子 | text/22-fm.txt:79(搜「几乎无穷多」) |
| 让它主动要求核对 | 再举几个例子 | text/22-fm.txt:106(搜「请求事实来做检查」) |
| 95% 这把尺子 | 前方的路 | text/23-fm.txt:19(搜「95%」) |
| 计算性文章与数学符号 | 前方的路 | text/23-fm.txt:58(搜「计算性文章」) · text/23-fm.txt:52(搜「数学符号」) |