CS329A Lecture3:AI 答了十次,我该信哪一次?

CS329A 2 / 2
Sakurs2 30 min read
Table of Contents

让一个 Agent 做完任务,再补一句“检查一下”,几乎是顺手的事。可如果它检查完,自信地把错误答案交了上来呢?

多问几次也未必解决问题。十份回答摆在面前,有的答案相同,有的解释漂亮。最后该交哪一份? Stanford CS329A 第 3 讲 Robust Verification,就从这个问题往下拆。

本文依据 CS329A 2025 年秋季课程表 的四篇指定阅读整理,不是课堂实录。文中的订单、批改和互动结果为教学示例;论文实验会单独注明出处。

先做一回阅卷人

买三杯奶茶,每杯 12 元,再用一张减 5 元的优惠券。这道题不难,答案是 31 元。不过,模型可以用不同的方式“算出”31。

先点下面的“核对最后数字”,再点“逐步批改”。

试着批一份作业 这三份解答,你会交哪一份?
同一张订单3 杯 × 12 元
优惠券 −5 元

先核对金额,再翻开计算过程。留意 A 和 C 的变化。

A 模型的答卷
实付金额 ¥ 31
等待批改
B 模型的答卷
实付金额 ¥ 41
等待批改
C 模型的答卷
实付金额 ¥ 31
等待批改

为本文构造的例子。按钮切换的是标签信息,不是在运行真实 ORM 或 PRM。

看到 C 的过程,大概就能理解为什么检查答案并不总是省心:它两次算错,最后居然写对了数字。

在数学题里,这可能是答案匹配,也可能要求推理成立。写代码时,可能是通过测试,还可能包括没有破坏已有功能。检查的标准不同,同一份结果可能得到不同的评价。

第一层:让模型学会挑答案

一个模型负责生成几份解答,再让一个评分模型比较它们,挑出最好的一份。这个评分模型就叫验证器(verifier)。

同一道题 算实付金额 生成多份解答 A · 31 元 B · 41 元 C · 31 元 候选中可能有错,也可能重复 验证器 看题目,也看完整解答 评分 · 比较 · 挑选 选出排名最高的一份 交给用户 31 元
多次生成只是增加候选,验证器决定最后交哪一份。图中是选择流程的示意,验证器也可能选错。

为什么把写答案和检查答案拆开?想象解一道数学题:从空白纸开始找解法,和检查别人写好的两步计算,做的事情不一样。现成的步骤给了检查者落脚点。模型能否利用这些线索,比重新作答更可靠,要靠实验来判断。

它又没有标准答案,凭什么给分?

遇到新题时确实没有。但训练的时候可以有。

Cobbe 等人在 2021 年的 Training Verifiers to Solve Math Word Problems 中,让生成模型先回答训练集里的题。训练集已经给出了标准答案,因此可以自动给模型的解答标注“对”或“错”,再把这些批好的作业交给另一个模型学习。

这里的训练,是用例子调整模型参数。反复练习以后,希望它学到一些能迁移到新题的判断方法,而不只是记住那几道题的答案。

训练时 先用批好的作业练习 旧题+模型解答 题目有已知答案 用标准答案标注 核对最后的数字 正确 错误 训练评分模型 学习解答与标签的关系 使用时 新题不再提供标准答案 新题+候选解答 需要模型自己判断 训练好的评分模型 A 0.8 B 0.3 C 0.6 每份候选得到一个分数
训练时借助已知答案教模型打分;遇到新问题时,评分模型需要自己判断。图中分数仅为示意。

回到奶茶订单。自动标注程序只要发现最终数字是 31,就给正标签;如果是 41,就给负标签。评分模型则可以同时读到题目和完整解答,学习预测这份解答最后是否正确。

这种训练方式叫结果监督(outcome supervision)。由它训练出的奖励模型,常简称为 ORM。这里的“奖励”可以先理解成一个用于比较的分数,比如 0.8 比 0.3 更值得选。

论文每道题生成 100 份解答,再由验证器挑最高分。这样的选择方式叫 Best-of-N:有 N 份候选,取评分最好的一份。它在训练数据足够时带来了提升;数据很少时,验证器也会过拟合,效果未必好。

论文依据:Cobbe et al.,§4.2 。实验使用 GSM8K,也就是论文提出的小学数学应用题数据集。训练验证器还包含辅助目标,这里只保留理解流程所需的部分。

先别把“出现过”当成“选对了”

假设有 100 道题,每题生成十份答案。检查完候选和最终提交结果,得到下面这本账:

