R01 最小可运行·自洽采样投票
R01 最小可运行·自洽采样投票
这个节点要解决的问题是:当你第一次想把”让模型多想想”变成一段能跑的代码时,最便宜、最不需要训练、最容易踩坑的入口是什么? 答案是 self-consistency(自洽采样投票)——同一道题用非零温度采样 N 条独立的推理路径,对最终答案做多数投票。它是整个测试时计算(test-time compute, TTC)家族里唯一一个不需要验证器、不需要训练、几十行代码就能复现的范式。本节的视角不是”教你写 prompt”,而是:把 self-consistency 当成一台可观测的实验装置,让一个 PM 第一次亲眼看到”准确率—成本—延迟”三角的滑杆是怎么动的,以及它在哪里突然不动了。
[!quote] 本专题核心命题在本节的投影 把”模型变聪明”从一次性预训练事件,重构成推理期可按需购买的连续变量。self-consistency 是这个连续变量最朴素的实现:N 就是你手里的滑杆,每加一个采样,你就多买一份算力、多压一点方差。本节让你亲手把滑杆推上去,再亲眼看它失灵。
§0 为什么是 self-consistency 而不是别的入口
在动手之前,先挡掉一个默认错误框架:很多人第一次复现”推理”会去抄 CoT prompt(“Let’s think step by step”),或者直接调 o3 / DeepSeek-R1 的 API 看它”自己会想”。这两条都不是复现 TTC 的正确入口,原因要分清三件不可通约的事:
| 你以为在做的事 | 实际是哪一层 | 改了什么 | 本节是不是它 |
|---|---|---|---|
| 写 “step by step” 提示 | CoT prompting(提示层) | 只改输入,权重和采样次数都不变 | 否——它是 self-consistency 的前置零件,不是 TTC 本身 |
| 调 o1/o3/R1 让它”思考” | trained reasoning(训练层) | 权重已被 RL 永久改写,思考是内化的 | 否——你买的是别人训练好的模型,复现不了机制 |
| 采样 N 条 + 投票 | inference-time 搜索/聚合(推理层) | 权重不变,但主动花 N 倍推理算力换准确率 | 是——这才是 test-time compute 的最小装置 |
[!warning] 三个术语别混 reasoning ≠ thinking ≠ test-time compute。reasoning 是能力(可来自训练或搜索);thinking token 是 o1/R1 这类模型生成的不可见中间 token(产品术语);test-time compute 是中性的”推理期花了多少算力”。self-consistency 是用 test-time compute 实现的一种聚合,它既不改权重(不是 trained reasoning),也不止于改 prompt(超出 CoT)。把这三件事画在一张纸上,是本专题 A01 Reasoning 概念史·从 CoT 到 Test-Time Compute 的全部任务;本节只取其中”推理层聚合”这一格动手。
为什么偏偏选 self-consistency 当 05 复现指南的第一站,而不是 Best-of-N + 验证器、或 MCTS?因为它砍掉了最贵的依赖——验证器。Best-of-N(R02 中型·Reasoning 预算路由器,待建)需要一个 ORM/PRM 给候选打分,而训练或调用一个像样的奖励模型本身是个项目;MCTS 还要顺序展开树、写回溯。self-consistency 用”答案出现频次”这个零成本的内生信号替代了验证器——对闭合式答案(一个数字、一个选项),众数本身就是最朴素的”投票即验证”。这让它成为唯一一个”今晚就能从零跑出曲线”的入口。
事实接地:self-consistency 的原始论文是 Wang et al. 2022《Self-Consistency Improves Chain of Thought Reasoning in Language Models》(arXiv:2203.11171,ICLR 2023)。核心数字(论文报告的提升幅度):GSM8K +17.9%、SVAMP +11.0%、AQuA +12.2%、StrategyQA +6.4%、ARC-challenge +3.9%。注意这是相对各自 CoT 基线的提升,不是绝对准确率。
§1 可跑骨架(最小,约 50 行)
下面这段是最小可运行骨架,刻意不依赖任何框架,只用一个 chat completion 接口。它做三件事:(1) 对同一道题采样 N 次(温度 > 0 制造多样性);(2) 从每条输出里抽出最终答案;(3) 多数投票。
import os, re, collections
from anthropic import Anthropic # OpenAI/DeepSeek 同理,换 client 即可
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
PROMPT = """请逐步推理,最后单独用一行输出:答案:<一个数字>
题目:{q}"""
def sample_once(question, temperature=0.7):
msg = client.messages.create(
model="claude-haiku-4-5", # 故意用便宜模型,凸显 TTC 的杠杆
max_tokens=1024,
temperature=temperature, # ★ 必须 >0,否则 N 条全一样,投票无意义
messages=[{"role": "user", "content": PROMPT.format(q=question)}],
)
return msg.content[0].text
def extract_answer(text):
# 抽取"答案:<数字>"。生产里这是最脏的一环,见 §4。
m = re.findall(r"答案[::]\s*\$?(-?[\d,]+(?:\.\d+)?)", text)
return m[-1].replace(",", "") if m else None
def self_consistency(question, n=8, temperature=0.7):
answers = []
for _ in range(n): # 串行;并发版见 §3
ans = extract_answer(sample_once(question, temperature))
if ans is not None:
answers.append(ans)
if not answers:
return None, {}
votes = collections.Counter(answers)
winner, count = votes.most_common(1)[0]
return winner, {"votes": dict(votes), "n_valid": len(answers),
"consensus": count / len(answers)} # 共识度 = 赢家票数占比
# 对照实验:同一道题,n=1 (相当于单次) vs n=8
q = "一支笔3元,一个本子5元,买4支笔和3个本子共多少元?"
print("n=1:", self_consistency(q, n=1))
print("n=8:", self_consistency(q, n=8))
骨架里两个不起眼但致命的设计点:temperature > 0(§4 第 1 条)和返回 consensus(共识度)。共识度是免费送你的一个置信度代理——8 票里赢家拿 8 票 vs 拿 3 票,意义完全不同,它后面会变成你做”要不要升级到更强模型/更大 N”的路由信号。
§2 你应该看到什么:准确率—成本—延迟的滑杆
把上面的骨架套到一个有标准答案的小数据集(哪怕手搓 30 道 GSM8K 风格题),扫 N ∈ {1, 4, 8, 16, 32},你会看到三条曲线同时动:
| N(采样数) | 准确率 | 相对成本(≈输出 token) | 相对延迟(串行) | 共识度典型值 |
|---|---|---|---|---|
| 1 | 基线 | 1× | 1× | n/a |
| 4 | 显著↑ | ~4× | ~4× | 高题目 1.0,难题 0.5 |
| 8 | 继续↑(放缓) | ~8× | ~8× | 难题分歧暴露 |
| 16 | 微升 | ~16× | ~16× | 边际趋平 |
| 32 | 可能不升甚至降 | ~32× | ~32× | 难题靠投票也救不回 |
这张表的形状就是本专题的核心命题落地:N 是一根你能拿在手里的滑杆,但它不是线性的,更不是免费的。
[!important] 反线性:self-consistency 不是免费午餐 这是本节最重要的判断,也是 PM 最容易被 demo 骗的地方:
- 边际递减是确定的。原论文 Wang et al. 2022 即明确报告”性能随样本数增加出现边际递减,更多路径不总带来更高准确率,有时甚至下降”。N 从 1→8 的收益,远大于 8→32。
- 成本/延迟是线性涨的。准确率亚线性涨、成本线性涨 ⇒ 每一分准确率越来越贵。这是滑杆的物理形状。
- 投票救不了系统性错误。如果模型对某类题有一致的错误偏向(8 条路径都用同一个错方法),多数投票会自信地放大错误——众数不是真理,是模型的众数偏见。self-consistency 假设”正确路径多样、错误路径分散”,这个假设在模型有系统性盲区时失效。
§3 并发与成本:把延迟灾难摁下去
§1 的骨架是串行的——n=8 意味着延迟 8 倍,这在交互场景里就是延迟灾难。但 self-consistency 的全部样本相互独立,天然可并行。这是它相对 MCTS(本质顺序、要回溯)的关键工程优势:
import asyncio
from anthropic import AsyncAnthropic
aclient = AsyncAnthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
async def self_consistency_parallel(question, n=8, temperature=0.7):
async def one():
msg = await aclient.messages.create(
model="claude-haiku-4-5", max_tokens=1024, temperature=temperature,
messages=[{"role": "user", "content": PROMPT.format(q=question)}])
return extract_answer(msg.content[0].text)
raw = await asyncio.gather(*[one() for _ in range(n)])
answers = [a for a in raw if a is not None]
votes = collections.Counter(answers)
return (votes.most_common(1)[0][0] if votes else None), dict(votes)
并发版把延迟从 ~N× 摁回 ~1×(受限于最慢的那条 + 速率限制),但成本仍是 N×——并行只买回时间,买不回钱。这是 PM 要分清的两笔账:
[!note] 三角是三个独立的旋钮,不是一个
- 准确率:由 N 和模型质量决定,亚线性。
- 成本:由 N × 输出 token 单价决定,线性,且只算输出 token——self-consistency 的开销几乎全在 output 侧(每条都重新生成完整 CoT),而 output token 通常比 input 贵数倍。
- 延迟:由串行/并行决定,可被并发解耦。 一个常见错位:以为”并行了就便宜了”。并行只动延迟旋钮,成本旋钮纹丝不动。成本控制要回到 m209 - 推理成本控制手册 的路由与缓存手段——比如对共识度高的简单题直接走 n=1,把 N 的预算省给难题。
成本数量级直觉:以一道题平均 600 输出 token、N=8 计,单题输出 ~4800 token。这是 first-order 估算(忽略 input、忽略重试),失效边界在于不同题目 CoT 长度方差很大——难题的 CoT 可能 2000+ token,N=8 就是近 2 万 token/题,量级上已逼近一次 R1 长思考的开销。
§4 判断主轴:90% 的人在这五个点上翻车
这一节是本节点的命门——不是”怎么写得对”,而是”别人怎么写错的”。每点给症状 → 为什么会错 → 正确做法 → 真实反例。
① temperature=0 跑 self-consistency
- 症状:N=8 但 8 条输出一字不差,投票永远 8:0,准确率等于 n=1。
- 为什么错:贪心解码(temp=0)是确定性的,没有多样性就没有”不同路径”,self-consistency 的整个前提崩塌。
- 正确做法:用 temp 0.5–0.8 制造路径多样性;原论文正是靠多样性采样。
- 真实反例:无数初学者把”复现失败、毫无提升”归咎于”self-consistency 没用”,实际是温度设成了 0。
② 把它用在开放式生成任务上
- 症状:对”写一段文案/总结这篇文档”做投票,发现没有两条输出一样,投票退化成随机选第一条。
- 为什么错:self-consistency 只对闭合式答案(单一数字、单选、可规范化的短答案)有效——投票需要”答案空间离散且可比较”。开放生成的答案空间连续,众数无意义。
- 正确做法:开放任务改用 Best-of-N + 验证器/judge 打分(R02 中型·Reasoning 预算路由器,待建),或 LLM-as-judge 排序,而不是频次投票。
- 真实反例:原论文 Wang et al. 2022 明确把适用范围限定在有唯一确定答案的推理任务。
③ 答案抽取(parsing)当成小事
- 症状:准确率”上不去”,调大 N 也没用。打开日志才发现一半输出因为格式(“$12”、“12.0”、“十二”、答案藏在句中)没被正则抓到,被当成无效票丢了。
- 为什么错:抽取是 self-consistency 里最脏、最被低估的一环。投票的前提是答案能被规范化比较;抽取一坏,投票全坏。
- 正确做法:强约束输出格式(要求”答案:<纯数字>“单独一行)+ 容错正则 + 数值归一化(去逗号、统一小数);生产里再加一道 LLM 兜底抽取。
- 真实反例:很多”复现不出论文数字”的案例,差距其实在 parsing 召回率,不在算法。
④ 把共识度当成校准过的置信度
- 症状:拿”8/8 票”直接当”99% 可信”上线,结果模型在它系统性错的那类题上也是 8/8 票,高共识 + 全错。
- 为什么错:共识度衡量的是模型内部一致性,不是与真值的一致性。模型可以一致地错。
- 正确做法:共识度只能当相对路由信号(低共识 → 升级模型/加 N/转人工),不能当绝对正确率,更不能直接对用户报数。这与 幻觉 同源——自信和正确是两回事。
- 真实反例:知识密集型任务上”延长推理诱发确认偏误 → 过自信幻觉”已有实证(arXiv:2509.06861,2025-09,14 个推理模型上”增加推理时计算并不持续提升准确率,且经常增加幻觉”)。投票同理会放大这种过自信。
⑤ 无脑加大 N,以为线性有效
- 症状:N 从 16 加到 64,账单翻 4 倍,准确率纹丝不动甚至降。
- 为什么错:边际递减(§2)。难题上模型的错误路径不是随机分散的,加再多采样也只是反复抽到同一批错路径。这与”过度思考”同病:算力的边际效用会转负。
- 正确做法:先在 eval 集上画准确率—N 曲线找拐点,把 N 钉在拐点附近;对简单题(高共识)动态降 N。
- 真实反例:overthinking 文献《When More Thinking Hurts》(arXiv:2604.10739,2026,ID 已 WebFetch 核实)明确发现”延长推理预算会让模型放弃已正确的答案、边际收益转负”(真实数据为 R1-32B AIME 12K token 见顶 55.8%、16K 回落 54.9%、约 7,000 token 后负向翻转超过正向翻转;旧稿”87.3%→70.3%“系误引、已更正,与 E02/E03 对齐)。这是同一机制在 trained reasoning 上的版本;self-consistency 的”加 N 无效”是它在 inference 聚合层的对应物。
§5 产品 PM 视角补盲
跳出工程视角,self-consistency 还有三个 PM 容易看走眼的点:
- 用户心理模型:用户感知的是”它想了 8 遍”还是”它慢了 8 倍”?对话场景里 N× 延迟(即便并发也有尾延迟)会直接砸掉体感。self-consistency 更适合异步/批处理场景(离线评测、批量数据标注、后台校验),而非实时对话。把它当”质量保险”用在关键路径,而非默认全开。
- 商业模式与计费:成本线性涨而准确率亚线性涨,意味着 self-consistency 的经济性只在”错误代价高”的场景成立——医疗剂量、财务计算、代码补丁这类”错一次很贵”的任务,多花 8× 算力买 10% 准确率是划算的;闲聊场景则是纯亏。PM 要做的是按错误成本分层决定哪些请求开 N>1。
- 合规与可解释:N 条路径 + 投票天然产出”多数 vs 少数意见”的痕迹,可作为审计证据(“3/8 条路径有异议,已转人工”)。这是 self-consistency 相对单次黑箱输出的一个被低估的合规价值——它让”模型内部分歧”可观测、可记录。
§6 对手框架回应
[!quote] 业界反方立场:接受 + 边界 反方一(Yu et al. 2025,验证器引导搜索的 scaling flaws,arXiv:2502.00271):他们的实验显示,样本数增大后验证器引导搜索的边际优势消退、最终反不如单纯重复采样。接受:这说明在大样本区,朴素的 repeat-sampling(self-consistency 正是其聚合形态)反而稳健——这恰恰是 self-consistency 作为入口的优点,它没有”验证器会错误降级有效路径”的故障模式。边界:但 self-consistency 自己的天花板更低——它无法处理开放任务、无法纠正系统性偏见,遇到难题就靠投票硬扛。所以本节的赌注是:self-consistency 是最好的”第一台装置”,不是最好的”最终系统”。
反方二(Snell et al. 2024,arXiv:2408.03314):他们论证”compute-optimal 策略比 Best-of-N 基线效率提升 >4×,同等 FLOPs 下小模型 + 测试时计算可超 14× 大模型”。接受:均匀 self-consistency(每题固定 N)确实不是 compute-optimal——简单题浪费、难题不够。边界:但”compute-optimal”需要一个难度估计器/验证器才能自适应分配,那是 R02/R03 的复杂度。本节坚持:先用固定 N 跑出曲线、建立直觉,再谈自适应。先会走再会跑。
§7 跨域呼应:控制论的采样—验证回路
[!note] 调度:Wiener 控制论的反馈回路(破 echo chamber 的外部框架) self-consistency 在控制论视角下是一个没有真正反馈的开环系统:它采样 N 次、取众数,但”众数”这个聚合器没有接入外部真值信号——它用”系统自身输出的统计”代替了反馈。这正是它和 Best-of-N + 验证器的本质分野:后者用验证器(ORM/PRM)把外部信号(答案对不对的代理)接进回路,构成闭环。控制论告诉我们:开环系统的稳态误差由系统自身偏差决定,无法被自身消除——这就是 §4 第④点”模型一致地错”的理论根源。判断改写:升级 self-consistency 的路径不是”加更多采样”(那只是把开环跑得更勤),而是”接入一个独立的验证信号把它变成闭环”。这条思路把 R01→R02 的演进从”经验技巧”提升为”从开环到闭环的控制论必然”,与 控制论系统化专题 的”采样—验证回路”是同一根骨架在不同抽象层的投影——本节不复述其论证,只标明 self-consistency 是该回路退化到”无验证器”时的最简边界情形。
§8 PM 决策启示
- 面试怎么用:被问”怎么低成本提升模型在数学/结构化任务上的准确率”,先答 self-consistency(不训练、几十行、有论文数字),再主动说出它的三条边界(开放任务无效、成本线性、放大系统偏见)——会边界比会方法更显水平。再补一句”它是开环,要闭环就上验证器”,直接拉满。
- 选型怎么用:评估一个”推理增强”供应商时,问清它的提升是来自 trained reasoning(改权重)还是 inference 聚合(self-consistency/BoN)。后者你自己就能复现,不该为它付溢价;为它付钱的前提是它有你拿不到的验证器或难度路由。
- 复现怎么用:本节骨架就是你的”第一台装置”。先用便宜模型跑出准确率—N 曲线,找到拐点,建立”这类任务 N 钉在几”的直觉,再决定要不要进 R02(验证器)/ R03(自适应分配)。
§9 与已有节点的关系
| 旧节点 | 本节做了哪种升级 |
|---|---|
| c11 - System 2 思维与 Test-Time Compute | 深化 + 落地。c11 在概念层讲清了 System 2 / TTC / 多数投票”是什么”;本节把其中”并行扩展—多数投票”这一格变成可运行装置,并补上 c11 未展开的工程坑(parsing、temperature、共识度误用)。不复述 c11 的 System 1/2 框架与 PRM/ORM 定义。 |
| Test-Time Compute | 操作化。概念卡定义了 TTC 的范式转移;本节是它”并行/无验证器”分支的最小复现,给出概念卡里没有的代码与曲线。 |
| m209 - 推理成本控制手册 | 对话。m209 讲成本控制(路由、缓存);本节暴露 self-consistency 的成本是线性 N×、只在输出侧,正是 m209 §路由决策的输入——“对高共识简单题降 N”就是把本节的共识度信号喂给 m209 的 cascade。 |
| 0411 Agent 专题 A03 ReAct | 横切呼应。ReAct 是顺序的”推理—行动”回路;self-consistency 是并行的”推理—聚合”。两者是 reasoning 作为 Agent 规划引擎的两种正交用法,本节不复述 ReAct 机制,只标明聚合维度的存在。 |
§10 关联节点
核心(必读)
延伸(可选)
- Scaling Laws
- Agent
- DeepSeek
- OpenAI
- Claude
- 0117社会学
- AI PM 知识图谱·总索引
[!info] 待建概念清单(本专题登记,暂降级为普通文本,不建 stub) 起草期占位内链已校正:
A02 CoT vs Trained Reasoning vs 推理期搜索→A01 Reasoning 概念史·从 CoT 到 Test-Time Compute;R02 Best-of-N 与过程奖励模型骨架→R02 中型·Reasoning 预算路由器;进阶验证器搜索内容见 R03 进阶·Verifier-guided 搜索;0411 A03 ReAct 跨专题链已确认存在并升级为双链 A03 ReAct。 (2026-06-11 已入库回链)0420 控制论专题(采样—验证回路)现已在主库发布,§5 正文引用已回链至 控制论系统化专题。
修订日志
- 2026-06-11 P3.4 校链:0420 控制论现已入库,§5 控制论呼应与待建清单中”未发布/降级为普通文本”恢复为真 0420 总览 链。
- R1(2026-06-07):首稿。建立可跑骨架(串行 + 并发)、准确率—成本—延迟三角表、五条判断主轴、控制论开环/闭环跨域呼应、对手框架(Yu 2025 / Snell 2024)回应。待核实项已标注。
[!caution] demo ≠ 生产 本节骨架是实验装置,不是生产系统。生产化至少还差:(1) 鲁棒的答案抽取与归一化(§4③ 是最大坑);(2) 速率限制下的并发退避与重试;(3) 按错误成本分层的动态 N 路由(而非固定 N);(4) 把众数投票升级为接入独立验证器的闭环(R02);(5) 共识度的离线校准,而非直接当置信度上线。能跑出曲线,离能上线还有一整个工程项目。