2.6 思维链的数学基础与理论解释
2.6.1 为什么思维链有效?——理论视角
思维链的有效性可以从多个理论角度解释:
计算复杂性视角
从计算复杂性理论来看,某些问题在固定计算深度下无法解决。思维链实际上将线性深度的计算"展开"到序列中,使得模型能够模拟更深的计算图。
传统前向传播:
输入 → [固定L层] → 输出
计算深度 = L
思维链:
输入 → [L层] → token1 → [L层] → token2 → ... → 输出
有效计算深度 = L × 序列长度
贝叶斯推理视角
可以将思维链视为一种近似贝叶斯推理。每一步推理都更新模型对最终答案的"信念"。
P(答案|问题) = ∫ P(答案|推理路径) × P(推理路径|问题) d推理路径
思维链显式地采样并评估了这些推理路径。
注意力机制视角
在Transformer中,后生成的token可以attend到之前生成的所有token。这意味着后续的推理步骤可以"看到"并利用之前的推理结果。
步骤1的输出:[计算中间值A]
步骤2的输出:[使用A计算B] ← 可以attend到步骤1
步骤3的输出:[使用B计算C] ← 可以attend到步骤1和2
...
2.6.2 思维链的局限性理论
不可判定性问题
某些问题本质上是不可计算的(如图灵停机问题)。思维链无法突破这一理论限制。
上下文窗口限制
对于需要O(n)或更多步骤的问题,思维链可能超出上下文窗口。这是一个实际问题,而非理论限制。
错误累积
思维链的每一步都有可能出错。对于需要n步的推理,假设每步正确率为p,则整体正确率为p^n。
例如:如果每步正确率p = 0.95,需要10步
整体正确率 = 0.95^10 ≈ 0.60(仅60%)
2.6.3 最优思维链长度
研究者发现,思维链的长度存在最优点:
- 过短:推理不充分,容易出错
- 过长:增加出错机会,消耗更多tokens
- 最优:足够覆盖关键推理步骤,但不冗余
经验法则
最优长度 ≈ log(问题复杂度) × 关键步骤数
示例
问题:23 × 47 = ?
过短的CoT:
23 × 47 = 1081(直接给出,可能出错)
适中的CoT:
23 × 47
= 23 × 40 + 23 × 7
= 920 + 161
= 1081(正确)
过长的CoT:
让我详细分析这个乘法问题。
首先,23是一个质数...
47也是一个质数...
让我使用分配律...
(冗余信息增加出错概率)
2.6.4 思维链与涌现能力
思维链是大型语言模型**涌现能力(Emergent Abilities)**的典型例子。研究发现,思维链的效果在模型规模超过一定阈值后才显著提升。
规模效应曲线
准确率
│
100%├─────────────────────●●●●
│ ●●●
80%├ ●●
│ ●
60%├ ●
│ ●
40%├ ●
│ ●
20%├ ●
│●
0├──┬──┬──┬──┬──┬──┬──┬──
1B 10B 30B 70B 175B 540B
模型参数量
这一发现被称为"相变"现象:模型在某规模之前几乎无效,之后突然变得有效。
为什么需要大规模?
- 知识广度:大规模模型见过更多推理模式
- 模式匹配:能更好地识别问题类型并选择合适的推理策略
- 指令遵循:更可靠地遵循"一步步思考"的指令
- 错误修正:有更多能力在推理中自我修正
本章小结
思维链(Chain-of-Thought)是提示工程领域最重要的发现之一。它通过要求模型展示推理过程,显著提升了复杂推理任务的性能。
关键要点:
-
核心原理:思维链让模型从"直觉回答"转向"逐步推理",激活了更深层的计算能力。
-
主要变体:
- 零样本CoT:简单添加"让我们一步步思考"
- 少样本CoT:提供推理示例
- 自洽性CoT:多数投票提高准确率
-
适用场景:数学推理、常识推理、符号推理、复杂决策
-
局限性:知识缺口、精确记忆、纯计算、过度推理
-
高级技术:Least-to-Most、Decomposed、Plan-and-Solve等变体进一步扩展了CoT的能力
在下一章,我们将探索更高级的推理技术,包括思维树、思维图和自我反思等方法,这些方法建立在思维链的基础上,但采用了更复杂的推理架构。
参考文献:
- Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903
- Wang, X., et al. (2022). Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171
- Kojima, T., et al. (2022). Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916
- Zhou, D., et al. (2022). Least-to-Most Prompting Enables Complex Reasoning in Large Language Models. arXiv:2205.10625
- Diao, S., et al. (2023). Active Prompting with Chain-of-Thought for Large Language Models. arXiv:2302.12246

