想象一节数学课。老师在黑板上写下一道应用题:“17 × 24 等于多少?”他没有让全班齐声回答,而是要求每个同学独立演算,把答案写在纸上,最后举手投票。结果,小明算出了 408,小刚也算出了 408,小华一走神算成了 410,小红又算出 408……众人的答案集中在 408,老师于是宣布:正确答案是 408。 一个人可能粗心犯错,但只要十几个独立演算的人各自犯错的方向不同,多数人同时犯同一个错的概率就低得多——这就是“众志成城”的智慧。Self-Consistency(自洽投票)正是把这种智慧搬进了大模型:同一个问题,让模型在稍高的随机性下独立推理多条路径,每条路径给出一个答案,最后统计票数,得票最多的答案胜出。在论文报告的数据中,数学应用题基准 GSM8K 上,单次思维链推理准确率约 17.9%,投票后跃升到 56.5%——模型没换、数据没加,仅靠“多算几次再举手表决”,准确率就实现了翻倍式增长。

岗位关联

掌握 Self-Consistency 是 Prompt 工程师的必备技能:无需训练、只用推理时采样与投票,就能低成本地把数学与逻辑任务的可靠性拉高一个台阶。

目录
  1. 可视化演示
  2. 投票核心思想
  3. 温度参数:把“独立程度”调到刚刚好
  4. 采样数量:问多少个同学才够?
  5. 适用题型:什么题适合举手投票?
  6. CoT配合:先交草稿,再举手
  7. 效果对比:全班投票 vs 班长一个人说了算
  8. 工程实现:发卷、收卷、唱票
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示多路径采样投票提升推理准确率:推理路径投票、温度参数影响、CoT与SC对比,三种模式交互切换。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多路径采样与投票 同一问题生成5条独立推理路径 投票选出出现频率最高的答案 P(answer) = majority_vote(paths) 5条路径中3条得到A,投票结果:A(60%)

投票核心思想

数学老师走进教室,在黑板上写下一道应用题:“17 × 24 等于多少?”他做了一个特别的要求:不许讨论,每个人独立演算,把答案写在纸上。等所有人都算完,他一声令下:“算好的举手!”算 408 的同学纷纷举起手;只有小华算成 410,小强算出 402。望着七嘴八舌的答案,老师笑了笑:“多数人都说 408,那我们就以 408 为准。”——这就是自洽投票的原始直觉:与其相信某个人的一次演算,不如相信一群人独立演算后的多数结论。

Self-Consistency(自洽投票)正是把这道“班级算术题”搬进了大模型。2022 年,Google 团队提出:同一个问题,让模型在 temperature > 0 的随机采样下,生成 N 条彼此独立的推理路径——就像 N 个同学各自演算;然后剥掉推理过程,只保留每条路径的最终答案,统计哪个答案得票最多,票数最高的答案作为最终输出。它背后的假设是:模型单次推理会犯各种随机错误,但多数人同时犯同一个错的概率,远小于某一个人犯错。用数学语言描述这一投票过程就是:

回到班级场景:老师要求的“独立演算”是采样路径,他“统计举手”是累加票数,“以 408 为准”就是 argmax。Self-Consistency 的每一步,都能在班级里找到对应角色——它是一种朴素到近乎天真、却又极其可靠的智慧。

