第 30 章 推理搜索结构:让 Agent 多想想,而不是一条道走到黑
推理不只是想,是搜索
第 29 章讲了模型路由。这一章回到一个更根本的问题:Agent 怎么推理。
最朴素的推理是链式的(Chain-of-Thought):沿着一条路径想下去。但复杂任务里,链式推理过早承诺一条路,中间假设错了会静默失败,错过本该被更广搜索发现的替代方案。
这一章讲四个模式,从"分叉"到"网状"到"自适应"到"搜索+反思",是一条完整的推理增强谱系:
- Tree-of-Thought(思维树):把推理从链变成树,分叉、评分、剪枝。
- Graph-of-Thoughts(思维图):把推理从树变成图,思路可以合并、回访。
- Self-Discover(自发现):让模型自己发现并组合推理结构。
- LATS(语言 Agent 树搜索):蒙特卡洛树搜索 + 反思,把搜索和推理结合。
模式一:思维树(Tree-of-Thought Reasoning)
问题
线性推理过早承诺一条路径,中间假设错误时会静默失败。复杂规划或综合任务上,这导致过早收敛、从错误里恢复的能力弱、错过更广搜索本该发现的替代方案。
方案
探索中间思想的搜索树,而不是单条链。 生成多个候选延续,给部分状态打分,剪掉弱分支,继续扩展最有希望的路径,直到满足停止条件。
这把推理变成有引导的搜索:回溯是显式的,分支质量可衡量,最终答案可以从竞争候选里选,而不是第一个轨迹。
评估函数的质量显著影响表现:外部验证器(代码执行、测试)胜过自我反思打分。
queue = [root_problem]
while queue:
thought = queue.pop()
for step in expand(thought):
score = evaluate(step)
queue.push((score, step))
prune_weak_branches(queue)
select_best(queue)证据
- 证据等级:成熟(
established),来自 Yao 等人(NeurIPS 2023)。 - 基础:Self-Consistency(Wang 等人,2022)是多路径探索的奠基方法,ToT 扩展了它。
- 它又被 LATS(树搜索)和 Graph of Thoughts(图结构)进一步扩展。
怎么用
- 任务受益于探索多种潜在策略时用:谜题、代码生成、规划。
- 用启发式或价值函数剪掉无望的分支。
- 算法变体:BFS 做穷举探索;DFS 做深路径、省内存;Beam search 做内存受限、启发式好的场景。
取舍
- 好处:覆盖更多可能性;硬任务上可靠性提升(多步推理比 CoT 高 22-28%);能从失败路径显式回溯。
- 代价:计算成本更高(比 CoT 多 3-10 倍 token);需要好的评估函数引导搜索;延迟天生更慢。最适合复杂规划、数学推理、代码生成,简单线性任务用它是杀鸡用牛刀。
模式二:思维图(Graph of Thoughts)
问题
线性推理(CoT)甚至树状方法(ToT)在需要推理步骤之间复杂相互依赖的问题上有局限。很多真实问题的推理路径会合并、分叉、重组,不适合线性或树结构。这些需要能表示思想间任意关系的更灵活方法。
方案
Graph of Thoughts(GoT)把推理过程表示成有向图。 它提供了一个通用框架,把 CoT(线性)和 ToT(分叉)作为特例囊括进来,聚合(aggregation)是关键的新操作。
在 GoT 里:
- 节点代表单个思想或推理状态。
- 边代表思想之间的变换或推理步骤。
- 多条路径可以通向和离开每个节点。
- 聚合操作可以合并多个思想。
- 回溯允许重访和精化之前的思想。
这支持的操作:
- 分叉(Branching):从一个思想生成多个。
- 聚合(Aggregation):从多条推理路径合并洞见。
- 精化(Refinement):基于后来的洞见改进思想。
- 循环(Looping):迭代地重访和精化思想。
初始问题 → 思想1 → 思想3 → 精化后的思想3 → 聚合洞见 → 最终解
→ 思想2 → 思想4 → 思想7 ────────↗
→ 思想5 → ─────────────↗
→ 思想6 → ─────────────↗多条路径可以汇聚到同一个聚合洞见,这正是树做不到的:不同分支的洞见可以合并。
证据
- 证据等级:新兴(
emerging),来自 Besta 等人(ETH Zurich,AAAI 2024)。
怎么用
- 用在不只一条解路径、或早期决策可能需要基于后来洞见修正的复杂问题上。
- LangGraph 原生支持带循环和回溯的 GoT 式工作流。
- 简单问题用 CoT / ToT:单一可行解路径、计算资源有限、推理分支不需要重组时。
取舍
- 好处:能处理推理步骤相互依赖的复杂问题;能发现想法间不明显的联系;支持迭代精化和回溯;比线性或树状方法更有表现力。
- 代价:计算成本显著更高(比线性推理多 5-20 倍);实现和调试复杂;可能生成很多冗余思想;需要精巧的评分和寻路算法;简单问题上是杀鸡用牛刀。
模式三:自发现(Self-Discover)
问题
不同的推理任务需要不同的思考策略。 CoT 这类技术对某些问题好用,对另一些可能次优。现有方法通常不管具体问题用什么固定推理模式,导致在不同任务上解题低效、表现次优。
方案
Self-Discover 让 LLM 自动发现并组合任务特定的推理结构。 过程分四步:
- SELECT(选择):从预定义的原子推理原语库里选 3-5 个相关推理模块。
- ADAPT(适配):把通用模块改造成针对确切问题的任务特定推理步骤。
- COMPOSE(组合):把适配后的模块组织成连贯的推理结构,定义操作顺序。
- EXECUTE(执行):用自发现的结构解题。
这让模型把推理策略适配到问题的独特特征,在挑战性基准上比 CoT 最高提升 32%。
reasoning_modules = [
"把问题拆成小步骤",
"想想你看过的类似问题",
"考虑边界情况和异常",
"从期望结果倒推",
"用具体例子验证理解",
"识别关键约束和需求",
"考虑多个视角",
"检查逻辑一致性",
"先简化问题",
"找模式"
]
def discover_reasoning_structure(self, task):
# 1. 选相关推理模块
selected = llm.generate(f"任务: {task}... 选 3-5 个最相关的模块")
# 2. 适配模块到任务
adapted = llm.generate(f"任务: {task}... 把这些通用模块改造成具体推理步骤")
# 3. 组合成推理结构
structure = llm.generate(f"任务: {task}... 组织成连贯的推理结构,定义操作顺序")
return structure证据
- 证据等级:新兴(
emerging),来自 Google DeepMind & USC(2024)。 - 有价值发现:在挑战性推理基准上比 CoT 最高提升 32%(arXiv:2402.03620)。
怎么用
- 用于不同问题需要不同推理策略的复杂推理任务:数学解题、战略规划、多步代码生成。
- 最适合表现提升值得额外计算开销的应用。
- 推理方式的可解释性有价值时考虑。
- 从一个覆盖分解、验证、改进、知识检索、战略推理的多样模块库开始。
取舍
- 好处:不同推理任务上表现显著提升;比试遍所有推理策略更高效;创建可复用的推理模板;适配新颖问题类型。
- 代价:计算开销,约单次 CoT 的 2-3 倍成本(多次 LLM 调用);要多样的推理模块库(通常 20-30 个覆盖才够);可能过度设计简单问题;结构质量取决于任务分析的准确性。
模式四:语言 Agent 树搜索(LATS)
问题
现有语言 Agent 常搞不定需要探索多条解路径的复杂推理任务。ReACT 这类简单线性方法或基础反思模式会卡在局部最优,或想不到考虑替代策略。这对需要战略规划、数学推理、多步解题的任务尤其麻烦,因为早期决策严重影响后期结果。
方案
LATS 把蒙特卡洛树搜索(MCTS)和语言模型的反思与评估能力结合。 把解题过程当成一棵树:
- 节点代表状态(部分解或推理步骤)。
- 边代表动作(推理的下一步)。
- 叶节点用 LLM 的自我反思能力评估。
- 反向传播更新整棵树的价值估计。
Agent 更深入探索有希望的分支,同时保持宽度避免卡住。这是"系统性搜索 + LLM 推理"两全其美。
选择用 UCB(上置信界)公式:
UCB(node) = Q(node) + c × √(ln(parent_visits) / node_visits)Q(node) 是估计值,c 是探索常数(通常 1.4),对数项平衡对访问较少节点的探索。这个有原则的方法比广度优先或随机探索的样本效率更高。
评估机制包括:直接置信度打分(0-1)、基于批评的评估、多维度打分。选择取决于任务复杂度和所需精度。
class LATSAgent:
def __init__(self, llm, max_iterations=50, exploration_constant=1.4):
self.llm = llm
self.max_iterations = max_iterations
self.c = exploration_constant # UCB 探索参数
def search(self, initial_state, problem):
root = Node(state=initial_state)
for _ in range(self.max_iterations):
# 选择:用 UCB 遍历树
node = self.select(root)
# 扩展:生成可能的动作
if not node.is_terminal():
for action in self.generate_actions(node.state, problem):
node.add_child(Node(state=apply_action(node.state, action)))
# 模拟:评估节点
value = self.evaluate(node, problem)
# 反向传播:向上更新价值
self.backpropagate(node, value)
return self.best_path(root)
def ucb_score(self, node):
if node.visits == 0:
return float('inf')
exploitation = node.value / node.visits
exploration = self.c * sqrt(log(node.parent.visits) / node.visits)
return exploitation + exploration证据
- 证据等级:新兴(
emerging),来自 Zhou 等人(伊利诺伊大学,2023)。 - 在复杂推理任务上超过 ReACT、Reflexion 和 Tree of Thoughts。
怎么用
什么时候用 LATS:
- 需要战略规划和多步决策的复杂推理任务。
- 有多条有效解路径、探索很重要的任务。
- 数学推理、算法设计、多个潜在原因的调试。
- 预算允许更高的计算成本(比简单方法多 5-20 倍 LLM 调用)。
什么时候用替代方案:
- 简单或线性任务:用 ReAct 或 CoT。
- 实时响应要求:用带反思循环的单次通过。
- 成本敏感应用:用有限分叉的 ToT。
实施指导: 先固定迭代次数(10-25)再调探索常数 c;评估用低温(0.1-0.3),扩展用高温(0.7-1.0);LangGraph 能提供支持 MCTS 式工作流的图基础设施。
取舍
- 好处:复杂推理任务上表现明显更好;系统性探索防止卡住;天然处理有多条有效解路径的问题;提供可解释的推理轨迹。
- 代价:计算成本高(比简单方法多 5-20 倍 LLM 调用);天生串行,不适合实时应用;实现复杂,要正确的 MCTS 和树状态管理;简单任务上是杀鸡用牛刀。
四个模式怎么选
| 场景 | 推荐模式 |
|---|---|
| 推理要分叉探索 | 思维树 |
| 思路要合并、回访、重组 | 思维图 |
| 不同任务要不同推理策略 | 自发现 |
| 复杂规划,要搜索 + 反思 | LATS |
| 简单线性任务 | 用 CoT / ReAct 就够了 |
四个模式是推理增强的演进谱系:CoT 是一条线,ToT 把它变分叉的树,GoT 把树变可以合并回访的图,Self-Discover 让模型自己挑推理结构,LATS 给搜索加上蒙特卡洛和反思。谱系越靠后越强大也越贵,选型原则是匹配任务复杂度:简单任务别杀鸡用牛刀。
实践清单
- 复杂推理任务,先评估是线性、树状、还是图状的结构
- 分叉探索用 ToT:生成多候选、评分、剪枝、继续扩最有希望的
- 评估函数用外部验证器(代码执行/测试)胜过自我反思打分
- 思路要合并重组时用 GoT:分叉 / 聚合 / 精化 / 循环四操作
- 不同任务不同策略时用 Self-Discover:SELECT → ADAPT → COMPOSE → EXECUTE
- 自发现模块库备 20-30 个原子推理原语,覆盖分解/验证/检索/战略
- 战略规划 + 多步决策用 LATS:UCB 选择 + 反思评估 + 反向传播
- 评估低温(0.1-0.3)、扩展高温(0.7-1.0);先固定迭代次数再调 c
- 记住成本谱系:CoT < ToT < Self-Discover < GoT ≈ LATS,按任务复杂度选
本章小结
- 思维树:链变树,分叉、评分、剪枝,多步推理比 CoT 高 22-28%。
- 思维图:树变图,思路合并、回访、重组,比树更有表现力。
- 自发现:SELECT / ADAPT / COMPOSE / EXECUTE,模型自己挑推理结构,比 CoT 高 32%。
- LATS:MCTS + 反思 + 评估,系统性搜索 + LLM 推理,超过 ReACT / Reflexion / ToT。
- 推理增强的谱系:越靠后越强越贵,选型匹配任务复杂度。
到这里,第七部分"规模化到多智能体"就讲完了。你的链路现在是:多智能体协调(28)→ 模型路由(29)→ 推理搜索结构(30),从"怎么一起干活"到"谁用哪个模型"到"怎么想得更深"。下一部分,进入"与人协作与产品化":落地最后一公里。先从第 31 章控制谱系开始。