第 30 章 AI AgentAgentic Patterns推理

第 30 章 推理搜索结构:让 Agent 多想想,而不是一条道走到黑

推理不只是想,是搜索

第 29 章讲了模型路由。这一章回到一个更根本的问题:Agent 怎么推理。

最朴素的推理是链式的(Chain-of-Thought):沿着一条路径想下去。但复杂任务里,链式推理过早承诺一条路,中间假设错了会静默失败,错过本该被更广搜索发现的替代方案。

这一章讲四个模式,从"分叉"到"网状"到"自适应"到"搜索+反思",是一条完整的推理增强谱系:

  1. Tree-of-Thought(思维树):把推理从链变成树,分叉、评分、剪枝。
  2. Graph-of-Thoughts(思维图):把推理从树变成图,思路可以合并、回访。
  3. Self-Discover(自发现):让模型自己发现并组合推理结构。
  4. 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 里:

  • 节点代表单个思想或推理状态。
  • 代表思想之间的变换或推理步骤。
  • 多条路径可以通向和离开每个节点。
  • 聚合操作可以合并多个思想。
  • 回溯允许重访和精化之前的思想。

这支持的操作:

  1. 分叉(Branching):从一个思想生成多个。
  2. 聚合(Aggregation):从多条推理路径合并洞见。
  3. 精化(Refinement):基于后来的洞见改进思想。
  4. 循环(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 自动发现并组合任务特定的推理结构。 过程分四步:

  1. SELECT(选择):从预定义的原子推理原语库里选 3-5 个相关推理模块。
  2. ADAPT(适配):把通用模块改造成针对确切问题的任务特定推理步骤。
  3. COMPOSE(组合):把适配后的模块组织成连贯的推理结构,定义操作顺序。
  4. 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)和语言模型的反思与评估能力结合。 把解题过程当成一棵树:

  1. 节点代表状态(部分解或推理步骤)。
  2. 代表动作(推理的下一步)。
  3. 叶节点用 LLM 的自我反思能力评估。
  4. 反向传播更新整棵树的价值估计。

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 章控制谱系开始。

📑 Agent 模式实战:生产级 AI Agent 的工程模式

1 第 1 章 什么是 Agent 模式 2 第 2 章 规划-执行-观察:先想清楚,再动手 3 第 3 章 反思闭环:让 Agent 学会检查自己的作业 4 第 4 章 委派:让主 Agent 学会把活分出去 5 第 5 章 上下文预算治理:把 token 当成钱来管 6 第 6 章 上下文压缩与精选:装不下怎么办 7 第 7 章 上下文最小化:别让脏东西留在脑子里 8 第 8 章 记忆体系:让 Agent 记得住过去 9 第 9 章 学习沉淀:让 Agent 和团队一起变聪明 10 第 10 章 工具接口哲学:让 Agent 能用、好用、用得起 11 第 11 章 工具发现:让 Agent 在几百个工具里找到对的 12 第 12 章 执行环境:Agent 在哪动手、怎么动手 13 第 13 章 代码执行与沙箱:先写码,再跑码 14 第 14 章 结构化输出与契约:让 Agent 的输出能接住 15 第 15 章 验证循环:Agent 怎么检查自己的作业 16 第 16 章 评测基建:怎么系统地检验 Agent 17 第 17 章 可观测性:看见 Agent 在想什么、在干嘛 18 第 18 章 韧性工程:扛得住部分失效 19 第 19 章 威胁模型:先看风险长什么样,再谈防御 20 第 20 章 控制流隔离:把"谁做决定"和"谁执行"分开 21 第 21 章 权限与审批:谁有权干什么、谁点头 22 第 22 章 凭据与出口:Agent 手里的钥匙和门 23 第 23 章 多智能体信任:多个 Agent 之间怎么互信、怎么审计 24 第 24 章 反馈信号设计:给 Agent 的是信号,不是更大的提示词 25 第 25 章 评测驱动的改进:让 Agent 在真实使用和对抗测试里变强 26 第 26 章 强化学习:把反馈变成训练信号 27 第 27 章 复合式进化:让 Agent 系统越用越值钱 28 第 28 章 多智能体协调:让一群 Agent 一起干活不掉链子 29 第 29 章 模型路由:谁用哪个模型,怎么用得起 30 第 30 章 推理搜索结构:让 Agent 多想想,而不是一条道走到黑 31 第 31 章 控制谱系:从自动补全到完全自主的滑动条 32 第 32 章 团队与产品:把 Agent 变成团队资产,而不是个人玩具
← 返回本书大纲