把 100 道题摊开看 每一格 = 1 道题
55
找到了,也选对了 最终交出的正确答案
25
找到了,却选丢了 检查者需要补上的差距
20
还没找到正确答案 先改善生成,才有机会可选
候选覆盖了 55 + 25 = 80 道题;
最终只交对了 55 道。
教学示例。绿色的 55 格和橙色的 25 格,都曾经拥有正确候选。

80/100 是候选覆盖率,这里对应 pass@10;55/100 才是最终正确率。中间这 25 道,值得单独追查挑选过程。上面的数字是教学例子。

这个差别会伴随整节课。候选中一份正确答案都没有,评分器再聪明也无从挑选;正确答案已经在里面,继续增加候选又未必是最需要做的事。

只想记一个式子的话

在同一个候选池、同一种正确性标准下:

选择后的正确率 ≤ 候选覆盖率\text{选择后的正确率}\ \leq\ \text{候选覆盖率}

如果正确答案出现时总能选中,两者就相等。这种“永远选得对”的理想检查者通常叫 oracle,用来给实验画上界。它不代表我们部署时真的有这样一个工具。

Weaver 将两者之差称为 generation-verification gap,生成与验证之间的差距。定义见原文 §3。这个关系针对从已有候选中选一份的流程;选完再修改答案,要另外评估。

现在回头看 C。只按最后数字标注,它拿到的也是“对”。模型从这条训练数据里,没有直接得到“第一步乘法错了”的提醒。怎样把这样的错误也教给它?

第二层:把批注写到每一步

批改数学作业时,老师经常会圈出某一行:“这里符号写反了。”这种反馈比整页一个叉更具体,也更容易知道该改哪里。

Let’s Verify Step by Step 就把这个想法用于模型训练:让人工标注者逐步读解答,给每一步标上正、负或中性标签,供模型学习。中性标签用于不好直接判成对或错的步骤。为了控制标注范围,论文在第一个错误处停止继续批改。

这样训练出来的模型叫过程奖励模型(process reward model,PRM)。过程监督的“过程”,指的就是模型写出来的这些中间推理步骤。

同一份 C 答卷,标签落在哪里?
ORM 给整份解答一个标签
C 的计算过程 ① 3 × 12 = 35 ② 35 − 5 = 31 最终答案:31 元

正标签来自最后的数字匹配。
没有告诉模型:第一步算错了。

PRM 把标签送到具体步骤
C 的计算过程 ① 3 × 12 = 35 ② 35 − 5 = 31 第一步就收到负标签 在首个错误处停止标注

负标签指出了第一处错误。
最终碰巧答对,也不会盖过这一步。

两种模型都可以读计算过程;区别在于训练时的标签有多细。右图采用 Lightman 等人的标注规则。
拿同一份解答来比较结果监督 · ORM过程监督 · PRM
批改到哪里?整份解答中间的每一步
收到什么标签?最终结果对或错步骤的正、负或中性评价
C 最后写了 31,但第一步算错按最终答案匹配,给正标签第一处算错的步骤收到负标签
评分时读什么?可以读题目和完整解答题目及当前步骤、前文

多写了过程,就算过程监督吗?

停一下,自己判断 模型写了十行推导,训练时只按最后数字打分。这算过程监督吗? 核对你的判断 收起参考思路

仍然是结果监督。推导写得再长,也没有收到逐步标签。过程监督需要把“这一行错了”的信息送到具体步骤,例如 C 的第一步 3 × 12 = 35。

而且,检查每一步时仍然要看题目和前文。“所以减去 5 元”在使用优惠券时是对的,在计算额外配送费时就未必成立。把一句话单独抽出来打分,容易丢掉它赖以成立的条件。

一份解答有很多分,最后选哪份?

PRM 会给各个步骤打分,但用户只需要一个答案。因此系统还要把步骤分数合成整份解答的分数。

Lightman 等人的主要做法 把各步分数相乘

三步得分是 0.95、0.10、0.95。

整份分数 ≈ 0.09

一步低分会拉低乘积;步骤数量也会影响结果。

Math-Shepherd 的做法 只取最低的那一步

还是这三个步骤,直接找到最低分。

整份分数 = 0.10

让最不可信的那一步决定整份解答的评分。

用三个数字看看“相乘”和“取最小值”

假设三步得分依次是 0.95、0.10、0.95。

  • 相乘:0.95×0.10×0.95≈0.090.95\times0.10\times0.95\approx0.09。
  • 取最小值:min⁡(0.95,0.10,0.95)=0.10\min(0.95,0.10,0.95)=0.10。

分数都被中间那一步拉低了。相乘还有一个需要留意的地方:步骤越多,乘积往往越小。每步都是 0.95,5 步的乘积约为 0.77,20 步只有约 0.36。因此,步骤怎样划分、解答写多长,也可能影响排序。

这些是用于比较的模型分数。一个分数写成 0.9,并不自动意味着它在现实中有严格校准的 90% 正确概率。

逐步批改真的更管用吗?

Lightman 等人在一组较难的数学题上比较了三种选择方式。生成模型保持相同,每道题准备 1,860 份候选,然后分别用多数投票、ORM 和 PRM 挑答案。

0% 25% 50% 75% 100% 多数投票 69.6% 整份打分 · ORM 72.4% 逐步打分 · PRM 78.2%
同一个生成器,每题 1,860 份候选,在保留的 500 道 MATH 题上比较选择方法。横轴从 0% 开始。

这组实验中,PRM 选对了 78.2% 的题,优于 ORM 的 72.4%。更细的监督帮助检查者从同一批候选中找到了更多正确解答。

标注预算有限,研究者优先挑哪些作业?

优先找评分很高,最终答案却错了的解答。明显的错误,模型可能已经会认;那些看似合理的错误,更值得请人复核。这种有选择地收集标注的方式叫主动学习。

论文依据:Lightman et al.,§2 介绍标注与评分,§3给出上图成绩, §4讨论受控比较和主动学习。大规模 ORM 与 PRM 的训练集不同,作者另做了小规模实验以帮助区分这些影响。实验固定生成器,没有用 PRM 做强化学习。

人工标注的难处也很直接:费时间。论文发布的 PRM800K 里约有 80 万个步骤标签。换一个任务、换一类题,还能一直请人这样逐步批下去吗?

第三层:批作业太贵,能让模型帮忙吗?

Math-Shepherd 给出了一个巧办法:暂时不请人判断“这一步逻辑上对不对”,先看看从这里接着做,能不能做出正确答案。

比如已经写到“原价共 36 元”。保留这段题目和已有计算,让一个负责续写的模型,从这里接着算几次。如果有一次成功得到 31 元,至少说明这条路曾经被走通过。

这个负责接着写的模型叫 completer。论文把“当前步骤之前的题目和解答”作为它的起点,反复续写到结束,再用训练题的标准答案核对最终结果。这些续写结果,就能转成步骤的训练标签。

试着给一个中间步骤打标签 已经算出原价 36 元。接下来能算对吗?

保留这一步,让模型接着算优惠后的价格。每次续写结束,用训练题的标准答案 31 元核对结果。

当前前缀:3 × 12 = 36 元 这一步保持不变 ? 第 1 次 ? 第 2 次 ? 第 3 次 ? 第 4 次 ? 第 5 次 ? 第 6 次 ? 第 7 次 ? 第 8 次

已续写0 / 8

答对次数0

硬标签 HE · 是否成功过尚未标注

软标签 SE · 成功比例尚未标注

两组结果都是预设的教学样本,不调用模型、不随机生成。演示的是标注如何形成,不是比较真实模型的能力。换模型会重新计数。

成功过一次,和经常成功,是两回事

看完八次预设续写,模型甲答对三次,乙答对一次。同样的记录,可以批出两种标签:

标签它问的问题模型甲 · 3/8模型乙 · 1/8
硬标签 HE有没有成功过?有就标 1,否则标 011
软标签 SE成功次数占多少?37.5%12.5%

HE 看不出甲乙的这点差别,SE 保留了成功比例。两种标签回答的问题不同。

论文主要使用硬标签,续写次数设为 8。训练过程奖励模型后,就可以让它直接预测这些步骤标签,不必每次在线打分都重新做八次续写。

一个正确步骤,也可能得到差评

可能低估一个好步骤 这一步对,后面却失败了

3 × 12 = 36 算得没错。可续写模型总把优惠券算成加价,接着写出 41 元。

前缀正确,续写却反复失败。

也可能放过一个坏步骤 这一步错,后面却答对了

前面写出 35,后面可能主动纠正,也可能碰巧回到 31。

最后答对,仍然不能证明前面每步都对。

所以,续写标签测到的是“从这里走到正确答案的机会”。它会受到续写模型能力的影响,和人工逐行判断逻辑并不相同。理解这个区别,才不会把自动标注当成一个无误的数学老师。

为什么多续写几次,硬标签就可能变了?

假设一个前缀每次续写成功的概率只有 10%,而且各次独立。只续写一次,90% 的时候会看到失败;续写 8 次,至少观察到一次成功的概率约为 57%。

P(至少成功一次)=1−(1−0.1)8≈57%P(\text{至少成功一次})=1-(1-0.1)^8\approx57\%

这就是有限采样带来的影响:没有看见成功,不等于不存在成功的可能。增加续写次数,既花更多计算,也会让更多偶尔能走通的前缀拿到正标签。

“用分数选答案”和“用分数继续训练”

重排 · Reranking 这次交哪份?

生成几份候选 → PRM 打分 → 交最高分。

改变本次选择,不更新生成模型的参数。

强化学习 · RL 以后怎样写?

生成解答 → PRM 给反馈 → 更新生成模型。

改变后续生成策略,这才涉及继续训练。

Math-Shepherd 两种都做了。逐步强化学习时,它在每个推理步骤结束后提供奖励,让生成模型根据这些反馈调整参数。

论文依据:Math-Shepherd,§3.3 定义两类标签,§3.4–3.5 介绍重排与逐步 PPO,§4给出 8 次续写等实验设置。标题中的“without Human Annotations”指无需人工逐步标注,仍然需要标准答案和生成计算。

第四层:多请几个检查者,会更可靠吗?

走到这里,我们已经有几种办法训练检查者。现实里也常常直接使用现成的奖励模型,或者请另一个 LLM 按提示词评价答案。后一种通常叫 LLM judge,可以把它理解为“扮演评审的语言模型”。

但单个检查者总有盲点。那就多请几个?

Weaver 研究的正是这个方向:把多个不完美的验证器组合起来。困难在于,有的可靠,有的不太可靠;有的给 0 到 1 分,有的给另一个范围的分数,还有的只回答对或错。

先看即使每个人都只投一票,会发生什么。

试着组织一次复核 两票对一票,多数人会不会一起算错?

候选 A 算出 31 元,计算正确。候选 B 把优惠券加进总价,算出 41 元,但解释写得很流畅。

检查者甲 被流畅的措辞说服了
选 B 权重 1
检查者乙 也偏爱措辞流畅的答案
选 B 权重 1
检查者丙 检查了优惠券应当减价
选 A 权重 1

A · 31 元11 票

B · 41 元22 票

这里手动设定权重为 1、1、3,只演示加权为何有用。Weaver 需要从数据中估计可靠性,不能预先知道谁在这道新题上答对了。真实奖励模型也不一定只检查上面列出的线索。

给分前,先看看是谁在给分

演示里的三份意见没有变,改变的是各自的分量。如果我们有理由相信丙更可靠,让它的意见占更大权重,便可能改善结果。

不过,这里偷了个懒:演示直接把丙的权重设成了 3。真正遇到一道新题,当然不能先知道谁答对,再给谁加权。Weaver 需要解决的是更难的部分:在没有大量标准标签的情况下,怎样估计谁的判断值得多信一点。

它使用了一类叫弱监督(weak supervision)的方法。可以先把它理解为:手里有很多不完全可靠的批改意见,通过这些意见在大量样本上的关系,估计检查者的可靠性,再组合出一个判断。

  1. 统一刻度

    不同模型的分数范围不同,先做归一化,方便后续处理。

  2. 整理成可用的判断

    把分数转成二元判断,过滤几乎总说对或总说错等低信息信号。

  3. 估计谁更可靠

    用大量样本上的批改意见拟合弱监督模型,估计检查者的可靠性。

  4. 组合后再选答案

    把这些判断汇总成候选评分,再从候选池里挑选。

两个人一起犯错,未必是两份证据

如果甲和乙都偏爱流畅的表达,它们可能反复被同一类错误说服。两人意见一致,看似增强了可信度,实际却可能只是重复了同一个偏差。

因此,验证器越多并不保证越准。输出统计可以提供线索,但不能靠一群模型互相赞同,就无条件推出它们都对。

往深一点:组合模型对检查者的关系作了什么假设?

Weaver 的基本模型采用“给定真实对错后,验证器判断条件独立”的假设。说得具体些:已经知道一份答案是错的以后,甲会不会被它骗过,不应再透露太多乙会不会被骗的信息。现实中的模型往往没这么独立。

论文依据:Weaver,§4.2 讨论弱监督与条件独立假设, 附录 B.3 介绍预处理及少量标签的用途。上面的手工加权演示只解释动机,并不是 Weaver 的算法复现。

组合后的检查,值不值得花这笔钱?

论文 v1 用 Llama 3.3 70B Instruct 为每题生成 100 份候选,在四个基准上得到下面的平均答对比例:

怎样选答案平均答对比例这个数字表示什么
多数投票72.2%选出现次数最多的答案
Weaver87.7%用组合后的验证器选答案
理想检查者 · Oracle91.9%这批候选能达到的上限

Weaver 缩小了“有正确答案却没选中”的损失,但没有把它完全消除。

