自洽性多路径投票

Self-Consistency (SC)

Self-Consistency 自洽性是思维链 CoT 的升级技巧:对同一个问题,用高 Temperature 采样生成 K 条(通常 5 至 40 条)不同的推理路径和答案,最后做答案投票选出票数最多的那个,数学或逻辑类任务准确率再提 10–20%。

详细解释

Self-Consistency(简称 SC,自洽性) 是 Google Brain 团队 2022 年在论文《Self-Consistency Improves Chain of Thought Reasoning in Language Models》中提出的,至今仍是”纯靠 Prompt Engineering 提升复杂任务准确率”的 TOP 3 有效手段之一,且对代码生成、数学、逻辑推理特别有效。

它的直觉非常简单:

  • 一道复杂数学题,人类学生可能会用不同路径推导,只要最终答案一致,这个答案大概率是对的;
  • 模型也一样:同一个问题,用 Temperature 稍高(如 0.7)的参数生成 20 条”推理过程 + 答案”,最后 20 条里有 14 条答案是 278,3 条是 231,2 条是 279,1 条是 1080——那我们相信”278 是对的”,因为它更自洽(自洽 = 多条推理路径都得出它)。

这和 思维链 CoT 的差异:

方法每次生成路径数是否有推理过程典型任务准确率提升
标准 Prompt(直接问答案)1 条❌ 没有基线
Zero-Shot CoT(一步步思考)1 条✅ 1 条推理数学从 13% → 40%+
Few-Shot CoT(给 8 条推理示例)1 条✅ 1 条推理57%(GSM8K)
Self-Consistency(CoT + 投票)20 条推理 + 投票✅ 20 条推理74%(GSM8K,同一模型直接 +17 点)
Self-Consistency + 更强基座40 条投票2025 年强模型上能到 GSM8K 90%+

一个小注意:Self-Consistency 只适合”有唯一正确答案”的任务,比如数学、代码、选择题、多跳事实 QA。开放式写作、文案润色没有”正确答案”,投票没有意义。

落地 Self-Consistency 的标准代码骨架

# 伪代码:SC 40 条投票示例
from collections import Counter
from openai import OpenAI
client = OpenAI(api_key="wm-xxxx", base_url="https://api.weimeta.cn/v1")

def solve_with_self_consistency(question, K=40, temperature=0.7):
    answers = []
    for _ in range(K):
        # 每条用不同 [Seed](/support/glossary/seed/) 保证多样性,或用高温度+无 Seed
        resp = client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role":"system","content":"你是数学竞赛金牌选手。请先给出多步推理过程,最后一行输出:答案 = [数字]"},
                {"role":"user","content": question}
            ],
            temperature=temperature, max_tokens=2048,
        )
        text = resp.choices[0].message.content or ""
        # 用正则抽出"答案 = x"
        m = re.search(r"答案\s*=\s*([\-]?\d+(\.\d+)?)", text)
        if m:
            answers.append(m.group(1))
    # 答案频次投票
    counter = Counter(answers)
    best_answer, votes = counter.most_common(1)[0]
    confidence = votes / K  # 置信度 = 票数 / K
    return best_answer, confidence, counter.most_common(3)

几个关键设计点:

  1. K 取多少?:经验值 K=20 是甜点(40 条的边际收益会递减)。对准确率要求极高的安全关键场景可以 K=40。
  2. Temperature / Seed:Temperature 0.6 至 0.8 比较好(太低大家都走同一条路径,多样性不够;太高大家都胡扯,没意义)。搭配 Seed 每轮不同,或者不设 Seed。
  3. 答案归一化:“278”、“278 个”、“答案:278。“其实是一个答案,抽答案时先做 trim + 去标点再投票。代码场景可以用 AST 解析 + black 格式化再投票,效果更好。
  4. 置信度阈值兜底:如果票数最高的答案只拿到 3/40 票(3 个答案各 3 票,其他零散)——说明这题模型完全没搞懂,置信度低,走【需要人审】或【降级提示”我不确定”】分支。

进阶变体(更上一层)

变体相比 SC 的改进适用场景
Verifier + SC先跑 SC 出 Top-N 答案,再用”答案验证器(一个小的 Reward Model / 代码执行器)“给每条打分,选分最高的代码:用单测跑,直接知道对不对
SC + 投票 + 自反思投票完之后把”20 条推理 + 最终答案”再喂给模型,让它自己挑哪条推理最合理法律/医学要”可解释的对”
Tree of Thoughts(思维树 ToT)SC 是”各自生成然后投票”的扁平结构;ToT 是”在每一步分叉 + 剪枝”的树结构更复杂的规划类任务(搜索、组合优化、多步规划)
MoA(Mixture of Agents)用多个不同模型(GPT-4o、Claude Opus、Qwen2.5 72B)一起各自推理,再做跨模型投票容错率最高:不同模型的弱点不一样,集体投票能掩盖单个模型的偏见
唯元智创 企业级 RAG + SC对”带证据的答案”做双投票:答案投票 + 证据来源投票,两者一致才输出金融合规/医疗,要”答案对”也要”引用对”

常见问题

Self-Consistency 要跑 K=40 次,成本会不会爆炸?
有两种方式控成本:(1)分层(Cascade),先跑 K=5,置信度(top 票数/K)大于 0.8 就直接返回;不满足再升级到 K=20;再不行 K=40。大多数题第一轮就过了,实际成本只有全 K=40 的 1/4。(2)选便宜的小模型做 SC:先用 Qwen2.5 14B 这种便宜模型 K=40 投票,得到一个”高置信答案候选”,再用强模型 GPT-4o 只跑 1 至 2 条去验证。成本几乎不涨,但准确率已经上去了。经验上,大多数场景平均 K 实际只有 8 至 12,不是 40。
会不会出现”大家一起走错同一条路”(集体幻觉)?
会,但 SC 仍然是降低幻觉率最有效的方法之一。经验上”同模型 40 条一起走错”的概率显著低于”单条走错”——因为高 Temperature 下路径会分叉,正确的路径(只要存在)总会被至少几条采样路径走中。要更保险,加【跨模型 MoA 投票】,用两个不同厂商的模型(比如 OpenAI + Anthropic + 开源),因为不同模型的”错误模式”相关性低,一起集体幻觉概率接近 0。
代码生成场景怎么用 Self-Consistency?
代码场景比数学更好做,因为有”单测 oracle”。标准实践:(1)SC 生成 40 份候选代码;(2)都跑同一份 unit tests;(3)选通过测试集且”最短 / AST 复杂度最低”的那份。行业里叫 Test-time Compute / Sample-And-Aggregate,在 HumanEval 榜单上,SC + 强模型几乎能逼近满分,这也是为什么模型越大代码能力越强的原因之一——能跑足够多样本。