Self-Consistency
自洽性投票同一问题让模型答 N 次,取出现最多的答案。
详解
Self-Consistency(自洽性采样)是一种提升模型推理可靠性的解码策略:对同一个问题,用较高的 temperature 让模型生成多条独立的推理路径,再对最终答案做多数投票,选出出现频率最高的那个。它的核心思想是:任何一条推理路径都可能出错,但如果多条独立路径都指向同一个答案,这个答案大概率是对的;若票数高度分散,说明这道题本身很难,要谨慎对待输出。论文原始结果显示,在数学推理基准 GSM8K 上,标准 CoT 准确率 51.7%,加入 30 条路径的 Self-Consistency 后提升到 68%(+17.9%);SVAMP 数据集提升 11%,AQuA 提升 12.2%。工程上的参数建议:采样 5–10 条路径,temperature 设 0.5–0.8(太低路径雷同,太高太发散),最后对答案字段做计数统计即可,无需额外模型调用。Self-Consistency 只适合有明确可比较答案的任务(数学题、分类);对开放式写作无意义。
一个类比
就像陪审团裁决:一个陪审员的判断可能有偏差,但 12 个人独立思考后投票,少数服从多数的结论通常比任何一个人的单独判断更可靠。答案一致的比例越高,说明证据越充分;如果 12 人各有各的说法,这案子就需要更多证据。
举个例子
# Self-Consistency:同一问题采样 5 次,多数投票
from collections import Counter
import anthropic
client = anthropic.Anthropic()
question = "一列火车时速 60 公里,行驶 2.5 小时后再以时速 80 公里行驶 1.5 小时,全程多少公里?请一步一步计算,最后一行只写数字答案。"
answers = []
for i in range(5): # 采样 5 条独立推理路径
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=256,
temperature=0.7, # 适当随机性让路径多样化
messages=[{"role": "user", "content": question}]
)
# 提取最后一行作为最终答案
last_line = resp.content[0].text.strip().split("\n")[-1].strip()
answers.append(last_line)
print(f"路径 {i+1}: {last_line}")
# 多数投票
vote = Counter(answers)
best_answer, count = vote.most_common(1)[0]
print(f"\n投票结果:{best_answer}({count}/5 票)")PYTHON 示例
相关概念
- → CoT (Chain-of-Thought)· 思维链
- → Temperature / Top-p / Top-k· 采样参数