跳到主要内容

先把尺子造出来 — 八步验证流水线,以及它在哪儿会判错

这一章讲什么: 怎么让机器自动判一道数学题答得对不对 —— 从模型吐出的一大段话里,一步步走到一个「对」或「错」; 这把尺子在哪几种情况下会判错;以及用它量出来的全书起点分数。 顺带回答一个更根本的问题:为什么改进之前一定要先造尺子。

它在全书链条里的位置: 全书的枢纽,后面九章每一次报分数,报的都是这把尺子上的读数。 而它还有第二个身份 —— 第 10 章会把这把尺子原样搬去当训练用的评委。 这一章谁都不能跳。

需要的基础: 会跑模型、拿得到它吐出来的那段文字(第 03、04 章)。

顶层全景:一道题,八步,一个百分比

整章的主走查是书自己挑的一道题:

已知 a+b=3ab=13/6,求 a²+b²正确答案是 14/3

这一章的八节和这条走查的八步严格对齐 —— 每读完一节,走查就往前走一步。

① 加载模型 ────────────────────────────────────┐
② 让它答这道题 │ 这两步在第 2 节
▼ 它写出一整段分步解法,末尾是 \boxed{\dfrac{14}{3}}
③ 从那一大段话里抠出答案框里的东西 第 3 节
▼ "\dfrac{14}{3}"
④ 把写法统一成一种 第 4 节
▼ "(14)/(3)"
⑤ 判断它和标准答案是不是同一个数 第 5 节
▼ 拿 "28/6" 试:化简后也是 14/3 ⟹ 判等
⑥ 打分(答案有好几段时逐段判) 第 6 节
▼ True
⑦ 换成 500 道题的题库 第 7 节
⑧ 全跑一遍,得出一个百分比 第 8 节
▼ **15.3%** ← 这是本章那张表 3.1 的数;**全书做纵向比较统一用另一组的 15.2%**

图说:这八步就是「验证器」的全部。注意 ③④⑤ 三步 ——
它们看起来是琐碎的字符串处理,**却正是整本书能成立的地基。**
末尾那两个数为什么不是同一个,第 8 节有一个口径块专门讲,**别在这里先记住 15.3。**

1. 为什么第一件事是造尺子,而不是改东西

先说清楚这本书在评测这件事上的位置。

书把评测大模型的常见做法分成四种,归成两大类1:

基准型(偏定量) 评判型(偏定性)
├─ 多选题 ├─ 排行榜(让人投票)
└─ 验证器 ← 本章做这个 └─ 让另一个模型当裁判

这本书只做左下角那一种,而且给的理由只有一条2:

数学题同时满足两个条件:它需要一步步推才做得出来,而它的最终答案又能自动核对。

这两个条件缺一不可。 只满足前一个(比如写一篇散文),没法自动判分; 只满足后一个(比如问「德国首都是哪」),又用不着推理。数学题正好卡在中间。

这一节要钉死的那个词:验证器。

所谓验证器,就是一段自己写的、能自动判断模型答得对不对的代码。 它不是模型,不含任何可调的数,输入一段回答和一个标准答案,输出「对」或「错」。

代价书也当场写了2:

代价说明
只能用在能确定判对错的领域数学、代码这类。这一条会在第 10 章变成一个更硬的限制
引入额外的麻烦和依赖你得自己写一堆处理文字的代码,还要装一个数学库
把一部分评测负担从模型转移给了外部工具尺子判错的时候,你会误以为是模型答错了

另外三种量法书没做,放在附录里 —— 我们在这一章末尾的「边界与局限」里补上, 因为不知道另外三种长什么样,就不知道这一种的位置在哪。

最后是这一节真正的落点,也是这本书区别于「炫技型」教程的地方:

这把尺子先造出来,后面每改一次就回来量一次。 书还给了它第二个用途:它引入的原则(能自动核对的奖励)正是第 6 章那套训练方法的地基 —— 第 10 章会看到这把尺子被原样搬过去当评委3

2. 走查开始:让 base 模型答一道题,它答得像模像样

走查第 ①、② 步:加载那个没调教过的 base 模型,把题目丢给它。

书挑的题是:已知 a+b=3ab=13/6,求 a²+b²

它吐出来的东西出乎意料地整齐4:

