详细解释
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)
几个关键设计点:
- K 取多少?:经验值 K=20 是甜点(40 条的边际收益会递减)。对准确率要求极高的安全关键场景可以 K=40。
- Temperature / Seed:Temperature 0.6 至 0.8 比较好(太低大家都走同一条路径,多样性不够;太高大家都胡扯,没意义)。搭配 Seed 每轮不同,或者不设 Seed。
- 答案归一化:“278”、“278 个”、“答案:278。“其实是一个答案,抽答案时先做 trim + 去标点再投票。代码场景可以用 AST 解析 +
black格式化再投票,效果更好。 - 置信度阈值兜底:如果票数最高的答案只拿到 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 + 强模型几乎能逼近满分,这也是为什么模型越大代码能力越强的原因之一——能跑足够多样本。