提示集成与自一致性:让大模型投票更可靠

你写完一条 prompt,单次调用模型,得到的答案时好时坏;把温度调高,回答更灵动,却也更飘;把温度调到 0,输出稳定了,但难题反而更容易卡死。问题不在你的提示写得太差,而在于「单次生成」这件事本身就不稳定。本文讲两套把不确定性变可控的工程化方法:自一致性(Self-consistency)与提示集成(Prompt ensembling),并延伸到动态路由的 Mixture of Prompts。

为什么单条 prompt 不稳定

大模型生成文本时,并不是「查表」返回一个标准答案,而是每一步对词表上的概率分布做采样:

  • 模型先输出对数几率(logits),经 softmax 变成词表上的概率分布。
  • 贪心解码temperature=0 的近似)每步选概率最高的 token,结果是确定的,但容易在长推理链里「一条路走到黑」,且不同模型快照之间仍可能漂移。
  • 温度采样temperature>0)按概率分布随机取 token:温度越高,分布越平缓,输出越多样、越不可复现。即使 top_p 截断低概率尾词,单次抽样的随机性仍在。

也就是说,同一个 prompt 在同一模型上跑两次,可能因为一次偶然的采样分支而给出不同结论。对于事实问答、数学推理、分类这类「答案唯一」的任务,这种方差就是 bug。要消方差,思路不是把温度锁死,而是多次抽样后用统计把噪声平均掉——这正是下面两类的核心。

Self-consistency:多次采样 + 多数投票

自一致性由 Wang 等人于 2022 年提出(论文 Self-Consistency Improves Chain of Thought Reasoning in Language Models,arXiv:2203.11171,ICLR 2023)。它给链式思维(CoT)换掉贪心解码,流程只有三步:

  1. 同一个 prompt,设置 temperature>0,独立采样 N 条带推理过程的回答。
  2. 从每条回答里解析出最终答案(一个数字、一个选项、一句结论)。
  3. 对 N 个答案做多数投票,得票最多的作为最终结果。

直觉很朴素:一个难题往往有多条不同的正确推理路径,却只有一个正确答案;错误的路径彼此发散,正确的路径在答案上收敛。于是把多条路径的答案摊开投票,噪声就被稀释了。论文报告在多个推理基准上相对贪心 CoT 显著提升:GSM8K +17.9%、SVAMP +11.0%、AQuA +12.2%、StrategyQA +6.4%、ARC-challenge +3.9%。

关键注意点:

  • 采样数 N 通常取 5 到 20;N 越大方差越小,但成本线性上升。
  • 必须能从回答里稳定解析出「答案字段」,所以 prompt 要约定输出格式(例如最后一行写 答案:xxx)。
  • 投票结果本身就是置信度信号:某答案占比越高,你越该相信它。

Prompt ensembling:多角度 / 多模板提示集成

自一致性让「同一个 prompt」多跑几遍;提示集成则更进一步,让「不同的 prompt」各跑一遍再聚合。区别在于集成维度从「采样」换成了「提示设计」。

常见做法:

  • 模板集成:同一任务写多套 phrasing(例如「逐步推理」「扮演专家」「用表格列要点」),分别调用后汇总。
  • 演示集成(DENSE):Khalifa 等人(Exploring Demonstration Ensembling for In-context Learning,arXiv:2308.08780,ICLR 2023 Workshop)把少样本示例分成若干「桶」(bucket),每个桶单独跑一遍,再把各桶的输出概率加权合并;其加权最大化集成比直接拼接示例平均高出最多 2.4 个百分点。
  • 聚合策略:分类任务用多数投票;自由生成任务可让模型对多份草稿做自评审打分,挑最高分,或做去重后拼接。

提示集成适合「换一种说法模型就换一种表现」的场景。它比自一致性更贵(每条 prompt 至少一次调用),但能覆盖单模板照顾不到的角度盲区。

Mixture of Prompts / 动态路由

前两类默认「每条输入都跑全部候选」。当候选 prompt 很多时,全量集成的成本扛不住。Mixture of Prompts(MoPs,Dun 等人,arXiv:2310.02842)借鉴混合专家(MoE)的思路,引入一个**路由(gating)**机制:

  • 维护一组「专家提示」,各自擅长不同子任务或数据分布。
  • 路由模块看输入,动态挑出最相关的一两个提示组合,而不是全跑。
  • 论文中 smart gating 能按目标任务自动分配提示组合,在联邦场景下把困惑度相对基线降低约 20% 到 70%,集中式场景降低约 3% 到 30%。

