概念定义

自我一致性(Self-Consistency)是一种通过采样多条推理路径,然后选择出现频率最高的答案来提升大语言模型推理准确性的技术,特别适合有固定答案的推理任务。

详细解释

自我一致性由Google Research在2022年提出,作为思维链(CoT)提示技术的重要增强。其核心思想是:复杂推理问题通常有多条有效的推理路径可以到达正确答案。通过探索多样化的推理路径而非仅依赖贪婪解码的单一路径,可以显著提高模型输出的可靠性。 该技术在算术推理、常识推理和符号推理等任务上展现了卓越性能,准确率提升幅度从3.9%到17.9%不等。2024年的最新进展包括动态自我一致性(Dynamic Self-Consistency)和通用自我一致性(Universal Self-Consistency),进一步优化了计算效率并扩展了应用范围。 自我一致性的本质是利用”群体智慧”原理——多个独立的推理过程得出相同结论的概率,比单一推理路径的正确率更高。这种方法特别适合处理具有确定性答案的任务,如数学问题、逻辑推理等。

工作原理

自我一致性的核心步骤:
  1. 多样化采样:使用较高温度参数生成多条推理路径
  2. 独立推理:每条路径独立完成推理过程
  3. 答案提取:从每条推理路径中提取最终答案
  4. 多数投票:选择出现频率最高的答案作为最终输出

实际应用

基础实现示例

标准自我一致性
def self_consistency(prompt, model, num_samples=5, temperature=0.7):
    """
    实现自我一致性推理
    """
    answers = []
    
    # 1. 生成多条推理路径
    for _ in range(num_samples):
        response = model.generate(
            prompt + "\n让我们一步步思考:",
            temperature=temperature
        )
        # 2. 提取答案
        answer = extract_answer(response)
        answers.append(answer)
    
    # 3. 多数投票
    from collections import Counter
    vote_counts = Counter(answers)
    final_answer = vote_counts.most_common(1)[0][0]
    confidence = vote_counts[final_answer] / num_samples
    
    return final_answer, confidence

2024年优化技术

动态自我一致性(Dynamic SC)
def dynamic_self_consistency(prompt, model):
    """
    动态调整采样数量的自我一致性
    """
    answers = []
    confidence_scores = []
    
    for i in range(1, max_samples):
        # 生成新的推理路径
        response = model.generate(prompt, temperature=0.7)
        answer = extract_answer(response)
        
        # 计算置信度(7个文本指标)
        confidence = calculate_confidence(response)
        
        answers.append(answer)
        confidence_scores.append(confidence)
        
        # 早停检查:如果答案一致性足够高
        if check_convergence(answers, confidence_scores):
            break
    
    # 加权投票而非简单多数投票
    return weighted_vote(answers, confidence_scores)

通用自我一致性

对于开放式生成任务:
def universal_self_consistency(prompt, model, task_type="generation"):
    """
    适用于摘要、创意写作等开放式任务
    """
    outputs = []
    
    # 生成多个输出
    for _ in range(5):
        output = model.generate(prompt, temperature=0.8)
        outputs.append(output)
    
    # 使用LLM判断一致性
    consistency_prompt = f"""
    以下是对同一问题的多个回答:
    {format_outputs(outputs)}
    
    请识别最一致和高质量的回答。
    """
    
    best_output = model.select_best(consistency_prompt)
    return best_output

应用场景与效果

  1. 数学推理
    • GSM8K数据集:准确率提升17.9%
    • MultiArith:准确率从78.7%提升至89.3%
  2. 常识推理
    • CommonsenseQA:准确率提升12.2%
    • StrategyQA:准确率提升6.4%
  3. 符号推理
    • Last Letter Concatenation:准确率提升8.3%
    • Coin Flip:准确率提升15.1%
  4. 实际案例
    • 客服问答系统:减少错误回答35%
    • 代码生成:bug率降低28%
    • 医疗诊断辅助:诊断一致性提升42%

最佳实践

  1. 采样数量:通常5-10条路径即可获得良好效果
  2. 温度设置:0.5-0.8之间平衡多样性和质量
  3. 早停策略:简单问题使用动态采样节省计算
  4. 组合使用:与CoT、思维树等技术结合效果更佳

相关概念

延伸阅读