
自我一致性Self-Consistency技巧
引言 大语言模型在推理任务上的一个痛点是:同一个问题,稍微不同的提问方式或不同的推理路径可能得到不同答案,而且模型本身无法判断哪个答案更可靠。Self-Consistency(自我一致性)技巧通过生成多条推理路径并投票选择最一致的答案,有效解决了这一问题。本文详细介绍该技巧的原理、实现和优化策略。 核心原理 从集成学习借鉴的思想 Self-Consistency的思想来自机器学习中的集成方法:多个独立"专家"的投票结果通常比单个专家的判断更可靠。在CoT场景中,通过使用较高的温度参数生成多条不同的推理链,每条链代表一个独立的"推理专家",然后对最终答案进行投票。 为什么有效 Self-Consistency有效的前提是:正确答案在多条推理路径中出现的频率高于任何单一错误答案。这是因为正确的推理路径更有可能收敛到同一答案,而错误路径往往各不相同(随机错误的多样性)。因此,投票自然地过滤掉了偶发错误。 数学上,假设正确答案的概率为p,共有N条推理链。如果各链独立,则正确答案获得最多票数的概率随N增大而趋近于1。即使推理链之间不完全独立,Self-Consistency仍能显著提升准确率。 基础实现 标准流程 from collections import Counter def self_consistency(model, prompt, n_samples=5, temperature=0.7): """ Self-Consistency推理 Args: model: 语言模型接口 prompt: 包含CoT触发词的prompt n_samples: 采样数量 temperature: 温度参数(建议0.5-1.0) Returns: 最一致的答案及其置信度 """ answers = [] reasoning_chains = [] for i in range(n_samples): response = model.generate( prompt + "\n\nLet's think step by step.", temperature=temperature, top_p=0.95 ) answer = extract_final_answer(response) answers.append(answer) reasoning_chains.append(response) # 投票 counter = Counter(answers) best_answer, count = counter.most_common(1)[0] confidence = count / n_samples return { "answer": best_answer, "confidence": confidence, "all_answers": answers, "reasoning_chains": reasoning_chains } def extract_final_answer(response): """从推理链中提取最终答案""" # 方法1:正则匹配 import re match = re.search(r'(?:答案|Answer|answer)[::\s]*(.+?)(?:\n|$)', response) if match: return match.group(1).strip() # 方法2:取最后一行 lines = [l.strip() for l in response.strip().split('\n') if l.strip()] return lines[-1] if lines else response 参数选择 采样数量N:N越大效果越好但成本越高。研究表明,N=5-10在大多数任务上已能获得显著提升,N=20-40在高难度任务上仍有边际收益。建议从N=5开始,根据任务难度和预算调整。 ...