从Chain-of-Thought到Tree-of-Thought全面解析

从Chain-of-Thought到Tree-of-Thought全面解析 推理能力是衡量AI智能水平的核心指标。从GPT-3时代的"直觉式回答"到2026年的多路径探索推理,大模型的推理范式经历了几次重要跃迁。本文将系统梳理从Chain-of-Thought到Tree-of-Thought的完整演进脉络。 Chain-of-Thought:让模型"展示推理过程" 核心思想 CoT的洞察看似简单——让模型在给出答案前先输出推理步骤。但这个简单的改变带来了巨大的效果提升。在GSM8K数学推理基准上,CoT将准确率从17.7%提升到58.1%。 CoT的深层原理是:大模型的每个token生成都消耗相同的计算量。“先想后说"本质上是给模型更多的计算预算来处理复杂问题。如果模型直接输出答案,它只用了一个forward pass的计算量。如果模型先输出5步推理再给答案,它用了5倍的计算量。 CoT的三种触发方式 Zero-shot CoT:在Prompt末尾加"Let’s think step by step”。最简单但效果不稳定。 Few-shot CoT:提供几个带推理过程的示例。效果好但需要精心设计示例。 Auto-CoT:让模型自己生成推理示例,减少人工设计。2026年的主流做法是结合few-shot和auto方式,用少量高质量种子示例引导自动生成。 CoT的局限 CoT本质是线性推理——从A推导到B,从B推导到C。但人类思考复杂问题时,往往会探索多条路径,发现走不通就回退重来。CoT没有这种"探索-回退"能力,一旦走上错误的推理路径,会一路错到底。 Self-Consistency:多路径投票 Self-Consistency是对CoT的第一个重要改进。核心思想:对同一个问题让模型生成多条独立的推理链,然后通过投票选择最一致的答案。 这个方法利用了一个关键洞察:正确的推理路径可能只有一条,但正确的答案可能由多条路径到达。通过多次采样并投票,正确答案获得多数票的概率显著提升。 实践效果:在GSM8K上从CoT的58.1%提升到74.4%。代价是推理成本增加N倍(N为采样次数,通常5-20)。 Self-Consistency的局限是它只对有唯一正确答案的问题有效。对于开放性问题(如"最好的方案是什么"),投票机制难以定义。 Tree-of-Thought:树形搜索推理 核心思想 ToT将推理过程建模为一棵搜索树。每个节点是一个"思考状态"(thought),模型从根节点出发,在每个节点生成多个候选的下一步思考,评估每个候选的质量,选择最优的继续探索。 这和CoT的本质区别是:CoT是一条链,ToT是一棵树。树结构允许模型: 在关键决策点探索多个选项 评估每个选项的前景 放弃不好的路径,回溯到好的分支 深度优先或广度优先搜索 ToT的工程实现 标准的ToT流程包含四个步骤: Thought Decomposition:将问题分解为中间思考步骤 Thought Generation:在每个状态生成多个候选下一步 State Evaluation:评估每个候选状态的前景 Search:使用BFS或DFS搜索最优路径 状态评估是ToT最关键也最有挑战的环节。评估方法有两种:数值评分(让模型对状态打1-10分)和排序比较(让模型比较两个状态哪个更好)。实践中,排序比较比数值评分更稳定。 ToT的效果与代价 ToT在复杂推理任务上的效果显著。在创意写作(24点游戏)等需要前瞻和回溯的任务上,ToT大幅超越CoT。但它有一个显而易见的代价——计算量巨大。ToT需要O(b×d)次推理调用,其中b是分支因子,d是搜索深度。一个典型配置b=5, d=3,意味着15次推理调用。 这使ToT在实际应用中需要权衡:简单问题不值得用ToT,复杂问题用ToT可能太慢。我们在硅基AGI平台中使用"自适应推理深度"策略——先用CoT尝试,如果置信度低再升级到ToT。 Graph-of-Thought:推理的图结构 超越树结构 GoT将推理过程从树结构扩展到图结构。核心动机是:不同推理路径之间可能有交叉和合并。在树结构中,两条路径一旦分离就不再交汇;在图结构中,路径可以合并。 一个具体场景:解决问题A需要同时考虑因素B和因素C。CoT会先分析B再分析C;ToT可能把B和C作为两个分支;但GoT允许在分析B的过程中发现与C相关的结论,并将这个结论合并到C的分支中。 知识图谱融合 GoT的一个有前途的方向是将推理图与外部知识图谱融合。推理过程中生成的中间结论作为节点加入知识图谱,后续推理可以直接引用这些结论。这类似于人类"把已经得出的结论记下来,在后面的推理中使用"。 演进趋势:从固定范式到自适应推理 2026年的最新趋势是放弃固定的推理范式,让模型自适应选择推理策略: ReAct:推理+行动交织 ReAct让推理和工具调用交织进行。模型可以先推理"我需要查一下这个数据",然后调用工具获取数据,再基于结果继续推理。这种"边想边做"的模式更接近人类解决问题的实际方式。 Reflexion:带反思的迭代推理 Reflexion在推理完成后增加一个"反思"步骤——模型评估自己的推理过程,识别可能的错误,然后基于反思重新推理。这种"失败-反思-重试"的循环能显著提升复杂任务的成功率。 LATS:语言Agent树搜索 LATS将ToT的思想扩展到Agent场景。搜索树的每个节点不只是一个思考状态,而是一个完整的Agent状态(包括思考、观察、行动)。这使搜索能在更大的行动空间中进行,适合需要多步骤决策的复杂任务。 推理范式的选择指南 基于我们的实践经验,不同场景推荐不同推理策略: 问题类型 推荐策略 理由 简单事实问答 直接回答 CoT反而可能引入错误 数学推理 CoT + Self-Consistency 多路径投票降低单链错误 逻辑推理 CoT 结构化推理足够 创意问题解决 ToT 需要探索多个方向 多步Agent任务 ReAct + Reflexion 需要行动和反思 复杂规划 LATS 大空间搜索 结语 从CoT到ToT的演进,本质是从"线性思考"到"结构化搜索"的范式升级。大模型不只是一个好的语言生成器,它还是一个不完美的推理器——通过外部化的推理结构(链、树、图),我们可以补偿模型自身推理能力的不足。2026年的前沿已经从"让模型更好地推理"转向"设计更好的推理结构来放大模型的推理能力"。 ...

