跳到主要内容

第二篇 — 给它接上算得准的工具

这一章讲三件事: 它错的时候错在哪(有规律)、怎么把工具接上去、 以及一把很实用的尺子 ——「这个场景里,出错的代价是什么」。

先摆正姿势:这同时是一篇产品文章。 这本书由两篇长文构成,前六章是第一篇。 第二篇的落点是作者自己的计算引擎产品。 但把产品名字划掉之后,论证本身是成立的 —— 而且它可能是「让模型调用外部工具」这件事最早的完整论证。

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% 够?作者给了两种情形:

  1. 输出本身没有「正确答案」(写作、建议、草稿);
  2. 人只是想挖掘一些可能性,再由人或程序去挑选和改进。

反过来,什么时候不够?

当必须把事情做到完美时,机器学习并不是解决问题的方法 —— 就像人类也不是一样。

判断(我们的,不是书里的): 这一段是判断一个 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. 可带走的

  1. 两条路线(统计 / 符号)分家,由接口连接 —— 这是第二篇的全部主张;
  2. 它的错法有规律:凡是需要「实际的计算算法」而不是泛化的地方,它就会错;
  3. 错得很像真的:会编造数据、会附上来源、会为自己的答案编一个像样的解释;
  4. 逐个修 bug 是错的方向:几乎无穷多的 bug 对几乎无穷小的成就;
  5. 三种接法:注入事实 / 让它主动要求核对 / 用工具补它答不了的实时数据; 走查上就是:问「芝加哥到东京多远」→ 它凭量级感凑一个数 → 把正确那一行字贴在问题后面再问一遍,它就对了; 或者让它自己说出「我要核对哪三条」,查完塞回去,它自己改口;
  6. 95% 这把尺子:先问那 5% 的代价是什么,再决定该不该做;
  7. 必须完美的场合,机器学习不是答案 —— 作者补了一句「就像人类也不是一样」;
  8. 今天读它的价值在骨架,不在产品:工具调用、RAG、agent 分工都能在这里找到雏形。

9. 原文地图

主题原书章原文位置
两条路线与公共接口ChatGPT和Wolfram|Alphatext/20-fm-chatgpt-wolfram-alpha.txt:36(搜「统计方法」) · text/20-fm-chatgpt-wolfram-alpha.txt:33(搜「公共接口」)
作者的资历与立场ChatGPT和Wolfram|Alphatext/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(搜「数学符号」)

Footnotes

  1. 出处:「一个简单的例子」第 49 段(text/21-fm.txt:49,搜「芝加哥和东京」)。

  2. 出处:「再举几个例子」第 55 段(text/22-fm.txt:55,搜「编造」)。原文:「它给出的解释里存在不理解数学的人类可能会犯的错误。」

  3. 出处:「再举几个例子」第 100 段(text/22-fm.txt:100,搜「捏造」)与第 94 段(text/22-fm.txt:94,搜「turkeys」)。这个例子源自一个长期使用的测试查询「土耳其有多少只火鸡」。

  4. 出处:「一个简单的例子」第 49 段(text/21-fm.txt:49,搜「计算算法」)。

  5. 出处:「再举几个例子」第 79 段(text/22-fm.txt:79,搜「几乎无穷多」)。

  6. 出处:「ChatGPT和Wolfram|Alpha」第 36 段(text/20-fm-chatgpt-wolfram-alpha.txt:36,搜「统计方法」)与同段(text/20-fm-chatgpt-wolfram-alpha.txt:36,搜「符号方法」)。

  7. 出处:「ChatGPT和Wolfram|Alpha」第 33 段(text/20-fm-chatgpt-wolfram-alpha.txt:33,搜「公共接口」)。作者在同章第 21 段(text/20-fm-chatgpt-wolfram-alpha.txt:21,搜「43年」)交代了自己的资历——研究神经网络技术「实际上已经有 43 年了」;第 27 段(text/20-fm-chatgpt-wolfram-alpha.txt:27,搜「计算超能力」)把结构化计算能力称为「计算超能力」。

  8. 出处:「一个简单的例子」第 46 段(text/21-fm.txt:46,搜「礼貌地接受了更正」)与第 34 段(text/21-fm.txt:34,搜「Web API」)。

  9. 出处:「再举几个例子」第 106 段(text/22-fm.txt:106,搜「请求事实来做检查」)。

  10. 出处:「再举几个例子」第 142 段(text/22-fm.txt:142,搜「冰激凌」)。

  11. 出处:「前方的路」第 19 段(text/23-fm.txt:19,搜「95%」)。

  12. 出处:「前方的路」第 58 段(text/23-fm.txt:58,搜「计算性文章」)、第 55 段(text/23-fm.txt:55,搜「思考语言」)、第 52 段(text/23-fm.txt:52,搜「数学符号」)、第 40 段(text/23-fm.txt:40,搜「母语」)。