y^=arg⁡max⁡y∑i=1N1{yi=y}\hat{y} = \arg\max_{y} \sum_{i=1}^{N} \mathbf{1}\{y_i = y\}
该式表示:在 N 条路径的答案中,找出被最多路径“点名”的那个答案作为最终输出。
  1. 路径集合模型采样出 N 条独立推理路径,第 i 条路径给出候选答案 $y_i$。
    y1,y2,…,yNy_1, y_2, \dots, y_N
  2. 指示函数$\mathbf{1}\{y_i = y\}$ 是一个“计票器”,若第 i 条路径的答案正好等于待统计的 y,就返回 1,否则返回 0。
    1{yi=y}={1,yi=y0,yi≠y\mathbf{1}\{y_i = y\} = \begin{cases} 1, & y_i = y \\ 0, & y_i \neq y \end{cases}
  3. 累加票数$\sum_{i=1}^{N}$ 把 N 个计票器的输出加起来,得到答案 y 的总得票数。
    votes(y)=∑i=1N1{yi=y}\text{votes}(y) = \sum_{i=1}^{N} \mathbf{1}\{y_i = y\}
  4. 多数胜出$\arg\max_{y}$ 表示在候选答案集合中挑选得票数最大者,这就是最终输出。
    y^=arg⁡max⁡y votes(y)\hat{y} = \arg\max_{y} \ \text{votes}(y)

温度参数:把“独立程度”调到刚刚好

要让投票有意义,前提是同学们真的“独立”了。如果老师规定所有人必须照抄课本例题的解法,全班答案高度雷同,投票等于投了个寂寞。反过来,如果老师让大家放飞自我随便写,答案又将变成一盘散沙。老师需要的,是一个能调节“独立思考程度”的旋钮——temperature(温度)就是这个旋钮。

在语言模型内部,生成每个词时,模型都会给候选词打一个分数 $z_i$(logit),分数高的词更受青睐。temperature 决定这个分数差距如何被放大或压缩,其数学形式是带温度的 softmax:

T=1 时就是普通 softmax;T 越大,各候选词的得分差距被压缩,模型越“随心所欲”;T 越小,差距被放大,模型越“循规蹈矩”。

把温度想象成老师调节“自由度”的旋钮:0.2 意味着人人照本宣科,1.2 意味着课堂乱成一锅粥。Self-Consistency 的实践经验是取 0.5~0.8——既让不同路径之间有可见差异,又让每条路径仍然认真答题。调得太低,N 条路径同质化,投票退化为单次推理;调得太高,多数路径都在胡诌,投票集结的是噪声。这个度,正是一节“成功的讨论课”需要的那个度。

pi=ezi/T∑j=1Kezj/Tp_i = \frac{e^{z_i / T}}{\sum_{j=1}^{K} e^{z_j / T}}
  1. 候选打分模型对每个候选词给出实数分数 $z_i$,分数越高代表越倾向选它。
    zi∈Rz_i \in \mathbb{R}
  2. 温度缩放用温度 T 除分数。T>1 时分数差缩小,T<1 时分数差放大,T→0 时只有最高分词的概率趋于 1。
    zi/Tz_i / T
  3. 指数化$e^{z_i / T}$ 把缩放后的分数映射为正数,同时放大差距的“感知”。
    ezi/T>0e^{z_i / T} > 0
  4. 归一化除以所有候选的指数和 $\sum_{j=1}^{K} e^{z_j / T}$,让所有概率之和恰好为 1,得到最终采样概率 $p_i$。
    ∑i=1Kpi=1\sum_{i=1}^{K} p_i = 1

采样数量:问多少个同学才够?

老师决定用投票,但马上遇到现实问题:只问 1 个同学,跟直接信他一个人没区别;问 3 个同学,万一有两个人恰好犯同一个错呢?问 30 个同学确实更稳,可每多问一个人,课堂时间就多消耗一分。投票的数量 N,是一个典型的“收益 vs 成本”权衡。

假设每条路径独立答对的概率是 p(比如 0.6),则 N 条路径中至少有 N/2 条答对时,多数投票才正确。这个概率服从二项分布:

代入 p=0.6 可以算出:N=5 时约 68%,N=11 时约 76%,N=21 时约 82%。增速肉眼可见地放缓——多买的每一票,边际收益都在递减。

班级里的经验同样如此:问 5 个同学可能刚好撞上“多数派也错了”的背运,问 40 个同学时,只要每个人独立演算的质量在线,答案几乎必然收敛到正确项。工程上的常见选择是 5~40 条,通常 10 条左右已能吃掉大部分收益。大模型 API 按调用次数计费,采样 40 条意味着约 40 倍成本——预算有限时,与其盲目加到 100 条,不如先把温度调对、把数据洗干净。投票这件事,讲的是“边际收益递减”,而不是“多多益善”。

PN=∑k=⌈N/2⌉N(Nk)pk(1−p)N−kP_N = \sum_{k=\lceil N/2 \rceil}^{N} \binom{N}{k} p^k (1-p)^{N-k}
  1. 单条正确率设每条路径独立答对的概率为 p,答错概率为 1-p,p 通常来自模型的基础能力。
    0<p<10 < p < 1
  2. 组合数$\binom{N}{k}$ 表示 N 条路径中“恰好 k 条答对”这件事有多少种安排方式。
    (Nk)=N!k!(N−k)!\binom{N}{k} = \frac{N!}{k!(N-k)!}
  3. 恰 k 对概率$p^k (1-p)^{N-k}$ 是“k 条答对、其余答错”这一具体局面的概率。
    pk(1−p)N−kp^k (1-p)^{N-k}
  4. 过半求和$\sum_{k=\lceil N/2 \rceil}^{N}$ 把“至少一半答对”的所有局面概率相加,得到投票总正确率。
    k≥⌈N/2⌉k \geq \lceil N/2 \rceil

适用题型:什么题适合举手投票?

并不是所有问题都适合“举手投票”。如果老师问“1+1 等于几”,全班异口同声,投票毫无意义;如果老师让每人写一首以春天为题的诗,写出来的作品全然不同,投出来的“大多数人的诗”也未必是好诗。投票的有效性,取决于问题是否存在“可判别的正确答案”。

Self-Consistency 的黄金适用区间是:数学计算、逻辑推理、常识问答、事实性校验——这些题目的答案可以明确比较异同,408 与 410 谁对谁错一望可知。相反,创意写作、开放式续写、闲聊寒暄没有标准答案,多数票反而会消弭个性。如何度量“这题适不适合投票”?看答案分布的熵:

班级投票什么时候有意义?当同学们意见足够分散、且正确答案具备判定标准的时候。熵就是那个“意见分散程度”的仪表盘。工程上遇到新任务,第一个动作往往是小规模采样 20 条看答案熵:熵很低,直接单次推理即可,别浪费钱;熵很高且答案能离散判定,Self-Consistency 简直是量身定做。若是开放生成任务,即便熵再高,投票也不适用——大家不会用举手表决来评诗。

H=−∑aP(a)log⁡2P(a)H = -\sum_{a} P(a) \log_2 P(a)
  1. 答案概率$P(a)$ 是答案 a 在 N 条路径中的得票占比,例如 6 条路径中 3 条给 A,则 $P(A)=0.5$。
    P(a)=votes(a)NP(a) = \frac{\text{votes}(a)}{N}
  2. 惊讶度$\log_2 P(a)$ 是信息量,答案越罕见(概率越小),数值越负,“惊讶”越大。
    log⁡2P(a)≤0\log_2 P(a) \leq 0
  3. 加权求和$-\sum_a$ 把每个答案的惊讶度按概率加权求和,得到整个答案分布的混乱程度。
    H≥0H \geq 0
  4. 熵的判读H 接近 0 说明路径高度一致,投票没什么可投的;H 较大说明答案四分五裂,正需要投票来“收拢军心”。
    H→0,意见统一;H→1,意见分散H \to 0, \text{意见统一}; \quad H \to 1, \text{意见分散}

CoT配合:先交草稿,再举手

小学时老师常要求“应用题必须写脱式过程,不写草稿不给分”。为什么要写过程?因为草稿让思路可追踪,也逼着学生一步步算而不是瞎猜答案。对语言模型而言,“思维链”(Chain-of-Thought,CoT)就是那张必须交的草稿——先写出推理步骤,再给出最终答案。

Self-Consistency 与 CoT 是一对黄金搭档:CoT 负责保证每条路径认真演算,自洽投票负责多数裁决。在 CoT 框架下,模型先从问题出发生成一条推理链 r,再基于 r 给出答案 y。单条路径是一个条件概率链,而 Self-Consistency 的本质是对所有采样路径做边缘化求和:

回到班级:CoT 相当于老师规定“必须附演算草稿”,自洽投票相当于“按最终答案举手表决”。草稿保证了每个人不是空口报数,投票保证了团体决策的稳健。研究也反复证明:“CoT + 采样 + 投票”三件套,比单独用 CoT 或单独用投票都更稳定。别忘了在 prompt 里加上“请逐步推理”——没有 CoT 的话,采样出来的路径往往只冒一个答案,投票就成了盲猜。

P(y∣x)=∑rP(r∣x)⋅P(y∣x,r)P(y \mid x) = \sum_{r} P(r \mid x) \cdot P(y \mid x, r)
  1. 推理链 rr 是一条完整的中间步骤序列,从读题到列式再到计算。
    r=(s1,s2,…,sm)r = (s_1, s_2, \dots, s_m)
  2. 生成链的概率$P(r \mid x)$ 表示给定问题 x,模型恰好生成这条推理链 r 的概率。
    P(r∣x)P(r \mid x)
  3. 链上的答案概率$P(y \mid x, r)$ 表示在已经写出 r 的条件下,模型最终给出答案 y 的概率。
    P(y∣x,r)P(y \mid x, r)
  4. 全链求和$\sum_r$ 把所有可能推理链的贡献按概率加权相加——这就是“让每条路径都贡献一票”的数学本质。
    ∑rP(r∣x)⋅P(y∣x,r)\sum_{r} P(r \mid x) \cdot P(y \mid x, r)

效果对比:全班投票 vs 班长一个人说了算

如果只让“班长”(模型单次贪心解码)答题,班长很聪明,但偶尔也犯低级错误;如果让全班独立演算再投票,团体智慧往往碾压单兵作战。Self-Consistency 论文中最震撼的实验数据来自 GSM8K 数学应用题基准:在 PaLM-540B 上,思维链单次贪心推理准确率只有 17.9%,而 Self-Consistency 投票后冲到 56.5%——准确率翻了三倍,而这仅仅是把“推理一次”改成“推理 40 次取多数”,没有动任何模型参数。

不同基线的差距可以用“错误削减率”来比较,它衡量投票消灭了单次推理中多大比例的错误:

在班级语境里,$A_{\text{CoT}}$ 是班长的个人正确率,$A_{\text{SC}}$ 是全班的团体命中率,$\Delta$ 则回答了一个关键问题:“搞投票到底值不值得?”值得。数学推理、符号逻辑类任务中,投票收益普遍显著;而在常识问答上,当单次准确率原本就很高(例如 90%),投票的提升空间也有限——错误削减率自然帮你识别这种“锦上添花 vs 起死回生”的差异。

Δ=ASC−ACoT1−ACoT\Delta = \frac{A_{\text{SC}} - A_{\text{CoT}}}{1 - A_{\text{CoT}}}
  1. 两次准确率$A_{\text{CoT}}$ 是单次思维链的准确率,$A_{\text{SC}}$ 是投票后的准确率。
    ACoT=0.179,ASC=0.565A_{\text{CoT}} = 0.179, \quad A_{\text{SC}} = 0.565
  2. 绝对提升$A_{\text{SC}} - A_{\text{CoT}}$ 是投票带来的绝对提升,本例为 0.386。
    ASC−ACoT=0.386A_{\text{SC}} - A_{\text{CoT}} = 0.386
  3. 剩余错误空间$1 - A_{\text{CoT}}$ 代表单次推理还错的比例,这是理论上还能挽救的空间,本例为 0.821。
    1−ACoT=0.8211 - A_{\text{CoT}} = 0.821
  4. 错误削减率两者相除,$\Delta=0.47$ 表示投票消灭了约 47% 的原有错误,跨任务比较时这个指标更公平。
    Δ=0.3860.821≈0.47\Delta = \frac{0.386}{0.821} \approx 0.47

工程实现:发卷、收卷、唱票

把 Self-Consistency 落到真实业务,本质上是在组织一场持续的小测验。流程分三步:发卷(多次调用模型)、收卷(归一化答案)、唱票(统计票数)。每张“试卷”都是独立的一次 API 调用,带着同一个问题、同样的 CoT prompt,不同的只是随机性(以及稍高的 temperature)。

工程上第一个坑是“归一化”——模型的答案五花八门:"408"、“答案是408”、“408元”、“408。因此正确”,字符串完全不一样,语义却是同一个答案。必须先写一个解析器,把每条路径末尾的答案抽取并归一化,再进入投票池。第二个坑是延迟与成本:采样 N 条路径,总延迟按下式增长:

类比班级测验:如果一张一张收卷子再一张一张批改,40 张卷子要等一节课;如果 40 个同学同时答题(并行请求),收齐后唱票只需几秒。企业落地时的做法通常是:设置并发水位(例如 8 路并发)、对高频题做结果缓存、把“投票 + 胜出推理链”组合返回给上层,既保住了准确率,又不会让用户等到失去耐心。Self-Consistency 本质上是一个“以算力换精度”的决策:只要预算买得起试卷,准确率就能实打实地提上来。

Ttotal=N×Tinfer+TaggregateT_{\text{total}} = N \times T_{\text{infer}} + T_{\text{aggregate}}
  1. 单条推理延迟$T_{\text{infer}}$ 是模型生成一条完整 CoT 路径所需的时间,往往占大头。
    Tinfer≈1–5 sT_{\text{infer}} \approx 1\text{--}5 \text{ s}
  2. N 倍推理$N \times T_{\text{infer}}$ 是 N 条路径的推理总耗时。串行时严格累加,并行时约等于单次耗时。
    N×TinferN \times T_{\text{infer}}
  3. 聚合开销$T_{\text{aggregate}}$ 是答案归一化与计票的本地计算时间,通常毫秒级。
    Taggregate≪TinferT_{\text{aggregate}} \ll T_{\text{infer}}
  4. 总延迟$T_{\text{total}}$ 是用户可感知的等待时间。工程上通过并发请求(async/多路 HTTP)把 N 倍积压拉回近单次水平,并配合缓存、超时与熔断。
    Ttotal≈Tinfer+ϵT_{\text{total}} \approx T_{\text{infer}} + \epsilon

AI 应用场景

智能解题辅导 App

阶段:生成后处理 / 推理增强

解决的问题:拍照搜题类产品的单次推理经常算错,尤其应用题步骤多,模型容易在中途出错。传统做法是递归调用模型直到“看起来对”,既慢又不稳定;Self-Consistency 通过多次投票直接量化置信度,得票集中的答案可以放心讲给学生。

具体案例:某 K12 数学辅导应用上线“自洽投票”后处理:前端拍题 → 后端对题目采样 5 条 CoT 路径 → 归一化答案 → 若 5 条中 ≥4 条一致,直接按胜出答案给学生讲解完整推理链;若票数分散(如 3:2 僵持),则自动降级为“人工审核队列”。上线后解析类题目的答错率下降约 40%。

大模型评测集的参考答案生成

阶段:评测数据构建

解决的问题:为数学/逻辑评测集标注参考答案成本高且有标注噪声。单次模型推理生成的“参考答案”本身可能是错的,会导致误判学生模型。

具体案例:评测团队对每道题采样 20 条推理路径做投票,仅在票数 ≥15 时才将该答案写为参考答案;票数分散的题目直接丢弃。相比纯人工标注,成本降低约 70%,且参考答案可追溯具体推理链、可复核。

SQL 生成后的结果一致性校验

阶段:生成结果校验

解决的问题:大模型生成的 SQL 语法正确但业务语义错误,是数据分析平台的高频事故,单次生成无法自检。

具体案例:某 BI 平台对大模型生成的 SQL 采样 3 条分别执行,若 3 条 SQL 的执行结果集完全一致,直接返回结果并标记“高置信”;若有分歧则告警,提示用户确认表字段含义。用投票代替人工逐条 review,数据事故工单量减少约 33%。

Python 演示

python56 行
"""Self-Consistency majority voting demo: sample paths and vote for the answer."""import random  def sample_path(question, temperature):    """Return a (reasoning_chain, answer) record simulating one LLM call."""    pool = [        ("17*24=17*20+17*4=340+68=408", "408"),        ("17*24=20*24-3*24=480-72=408", "408"),        ("17*24=17*25-17=425-17=408", "408"),        ("17*24=18*24-24=432-24=408", "408"),        ("17*24=410", "410"),        ("17*24=400+8=408", "408"),        ("17*24=17*4*6=68*6=408", "408"),        ("17*24=80", "80"),    ]    lines = list(pool)    if temperature >= 1.0:        # 温度过高: 注入更多离谱答案, 模拟随机性失控        lines += [("17*24=1000", "1000"), ("17*24=500", "500")]    if temperature <= 0.2:        # 温度过低: 每次贪心解码几乎相同, 投票退化为单次推理        lines = [pool[0]]    return random.choice(lines)  def normalize(answer):    """Normalize '答案是408' / '408元' into the same canonical '408'."""    return answer.replace("答案是", "").replace("元", "").strip()  def self_consistency(question, num_paths=7, temperature=0.7):    """Sample num_paths reasoning paths and return (winner, votes, records)."""    records = []    votes = {}    for _ in range(num_paths):        reasoning, answer = sample_path(question, temperature)        answer = normalize(answer)        records.append((reasoning, answer))        votes[answer] = votes.get(answer, 0) + 1    winner = max(votes, key=votes.get)    return winner, votes, records  def main():    question = "17 x 24 = ?"    for temp in (0.2, 0.7, 1.2):        winner, votes, records = self_consistency(question, num_paths=7, temperature=temp)        print(f"temperature={temp}, votes={votes}, winner={winner}")        # 打印胜出答案对应的一条推理链, 作为给用户的解释        best_chain = next(r for r, a in records if a == winner)        print(f"  winning chain: {best_chain}")  if __name__ == "__main__":    main()
目的:用模拟数据演示 Self-Consistency 的完整流程——多条路径采样、答案归一化、多数投票,并对比三种温度下投票结果的差异。
  1. def sample_path(question, temperature):每个“同学”独立演算一次,真实场景中这里换成大模型 API 调用,把 question 与 CoT prompt 一起传入。
  2. if temperature >= 1.0:模拟温度过高时路径池里涌入离谱答案,直观看到高温度会让投票翻车。
  3. if temperature <= 0.2:温度太低时每次返回同一条链,投票等于白设,这就是“温度 0 无多样性”的缩影。
  4. def normalize(answer):投票前必须把“答案是408”、“408元”归一为"408",否则同一答案会被拆成不同字符串而稀释票数。
  5. votes[answer] = votes.get(answer, 0) + 1每生成一条路径就给它的答案投一票;get 缺省 0 保证首次计票从 1 开始。
  6. winner = max(votes, key=votes.get)取出得票最多的答案,对应公式中的 argmax。
  7. for temp in (0.2, 0.7, 1.2):跑三组温度对比,直观感受“温度过低没多样性、过高噪声淹没信号”。

常见误区

误区我为了让模型每次推理都不一样,把 temperature 拉到 1.5 甚至 2.0,觉得路径越不一样,投票就越准。

正解投票的前提是“每条路径都还在认真答题”。温度过高时,softmax 把分数差距压平,模型几乎在随机选词,采出来的路径大多驴唇不对马嘴,多数票集结的是噪声而非共识。实践经验推荐 0.5~0.8:足够让路径分岔,又不会让路径失控。这就像开班会,课堂越吵闹不等于结论越正确。

为何常见:新手容易把“多样性”直接等同于“多样性更好”,忽略了多样性必须建立在单条路径质量合格的前提上。

误区既然投票越多越好,我就把采样数从 5 加到 20 再到 50,准确率应该一路涨。

正解从二项分布的多数投票公式看,当单路径正确率 p 固定时,准确率随 N 增大呈“先快后平”的边际递减曲线:p=0.6 时,N=5 约 68%,N=21 约 82%,再往上收益趋近于 0,而 API 成本与延迟却线性增长。工程上 5~40 条即可,10 条左右已覆盖大部分收益。

为何常见:日常经验“问的人越多越稳”没有考虑边际收益递减;当路径高度趋同时,新增的票只是重复投票。

误区这是个能提准确率的万能技巧,写文案、翻译、闲聊都套上“多采样 + 投票”。

正解投票在数学计算、逻辑推理等“答案可离散判定”的任务里管用;在开放生成任务里,没有统一标准答案,多数票只会抹掉多样性和创意——全班投票选不出最好的诗。落地前先用答案熵或小样本实验判断任务是否适合投票。

为何常见:把“准确率”误解为一切任务的目标,忽略了自洽投票对“答案可比较”这一前提的依赖。

误区我直接把整条 CoT 文本放进投票池,想着“推理链长的就是对的”,再用文本相似度来聚类投票。

正解投票的对象必须是归一化后的最终答案,而不是推理链。两条推理链文字完全不同,可能指向同一个正确答案;两条链相似,也可能只是复读同一个错误。工程上需要先用规则或二段 prompt 抽取每条路径的最终答案,再做归一化和计票。

为何常见:没分清“过程多样性”和“结论一致性”——过程千变万化没关系,结论一致才有投票价值。

误区我把 temperature 设成 0(贪心),调用 10 次 API,心想“调用多次总归会有不同结果吧”。

正解temperature=0 时模型输出完全确定,同等输入下 10 次调用的路径和答案一模一样,投票退化为单次推理,等于花了 10 倍的钱买了同一份答案。要获得路径多样性,必须让 temperature > 0(0.5~0.8),或显式传入不同的随机种子。

为何常见:不了解贪心解码的确定性——greedy 每次选概率最大的词,结果不含随机性,多次调用不过是重复同一份答案。

面试题

Q1. Self-Consistency 的核心思想是什么?

单选题 · easy

  • A.让模型多次推理,对答案投票取多数← 正确答案
  • B.让模型单次推理的步长拉长
  • C.用更大的模型替换当前模型
  • D.用更多训练数据微调模型

答案:A。Self-Consistency 的核心是“采样多条独立推理路径 + 多数投票”。B 只是把单次推理变长,C 换模型、D 微调都属于模型侧改进,均未体现“多条路径投票”这一核心。

Q2. 使用 Self-Consistency 时,temperature 通常设置为多少?

单选题 · easy

  • A.0(贪心解码)
  • B.0.5~0.8← 正确答案
  • C.1.5~2.0
  • D.任意值均无影响

答案:B。0.5~0.8 既保证路径有差异又保证路径仍在认真答题。A 的 T=0 会让所有路径完全一样,投票失效;C 过高会让输出接近随机;D 认为无影响,忽略了温度对路径多样性的决定性作用。

Q3. 为什么 Self-Consistency 投票能提升推理准确率?

单选题 · mid

  • A.多次采样增加了模型参数
  • B.多数投票能抵消个别路径的随机错误← 正确答案
  • C.投票过程让模型学会了新知识
  • D.每条推理路径变得更长了

答案:B。单条路径存在随机性失误,但失误方向各不相同;多数投票把个别“跑偏”路径的票淹没在多数正确路径中。A 采样不改变参数,C 推理不产生学习,D 路径长度与准确率无必然关系。

Q4. 以下哪类问题最适合 Self-Consistency?

单选题 · mid

  • A.开放式故事续写
  • B.数学应用题求解← 正确答案
  • C.日常闲聊寒暄
  • D.诗歌意境翻译

答案:B。数学应用题有离散可判定的标准答案,多数投票能显著提分;开放式续写、闲聊、诗歌翻译没有统一标准,多数票无法判定优劣,也不该用投票抹杀多样性。

Q5. 采样数量从 1 增加到 40,投票准确率的变化趋势是?

单选题 · mid

  • A.线性持续单调上升
  • B.先快速上升后趋于平缓← 正确答案
  • C.先下降后波动上升
  • D.几乎保持不变

答案:B。多数投票准确率随 N 增大呈边际收益递减:从单条路径的 p 开始快速爬升,随后逐渐逼近 1(当 p>0.5 时)。A 的“线性”不符合二项分布规律;C、D 与二项分布的单调递增趋势不符。

Q6. 投票前为什么需要对答案做归一化处理?

单选题 · hard

  • A.让答案看起来更完整规范
  • B.让“408“与”答案是408”计为同一票← 正确答案
  • C.为了减少采样路径数量
  • D.归一化后就不需要温度设置了

答案:B。模型输出的最终答案形式五花八门,不归一化会把同一答案拆成多个字符串,导致票数被稀释、多数派逆转。A 不是目的,C 与归一化无关,D 更是把归一化误当成温度设置的替代品。

Q7. 关于 Self-Consistency 的工程实现,以下哪些做法正确?

多选题 · mid

  • A.多次调用模型并保持 temperature>0← 正确答案
  • B.只保留贪心解码的结果
  • C.对每条路径的答案归一化后投票← 正确答案
  • D.把整条推理链文本也纳入投票

答案:AC。A 保证采样多样性,C 防止同一答案被拆票,二者是标准做法。B 的贪心解码无多样性;D 投票对象应是最终答案而非推理链文本,否则过程文字差异会干扰计票。

Q8. 以下哪些策略能与 Self-Consistency 正确配合?

多选题 · mid

  • A.配合思维链 CoT 提示词← 正确答案
  • B.温度参数固定为 0
  • C.采样多条独立的推理路径← 正确答案
  • D.不写提示词直接输出答案

答案:AC。CoT 让路径先写草稿再给答案,配合投票效果最好;多条独立路径是投票的前提。B 温度 0 无多样性;D 无 CoT 时模型直接报答案,路径质量差,投票收益也差。

Q9. 投票结果中答案 A 得 4 票、答案 B 得 3 票,Self-Consistency 最终输出什么?

单选题 · mid

  • A.输出 A,因为得票最多← 正确答案
  • B.输出 B,因为最后出现
  • C.重新采样 10 条再投
  • D.随机选择一个答案

答案:A。Self-Consistency 就是多数投票,得票最多的 A 胜出。B 的“最后出现”没有依据;C 重采样增加成本而未必改变结论;D 随机选择等于放弃投票结果,也不符合多数原则。

Q10. Self-Consistency 相对单次推理的主要代价有哪些?

多选题 · hard

  • A.推理延迟按采样数成倍增加← 正确答案
  • B.API 调用成本随采样数放大← 正确答案
  • C.模型参数量同步翻倍
  • D.需要额外的人工标注数据

答案:AB。N 次采样意味着 N 倍 tokens 生成与 N 倍 API 计费,延迟可用并发压缩但成本不可压缩。C 模型参数完全不变;D 该方法无需训练与标注,这正是它比微调更轻量、更受欢迎的原因。