落到工程上,动态路由有两种轻量实现:

  • 用模型当路由器:先让一个小模型或同一大模型对输入做意图分类,再选对应 prompt(省成本,但路由本身可能分错)。
  • 路由 + 兜底集成:先路由到 top-k 个提示,再对这 top-k 做小范围投票,兼顾成本与稳定。

它和自一致性、提示集成不是替代关系,而是「先选哪些 prompt、再怎么聚合」的上一层调度。

代码示例:自一致性投票与置信度估计

下面用 Python 演示自一致性的最小可用实现。示例同时给出 OpenAI 官方接口与国内兼容接口(以 DeepSeek 为例,OpenAI SDK 通过设置 base_url 即可复用)两种写法。

import os
import re
from collections import Counter
from openai import OpenAI

    # 解析回答末尾的「答案:xxx」字段,取不到时返回原始文本
def parse_answer(text):
    match = re.search(r"答案[::]\s*(.+)", text)
    return match.group(1).strip() if match else text.strip()

    # 自一致性核心:同一条 prompt 多次采样,投票出最终答案与置信度
def self_consistency_vote(client, model, prompt, n=8, temperature=0.7):
    answers = []
    for _ in range(n):
        resp = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=temperature,
            max_tokens=512,
        )
        answers.append(parse_answer(resp.choices[0].message.content))

        # 统计票数与最高占比,占比即作为置信度估计
        counts = Counter(answers)
    best, vote = counts.most_common(1)[0]
    confidence = vote / n
    return best, confidence, counts

    # 用法一:OpenAI 官方接口
client_oai = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
prompt = "请一步步推理,最后用「答案:」开头写出结论。一班 12 男 9 女,转走 4 男,还剩几人?"
best, conf, dist = self_consistency_vote(client_oai, "gpt-4o-mini", prompt)
print(f"OpenAI 结论={best} 置信度={conf:.2f} 分布={dict(dist)}")

    # 用法二:国内兼容接口(DeepSeek,接口与 OpenAI 一致,仅换 base_url)
client_cn = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com/v1",
)
best_cn, conf_cn, dist_cn = self_consistency_vote(client_cn, "deepseek-chat", prompt)
print(f"国内接口结论={best_cn} 置信度={conf_cn:.2f} 分布={dict(dist_cn)}")

要点说明:

  • temperature 必须高于 0,否则 N 次采样会得到完全相同的结果,投票失去意义。
  • parse_answer 依赖 prompt 约定了输出格式;生产环境建议加校验与失败兜底。
  • confidence 是多数票占比,可作为「低置信时转人工 / 重试」的触发条件,把稳定性变成可监控指标。

想把提示集成也接进来,只需把 prompt 换成一组模板循环调用,再对 best 做一次外层投票即可;动态路由则在这之前加一步意图分类来挑选模板子集。

小结

  • 单条 prompt 不稳定的根源是概率采样,温度越高方差越大,锁死温度又会牺牲推理质量。
  • 自一致性用「同 prompt 多次采样 + 多数投票」稀释噪声,答案占比天然给出置信度,最适合答案唯一的推理与分类任务。
  • 提示集成换成「多模板 / 多角度各跑一遍再聚合」,覆盖单模板的盲区,代价是调用次数更多。
  • Mixture of Prompts 用路由动态选提示,是在候选很多时控制成本的调度层,可与前两者组合。
  • 落地优先级:先上自一致性(改动最小、收益直接),再按需加提示集成,最后用动态路由压成本。

参考与延伸阅读

  • Wang, X., Wei, J., Schuurmans, D., 等. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171, ICLR 2023.(自一致性原论文,给出 GSM8K 等基准的多数投票提升)
  • Khalifa, M., Logeswaran, L., Lee, M., 等. Exploring Demonstration Ensembling for In-context Learning. arXiv:2308.08780, ICLR 2023 Workshop ME-FoMo.(DENSE 演示集成,桶化加权合并输出概率)
  • Dun, C., Garcia, M. H., Zheng, G., 等. Sweeping Heterogeneity with Smart MoPs: Mixture of Prompts for LLM Task Adaptation. arXiv:2310.02842.(Mixture of Prompts 与动态路由 gating)
  • Brown, T., Mann, B., Ryder, N., 等. Language Models are Few-Shot Learners. NeurIPS 2020.(少样本上下文学习的奠基工作,本文方法均建立在其之上)
本文累计阅读