AI Prompt Engineering · 课时

自洽性采样

对多条推理路径进行投票。

第 2 / 4 课13 个步骤

自洽性采样 是 CoddyKit 上的免费 AI Prompt Engineering 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Prompt Engineering 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Prompt Engineering 课程共包含 4 节课。

一条推理链很脆弱

单条思维链可能很早就走错方向,并且再也无法恢复。自洽性(Wang 等人,2022)通过采样许多彼此独立的推理路径并汇总其最终答案来解决这一问题,通常采用多数投票。

其直觉是:正确的推理会通过不同路径汇聚到同一个答案,而错误会分散开来。汇总会放大一致的信号。

def self_consistency(prompt, n=20, temperature=0.7):
    answers = []
    for _ in range(n):
        chain = llm(prompt, temperature=temperature)
        answers.append(extract_answer(chain))
    return majority_vote(answers)

对路径进行边缘化为何有效

自洽性近似于对推理路径进行边缘化:不再信任单条潜在推导,而是估计综合许多推导后最有可能的最终 answer。

这是对 answer 分布的蒙特卡洛估计。该分布的众数通常比任何单条采样路径都更可靠,尤其是在答案空间较小且离散时。

from collections import Counter

def majority_vote(answers):
    norm = [normalize_answer(a) for a in answers]
    counts = Counter(norm)
    answer, votes = counts.most_common(1)[0]
    confidence = votes / len(norm)
    return answer, confidence

通过温度提高多样性

自洽性需要多样的路径。贪心策略或接近零的温度会产生几乎相同的推理链,使该方法失去作用。请使用适中的温度(通常为 0.5 到 0.8),并可以采用 top-p 采样来分散路径。

温度过高会降低每条推理链的质量;应调整温度以最大化集成准确率,而不是单条推理链的质量。

def tune_temperature(prompt, val_set, temps=(0.4, 0.6, 0.8, 1.0)):
    best = max(
        temps,
        key=lambda t: ensemble_accuracy(prompt, val_set, temp=t, n=20)
    )
    return best

答案规范化至关重要

只有在能够识别出等价答案时,投票才有意义。计数前请进行规范化:去除单位,将数字转换为规范形式,将文本转换为小写,解析分数和百分比,并应用任务特定的等价规则。

糟糕的规范化会把真正的多数分散到不同的表面形式中,使少数答案赢得投票。

def normalize_answer(a):
    a = a.strip().lower().rstrip('.')
    a = a.replace(',', '').replace('$', '').replace('%', '')
    try:
        return str(round(float(a), 6))   # numeric canonical form
    except ValueError:
        return a

需要多少个样本

准确率会随着样本数量 n 的增加而提高,但会出现边际收益递减,具体通常取决于任务难度,并在 10 到 40 个样本左右趋于平稳。每个样本都会使成本和延迟按线性比例增加。

请在验证集上遍历不同的 n 值,并选择曲线的拐点,即新增样本带来的收益已不足以抵消其成本的位置。

def sweep_n(prompt, val, ns=(1,3,5,10,20,40)):
    return {n: ensemble_accuracy(prompt, val, n=n) for n in ns}
# Choose n at the accuracy/cost knee, not the maximum

自适应提前停止

通过自适应采样节省计算资源:一旦投票结果已经明确,就停止继续生成路径。如果在采样 5 条路径后某个 answer 已经明显领先,继续采样不太可能改变获胜者。

这样可以将计算资源集中在真正困难且存在争议的题目上,并以较低成本回答简单题目。

def adaptive_sc(prompt, max_n=40, margin=0.6, min_n=5):
    answers = []
    for i in range(max_n):
        answers.append(extract_answer(llm(prompt, temperature=0.7)))
        if i + 1 >= min_n:
            ans, conf = majority_vote(answers)
            if conf >= margin:
                return ans, conf, i + 1
    return majority_vote(answers)

加权与验证器辅助投票

普通多数投票平等对待所有路径。您可以根据模型为路径分配的似然、经过训练的验证器得分,或对每条推理链有效性的自我评估来加权投票。