它先说要用一个代数恒等式: a² + b² = (a + b)² − 2ab
然后写 "**Step 1:** 把已知的值代进去"
a² + b² = (3)² − 2 × (13/6)
……(中间还有几步)
最后写 "**Final Answer:**"
\boxed{\dfrac{14}{3}}

注意最后那一行的 \boxed{...} 这是数学排版里「把最终答案框起来」的写法, 而这本书的提示词里明确要求了模型这么做 —— 有了这个框,机器才知道该从哪儿抠答案。

但这里有一件事必须停下来说,它兑现了第 01 章的一个许诺。

这是一个 base 模型 —— 按第 02 章的说法,它连指令都不一定听得懂,更没被教过要写解题步骤。 可它自己写出了完整的分步解法。

书对此下了一个判断4:

这很可能是因为 Qwen3 团队在预训练阶段就掺进了带分步解法的数据(依据是他们的技术报告)。

这就是第 01 章第 6 节说的「推理是一条连续谱」的实物证据: 不是「推理模型才会写步骤」,而是这个能力早就在里面了,只是强弱不同

书还留了一句提醒: 你在自己机器上跑,答案可能不一样 —— 取决于你用的是中央处理器还是显卡4

3. 第三步:从一大段话里把答案抠出来

问题很具体:上面那一大段话里,只有 \boxed{\dfrac{14}{3}} 里面那一小截是答案。怎么抠?

最容易想到的办法是「找 \boxed{ 然后一直读到 }」。这个办法是错的。