2026-07-13 · 1 min · 91 words · 硅基 AGI 探索者
chain of thought advanced tot got

Chain-of-Thought 进阶:Tree-of-Thought 与 Graph-of-Thought

从线性思维到图结构推理 Chain-of-Thought (CoT) 自 2022 年提出以来,已成为大模型推理的基础范式。但线性思维链的局限在于:真实世界的推理往往不是一条直线,而是包含分支、回溯和交叉的复杂网络。2025-2026 年,Tree-of-Thought (ToT) 和 Graph-of-Thought (GoT) 作为 CoT 的高级进化形态,正在重新定义 LLM 的推理边界。 一、CoT 回顾与局限 1.1 标准 CoT 范式 问题 → [思考步骤1] → [思考步骤2] → [思考步骤3] → 答案 标准 CoT 的 Prompt 模板: 请一步步思考: 1. 首先分析问题中的关键条件... 2. 然后推导中间结论... 3. 最后得出最终答案... 1.2 CoT 的核心局限 局限 描述 影响 单线性 只有一条推理路径 无法处理需要多路径探索的问题 无回溯 一旦走错无法回头 早期错误会传播到最终答案 无比较 无法对比不同推理路径 错过更优解法 固定深度 推理步骤数预设 简单问题过度思考,复杂问题思考不足 二、Tree-of-Thought (ToT) 2.1 核心思想 ToT 将推理过程建模为一棵搜索树,每个节点是一个"思维状态"(thought state),可以生成多个分支并评估: [初始状态] / \ [思路A] [思路B] / \ / \ [A-1] [A-2] [B-1] [B-2] | | | [答案A] [答案A'] [答案B] 评估:答案B 最优 → 选择路径 B → B-1 2.2 ToT 完整实现 from typing import List, Optional, Callable from dataclasses import dataclass, field import json @dataclass class ThoughtNode: """思维树节点""" state: str # 当前思维状态描述 thought: str # 到达此状态的思考内容 parent: Optional['ThoughtNode'] = None children: List['ThoughtNode'] = field(default_factory=list) value: float = 0.0 # 评估值 0-1 depth: int = 0 visited: bool = False class TreeOfThought: """Tree-of-Thought 推理引擎""" def __init__(self, llm_client, max_depth: int = 5, branching_factor: int = 3, beam_size: int = 2): self.llm = llm_client self.max_depth = max_depth self.branching = branching_factor self.beam_size = beam_size def solve(self, problem: str) -> dict: """求解问题""" root = ThoughtNode(state=problem, thought="初始问题", depth=0) solution = self._search(root) return { 'answer': solution.thought if solution else None, 'path': self._trace_path(solution) if solution else [], 'tree_stats': { 'nodes_generated': self._count_nodes(root), 'max_depth_reached': self._max_depth(root), } } def _search(self, node: ThoughtNode) -> Optional[ThoughtNode]: """束束搜索(Beam Search)""" frontier = [node] for depth in range(self.max_depth): next_frontier = [] for current in frontier: if self._is_solution(current): return current # 生成多个思维分支 thoughts = self._generate_thoughts(current) for thought in thoughts: child = ThoughtNode( state=thought['state'], thought=thought['content'], parent=current, depth=depth + 1 ) # 评估每个分支 child.value = self._evaluate(child) current.children.append(child) next_frontier.append(child) # 保留 top-k 分支 next_frontier.sort(key=lambda n: -n.value) frontier = next_frontier[:self.beam_size] if not frontier: break # 返回最优叶节点 return max(frontier, key=lambda n: n.value) if frontier else None def _generate_thoughts(self, node: ThoughtNode) -> List[dict]: """生成多个可能的下一步思考""" prompt = f""" 问题:{node.state} 当前思考:{node.thought} 当前深度:{node.depth} 请生成 {self.branching} 个不同的下一步思考方向。 每个方向应探索不同的推理路径。 输出JSON格式: [ {{"state": "更新后的问题状态", "content": "具体思考内容"}}, ... ] """ response = self.llm.generate(prompt) return json.loads(response) def _evaluate(self, node: ThoughtNode) -> float: """评估思维节点的价值""" prompt = f""" 评估以下推理步骤的质量: 问题:{node.parent.state if node.parent else node.state} 推理步骤:{node.thought} 请从以下维度评分(0-1): 1. 逻辑正确性 2. 与问题相关性 3. 推进进度(离答案有多近) 返回平均分。 """ response = self.llm.generate(prompt) return float(response.strip()) def _is_solution(self, node: ThoughtNode) -> bool: """判断是否已到达答案""" prompt = f"以下内容是否已经给出了问题的完整答案?回答是或否。\n{node.thought}" return "是" in self.llm.generate(prompt) def _trace_path(self, node: ThoughtNode) -> List[str]: """回溯推理路径""" path = [] while node: path.append({'depth': node.depth, 'thought': node.thought, 'value': node.value}) node = node.parent return list(reversed(path)) def _count_nodes(self, root: ThoughtNode) -> int: count = 1 for child in root.children: count += self._count_nodes(child) return count def _max_depth(self, root: ThoughtNode) -> int: if not root.children: return root.depth return max(self._max_depth(c) for c in root.children) 2.3 ToT 效果对比 在 24 点游戏、创意写作、交叉词谜题等任务上的对比: ...

2026-06-28 · 5 min · 957 words · 硅基 AGI 探索者
鲁ICP备2026018361号