自省不如重复采样:等 token 成本下 7 种推理方法的 36 组对照
七种「让模型想得更好」的方法,在等 token 预算下和重复采样逐题配对:36 组对照零胜十负,输的全是自省类。
一个 1.5B 的小模型做数学题,给你 2400 个 token 的预算。两种花法。
第一种:让它写一遍解答,然后自我批评、重写、再检查一遍。第二种:让它把同一道题独立做八遍,然后数哪个答案出现次数最多。
第一种听起来聪明得多。第二种赢了 7.7 个百分点。
这不是新猜想——Wang 等人 2024 年就提出过类似的怀疑。新的是它终于被当成实验来做了:七种方法、三个尺寸的模型、两个数学基准、每个 150 道题、36 组逐题配对的对照,全部带置信区间和多重比较校正。
先说结论
- 等 token 成本下,没有一种”让模型想得更好”的方法可靠地打败重复采样。七种方法、36 组逐题配对对照,赢的一组都没有;十组显著输,其中两组在对全部 36 组做多重比较校正后仍然显著。
- 输的那十组全部是”让模型检查自己输出”的方法。涉及自省的 18 组对照,无一例外为负。
- 最干净的一刀:同样八份样本,让模型挑最好的,比直接数众数差 8.0 到 17.3 个百分点。样本、token、模型完全相同,唯一区别是赢家由模型选还是由计票决定。
- 这个惩罚随模型变大而缩小,但只缩到”打平”。7B 上两个基准分别是 −2.0 和 −1.3 个百分点,置信区间都跨零。
- Reflexion 在 1.5B 上一次都没触发过自己的重试。它每道题都判自己对,静默退化成一条普通思维链,然后因为便宜而”分数不错”。
问题出在哪:预算和方法被绑在了一起
先说清楚被比较的两样东西。
重复采样(论文里叫 self-consistency,自一致性):同一道题问 遍,每遍让模型在温度 0.7 下自由采样,得到 份可能不同的解答,取出现次数最多的最终答案。它没有任何”思考技巧”,只有重复和计票。
自省类方法:让模型先写一版,再让它批评这一版,再让它按批评重写。Self-Refine 和 Reflexion 属于这类。
现在看一个几乎所有方法论文都踩过的坑。一条普通思维链大约 300 个 token。三轮自我批评大约 1600 个。三个副本辩论两轮大约 2500 个。
所以当一篇论文说”我们的方法比思维链高 5 个百分点”时,它同时改了两件事:方法变了,预算也变了,而且常常变了五到十倍。而预算本身就会提高准确率——把同一道题多做几遍再投票,什么技巧都不用,分数就会涨。
朴素比较(几乎所有方法论文的做法)
┌──────────────┐
CoT │ 300 token │ → 72.0%
└──────────────┘
┌──────────────────────────────────────┐
Self-Ref│ 1784 token │ → 72.0%
└──────────────────────────────────────┘
结论:「打平,但我们的方法更稳」
等成本比较(这篇论文的做法)
┌──────────────────────────────────────┐
Self-Ref│ 1784 token │ → 72.0%
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
SC │ 1784 token(≈ 6 次采样 + 计票) │ → 78.3%
└──────────────────────────────────────┘
结论:这 1784 个 token 花错了,差 6.3 pp
关键动作是:把每个方法实际烧掉的 token 数出来——包括批评、反思、辩论、检查所有中间文本——然后让重复采样也花同样多的 token,再比。
数字长什么样
Qwen2.5-1.5B、GSM8K(小学数学应用题)、150 道题。“配平的 SC”一列是把同样多的 token 换成重复采样投票的成绩。
| 方法 | 该方法得分 | 平均 token | 配平的 SC | 差值(95% CI) | 校正后 p |
|---|---|---|---|---|---|
| Chain-of-Thought | 72.0% | 302 | 70.1% | +1.9 [−3.2, +7.1] | 0.989 |
| Plan-and-Solve | 70.0% | 319 | 70.1% | −0.1 [−5.0, +4.9] | 0.989 |
| Self-Refine | 72.0% | 1784 | 78.3% | −6.3 [−11.5, −1.2] | 0.097 |
| Reflexion | 74.0% | 323 | 70.1% | +3.9 [−1.2, +8.9] | 0.441 |
| Reflexion(强制重试) | 71.3% | 1197 | 76.3% | −5.0 [−11.1, +1.1] | 0.441 |
| Best-of-N(自我验证) | 71.3% | 2369 | 79.1% | −7.7 [−13.3, −2.2] | 0.036 |
| Multi-Agent Debate | 74.0% | 2539 | 79.2% | −5.2 [−10.0, −0.7] | 0.110 |
读法上有两处容易看错,值得停一下。
第一,Reflexion 那个 +3.9 不是胜利,是没干活。它只花了 323 个 token——和一条普通思维链一样多。因为它的自我评估在这个模型上从未触发过重试:模型每道题都判自己正确,于是”反思循环”一次都没进入。它退化成了一条思维链,然后被拿去和”323 token 的重复采样”比。作者把强制重试的版本单列出来,那一行是 −5.0。
第二,看 token 列比看得分列重要。Best-of-N 得了 71.3%,和思维链的 72.0% 差不多,看起来”没变差”。但它花了 2369 个 token,是思维链的 7.8 倍。同样这 2369 个 token 用来采样投票能拿 79.1%。所以它不是”没变差”,而是把 8 倍的算力烧掉换来了 0 收益。
最干净的一刀:同样的样本,谁来定胜负
上面那张表还有个可以质疑的地方:token 配平了,但两组的采样过程不完全一样,也许差异来自别处。
于是作者做了一个几乎无法反驳的对照。取 Best-of-N 的那八份样本——同一批样本,一个字都不重新生成——然后只换最后一步:
- 判:把八份都给模型看,让它挑出最好的那一份。
- 数:数八份里哪个最终答案出现次数最多。
样本相同、token 相同、模型相同、题目相同。唯一的变量是赢家由模型的判断决定,还是由计票决定。
| 模型 / 基准 | 模型来判 | 计票 | 差值(95% CI) | p |
|---|---|---|---|---|
| Qwen2.5-1.5B / GSM8K | 71.3% | 79.3% | −8.0 pp [−13.3, −3.3] | 0.001 |
| Qwen2.5-1.5B / MATH-500 | 46.7% | 58.0% | −11.3 pp [−17.3, −6.0] | <0.001 |
| Qwen2.5-3B / GSM8K | 84.0% | 89.3% | −5.3 pp [−10.7, −0.7] | 0.038 |
| Qwen2.5-3B / MATH-500 | 52.0% | 69.3% | −17.3 pp [−24.0, −11.3] | <0.001 |
| Qwen2.5-7B / GSM8K | 90.7% | 92.7% | −2.0 pp [−5.3, +0.7] | 0.241 |
这一刀切出来的结论没有回避空间:在这些模型上,“让模型自己选”这个动作本身就是有害的,与生成质量无关。信息完全一样,只是读取信息的方式不同。
有意思的是模型判得并不算离谱:它和多数答案的一致率有 63% 到 89%,说明它确实在跟踪某种信号。但在小模型上它约有四分之三的时间挑第一个候选——这是位置偏差,不是判断。而正确答案在八份里出现在哪个位置是随机的。
为什么会这样
一个能解释全部结果的说法:判断答案对不对,和生成答案,是同一个能力。
重复采样只需要模型”有时候对”。它把八次独立尝试的正确率聚合起来——只要正确答案比任何单一错误答案更常出现,计票就能捞到它。它不要求模型知道自己什么时候对。
自省要求的是另一件事:模型必须能区分自己的对与错。而这个能力恰恰是它欠缺的——如果它能可靠地识别自己的错误,它一开始就不会犯。于是自我批评拿到的是一个和生成过程相关的噪声信号,然后据此重写。重写有时改对,有时把对的改错,净收益接近零,而 token 已经花掉了。
重复采样:把独立性变成信号
sample1 ─→ 42 ┐
sample2 ─→ 42 ├─→ 计票 ─→ 42 (错误彼此不一致,
sample3 ─→ 17 │ 正确答案聚集)
... ┘
要求:模型「有时候对」
自省:把相关的噪声当成信号
draft ─→ 自评 ─→ 重写 ─→ 自评 ─→ ...
↑
评判者和生成者是同一个模型,
错误也是同一批错误
要求:模型「知道自己何时对」← 这个它没有
这解释了为什么惩罚随模型变大而缩小:大模型的自我判别能力更强,噪声更小。但 7B 的两个数字(−2.0 和 −1.3,置信区间跨零)只到”打平”,不到”更好”。作者据此把结论写成一个趋势而非阈值——他们明确说,三个尺寸不足以外推 32B 或 70B 会怎样。
边界:这篇论文不能推广到哪里
这些限制不是免责声明,是使用条件。越界引用这个结果和不知道这个结果一样糟。
只测了数学。GSM8K 和 MATH-500 有一个共同特性:答案是可以精确比对的短字符串,所以”数众数”这个操作有定义。写代码、写摘要、多轮对话里,“最常见的输出”往往不成立——两份都正确的代码可能长得完全不同。重复采样在没有可聚合答案的任务上不可用,这时自省是不是就赢了,这篇论文没测。
只测了 1.5B / 3B / 7B。趋势指向”大模型上惩罚消失”,但这是三个点连的线。
只测了 Qwen2.5 一个家族。同一个预训练配方共享自我判别的弱点是完全可能的。
自省有真实反馈时是另一回事。Reflexion 原始设定里有环境反馈(比如单元测试跑没跑过)。这篇论文测的是纯自我评估——没有外部信号,模型只靠自己判断。有可执行测试、有编译器、有检索到的事实做对照时,“批评—重写”回路拿到的就不是自相关噪声了。这条边界很重要:它把结论收窄到”没有外部验证器的自省”。
150 道题的样本量。逐题配对设计(同一批题上比两种方法)比独立组比较更敏锐,置信区间也是用 bootstrap 算的,但它撑不起细分到小格子上的结论。
一个能直接用的检查
这篇论文真正可迁移的不是”自省没用”这个结论——它有一堆前置条件。可迁移的是那个实验设计,而且它便宜到没有理由不做。
你手上任何一个”让模型想得更仔细”的流程,问三个问题:
- 它比朴素基线多花了多少 token?不是估算,是数出来——包括所有中间产物。倍数常常比人以为的大得多(这篇里最高 7.8 倍)。
- 同样的 token 换成”多跑几遍取多数”,成绩是多少?这是真正的基线。和 1 倍成本的基线比,赢了不算赢。
- 流程里的自省环节,实际触发了几次?Reflexion 那一行是整篇论文最有价值的教训:如果作者没有埋点统计触发率,他们会报告”Reflexion 涨了 3.9 个百分点”——而真相是它一次都没运行过。一个静默失效的组件会伪装成一个便宜又有效的组件。
第三条最容易被跳过,也最容易造成假结论。任何带条件分支的智能体流程都该记录每个分支的实际命中次数,否则你无法区分”这个机制有效”和”这个机制没跑”。