因为答案本身里面还套着花括号:\boxed{\dfrac{14}{3}} 里有 {14}{3}读到第一个 } 就停,抠出来的是 \dfrac{14 —— 半截。

所以书手写了一个配对扫描: 从最后一个 \boxed 开始,跳过空白,认准那个 {, 然后一个字符一个字符往后走,遇到 { 就计数加一、遇到 } 就减一,减到零的那个才是真正的收尾5

\boxed{\dfrac{14}{3}}
↑ 深度 1
↑ 深度 2({14 开始)
↑ 深度 1(}14 结束)
↑ 深度 2({3 开始)
↑ 深度 1
↑ 深度 0 ⟹ 就是这里收尾

抠出来 → "\dfrac{14}{3}" ← 走查第 ③ 步的结果[^6]

书专门用一个边栏回答了「为什么不干脆让另一个模型来抠答案」,这段值得记住6:

抠答案是机械活。用代码做,结果是确定的、可复现的、便宜的; 用另一个模型做,等于引进它自己的不确定性和额外的复杂度。

这是这本书里少见的、明确反对「什么都用大模型」的立场。

顺带一条通则,作者在这一节写下,后面会反复用到7:

凡是模型训练那会儿互联网上有的东西,都可以假定它进过训练数据。 —— 这句话在第 8 节会变成一个很不舒服的结论。

4. 第四步:同一个数,它能写出五六种样子

先看问题。同一个值 14/3,模型可能写成8:

\frac{14}{3} \dfrac{14}{3} 14/3 $14/3$ (14)/(3)

这五种当成一串字符去比,没有两个一样;可数学上它们完全相同。 (一串字符在程序里就叫字符串。)所以直接比字符串,五种里有四种会被判错。

改法是先用一串固定的改写规则,把它们统统碾成同一种写法 —— 这一步叫归一化(意思就是「把不同的写法统一成一个标准样子」)。

书里那个函数干的活,列出来是这些8:

干什么例子
删掉特殊词元和排版杂物\left\right、度数符号
拆掉外壳\text{2/3}2/3
去掉行内公式的记号$14/3$14/3
改写成算式的样子\sqrt{a}sqrt(a);\frac{a}{b}(a)/(b);^**
去掉千分位逗号、统一小写1,2341234

走查第 ④ 步:\dfrac{14}{3} 归一化之后是 (14)/(3) 书还试了另一种写法 \text{\[\frac{14}{3}\]},归一化之后同样得到 (14)/(3)9 —— 两条不同的路走到了同一个点,这正是这一步存在的意义。

5. 第五步:统一了写法还不够,得判它们是不是同一个数

先看为什么还不够。书举了两个例子10:

两边字符串一样吗数学上一样吗
14/3(14)/(3)不一样一样
(28)/(6)(14)/(3)完全不一样一样(约分之后)

第二行是关键:归一化管不了约分。 你可以把写法统一,但没法把 28/6 变成 14/3 —— 那不是排版问题,是数学问题。

所以要请一个会做数学的工具来判。 书用的是 SymPy,一个符号数学库 —— 这里的符号指的是它像人做代数那样操作式子本身,而不是把式子算成一个近似的小数。 它的源码公开、谁都能免费拿去用和改,这类软件就叫开源软件。 书特意提了它的资历:开发和测试了二十年11

判等分三步。第二步要把两边各自「读懂」—— 把一串字符变成程序能操作的式子, 这个动作就叫解析12:

① 先试字符串全等 —— 相等就直接算对(省时间)
② 不等:把两边各自解析成 SymPy 认得的式子
③ 判断「两者之差化简之后是不是 0」 ⟹ 是,就判等

走查第 ⑤ 步:拿 "28/6" 走一遍
解析 → SymPy 化简 → 14/3
14/3 − 14/3 = 0 ⟹ True[^14]

这一节还有一条坦白,是全书最有价值的工程细节之一13:

那个解析函数里捕获的异常种类多到看着离谱, 但作者说:每一种都是他跑完 500 道题时真撞上的 —— 因为模型不总是产出格式良好的输出。

这就是「从零手写」才会暴露的现实。 你在论文里看到的一句「我们用一个验证器判分」, 背后是一堆这样的补丁。

6. 第六步:它翻车了一次,然后被修好

这一节是全书最好的教学素材,因为书没有一路顺风,它把失败留在了正文里。

失败长这样14:

比较 (14/3, 2/3) 和 (14/3, 4/6)
↑ 两个数一组的答案(数学里叫「有序对」,比如坐标)

2/3 和 4/6 数学上完全相等 ⟹ 应该判 True
实际返回 → **False**

原因:上一节那个判等函数只会处理单个式子,不认「一组数」这种东西

修法分两步15:

干什么
看到 (a, b)[a, b] 这种形状,按逗号拆成一段一段
逐段判 + 全对才算对每一段各自走一遍上一节的判等,全部对上才判 True

走查第 ⑥ 步:(14)/(3) 只有一段,拆完还是它自己,判等通过 ⟹ True。

修好之后,书拿 16 条用例跑了一遍,全部通过16这 16 条就是这把尺子的说明书, 下面五条最能说明它的边界:

用例模型答的标准答案结果为什么
check_3\frac{\sqrt{8}}{2}sqrt(2)化简之后相等 —— 符号引擎的功劳
check_6(2, 1)(1, 2)顺序算数,这是有序对不是集合
check_80.51/2小数和分数能对上
check_90.33333333331/3近似值不算 —— 它判的是精确相等,不是「差不多」
check_1250%1/2百分号在归一化那一步被直接删掉了,于是变成了数字 50

check_9 和 check_12 是这把尺子的真实边界,必须记住:

它做的是符号意义上的精确相等,不是数值上的接近。 而且百分号会被当成排版杂物删掉 —— 这是归一化那一步的副作用,不是有意设计。

这两条意味着什么: 如果模型答了 0.3333333333,人会说它对,这把尺子会说它错。 所以后面所有的分数,都是这把尺子的读数,不是「真实水平」。

7. 第七步:换成 500 道题的题库

一道题说明不了任何问题,要一批题。书用的是 MATH-500 —— 从一个更大的数学题库里精选出来的 500 道题17

挑它的三条理由,书列得很清楚18:

理由说明
大小合适大到结果有意义,又小到能在全书里反复跑 —— 跑完整个大题库每次都太慢
和后面的训练集不重叠第 10 章要用的训练题来自同一个大题库的另外一部分,所以这 500 道是干净的考卷
别人也在用它是推理模型文献里的常用基准,结果可以和别人比

每一道题带这么几样东西:题面、标准答案、一份详细解法、难度、学科、编号。 书这一章只用前两样 —— 那份详细解法要到第 10 章才被提起,而且是被故意不用的

出身也交代了:这个 500 道题的划分最早出自 OpenAI 的一个仓库,现在也放在 Hugging Face 上; 书为了保证结果可复现,从自己的代码仓库里加载了一份副本19

8. 第八步:量出起点 —— 以及这个数有多不牢靠

走查最后一步:把八步流水线套在 500 道题上跑一遍。

书跑出来的数20:

模型题量准确率耗时
base1030%0.4 分钟(Mac Mini M4)
官方推理版1090%7 分钟(同一台)
base50015.3%13.3 分钟(H100)
官方推理版50050.8%185.4 分钟(H100)

这两个数要一起读:准确率从 15.3% 到 50.8%(三倍多),耗时从 13.3 到 185.4 分钟(慢 14 倍)。 书自己下的判词:这正是用推理模型要付的代价之一21

一个必须写死的口径:书里有两组基线,别混用

这是我们通读时抓到的一处书自己的不一致,书没有解释。

出处base官方推理版跑在哪台机器上
第 3 章表 3.1(就是上面这张)15.3%50.8%H100
第 4 章之后所有的表15.2%48.2%DGX Spark

我们全书的口径:凡是要做纵向比较的地方,一律用后一组(15.2% / 48.2%)。 理由: 后面四章的每一行成绩都是在同一台 DGX Spark 上、和那两个数一起跑出来的,彼此可比; 而这一章的两个数跑在另一台机器上。跨机器比准确率,比出来的差值不知道该记在谁头上。 我们在提到基线时会一直标明是哪一组。

更不舒服的一件事:换个提示词,分数动 20 个点

这一节是这一章最反直觉、也最该被记住的部分。

先说清楚被改的是什么。 这本书是把每道题套进一个固定的框子里再发给模型的 —— 框子里写着「你是一个数学助手……请把最终答案放进 \boxed{} 里……Question: <题目>」, 这个框子就叫提示词模板

书交代了两组实测,每一组都会改变你对「基准分数」这件事的信任度22:

改动base 模型官方推理版
干脆不用提示词模板准确率 涨约 50%掉约 40%
把模板里的 Question: 换成 Problem:涨约 20%掉约 30%

Problem: 是 MATH-500 这个题库的标准写法。 而作者对那 20% 的解释非常直白:

很可能是因为它更贴近被记住的训练数据 —— 也就是说,假定这 500 道题本来就在训练用的那批文字里22

这句话和第 3 节那条通则(互联网上有的都假定进过训练数据)合起来,结论很硬:

基准分数 = 模型真实能力 + 它对这套措辞的熟悉程度 + 它可能背过这些题
↑ 换个词就动 20 个点 ↑ 作者自己承认的可能性

图说:所以「A 模型 52 分、B 模型 48 分」这种比较,
在小模型上可能只是在比谁的提示词更凑巧。

书还澄清了一个可能的误读23:准确率随提示词大幅变化, 不代表我们的抽答案方法不可靠 —— 模型也可能只是单纯答错了, 换一个模型来抠答案救不了这种情况。书说小模型对措辞往往极其敏感, 下一章引入更多提示词变体之后会更明显。

作者的判断与证据

说法性质
八步流水线每一步的中间结果书里印出来的真实运行结果
16 条用例全部通过有证据,书把整张表印了出来
15.3% / 50.8% / 13.3 分钟 / 185.4 分钟书里的实测,在 H100 上跑的
base 模型会写分步解法是因为预训练掺了这类数据作者的推断,措辞是「很可能」;他给的依据是 Qwen3 团队的技术报告,不是自己做的实验
Problem: 涨 20% 是因为更贴近被记住的数据作者的推断,措辞同样是「很可能」,并且明说这建立在「假定测试集在训练用的那批文字里」之上
「凡是网上有的都可以假定进过训练数据」作者给的通则,没有出处 —— 当经验法则用
那一堆异常处理全是真撞上的作者的自述,这是他跑 500 道题的经历
不该用另一个模型来抠答案作者的立场,理由是确定性、可复现、便宜
两组基线数字不一致这是我们发现的,书没有承认也没有解释(见上面那个口径块)

判断(我们的,不是书里的): 这一章最值钱的不是那八步代码,是第 8 节那三个坦白 —— 尺子有明确的判错清单、提示词换一个词分数动 20 个点、题目可能本来就在训练数据里。 一本教人做评测的书,肯把自己尺子的三处软肋摆在正文里, 这比它把准确率提到多少更有参考价值。 如果错,会错在: 我们没有独立验证那三条 —— 尤其是「MATH-500 在训练数据里」这一条, 作者用的是「假定」,我们也没有办法去核。若 Qwen3 训练时用的文字里确实排除了这个题库, 那么 Problem: 涨 20 个点就要另找解释,而这一章的分数可信度会比我们说的更高。

边界与局限

书没做的另外三种量法(附录 F)

第 1 节说过评测有四种,这本书只做了验证器那一种。另外三种在附录里,列出来才知道这一种的位置24。 其中一种要先认个名字:把很多模型按好坏排成一张名次表,这张表就叫排行榜

方法类别怎么做书举的例子
多选题基准型让模型输出一个字母,直接和正确选项比MMLU —— 57 个学科、约 1.6 万道题;书演示了一道,模型答错了
验证器基准型本章做的这一种MATH-500
排行榜评判型让用户对两个模型的回答投票,再把票汇总成排名LM Arena —— 汇总用的方法源自国际象棋的等级分系统
让另一个模型当裁判评判型给裁判模型一份评分细则和一个参考答案,让它打分书用一个本地跑的开源模型实现了一遍

三条书自己给的判断值得记25:

  1. 更早的自动指标(比如 BLEU)为什么不行: 它们要求词对词精确匹配,不认同义词和措辞变化;
  2. 为什么让模型当裁判效果不错: 除了裁判本身够强,还有一条更根本的原因 —— 评价一个答案往往比生成一个答案容易;
  3. 训练时盯的那几个量不算在这四类里 —— 比如「它答得离对的差多远」那个数、 以及后面第 10 章要讲的奖励;书说那些是模型开发过程内部用的,不是拿来对外报成绩的。

这把尺子本身的边界

  1. 它只判最终答案,不判中间步骤对不对。 一个过程全错、答案蒙对的回答,它给满分。
  2. 它做符号意义上的精确相等:0.3333333333 不等于 1/3,50% 不等于 1/2(见第 6 节)。
  3. 只能用在数学、代码这类能确定判对错的领域。 这条限制会在第 10 章变得更硬。
  4. 代码题这本书没做。 书明说因为要搭一个安全的隔离环境去执行模型写的代码,太复杂; 但它强调:两者的训练算法是一样的26
  5. 它把一部分评测负担转移给了外部工具。 尺子判错时,你看到的是「模型答错了」。
  6. 提示词模板是作者为了「读起来快」挑的,不是为了最高分挑的。 书自己建议读完之后回头换设置重跑27 —— 所以这一章的分数不是这些模型的上限。

可带走的

  1. 先造尺子,再改东西。 这是这本书唯一的方法论主张,也是最值得抄走的一条: 没有能自动跑、每次都给同一个答案的尺子,后面所有的改进都是自说自话。
  2. 验证器 = 一段自己写的、能自动判对错的代码。 它不含任何可调的数,所以结果确定、可复现、便宜。
  3. 挑数学题当评测领域,是因为它同时满足两个条件:要一步步推才做得出、最终答案能自动核对。 这两条也是你自己挑评测任务时该用的判据。
  4. 抠答案要用配对扫描,不能读到第一个右括号就停。 因为答案里往往还套着括号。
  5. 别用另一个模型去做机械活。 抠答案、统一写法这类事,代码做才确定、可复现、便宜。
  6. 判两个答案是否相同,分三层:字符串相等 → 写法统一 → 数学上等价。 前两层管排版,第三层要请符号数学库,判的是「两者之差化简后是不是 0」。
  7. 多段答案要拆开逐段判,全对才算对。 书是撞了车才补上这一步的 —— 你自己写验证器时,大概率也会在同一个地方翻车。
  8. 给你的验证器写一批用例,并且把「预期为错」的那几条也写进去。 书那 16 条里最有价值的正是判错的那几条 —— 它们才是尺子的边界说明书。
  9. 记住这把尺子会在哪儿判错:近似小数、百分号、顺序不同的有序对。
  10. 基准分数不等于真实能力。 换个提示词模板能动 20 到 50 个点, 而且题目可能本来就在训练数据里。报分数时一定要说清用的是哪套提示词、哪台机器。
  11. 跨机器、跨设置的分数不能混着比。 这本书自己就有两组对不上的基线(15.3/50.8 与 15.2/48.2), 我们全书统一用后一组。

原文地图

主题原书章原文位置
验证器的第二个身份(→ 第 6 章)3 Evaluating reasoning modelstext/16-ch03-3-evaluating-reasoning-models.txt:41(搜「principle of verifiable rewards」)
四种评测法与两大类3.1 Building a math verifiertext/17-ch03-01-3-1-building-a-math-verifier.txt:7(搜「multiple choice, verifiers, leaderboards, and LLM judges」) · :13(搜「benchmark-based evaluation and judgment-based evaluation」)
为什么挑数学题同上text/17-ch03-01-3-1-building-a-math-verifier.txt:19(搜「benefit from step-by-step reasoning to solve」)
验证器的三条代价同上text/17-ch03-01-3-1-building-a-math-verifier.txt:65(搜「shift part of the evaluation burden」)
八步流水线同上text/17-ch03-01-3-1-building-a-math-verifier.txt:77(搜「following the 8 steps」)
走查那道题与模型的完整输出3.2 Loading a pre-trained model to generate texttext/18-ch03-02-3-2-loading-a-pre-trained-model-to-generate-text.txt:196(搜「given that ( a + b = 3 )」)
base 模型为什么会写分步解法同上text/18-ch03-02-3-2-loading-a-pre-trained-model-to-generate-text.txt:227(搜「included chain-of-thought data during the pre-training」)
「网上有的都假定进过训练数据」3.4 Extracting the final answer boxtext/20-ch03-04-3-4-extracting-the-final-answer-box.txt:25(搜「part of the training data」)
配对扫描抠答案同上text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:107(搜「def get_last_boxed」) · :190(搜「the boxed answer we wanted to extract」)
为什么不用模型来抠答案同上text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:369(搜「Why not use an LLM for the answer extraction」) · :381(搜「deterministically and reproducibly」)
同一个值的多种写法3.5 Normalizing the extracted answertext/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:7(搜「Models may print the same value in many ways」)
归一化做哪些改写同上text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:172(搜「rewrites it into a standardized format」)
归一化的两次输出同上text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:198(搜「(14)/(3)」) · :217(搜「as intended」)
为什么 == 不够3.6 Verifying mathematical equivalencetext/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:26(搜「not sufficient」)
SymPy 与它的资历同上text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:38(搜「developed and tested for two decades」)
判等的做法:差是不是 0同上text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:170(搜「def equality_check」) · :191(搜「If the difference is 0」)
28/6 化简成 14/3同上text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:146(搜「sympy_parser("28/6")」) · :152(搜「Similarly, this returns」)
异常种类全是真撞上的同上text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:116(搜「excessive amount of error cases」)
元组答案上的翻车同上text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:277(搜「it currently only handles simple expressions」)
拆段与逐段判3.7 Grading answerstext/23-ch03-07-3-7-grading-answers.txt:55(搜「breaks down multi-part answers」) · :90(搜「def grade_answer」)
16 条用例与全通过同上text/23-ch03-07-3-7-grading-answers.txt:176(搜「tests = [」) · :275(搜「Passed 16/16」)
MATH-500 是什么3.8 Loading the evaluation datasettext/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:7(搜「MATH-500 dataset」)
挑它的三条理由同上text/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:20(搜「practical for three reasons」)
它的出身同上text/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:94(搜「PRM800K repository」)
提示词模板是为「读起来快」挑的3.9 Evaluating the modeltext/25-ch03-09-3-9-evaluating-the-model.txt:130(搜「encourages short outputs」)
Problem: 动 20 个点同上text/25-ch03-09-3-9-evaluating-the-model.txt:142(搜「swaps "Question:" with "Problem:"」)
分数变动不代表抽取方法不可靠同上text/25-ch03-09-3-9-evaluating-the-model.txt:148(搜「it looks like our extraction method may not be reliable」) · :154(搜「sensitive to prompt phrasing」)
表 3.1 与两个基线数同上text/25-ch03-09-3-9-evaluating-the-model.txt:512(搜「Table 3.1」) · :614(搜「15.3%」) · :625(搜「50.8%」)
准确率与耗时的代价同上text/25-ch03-09-3-9-evaluating-the-model.txt:636(搜「185.4 min」)
代码领域没做的理由同上text/25-ch03-09-3-9-evaluating-the-model.txt:702(搜「executing code would require additional」)
多选题与 MMLUAppendix F. Common approaches to model evaluationtext/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:61(搜「Massive Multitask Language Understanding」) · :74(搜「57 subjects」) · :417(搜「Correct? False」)
排行榜与等级分同上text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:524(搜「LM Arena」) · :569(搜「Elo rating system」)
让模型当裁判同上text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:783(搜「pre-defined grading rubric」) · :796(搜「evaluating an answer is often easier than generating one」)
BLEU 为什么不行同上text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:771(搜「they require exact word matches」)
训练时的那些量不算这四类同上text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:37(搜「used internally during model development」)

Footnotes

  1. 出处:「3.1 Building a math verifier」第 7 段(text/17-ch03-01-3-1-building-a-math-verifier.txt:7,搜「multiple choice, verifiers, leaderboards, and LLM judges」)与第 13 段(text/17-ch03-01-3-1-building-a-math-verifier.txt:13,搜「benchmark-based evaluation and judgment-based evaluation」)。原文还顺带解释了「模型卡」是什么:一份说明这个模型怎么训的、怎么评的、打算怎么用的文档。

  2. 出处:「3.1 Building a math verifier」第 19 段(text/17-ch03-01-3-1-building-a-math-verifier.txt:19,搜「benefit from step-by-step reasoning to solve」)是挑数学题的理由;三条代价在第 65 段(text/17-ch03-01-3-1-building-a-math-verifier.txt:65,搜「shift part of the evaluation burden」)。八步流水线的出处是第 77 段(text/17-ch03-01-3-1-building-a-math-verifier.txt:77,搜「following the 8 steps」)。 2

  3. 出处:「3 Evaluating reasoning models」第 41 段(text/16-ch03-3-evaluating-reasoning-models.txt:41,搜「principle of verifiable rewards」)与「3.6 Verifying mathematical equivalence」第 13 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:13,搜「reappear as a verifiable reward signal」)。书在两个地方明说了这件事,可见它有多要紧。

  4. 出处:「3.2 Loading a pre-trained model to generate text」第 196 段起(text/18-ch03-02-3-2-loading-a-pre-trained-model-to-generate-text.txt:196,搜「given that ( a + b = 3 )」)是模型输出的原样,一直到第 215 段的 \boxed{\dfrac{14}{3}};作者的判断与那句「换设备结果可能不同」的提醒在第 227 段(text/18-ch03-02-3-2-loading-a-pre-trained-model-to-generate-text.txt:227,搜「included chain-of-thought data during the pre-training」)。 2 3

  5. 出处:「3.4 Extracting the final answer box」第 107 段(text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:107,搜「def get_last_boxed」)到第 140 段(text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:140,搜「content_start_idx」)。我们只描述这个扫描的逻辑,不搬代码。

  6. 出处:「3.4 Extracting the final answer box」第 369 段(text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:369,搜「Why not use an LLM for the answer extraction」)与第 381 段(text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:381,搜「deterministically and reproducibly」)。这是书里的一个边栏。

  7. 出处:「3.4 Extracting the final answer box」第 25 段(text/20-ch03-04-3-4-extracting-the-final-answer-box.txt:25,搜「part of the training data」)。

  8. 出处:「3.5 Normalizing the extracted answer」第 7 段(text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:7,搜「Models may print the same value in many ways」)给了几种写法;归一化具体做哪些改写在第 172 段(text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:172,搜「rewrites it into a standardized format」)。 2

  9. 出处:「3.5 Normalizing the extracted answer」第 198 段(text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:198,搜「(14)/(3)」)与第 217 段(text/21-ch03-05-3-5-normalizing-the-extracted-answer.txt:217,搜「as intended」)。

  10. 出处:「3.6 Verifying mathematical equivalence」第 26 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:26,搜「not sufficient」)。原文举的正是 14/3(14)/(3)(28)/(6)(14)/(3) 这两组。

  11. 出处:「3.6 Verifying mathematical equivalence」第 38 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:38,搜「developed and tested for two decades」)。原文说它已成为 Python 科学计算里的一件常备工具。

  12. 出处:「3.6 Verifying mathematical equivalence」第 170 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:170,搜「def equality_check」)到第 191 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:191,搜「If the difference is 0」)。

  13. 出处:「3.6 Verifying mathematical equivalence」第 116 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:116,搜「excessive amount of error cases」)。

  14. 出处:「3.6 Verifying mathematical equivalence」第 277 段(text/22-ch03-06-3-6-verifying-mathematical-equivalence.txt:277,搜「it currently only handles simple expressions」)。书在这一节末尾承认了这个限制,并把修复放到下一节。

  15. 出处:「3.7 Grading answers」第 55 段(text/23-ch03-07-3-7-grading-answers.txt:55,搜「breaks down multi-part answers」)与第 90 段(text/23-ch03-07-3-7-grading-answers.txt:90,搜「def grade_answer」)。

  16. 出处:「3.7 Grading answers」第 176 段起是那 16 条用例的清单(text/23-ch03-07-3-7-grading-answers.txt:176,搜「tests = [」),结果在第 275 段(text/23-ch03-07-3-7-grading-answers.txt:275,搜「Passed 16/16」)。表格里那五条是我们从 16 条里挑出来的,原文全部列了。

  17. 出处:「3.8 Loading the evaluation dataset」第 7 段(text/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:7,搜「MATH-500 dataset」)。

  18. 出处:「3.8 Loading the evaluation dataset」第 20 段(text/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:20,搜「practical for three reasons」)。同一段还说明了为什么不用更简单的 GSM8K:MATH-500 对现代推理模型更有挑战性。

  19. 出处:「3.8 Loading the evaluation dataset」第 94 段(text/24-ch03-08-3-8-loading-the-evaluation-dataset.txt:94,搜「PRM800K repository」)。书说明了为什么从自己的仓库加载副本:防止外部来源变动导致结果不可复现。

  20. 出处:表 3.1,「3.9 Evaluating the model」第 512 段(text/25-ch03-09-3-9-evaluating-the-model.txt:512,搜「Table 3.1」),两个 500 题的数在第 614 段(text/25-ch03-09-3-9-evaluating-the-model.txt:614,搜「15.3%」)与第 625 段(text/25-ch03-09-3-9-evaluating-the-model.txt:625,搜「50.8%」)。10 题子集上的 30% 与 90% 见第 472 段(text/25-ch03-09-3-9-evaluating-the-model.txt:472,搜「relatively low accuracy of 30%」)与第 506 段(text/25-ch03-09-3-9-evaluating-the-model.txt:506,搜「achieves a 90% accuracy」)。

  21. 出处:「3.9 Evaluating the model」第 636 段(text/25-ch03-09-3-9-evaluating-the-model.txt:636,搜「185.4 min」)。同一节第 649 段(text/25-ch03-09-3-9-evaluating-the-model.txt:649,搜「batched mode」)给了成批跑的对照:base 模型从 13.3 分钟降到 3.3 分钟 —— 这正是第 04 章第 5 节那笔账。

  22. 出处:「3.9 Evaluating the model」第 142 段(text/25-ch03-09-3-9-evaluating-the-model.txt:142,搜「swaps "Question:" with "Problem:"」)。两组改动的四个百分比全部出自这一段;「假定 MATH-500 测试集在训练语料里」这句也在这一段。 2

  23. 出处:「3.9 Evaluating the model」第 148 段(text/25-ch03-09-3-9-evaluating-the-model.txt:148,搜「it looks like our extraction method may not be reliable」)与第 154 段(text/25-ch03-09-3-9-evaluating-the-model.txt:154,搜「sensitive to prompt phrasing」)。

  24. 出处:「Appendix F. Common approaches to model evaluation」第 61 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:61,搜「Massive Multitask Language Understanding」)与第 74 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:74,搜「57 subjects」)是多选题那一种;那道演示题模型答错了,见第 417 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:417,搜「Correct? False」)。排行榜见第 524 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:524,搜「LM Arena」)与第 569 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:569,搜「Elo rating system」)——附录还说明了 LM Arena 后来已经从等级分换成了另一套统计方法,但「Elo」这个叫法在业内仍然沿用(第 751 段,text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:751,搜「Bradley–Terry model」)。裁判模型见第 783 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:783,搜「pre-defined grading rubric」)。

  25. 出处:「Appendix F. Common approaches to model evaluation」第 771 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:771,搜「they require exact word matches」)、第 796 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:796,搜「evaluating an answer is often easier than generating one」)与第 37 段(text/84-apx-f-appendix-f-common-approaches-to-model-evaluation.txt:37,搜「used internally during model development」)。

  26. 出处:「3.9 Evaluating the model」第 702 段(text/25-ch03-09-3-9-evaluating-the-model.txt:702,搜「executing code would require additional」)。原文说同样的思路可以扩展到代码领域,但执行模型生成的代码需要额外的安全措施,所以本书没做。

  27. 出处:「3.9 Evaluating the model」第 130 段(text/25-ch03-09-3-9-evaluating-the-model.txt:130,搜「encourages short outputs」)。作者的原话是:这个模板鼓励短输出,好让你第一遍读的时候跑得快;读完之后建议换设置重跑,把参照用的官方推理模型的准确率调上去。