验证器加权的自洽性通常优于不加权投票,因为它会降低那些自信但错误且频繁出现的失败模式的排名。

def weighted_vote(chains):
    scores = {}
    for c in chains:
        a = normalize_answer(extract_answer(c))
        scores[a] = scores.get(a, 0.0) + verifier_score(c)
    return max(scores, key=scores.get)

从一致性中获得置信度

投票差距是一个有用的置信度信号。全票一致的 answer 远比 6 比 5 的结果可信。请将此信号提供给下游逻辑:将一致性较低的题目 route 至升级处理、人工审核或更强的模型。

这样一来,自洽性既能提升准确率,也能充当校准机制。

def route(prompt):
    ans, conf = adaptive_sc(prompt)[:2]
    if conf < 0.5:
        return escalate_to_stronger_model(prompt)
    return ans

局限:连续任务与开放式任务

多数投票假定存在一个离散且可比较的 answer 空间。它无法直接应用于自由形式生成、长文本或连续输出,因为这些情况下没有两个完全相同的样本。

对于此类任务,应采用不同的汇总方式:将语义相似的输出聚类,对提取出的结构化字段进行投票,或使用评判模型选择最佳样本,而不是统计完全匹配的数量。

def semantic_consistency(samples):
    clusters = cluster_by_embedding(samples)
    biggest = max(clusters, key=len)        # largest agreement cluster
    return representative(biggest)            # medoid of the cluster

考虑成本的部署

自洽性是成本最高的提示技术之一:成本会随着 n 增加而增加。请将其保留给高风险或困难题目,结合自适应停止,并考虑采用分层策略,让单条推理链处理简单请求。

始终将其每美元带来的准确率提升与调用一次更强模型进行比较;后者可能以更低成本获得相同的提升。

def tiered(prompt, q):
    if easy(q):
        return extract_answer(llm(prompt, temperature=0))
    return adaptive_sc(prompt, max_n=20)[0]   # SC only when needed

端到端的自洽性

完整流程如下:调整温度和 n,采样多样的推理链,严格规范化 answer,可选择使用验证器加权进行投票,将投票差距用作置信度,在结果明确时提前停止,并升级处理一致性较低的题目。

最终得到的推理系统比任何单条推理链都更准确,并且能够自我校准。

def solve(prompt):
    chains = sample_until_decisive(prompt, max_n=20, temp=0.7)
    ans, conf = weighted_majority(chains)
    if conf < THRESH:
        return escalate(prompt)
    return {'answer': ans, 'confidence': conf, 'paths': len(chains)}

快速检查

诊断一个表现不佳的自洽性设置。

回顾

关键要点:

  • 自洽性会采样许多具有多样性的推理链并进行投票,从而近似对推理路径进行边缘化。
  • 多样性(适中的温度)和严格的答案规范化是该方法奏效的前提。
  • 准确率会随着 n 增加而提高,但最终趋于平稳;请使用自适应提前停止来控制成本。
  • 使用验证器对投票进行加权,并将投票差距作为经过校准的置信度信号。
  • 该方法需要离散的 answer 空间;对于开放式任务,应按语义聚类或使用评判模型。
免费开始

用 AI 导师学习 AI Prompt Engineering — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
53
课程
199

常见问题解答

「自洽性采样」课时是免费的吗?

是的 — 「自洽性采样」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Prompt Engineering 课程的其余内容,请升级到 CoddyKit PRO。 AI Prompt Engineering 课程共包含 4 节课。

「自洽性采样」这节课中我会学到什么?

对多条推理路径进行投票。 你通过在浏览器中直接运行的动手代码来练习 AI Prompt Engineering,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AI Prompt Engineering 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AI Prompt Engineering 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「自洽性采样」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AI Prompt Engineering 课中编写并运行代码吗?

能。每节 AI Prompt Engineering 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 思维链提示
  2. 自洽性采样
  3. 思维树探索
  4. 推理提示何时有帮助
← 返回 AI Prompt Engineering