代价也容易看见:100 份答案,每份交给多个检查者,都要消耗计算。论文还尝试把集成产生的信号用于训练一个更小的 400M 模型,让它学习这套评分方式,降低实际使用时的检查开销。这叫蒸馏,可以理解为让一个较小模型学习较大系统给出的判断。

数据来自 Weaver v1,Table 1 ,蒸馏见 §6 。这些数字属于整个多候选系统,比较时仍要另算验证成本。

候选越多,检查也会遇到新麻烦

现在再看开头的“多答几次”。假如检查者偶尔会把某类错误打成特别高的分,十份候选里可能遇不到它,一百份里却遇到了。一旦系统总是选最高分,这个错误就会挤掉真正正确的答案。

下面的小实验把这个机制简化到可以算清楚。模型每次只有 10% 的概率答对,正确答案得 0.8 分。错误通常得 0.2 分,但偶尔会被误打成 0.9 分。试着增加候选数,看看两条曲线是否一起上升。

试试看:多答几次,就一定更可靠吗?

每次独立生成,答对概率为 10%。正确答案得 0.8 分;错误答案通常得 0.2 分, 偶尔被误打为 0.9 分。你可以调整尝试次数,以及这种误判发生的概率。

96.6%至少出现一份正确答案
72.4%最终选对概率
24.2相差多少个百分点
0% 25% 50% 75% 100% 1 4 16 64 256 512

横轴为答案数量(对数刻度)。试着从 32 份调到 128 份,再把误判概率调到 0。 曲线只展示上述假设的计算结果,不是论文实测,也不表示所有验证器都会退化。

在默认设置下,从 32 份增加到 128 份,正确答案几乎一定出现了,但最终选对的概率却下降了。把误打高分的概率调到 0,两条曲线又会重合。

这是一个构造的反例,用来解释为什么增加候选不保证最终成绩上升。真实验证器是否会退化、何时退化,需要在具体任务上测量。它也解释了为什么我们不能只看随机抽查时的平均准确率:系统最后专门选择最高分,恰好可能集中遇到评分器最有自信的那类错误。

想知道图里的曲线怎么算

设每次生成答对的概率为 pp,错误候选被误打成 0.9 分的概率为 qq,共生成 NN 次,各次独立。图中固定 p=0.1p=0.1。

候选中至少出现一个正确答案的概率是:

覆盖率=1−(1−p)N\text{覆盖率}=1-(1-p)^N

最终要选对,必须没有高分错误,并且至少出现一个正确答案。因此:

最终选对概率=[1−(1−p)q]N−[(1−p)(1−q)]N\text{最终选对概率}=[1-(1-p)q]^N-[(1-p)(1-q)]^N

第一项是“没有高分错误”的概率,第二项是“全是低分错误”的概率。两者相减,留下了能够选对的情况。这里的 qq 特指错误答案超过正确答案分数的概率,不是任意分类阈值下的假阳性率。曲线只对应这个教学设定。

回到你自己的 Agent

下次 Agent 失败,可以先留住它生成过的候选,看看究竟发生了哪种情况。

候选中没有好答案 十份补丁都没修好

先查生成和工具使用:是否读到了相关代码?是否能运行测试?

好答案在挑选时丢了 第五份修好了,却交了第七份

先查第七份为什么得了高分:测试漏了什么?检查者是否被解释说服了?

这时可以把本节四种思路放回自己的任务中理解。整份打分适合已有明确结果标签的情况;逐步反馈能指出错误发生的位置;续写和执行可以帮助自动构造一些训练信号;多个检查者则提供了组合不同判断的机会。要用哪一种,取决于你能获得什么反馈,以及检查要花多少成本。

比较两种检查方法时,留住这四项记录
  • 同一批候选:让两种方法面对相同的选择范围。
  • 有正确候选的题数:生成器给了检查者多少机会?
  • 最后选对的题数:有多少机会被用上了?
  • 生成与检查的总成本:多花的计算换来了什么?
最后留一道题 验证器从 100 份解答里挑出了高分答案。只能再检查一次,你想查什么? 查看参考思路 收起参考思路

检查它最容易给高分、却可能出错的地方。数学题可以重新核对关键推导;代码补丁可以补上与原测试不同的边界用例;如果用了多个模型,看看它们是否只是重复同一种判断。

这不是一个放之四海皆准的操作。它提醒我们把有限检查预算花在尚未获得可靠证据的地方,而不是机械地再问一次“你确定吗”。

四篇论文,接下来怎么读

如果想读原文,可以带着下面几个具体问题去找答案。本文按 2025 年 9 月开课时已经公开的版本整理,避免混入后续修订的实验。


CS329A Series