超越零样本的推理增强
Prompt工程已从简单的指令编写进化为一门系统化的方法论。在需要复杂推理的任务中,恰当的推理增强技术可以将模型准确率提升30-50%。
思维链(Chain-of-Thought)
基本CoT
思维链的核心思想是让模型"展示推理过程"。通过在prompt中加入"让我们一步步思考"或提供推理示例:
Q: 一个商店有23个苹果,卖了17个后又进了8个,现在有多少苹果?
A: 让我们一步步思考。
初始数量:23
卖出17个后:23 - 17 = 6
又进了8个后:6 + 8 = 14
答案:14
CoT对数学推理、逻辑推理和多步规划任务效果显著。在GSM8K数学基准上,CoT将GPT-4的准确率从约75%提升到92%。
Zero-shot CoT
最简单的CoT只需在prompt末尾添加:
让我们一步步思考。
这五个字的魔力在于:它激活了模型在预训练阶段学到的"推理模式",使模型生成中间推理步骤而非直接跳到答案。
Few-shot CoT
提供2-4个带有推理过程的示例,效果更好但消耗更多token。关键是示例的推理过程要正确且简洁——过长的推理链反而会降低性能。
自一致性(Self-Consistency)
核心思想
CoT的一个问题是:同一条推理路径可能系统性偏向错误答案。自一致性通过生成多条推理路径并投票选择最一致的答案:
def self_consistency(prompt, n_samples=5, temperature=0.7):
responses = []
for _ in range(n_samples):
response = llm.generate(
prompt + "\n让我们一步步思考。",
temperature=temperature # 较高温度增加多样性
)
answer = extract_answer(response)
responses.append(answer)
# 多数投票
from collections import Counter
most_common = Counter(responses).most_common(1)[0]
return most_common[0]
在GSM8K上,自一致性将准确率从92%进一步提升到96%+。代价是推理成本增加5倍。
采样策略
- 温度:0.5-0.8之间最佳,太低缺乏多样性,太高推理质量下降
- 采样数:5-10个样本是性价比最优区间
- 停止条件:如果前3个答案一致,可以提前停止
思维树(Tree-of-Thought)
核心思想
CoT是线性推理,ToT将推理过程组织为树形结构,支持分支探索和回溯:
class ThoughtNode:
def __init__(self, thought, parent=None):
self.thought = thought
self.parent = parent
self.children = []
self.value = 0 评估值
self.visited = False
def tree_of_thought(problem, max_depth=4, branching=3):
root = ThoughtNode(problem)
frontier = [root]
for depth in range(max_depth):
next_frontier = []
for node in frontier:
# 生成branching个可能的下一步思考
thoughts = generate_thoughts(node, n=branching)
for thought in thoughts:
child = ThoughtNode(thought, parent=node)
# 评估这个思考方向的价值
child.value = evaluate_thought(thought, problem)
node.children.append(child)
next_frontier.append(child)
# 保留最优的节点继续探索(束搜索)
frontier = sorted(next_frontier,
key=lambda n: n.value, reverse=True)[:branching]
# 回溯最优路径
return trace_best_path(root)
适用场景
ToT在以下场景中明显优于CoT:
- 24点游戏:需要尝试多种运算组合
- 创意写作:需要探索不同情节方向
- 约束满足问题:需要在多约束下搜索解空间
对于简单的问答或单步推理,ToT的收益不显著且成本很高。
思维图(Graph-of-Thought)
GoT将推理结构进一步泛化为任意图结构,允许:
- 合并多条推理路径的结论
- 循环改进(对同一问题多次思考)
- 跨分支的信息共享
def graph_of_thought(problem):
graph = ReasoningGraph()
# 初始分解
subproblems = decompose(problem)
for sp in subproblems:
graph.add_node(sp)
# 并行推理
for node in graph.nodes:
if not node.solved:
solution = solve_subproblem(node)
node.solution = solution
# 合并解
final_solution = merge_solutions(graph)
return final_solution
推理时计算扩展
Best-of-N采样
生成N个回答,用一个奖励模型选择最好的:
def best_of_n(prompt, n=4, reward_model=None):
candidates = [llm.generate(prompt, temperature=0.8) for _ in range(n)]
if reward_model:
scores = [reward_model.score(prompt, c) for c in candidates]
return candidates[argmax(scores)]
return candidates[0] # 无奖励模型时取第一个
过程奖励模型(PRM)
与只评估最终结果的结果奖励模型不同,PRM评估推理过程中的每一步:
def prm_guided_search(prompt, max_steps=10):
current = prompt
for step in range(max_steps):
# 生成多个候选推理步骤
candidates = [generate_step(current) for _ in range(4)]
# PRM评估每一步
scores = [prm.score(current, c) for c in candidates]
# 选择最优步骤
best = candidates[argmax(scores)]
current += best
if is_complete(best):
break
return current
这种方法类似o1的推理机制,通过在推理过程中做搜索来提升质量。
实用Prompt模板
分析型任务模板
你是一位[角色]。请按以下步骤分析这个问题:
1. 问题理解:复述问题,明确已知条件和目标
2. 信息收集:列出解决这个问题需要的信息
3. 方案设计:提出2-3个可能的解决方案
4. 方案评估:从[维度1]、[维度2]、[维度3]评估每个方案
5. 最优选择:选择最佳方案并说明理由
6. 风险分析:列出可能的风险和缓解措施
问题:[具体问题]
调试型任务模板
以下代码有bug,请按以下步骤调试:
1. 理解意图:代码应该实现什么功能
2. 执行追踪:手动模拟执行过程
3. 错误定位:在哪个步骤出现了问题
4. 根因分析:为什么会产生这个错误
5. 修复方案:如何修复
6. 验证方案:如何确认修复正确
代码:
[代码内容]
错误信息:[如有]
结语
推理增强技术是Prompt工程中最具技术含量的部分。从CoT的线性推理到ToT的树搜索再到PRM引导的过程搜索,推理时计算扩展正在成为提升模型能力的新维度。这些技术的本质是用更多推理时间换取更高质量的输出——一种与训练时计算扩展互补的扩展维度。