第三章:高级推理技术
3.1 思维树(Tree of Thoughts)
3.1.1 思维树的诞生背景
思维链(Chain-of-Thought)通过让模型逐步推理显著提升了复杂问题的解决能力。然而,思维链存在一个根本性局限:它是线性的。当面对需要探索多个可能性、回溯和比较的场景时,线性的推理路径往往会导致模型过早承诺于某个次优解。
思维树(Tree of Thoughts, ToT)正是为了解决这一局限而诞生。由Yao等人于2023年提出,ToT将问题求解过程建模为一棵搜索树,其中每个节点代表一个"思维状态"(thought state),每个分支代表一个可能的推理步骤。通过系统性地探索、评估和回溯,ToT能够在解空间中进行更有效的搜索。
3.1.2 思维树的核心架构
思维树的框架包含四个关键组件:
1. 思维分解(Thought Decomposition)
将复杂问题分解为中间思维步骤。每个思维应该是一个足够小的单元,既能被独立评估,又能与其他思维组合形成完整的解决方案。
问题:规划一次为期7天的日本旅行 思维分解示例: - 思维1:确定旅行主题(文化探索/美食之旅/自然风光) - 思维2:选择主要城市(东京/京都/大阪/北海道) - 思维3:安排交通方式(JR Pass/国内航班) - 思维4:预订住宿类型(酒店/民宿/胶囊旅馆) - 思维5:列出必看景点 - 思维6:预算分配2. 思维生成器(Thought Generator)
给定当前树状态,生成候选的下一个思维。生成策略可以分为两类:
# 采样策略示例 prompt = f""" 当前状态:{current_state} 问题:{problem} 请生成{k}个不同的下一步思维。 """ # 提议策略示例 prompt = f""" 当前状态:{current_state} 问题:{problem} 请提出{k}个可能的下一步思维,编号1-{k}。 每个思维应该是: - 具体的、可执行的 - 与之前思维不同的 - 有助于解决问题的 """3. 状态评估器(State Evaluator)
评估当前思维状态的价值,判断其是否有希望通向正确解。评估方法包括:
评估维度示例(1-10分): - 可行性:这个思维在现实中是否可行? - 连贯性:与之前思维的一致性如何? - 进展性:是否向目标迈进? - 创造性:是否提供了新的视角? 评估提示模板: "评估以下思维状态解决问题的前景: [思维状态] 从1-10评分,10分表示非常有望解决问题。 输出格式:分数:X,理由:..."4. 搜索算法(Search Algorithm)
在思维树上进行搜索的核心算法。两种主要策略:
广度优先搜索(BFS):
def tot_bfs(initial_state, problem, steps, breadth): states = [initial_state] for step in range(steps): new_states = [] for state in states: # 生成候选思维 thoughts = generate_thoughts(state, problem, breadth) # 评估每个思维 for thought in thoughts: new_state = state + [thought] score = evaluate_state(new_state, problem) new_states.append((new_state, score)) # 保留得分最高的b个状态 new_states.sort(key=lambda x: x[1], reverse=True) states = [s[0] for s in new_states[:breadth]] return states[0] # 返回最佳路径深度优先搜索(DFS):
def tot_dfs(state, problem, max_depth, threshold): if len(state) >= max_depth: return evaluate_solution(state, problem) thoughts = generate_thoughts(state, problem, k=5) for thought in sorted(thoughts, key=lambda t: evaluate(state + [t]), reverse=True): new_state = state + [thought] score = evaluate_state(new_state, problem) if score >= threshold: # 有希望则继续深入 result = tot_dfs(new_state, problem, max_depth, threshold) if result is not None: return result # 否则回溯,尝试下一个思维 return None # 当前路径无解3.1.3 思维树实战:24点游戏
24点游戏是展示思维树威力的经典案例。给定4个数字,使用加减乘除运算得到24。
问题:使用数字 [4, 5, 6, 10] 得到 24 思维树搜索过程: 根节点:[4, 5, 6, 10] 分支1(选择两个数运算): ├── 4+5=9 → [9, 6, 10] │ ├── 9+6=15 → [15, 10] → 15+10=25 ✗ │ ├── 9*6=54 → [54, 10] → 54-10=44 ✗ │ └── 9-6=3 → [3, 10] → 无法得到24 ├── 6*4=24 → [24, 5, 10] │ ├── 24+5=29 → [29, 10] ✗ │ └── 24-10=14 → [14, 5] ✗ ├── 10-4=6 → [6, 5, 6] │ ├── 6*5=30 → [30, 6] → 30-6=24 ✓ │ └── ... └── 10-6=4 → [4, 4, 5] └── 4*5=20 → [20, 4] → 20+4=24 ✓ 找到两个解: 1. (10-6)*5+4 = 24 2. (10-4)*5-6 = 243.1.4 思维树提示模板
以下是一个通用的思维树提示模板:
# 思维树推理框架 你是一个使用思维树方法的问题求解专家。 ## 问题 {problem} ## 当前状态 {current_state} ## 可用数字/资源 {available_resources} ## 任务 1. 生成3个不同的下一步思维 2. 每个思维评估其前景(1-10分) 3. 选择最有希望的思维继续 ## 输出格式 ### 思维1 - 操作:[具体操作] - 理由:[为什么这个操作有意义] - 前景评分:X/10 ### 思维2 ... ### 思维3 ... ### 最优选择 选择思维X,理由:...3.1.5 思维树的适用场景与局限
适用场景:
局限性:
3.2 思维图(Graph of Thoughts)
3.2.1 从树到图:推理的更一般形式
思维树假设思维之间是严格的层级关系——每个思维只有一个父节点。然而,真实的推理过程往往更加复杂:思维之间可能存在依赖、组合、反馈等非线性关系。
思维图(Graph of Thoughts, GoT)将推理过程建模为一个有向图,其中:
3.2.2 思维图的核心操作
GoT定义了一组基本图操作:
1. 分支(Branching)
从一个思维生成多个后继思维 A /|\ B C D2. 聚合(Aggregation)
将多个思维合并为一个综合思维 B C D \ | / \ | / E聚合是GoT相比ToT的关键优势,允许将不同推理路径的结果整合。
3. 改进(Refinement)
在现有思维基础上迭代改进 A → A' → A'' → A'''4. 回溯(Backtracking)
放弃当前路径,返回之前的思维状态 A → B → C ✗ ↓ 返回A → D → E ✓5. 循环(Looping)
思维之间形成反馈循环,持续改进 ┌──────┐ ↓ │ A → B → C ─┘3.2.3 思维图提示实现
class GraphOfThoughts: def __init__(self, problem): self.problem = problem self.graph = {} # adjacency list self.thoughts = {} # id -> thought content self.scores = {} # id -> evaluation score def add_thought(self, thought, parents=None): """添加新思维节点""" thought_id = generate_id() self.thoughts[thought_id] = thought self.graph[thought_id] = [] if parents: for parent in parents: self.graph[parent].append(thought_id) return thought_id def aggregate(self, thought_ids): """聚合多个思维""" combined_context = "\n".join([ self.thoughts[tid] for tid in thought_ids ]) aggregation_prompt = f""" 综合以下多个推理路径的结果: {combined_context} 请整合这些思路,形成一个统一、连贯的综合结论。 保留各路径的优点,消除矛盾。 """ aggregated = llm_generate(aggregation_prompt) return self.add_thought(aggregated, parents=thought_ids) def refine(self, thought_id, feedback=None): """改进现有思维""" thought = self.thoughts[thought_id] refinement_prompt = f""" 当前思维:{thought} {f"反馈意见:{feedback}" if feedback else ""} 请改进这个思维,使其更加: - 准确 - 完整 - 有见地 """ improved = llm_generate(refinement_prompt) new_id = self.add_thought(improved, parents=[thought_id]) return new_id3.2.4 思维图实战案例:文档写作
写作任务天然适合思维图建模,因为不同章节可以并行发展,最后聚合为完整文档。
写作任务:撰写一篇关于AI伦理的文章 思维图结构: [主题确定:AI伦理] | ┌────────────────┼────────────────┐ ↓ ↓ ↓ [隐私问题] [偏见与公平] [责任归属] | | | [数据收集] [训练数据偏见] [AI决策透明度] [数据使用] [算法公平性] [人类监督] | | | └────────────────┼────────────────┘ ↓ [章节聚合] | [综合讨论] | [结论与建议] 关键操作: 1. 三个主题并行探索(分支) 2. 各主题下深入展开(改进链) 3. 整合为完整文章(聚合)3.2.5 思维图与思维树的对比