Skip to content

第 9 章 · Zero-shot 与 Few-shot

本章目标:理解 Self-Consistency 多采样投票机制的原理与实现,掌握生成知识提示技术,并了解如何在成本与准确性之间做出权衡。

9.1 Self-Consistency:多路径推理的投票机制

Self-Consistency 是一种简单但强大的后处理技术。核心思想是:不依赖单一的贪婪解码(greedy decoding),而是采样多条推理路径,然后投票选出最一致的答案。

传统方法只取概率最高的单个答案:

Prompt: "2 + 3 × 4 = ?"
模型输出: "14"  ← 错误,因为先加了后乘了

Self-Consistency 方法采样多个答案并投票:

采样 5 次得到: ["14", "14", "14", "14", "14"]  → 投票结果: "14"(多数派)
采样 5 次得到: ["5", "14", "14", "5", "14"]   → 投票结果: "14"(3 vs 2)
采样 5 次得到: ["5", "5", "5", "5", "14"]     → 投票结果: "5"(多数派,正确答案)

9.2 实现 Self-Consistency

python
import random

def self_consistency(prompt, model, n_samples=10, temperature=0.7):
    """
    Self-Consistency 实现
    
    Args:
        prompt: 输入提示
        model: LLM 模型接口
        n_samples: 采样次数(越多越准确但成本越高)
        temperature: 采样温度,控制多样性
    """
    answers = []
    
    for _ in range(n_samples):
        # 使用 CoT 生成推理链
        cot_prompt = f"{prompt}\nLet's think step by step."
        response = model.generate(cot_prompt, temperature=temperature)
        
        # 提取最终答案(假设答案在最后)
        answer = extract_answer(response)
        answers.append(answer)
    
    # 投票选择最常见答案
    from collections import Counter
    most_common = Counter(answers).most_common(1)[0][0]
    
    return {
        'answer': most_common,
        'votes': dict(Counter(answers)),
        'confidence': Counter(answers).most_common(1)[0][1] / n_samples
    }

# 使用示例
result = self_consistency(
    prompt="小明有5个苹果,吃了2个,又买了3个,现在有几个?",
    model=gpt_4,
    n_samples=10
)
print(f"答案: {result['answer']}, 置信度: {result['confidence']:.2%}")

9.3 生成知识提示(Generated Knowledge Prompting)

生成知识提示通过让模型先生成相关知识,再基于知识回答问题,从而减少幻觉、提高准确性。

工作流程

原始问题 → 知识生成 → 知识+问题 → 最终答案

示例实现

python
def generated_knowledge_prompt(question, model):
    """
    生成知识提示:先生成相关知识,再回答
    """
    # 第一步:生成相关知识
    knowledge_prompt = f"""Generate relevant knowledge for answering the question:
Question: {question}
Knowledge:
"""
    generated_knowledge = model.complete(knowledge_prompt)
    
    # 第二步:基于生成知识回答问题
    answer_prompt = f"""Based on the following knowledge, answer the question:

Knowledge:
{generated_knowledge}

Question: {question}
Answer:
"""
    final_answer = model.complete(answer_prompt)
    
    return {
        'question': question,
        'generated_knowledge': generated_knowledge,
        'final_answer': final_answer
    }

使用场景

  • 事实性问答:生成背景知识可减少模型幻觉
  • 复杂推理:分解问题为知识+推理两步
  • 专业领域:先生成领域知识再应用

9.4 成本与准确性权衡

Self-Consistency 和生成知识提示都会增加计算成本,需要权衡:

方法额外成本准确性提升适用场景
单次 CoT+10-20%简单推理
Self-Consistency (n=5)×5+15-30%高精度需求
Self-Consistency (n=10)×10+20-40%关键决策
生成知识提示×2+10-25%事实性问答

优化策略

python
def adaptive_consistency(question, model, max_samples=10):
    """
    自适应 Self-Consistency:根据置信度动态决定采样次数
    """
    answers = []
    
    for i in range(1, max_samples + 1):
        response = model.generate(f"{question}\nLet's think step by step.")
        answers.append(extract_answer(response))
        
        # 检查是否达到共识
        if i >= 5:  # 最少采样 5 次
            vote_counts = Counter(answers)
            top_answer, top_count = vote_counts.most_common(1)[0]
            
            # 如果某个答案超过 80% 占比,提前停止
            if top_count / i >= 0.8:
                print(f"达到共识,采样 {i} 次后停止")
                return top_answer, i
    
    # 返回最终投票结果
    return Counter(answers).most_common(1)[0][0], max_samples

9.5 实践建议

  1. Start Simple:先用单次 CoT,效果好再考虑 Self-Consistency
  2. Tune n_samples:从 5 开始,根据效果调整到 10-20
  3. Use Temperature:设置 temperature=0.7-0.9 增加采样多样性
  4. Extract Carefully:答案提取要可靠,避免解析错误
  5. Monitor Cost:记录每次调用的 token 消耗和延迟

本章小结

  • Self-Consistency:多采样投票机制,提升复杂推理准确性
  • 生成知识提示:先生成知识再回答问题,减少幻觉
  • 成本权衡:n_samples 越大越准确但成本越高,可用自适应策略优化
  • 实践要点:从简单开始、调参温度、小心提取答案

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. Self-Consistency 的核心思想是什么?

2. 生成知识提示的第一步是什么?

3. 自适应 Self-Consistency 的提前停止条件通常是什么?

4. Self-Consistency 最适合哪种场景?

🛠️ 动手实践

  1. 实现 Self-Consistency 函数,对比 n=1, 5, 10 时同一问题的准确率差异。
  2. 设计一个生成知识提示的应用,比较"直接回答"vs"生成知识后回答"在事实性问答上的表现。
  3. 实现自适应 Self-Consistency,当置信度达到 80% 时提前停止采样,分析节省的成本比例。

下一章:思维链 Chain-of-Thought