原始的Chain-of-Thought(CoT)是线性的单路径推理,但复杂问题往往需要探索多种可能性,因此研究者们提出了多种CoT的扩展方法,包括Tree of Thoughts、Graph of Thoughts、Program-of-Thought等,进一步提升大模型解决复杂问题的能力。
原始CoT是线性单路径推理,只有一条解决问题的路径。但很多复杂问题存在多种可能的解题路径,需要搜索、回溯和选择,单路径无法应对这种情况。
ToT将问题求解建模为在树上的搜索过程,每个节点表示一个中间思维状态(部分解决方案),模型可以启发式地探索不同的思维路径,做出更明智的决策。
Game of 24:给定4个数字,通过加减乘除得到24。
4 9 10 1313 - 9 = 4,剩余4 4 1010 - 4 = 6,剩余4 64 * 6 = 24,完成例如归并排序:先分解子数组分别排序,再合并结果,这就是图结构而非树结构。
GoT通过构建有向图来建模思维过程,任意节点都可以相互连接,支持更灵活的推理结构。
| 方法 | 结构 | 适用场景 |
|---|---|---|
| CoT | 线性链式 | 简单多步推理 |
| ToT | 树 | 需要探索多条路径 |
| GoT | 任意有向图 | 复杂依赖,需要合并分支 |
AoT将搜索过程(DFS/BFS)直接融入提示示例中,用自然语言描述搜索过程,让LLM模仿深度优先或广度优先搜索来解决问题。
与ToT不同,AoT不需要额外调用模型进行搜索评分,而是通过in-context示例教模型自己执行搜索。
将问题转化为程序代码,让大模型编写可执行程序解决问题,而不是用自然语言一步步推理。
利用大模型的代码生成能力,将复杂计算交给解释器执行,充分利用外部工具的准确性。
问题:"计算从1到100所有素数的和"
PoT会让模型输出:
1def is_prime(n):
2 if n < 2:
3 return False
4 for i in range(2, int(n**0.5) + 1):
5 if n % i == 0:
6 return False
7 return True
8
9total = sum(i for i in range(1, 101) if is_prime(i))
10print(total)然后执行代码得到结果。
手动设计CoT提示需要专业知识,而且不同提示效果差异很大。
自动搜索最优提示,用大模型生成候选提示,然后在验证集上评估,选择效果最好的提示。完全自动,不需要人工设计。
对同一个问题采样多个CoT推理路径,投票选出最常见的答案。不需要改架构,只需要多次采样。在保持简单的同时显著提升准确率。
类似于Self-Consistency,多个推理结果投票,利用一致性减少错误。
增加一个验证步骤,让模型自己验证推理结论是否正确,排除错误结果。
| 方法 | 核心思想 | 适用场景 | 复杂度 |
|---|---|---|---|
| 原始CoT | 线性单路径推理 | 简单多步推理 | 低 |
| Zero-shot-CoT | "Let's think step by step" | 无示例场景 | 最低 |
| Self-Consistency | 多路径投票 | 任何CoT场景,提升准确率 | 低 |
| Tree of Thoughts | 树上搜索,多路径探索 | 需要探索多种可能的复杂问题 | 中 |
| Graph of Thoughts | 任意图结构推理 | 复杂依赖,需要合并分支 | 中高 |
| Algorithm of Thoughts | 提示中嵌入搜索示例 | 让模型自己执行搜索 | 中 |
| Program-of-Thought | 生成代码交给解释器 | 需要精确计算的问题 | 中 |
| APE | 自动搜索最优提示 | 减少人工,自动化优化提示 | 高 |
**原始CoT存在什么问题?ToT怎么解决? 原始CoT是线性单路径推理,复杂问题往往需要探索多种可能的路径,单路径容易走错无法回溯。ToT将问题建模为树上搜索,每个节点产生多个候选思维,通过搜索探索多条路径,可以剪枝不可能的路径,选择最有希望的路径继续,提高复杂问题解决率。
**ToT和GoT的区别是什么? ToT是树形结构,每个节点只有一个父节点,不能有效表示多个分支合并的情况。GoT是任意有向图,允许节点有多个父节点,可以表示更复杂的依赖关系(比如归并排序中的合并步骤),更灵活地建模复杂推理过程。
**什么是Program-of-Thought?它的优势是什么? Program-of-Thought让大模型生成可执行的程序代码来解决问题,而不是用自然语言推理。优势:(1) 数值计算准确,不会犯计算错误;(2) 程序结构天然分步,逻辑清晰;(3) 可以调用外部工具和库,扩展大模型能力;(4) 在需要精确计算的任务上准确率高于纯文本CoT。
**AoT与ToT的主要区别在哪里? ToT需要多次调用模型,对每个状态进行评估和剪枝,算法控制在外部程序。AoT将搜索过程(DFS/BFS)直接用示例写在提示中,让大模型自己模仿搜索过程,不需要外部算法控制,调用次数更少,更简洁。
**你认为哪种CoT变体最好?它们适用场景有何不同? 没有绝对最好,要看场景:
**为什么从CoT发展到ToT再到GoT,结构越来越复杂? 因为问题复杂度在增加:
**Automatic Prompt Engineering解决了什么问题? 手动设计CoT提示需要经验,效果因人而异,APE自动搜索最优提示,减少人工成本,有时候能发现比人工设计更好的提示,自动化提示工程流程。
**ToT中的State Evaluator起什么作用? State Evaluator对当前思维状态进行评估,判断这个状态离解决问题还有多远,用来指导搜索顺序,优先探索更有希望的路径,剪枝没有希望的路径,提高搜索效率。可以是模型打分,也可以是多个模型投票。
**除了提到的这些变体,你还知道哪些CoT改进?
**在实际应用中,你会优先选择哪个CoT方法? 我会优先从简单开始: