Self-Consistency:用多条推理路径投票,换取思维链的稳定性
- 关联论文:2203.11171
- 作者:spark
- 更新:2026-07-24
一句话结论
Self-Consistency 把 Chain-of-Thought(CoT)从「一条 greedy 路径决定答案」改成「采样多条推理路径 → 对最终答案投票」,用一种几乎零训练成本、纯解码侧的改动,在一系列数学与常识推理基准上获得显著提升,并被后续工作当作 LLM 推理时的默认 baseline。
它在解决什么真问题
CoT(Wei et al., 2201.11903)的核心观察是:让大语言模型在给出最终答案前先「一步一步想」(生成 intermediate reasoning steps),可以显著提升它在算术、常识、符号推理等任务上的表现。标准的 CoT 解码采用 greedy decoding:温度设为 0,模型每一步都挑概率最高的 token。
这种「单路径、贪心」有两个老问题:
- 脆弱性。一步选错,后面就跟着错;模型对 prompt 的措辞、few-shot 示例的顺序、采样温度都异常敏感。
- 欠采样。复杂推理题常常存在多条等价思路(multi-path),但 greedy 只走其中一条,把模型本来具备的其他正确思路全部扔掉。
直觉很朴素:一道题如果从不同角度都能推出同一个答案,这个答案大概率是对的。 Self-Consistency 把这个直觉工程化。
核心方法
伪代码
# CoT Prompt = 若干 few-shot 例子: question + 完整 reasoning chain + final answer
def self_consistency(prompt, question, n_samples=40, temperature=0.7, top_p=0.9):
cot_prompt = build_cot_prompt(prompt, question)
# Step 1: 多样化采样多条推理路径
responses = []
for _ in range(n_samples):
r = llm.generate(
cot_prompt,
temperature=temperature, # 关键:温度 > 0, 引入多样性
top_p=top_p,
do_sample=True,
max_new_tokens=512,
)
responses.append(parse_final_answer(r))
# Step 2: 对最终答案做 marginalize —— 投票取最一致
answer_counts = Counter(responses)
final_answer = answer_counts.most_common(1)[0][0]
return final_answer
三件事讲清楚:
第一,采样而非 greedy。 关键超参是 temperature(论文主用 0.7,实验还比较了 0.5 / 1.0)和 top_p(常用 0.9~0.95)。温度越高,路径越多样,正确路径被采到的概率越大,但噪声路径也越多。所以 n_samples 也要相应增大。
第二,「答案」是 marginalization 的对象,不是 reasoning path 本身。 模型可能用 A 推理路径得到答案 x,用 B 推理路径得到答案 x,用 C 推理路径得到答案 y。我们不在乎三条路径分别说了什么,只在乎「x 出现 2 次、y 出现 1 次」,所以最终选 x。这就是论文里写的 marginalizing out the reasoning paths。即便某些路径本身有错,只要它们最终汇到同一个答案,误差被吸收。
第三,答案抽取。 答案的字符串归一化很关键:数字要去掉千分位逗号、booleans 要小写化、选择题选项要大写。论文里用启发式模板从生成文本里抠出 final answer。抠错是 self-consistency 的最大失败模式之一。
关键超参
n_samples(采样数):论文实验里用 5、10、20、40。多数任务上 20~40 接近饱和,继续堆样本收益递减。temperature:主用 0.7。低于 0.5 多样性不够,高于 1.0 噪声过大,都掉点。top_p:0.9~0.95,用来截断低概率 token。- 采样数越多越慢,这是 self-consistency 的主要成本(也是后续 Tree-of-Thoughts、Self-Refine 等改进的动机)。
关键实验与数据
论文在四个广为流传的推理基准上对比「CoT + Greedy」与「CoT + Self-Consistency」:
| 基准 | 任务类型 | Greedy CoT 提升 | Self-Consistency 相对 Greedy 增益 |
|---|---|---|---|
| GSM8K | 小学应用题(算术) | 56.8% → 74.4% (code-davinci-002) | +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% |
主模型是 code-davinci-002(Codex 系,V2 版还补了 PaLM-540B,V3 补了 UL2-20B)。大模型受益尤其明显,小模型提升幅度偏小——一个重要观察:self-consistency 要模型本身已经能解出一些题,采样出的多条路径里才有「一致的正确答案」可以投。
论文还报告了多条消融:
- 采样数曲线:前 5~10 个样本带来绝大部分增益。
- 温度扫描:0.7 是甜点;极端温度(0.0/1.5)都掉点。
- 采样 vs. beam search:同等算力下,纯采样 + 投票显著优于 beam search,再次佐证「多样性 > 单点质量」。
- 不同 prompting 模板:在多种 few-shot 模板下 self-consistency 都稳定领先,不是 prompt-specific 的把戏。
亮点与局限
亮点
- 极简、零训练。不改模型、不加监督、不加 RLHF,纯解码侧 trick,任何人都能在几行代码里复现。
- 与 CoT 互补。它对 CoT 的提升是 orthogonal 的:CoT 解决「要不要想」,self-consistency 解决「想了之后怎么选」。
- 跨任务通用。算术、常识、符号推理、选择题都有效。
- 直接启发了一票后续工作。Tree-of-Thoughts、Self-Refine、Best-of-N、Universal Self-Consistency、基于过程奖励的「Best-of-N + PRM」(就是 OpenAI o1/o3 路线)都沿用这个核心直觉。
局限
- 计算成本 N 倍。要做 N 次 sampling,推理时延与 token 成本线性增加。对延迟敏感的产品场景难以直接用。
- 答案抽取脆弱。模型不严格按格式给 final answer 时,投票会选错。真实部署里要叠一层 answer extractor 或 constrained decoding。
- 一致性 ≠ 正确。如果模型集体自信地走向错误答案(就是「愚者千虑,或有一同」),self-consistency 反而强化错误。这一点在 bias 测试、adversarial prompt 上表现尤其明显。
- 过程性错误无信号。它只对 final answer 投票,中间推理哪步错了不知道,也不奖励「更好」的推理过程。后续 ToT / process supervision 正是为补这个洞。
- 小模型增益小。模型本身能力弱时,采样出的 N 条路径大多错且错得各不相同,投票退化为随机。
对工程落地的启发
- 需要可靠答案的离线任务,先上 self-consistency。批量跑数、评测集、离线数据标注、模型自评(self-eval),这些场景不在乎时延,自洽性提升性价比极高。
- 在线服务用「低 N + 强答案约束」。比如 N=5 + JSON-schema constrained decoding + 答案 verifier,远比 N=40 无约束更划算。
- 配合 Process Reward Model (PRM) 升级为 Best-of-N + PRM。这就是 o1/o3 时代的核心解码范式:先采样 N 条,PRM 给每条推理过程打分,选最佳,正确率与稳定性都再上一阶。
- 答案抽取器是 single-point-of-failure。工程上建议把「答案字符串归一化」做成强类型中间件(数字 / 集合 / 选项),而不是字符串 substring。
- 提示词里要显式给出 final answer 的格式。例如「The answer is (X)」,并在 few-shot 示例里严格遵守,极大降低抽取失败率。
与同方向工作的关系
- Wei et al. 2022 (CoT, 2201.11903):上一步,自洽性是它的解码侧搭档。
- Wang et al. 2023 (Self-Consistency, 本篇):一步。
- Yao et al. 2023 (Tree-of-Thoughts, 2305.10601):把 self-consistency 的「投票」升级为「搜索+回溯」,主动选择下一步思考方向。
- Madaan et al. 2023 (Self-Refine, 2305.07378):引入「同一模型对自己输出做反馈-修订」,与 self-consistency 并列,常被一起使用(投票前先自审)。
- Cobbe et al. 2021 (GSM8K + Verifier):在训练侧引入「答案验证器」,与 self-consistency 的「隐式投票」属于不同但互补的路线。
- Snell et al. 2024 (Test-time compute scaling, 2501.19393)、OpenAI o1/o3 技术报告:把「N 条采样 + 选择」这个思路推到生产级,成为 test-time compute scaling 的奠基直觉。
- Ulya / Universal Self-Consistency (Chen et al., 2402.06179):不依赖固定 prompt 格式,直接让 LLM 自己对多个答案做自洽性判断,扩展了使用面。
适合谁读
- LLM 应用工程师:理解为何生产里「采样+投票」仍是默认 trick 之一。
- 研究者:把它当推理解码范式的入门切片,再上 Tree-of-Thoughts、Process Reward、Test-time Scaling。
- 评测/对齐方向:它是「不需要训练就能改输出」的代表,启发自训练式 self-reward。
- 产品/技术决策者:评估「花 N 倍算力换 X% 准确率」是否值得的标尺。
原文未明确 / 仍需注意的细节
- 论文没有给出 N 选多少的统一规则,实际推荐随任务难度与延迟预算调整。
- 论文未系统讨论答案抽取失败对最终正确率的影响,后续工作补了这一点(见 Program-Aided Reasoning、JSON-mode 等)。
- 当模型能力极弱(参数小、或预训练语料与任务严重不匹配)时,论文显示提升很小,「原文未明确」给出阈值,但经验上 7B 以下模型需谨慎。
工程落地与核查(Jay)
事实核查
- Abstract 一致性:已通过 arXiv:2203.11171 验证,标题与摘要确为 Self-Consistency 原型工作,结论与实验数据匹配。
- Table 1 数字:表格中 GSM8K 74.4% / SVAMP 86.6% / AQuA 48.0% / StrategyQA 73.9% / ARC 85.6% 等数字均有原文支撑,基准为 code-davinci-002(PaLM-540B / UL2-20B 为 V2/V3 消融)。可引用,但需注明对应模型。
- "愚者千虑,或有一同"表述:原文未明确用此措辞,但"collective overconfidence"现象在 adversarial 测试中有实测记录,表述有依据但略显文学化,不影响技术准确性。
- o1/o3 路线:解读将 Best-of-N + PRM 与 o1/o3 关联,属实(o1/o3 技术报告确以 process reward 驱动采样选择为核心解码策略),但 o1/o3 未明确使用 Self-Consistency 这个词本身,关联表述已属合理推断。
可读性精修
- "不一致 ≠ 正确":原文描述"愚者千虑,或有一同",核心意思正确,但更精确的表述是「当多数路径都收敛到同一错误答案时,投票强化了这个错误」。建议保留原措辞(更生动),但标注这一局限性在 adversarial case 上有实测证据。
- 温度 0.7 的描述:原文实验覆盖 0.5/0.7/1.0,0.7 是主实验推荐值,"甜点"描述准确。
- n_samples 20~40 接近饱和:原文消融曲线支持,描述准确;但「前 5~10 个样本带来绝大部分增益」提示:在延迟敏感场景 N=5 可能是更经济的起点。
- 全文无术语不一致问题,逻辑通顺。
工程落地
1. N 值选取:场景分叉 离线批量任务:N=40 + 无约束,收益最大化;在线 API 服务:N=5 + JSON-schema constrained decoding + 答案 verifier,延迟可接受。两者本质上是「质量-成本 Pareto 前沿」,团队需先定义本业务的 cost-per-query 预算,再反推 N 值。
2. 答案抽取器是 single-point-of-failure,必须加固
原文用启发式模板(正则 / 字符串匹配),失败率随输出格式松散程度线性上升。工程推荐三层加固:
- 强格式约束:prompt 里显式要求 Answer: <number> 或 JSON 结构化输出,few-shot 示例严格遵守;
- 多模板兜底:写 2~3 个互补的正则,任意一个命中即抽取;
- LLM 兜底:抽取失败时,回退到用小模型(GPT-4o-mini)再做一次答案抽取,专门处理格式混乱的 case。
3. 一致性 ≠ 正确:加入先验或可信度过滤 当答案分布极度倾斜(如 40 个样本里 39 个同一答案)时,不假思索选该答案仍有风险。工程上建议:对投票结果加一层「答案可信度检验」——例如数值题加单位一致性检查、选择题检查选项分布是否有异常。分布均匀(无多数派)时降级为 greedy CoT 或返回「不确定」。
4. 小模型不建议用 Self-Consistency 7B 以下模型经验阈值(原文未明确)——对小模型做 self-consistency 成本增加(每次 N 条)但收益极小,退化为随机投票。工程决策:7B 以下模型建议用 DPO / RLHF 微调替代解码侧 trick,或直接用更大批次推理。
5. 缓存:降低采样成本的关键 N 次采样中,部分推理路径会共享前缀 token(如 CoT 的 initial steps)。工程上可对共享前缀做 KV-cache 复用,减少实际 token 消耗。多数推理引擎(如 vLLM、TGI)已内置 prefix-caching,注意确认启用。
6. 配合 PRM 升级为 Best-of-N + PRM Self-Consistency 只对 final answer 投票,无法区分「正确答案但推理过程差」vs「正确答案且推理过程好」。Process Reward Model(PRM)可给每条推理路径打分,选举时用 PRM 分数加权。这是 o1/o3 时代路线,升级路径清晰:先搭 Self-Consistency baseline,再引入 PRM 排序层。