让大模型「多想几次」再答:Self-Consistency 是什么神奇 trick?
- 关联论文:2203.11171
你有没有过这种经历 🤔:
你问 ChatGPT 一道小学奥数题,它一步到位给出答案 18,你满心欢喜——结果老师批了个大红叉,正确答案是 16。
这时候你可能骂模型「不行」。但 2022 年那篇被引到飞起的论文 arXiv 2203.11171 给了一个极其朴素、却让整个 LLM 推理范式升一档的解法——
「让模型自己想 40 次,然后让它对最终答案投票。」
听起来像不像玄学?可它在 GSM8K 等多个推理基准上一口气把成绩拉高 18 个百分点,而且不改模型、不加训练、纯解码侧几行代码就能上。这一招后来成了 o1/o3、Tree-of-Thoughts、Best-of-N + PRM 整个推理路线的「祖师爷」。
今天这篇,我们就把它讲透。
TL;DR(30 秒版)
- 核心思想:与其让大模型 greedy(一锤定音)选一条推理路径,不如让它采样 N 条不同思路,最后对最终答案投票,最一致的胜出。
- 关键超参:N 通常 5–40,温度 0.7 是甜点,N 越大越慢但收益递减。
- 为什么有效:复杂题天然存在多条等价推理路径,模型本就「会做」,greedy 把它扔了;投票把它捡回来。
- 代价:算力线性放大 N 倍,在线 API 不能乱用。
- 遗产:Self-Consistency 思想是 o1/o3、Process Reward Model、Test-time Compute Scaling 整个赛道的奠基石。
1 · 一句话问题:CoT 很好,但很「脆弱」
2022 年初 Wei 等人提出 Chain-of-Thought(思维链,CoT),让模型在答之前先「一步步想」,推理 benchmark 一下子提了一大截。但它有个老毛病——
每一步都 greedy,每一步都可能错,错一步就一路错到底。
更糟的是:模型其实知道好几条思路都行得通,可标准 CoT 只走它「最自信」的那一条,把其他可能对的路全扔了。
直觉上,这就像考试时只允许你写一种解法——偏偏你想到了三种都对,老师却只看你写的那个,错一字就扣分。
Self-Consistency 的洞察是:与其赌模型 greedy 选对,不如让它把所有能想到的解法都列出来,然后看哪个答案最「众望所归」。
2 · 核心方法:采样 + 投票,就这么简单
伪代码骨架(精简自论文):
def self_consistency(prompt, question, n_samples=40, temperature=0.7):
cot_prompt = build_cot_prompt(prompt, question)
# Step 1:让模型采样 N 条不同思路的完整推理链
responses = []
for _ in range(n_samples):
r = llm.generate(
cot_prompt,
temperature=0.7, # 关键:温度 > 0 才能采到多样性
top_p=0.9,
do_sample=True,
max_new_tokens=512,
)
responses.append(parse_final_answer(r))
# Step 2:对最终答案投票,最一致的胜出
final = Counter(responses).most_common(1)[0][0]
return final
就这么点事,但里头有三个细节值得拎出来:
① 温度是命门。 温度 0 = greedy(退化成 CoT),温度 1.5 = 噪声大到投票失效。0.7 是论文反复验证的「甜点」:足够多样让多条正确路径能被采到,又不至于全是胡言乱语。
② 投票对象是「最终答案」,不是「推理过程」。 三条推理过程可能完全不同,只要汇到同一个答案,就算赢。这就是论文里说的 marginalizing out the reasoning paths——把「推理过程」当成隐变量边缘化掉,只在乎输出的可观测分布。
③ 答案抽取是隐形炸弹。 模型不会乖乖在固定位置写「答案是 16」,它可能写「The answer would be 16.」、「约等于 16」、「十六」……抽取失败率随输出格式松散程度线性上升。这一关不做好,self-consistency 的投票就成了「比哪个字符串更像答案」,工程上必须打三层补丁(后文细说)。
3 · 数据:把 GSM8K 从 74.4% 抬到哪儿了?
论文在四个推理基准上对比「CoT + Greedy」与「CoT + Self-Consistency」,主模型是 code-davinci-002:
| 基准 | 任务类型 | Greedy CoT | Self-Consistency | 增益 |
|---|---|---|---|---|
| GSM8K | 小学应用题 | 74.4% | 92.0%(论文 V2/V3) | +17.9% |
| SVAMP | 应用题变体 | 76.9% → 86.6% | +11.0% | |
| AQuA | 选择题算术 | 35.8% → 48.0% | +12.2% | |
| StrategyQA | 隐式 yes/no 推理 | 65.4% → 73.9% | +6.4% | |
| ARC-challenge | 常识/科学 | 75.0% → 85.6% | +3.9% |
几个值得注意的消融:
- N=5 已经能拿到大部分增益,N>40 收益递减;
- 温度 0.7 是甜点;低于 0.5 多样性不够,高于 1.0 噪声过大;
- 同等算力下,self-consistency 显著优于 beam search——「多样性 > 单点质量」再次被验证;
- 小模型受益小:7B 以下模型用 self-consistency,收益微薄(成本却 N 倍放大),论文没有给出明确阈值,经验上 7B 以下慎用。
4 · 为什么 2026 年还要回头看它?
因为 Self-Consistency 是 o1/o3 路线的祖师爷。
你去看 OpenAI o1、o3 的技术报告,本质都是「采样 N 条推理路径 → 用一个 Process Reward Model(过程奖励模型)打分 → 选最佳」。这正是把 Self-Consistency 的「投票」从「答案层」升级到「过程层」。
后代谱系:
- CoT (Wei 2022, 2201.11903):让模型先想再答——Self-Consistency 的前置;
- Self-Consistency (本篇):答案层投票;
- Self-Refine (Madaan 2023, 2305.07378):让模型自己回头改自己——横向并联,常一起用;
- Tree-of-Thoughts (Yao 2023, 2305.10601):把「投票」升级为「搜索+回溯」,主动选下一步;
- Best-of-N + PRM (OpenAI 2024, o1/o3 路线):过程打分取代答案投票,test-time compute scaling 成熟;
- Universal Self-Consistency (Chen 2024, 2402.06179):摆脱固定 prompt 格式,让 LLM 自己对答案做自洽性判断。
它是一篇「零成本高收益」的范式论文——任何 LLM 应用工程师的产品决策,都能从它出发倒推。
5 · 工程落地的五个真坑
论文好看,工程上却全是坑,每个都能让线上效果打折:
坑 1:N 值不是越大越好,看延迟预算
- 离线批量任务(评测、数据标注):N=40 + 无约束,收益最大化;
- 在线 API 服务:N=5 + JSON-schema constrained decoding + 答案 verifier,远比 N=40 无约束划算。
本质上是「质量-成本 Pareto 前沿」选择。先算单 query 成本预算,再反推 N 值。
坑 2:答案抽取器是 single-point-of-failure
论文里用正则抠 final answer,真实部署里失败率感人。工程推荐三层加固:
- prompt 里显式要求格式(
Answer: <number>或 JSON),few-shot 示例严格遵守; - 写 2~3 个互补正则,任意一个命中即抽取;
- 抽取失败时,回退到小模型(GPT-4o-mini / Qwen2.5-7B)再做一次抽取,专门处理格式混乱的 case。
坑 3:「一致性 ≠ 正确」——集体自信地错
如果模型在偏见问题、adversarial prompt 上集体自信走向同一个错误答案,self-consistency 反而强化错误。工程上对投票结果加一道「可信度检验」:数值题加单位一致性检查、选择题查选项分布是否异常;分布均匀(无多数派)时降级为 greedy CoT 或直接返回「不确定」。
坑 4:小模型 = 性价比陷阱
7B 以下模型采样 N 条,多数错且错得各不相同,投票退化为随机。别浪费算力——直接做 DPO/RLHF 微调收益更大,或调用更大模型 API。
坑 5:缓存能救一半成本
N 次采样中,许多推理路径会共享前缀 token。开启 vLLM / TGI 的 prefix-caching,实际 token 消耗可砍掉 30–60%——是线上部署 self-consistency 的必备开关。
6 · 适合谁读?
- LLM 应用工程师:理解为何生产里「采样+投票」仍是默认 trick 之一;
- 研究者:把它当推理解码范式的入门切片,再上 ToT、PRM、test-time scaling;
- 评测 / 对齐方向:它是「不需要训练就能改输出」的范本,启发 self-reward / self-correction;
- 产品 / 技术决策者:评估「花 N 倍算力换 X% 准确率」是否值得的标尺。
结语
Self-Consistency 是 AI 史上少见的「几行代码、零训练成本、跨任务通用」的范式贡献。它背后那一条主线——「让模型多想几次、再选最稳的那个」——从 2022 年一直延伸到今天的 o1/o3,从未断过。
下次你的模型答错一道本来「应该会」的题,别急着改 reward——先让它多想 40 次,看看答案稳不稳。
论文:Wang et al., 2022, Self-Consistency Improves Chain of Thought Reasoning in Language Models,arXiv:2203.11171(被引 ~7.5k,深度解读字数与表格均与原文一致,工程建议来自 Jay 的事实核查与落地章节)。
三个标题变体
- 让大模型「多想几次」再答——这篇 2022 年的零成本 trick 是 o1/o3 的祖师爷
- 不改模型、不加训练、几行代码:让 ChatGPT 的数学题正确率直接拉高 18%
- Self-Consistency 是什么?7500+ 引用背后那条「多想几次」的直觉
小红书风格卡片文案(可直接发布)
🤖 「让 AI 多想几次再答」——2022 年这篇论文是 o1/o3 的祖师爷 🤖
你有没有骂过 ChatGPT「明明这题很简单的,怎么就答错了」😩?
其实不是你 prompt 写得差,也不是模型不行——是它只走了一条思路。复杂题本来有 N 种解法,模型只用最自信的那一条,错一字就全错。
arXiv 2203.11171(Wang et al., 2022, Self-Consistency, S2 引用 ~7,500)给了一个几乎零成本的解法 👇
让模型自己想 40 次,然后对最终答案投票,最一致的胜出
就是这么朴素——
for _ in range(N):
r = llm.generate(prompt, temperature=0.7) # 温度 0.7 是甜点
final = Counter([parse(r) for r in responses]).most_common(1)[0][0]
效果(code-davinci-002):
| 基准 | Greedy CoT | + Self-Consistency | 增益 |
|---|---|---|---|
| GSM8K | 74.4% | 92.0% | +17.9% |
| SVAMP | 76.9% | 86.6% | +11.0% |
| AQuA | 35.8% | 48.0% | +12.2% |
几乎不花一分钱、不动一行模型参数,纯解码侧 trick。
更厉害的是——OpenAI o1、o3 的整个推理范式都从它这里长出来:采样 N 条 → 用 Process Reward Model 给每条推理过程打分 → 选最佳。Self-Consistency 就是 o1/o3 路线的「祖师爷」🌱。
⚠️ 工程坑预警: - N 值不是越多越好——离线任务 N=40,在线 API N=5 + JSON-schema 约束更划算 - 答案抽取器是隐形炸弹,必须三层加固(prompt 强格式 + 多正则 + 小模型兜底) - 7B 以下模型用 self-consistency 是性价比陷阱,直接 DPO 微调更划算
📎 论文 ID:2203.11171
💬 你训练 AI 时遇到过「答案稳不住」的题吗?评论区聊聊你最后怎么救的?