第 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_samples9.5 实践建议
- Start Simple:先用单次 CoT,效果好再考虑 Self-Consistency
- Tune n_samples:从 5 开始,根据效果调整到 10-20
- Use Temperature:设置 temperature=0.7-0.9 增加采样多样性
- Extract Carefully:答案提取要可靠,避免解析错误
- Monitor Cost:记录每次调用的 token 消耗和延迟
本章小结
- Self-Consistency:多采样投票机制,提升复杂推理准确性
- 生成知识提示:先生成知识再回答问题,减少幻觉
- 成本权衡:n_samples 越大越准确但成本越高,可用自适应策略优化
- 实践要点:从简单开始、调参温度、小心提取答案
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. Self-Consistency 的核心思想是什么?
2. 生成知识提示的第一步是什么?
3. 自适应 Self-Consistency 的提前停止条件通常是什么?
4. Self-Consistency 最适合哪种场景?
🛠️ 动手实践
- 实现 Self-Consistency 函数,对比 n=1, 5, 10 时同一问题的准确率差异。
- 设计一个生成知识提示的应用,比较"直接回答"vs"生成知识后回答"在事实性问答上的表现。
- 实现自适应 Self-Consistency,当置信度达到 80% 时提前停止采样,分析节省的成本比例。