每日 Agent 核心知识 · 第 08 期Agent 规划能力深度拆解:从 CoT 到 MCTS,LLM 如何学会“想清楚再做“

📅 2026/6/25 13:00:16
每日 Agent 核心知识 · 第 08 期Agent 规划能力深度拆解:从 CoT 到 MCTS,LLM 如何学会“想清楚再做“
个人主页代码不加冰欢迎来访作者简介java后端学习者❄️个人专栏LeetCode刷题日记 苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言大家好我是代码不加冰今天给自己放空了一下没有想太多也没有复习准备明天正式开始复习吧不知道是不是考虑太多 了还是想的太多了每天过的总有点无趣今天放空了一下还是有效果的充充能。闲话不多说让我们来到我们的每日agent知识专栏的第八期。规划是 Agent 和普通 LLM 调用最本质的区别。但规划不是一个单一技术而是一个方法谱系。本文沿着这条演进线把每种范式讲透——它解决了什么问题引入了什么新问题以及工程上真正能用的是哪些。文章摘要本文系统探讨了LLM大语言模型中的规划技术分析了四种主要范式及其工程应用。首先指出LLM自回归生成的固有局限单向不可撤销的推理过程无法应对复杂问题的试错需求。然后依次介绍Chain-of-Thought (CoT)通过显式中间步骤补偿单向生成局限但仍是单路径推理Tree-of-Thought (ToT)扩展为多路径搜索树但计算成本高昂MCTSLLM移植蒙特卡洛树搜索算法目前主要用于离线优化Reflexion通过错误驱动的迭代改进实现自适应学习文章最后提供工程选型矩阵建议从低成本CoT开始根据任务特点逐步采用更复杂方案并解答了相关面试高频问题。核心观点不同规划技术本质都是为弥补LLM的单向生成缺陷需权衡计算成本与收益选择适当方案。目录规划的本质问题为什么 LLM 需要显式规划Chain-of-Thought让推理过程可见Tree-of-Thought从线到树的搜索空间扩展MCTS 与 LLM蒙特卡洛树搜索的迁移自我反思Reflexion 与错误驱动的迭代四种范式的工程选型矩阵面试高频问题01 规划的本质问题在讲具体技术之前先搞清楚规划在解决什么问题。LLM 做推理时有一个固有局限自回归生成是单向的、不可撤销的。每个 token 生成后就成了事实后续的生成只能顺着它走不能回头修改已经说出口的内容。这在简单问题上不是问题——一步能到达答案不需要回溯。但复杂问题需要试错一条路走不通要回到分叉点选另一条。自回归生成天然做不到这件事规划技术的全部意义就在于在生成之前或生成过程中引入某种形式的向前看或回溯能力补偿单向生成的局限。理解这个出发点后面每种技术的设计逻辑就都清晰了CoT让模型把推理步骤外显化给后续 token 更多参考上文ToT在分叉处同时探索多条路径MCTS通过模拟和评估来指导搜索自我反思通过多轮迭代来弥补单次推理的不足。它们都是在补偿同一个根本局限。02 Chain-of-Thought让推理过程可见CoT 是 2022 年 Google 提出的原理极其简单在 prompt 里加上Lets think step by step或者给出几个带推理过程的示例模型就会在生成最终答案前先输出一系列中间推理步骤。这为什么有效两个层次的解释① 信息层解释工程视角生成中间步骤时这些步骤的 token 会出现在后续生成的上文里。模型在生成最终答案时能看到自己已经推导出的中间结论等于减少了一步跳到答案需要记住的信息量。中间步骤起到了草稿纸的作用。② 训练分布解释ML 视角人类写的高质量推理文本教材解题、论文推导本身就是 step-by-step 结构的。CoT 让模型生成了与这类训练数据分布对齐的 token 序列激活了模型在预训练阶段学到的推理模式。2.1 Zero-shot CoT vs Few-shot CoTZero-shot CoT只加一句触发语不给示例python prompt 问题一家工厂每天生产120个零件其中15%是次品次品中 30%可以返工。问每天最终合格品数量是多少 请一步一步地思考。 # 模型会自己推导 # 步骤1次品数 120 × 15% 18个 # 步骤2可返工次品 18 × 30% 5.4 ≈ 5个 # 步骤3最终合格品 (120-18) 5 107个Few-shot CoT给出带推理过程的示例效果更稳定python prompt 示例问题仓库有500箱货每箱重20kg卡车载重5吨需要几辆卡车 示例推理 步骤1总重量 500 × 20 10000kg 10吨 步骤2需要卡车数 10 ÷ 5 2辆 示例答案需要2辆卡车。 现在解决工厂每天生产120个零件...同上 2.2 CoT 的局限仍然是单路径CoT 让推理过程变得可见但它仍然是单条路径的线性推进——模型在第一步迈出去就沿着这个方向走到底不会在推理到一半时意识到这条路走不通我需要换个思路。对于需要探索多种可能的问题比如创意写作、复杂数学证明、战略规划CoT 的单路径特性是硬伤。这就是Tree-of-Thought要解决的问题。03 Tree-of-Thought从线到树的搜索空间ToT2023普林斯顿Google把 CoT 的一条线变成一棵树——在推理的每个关键分叉点同时探索多个备选方向并对每个方向的前景做评估只沿着最有希望的分支继续深入。核心步骤阶段说明① 问题分解把问题拆成可以逐步求解的思维步骤② 候选生成在每个步骤生成多个备选方向③ 状态评估用 LLM 评估每个候选状态的前景④ 搜索策略只沿最优分支继续深入BFS/DFS前提ToT 要求把问题定义成一系列步骤每一步有明确的中间思维状态。比如写一篇文章步骤1确定核心论点步骤2设计段落结构步骤3每段扩写。每一步的输出是下一步的输入构成一棵可搜索的推理树。ToT 的工程代价和适用范围ToT 在论文里对 24 点游戏等需要系统性搜索的问题效果显著但工程代价很重一次完整的 ToT 搜索可能需要几十到上百次 LLM 调用延迟高、成本高。生产环境里几乎不会部署完整的 ToT而是使用其思想的变体——比如在规划阶段生成 2-3 个备选方案让 LLM 自己评估选最优保留了多路径探索的核心价值同时把调用次数控制在可接受范围内。04 MCTS 与 LLM蒙特卡洛树搜索的迁移MCTS蒙特卡洛树搜索来自游戏 AI 领域是AlphaGo的核心算法。它解决的问题和 ToT 相似——在一个巨大的搜索空间里找好的路径——但用了不同的策略。把 MCTS 迁移到 LLM 推理是近两年最前沿的研究方向之一。4.1 MCTS 的四个阶段MCTS 一次迭代的完整流程阶段说明Selection从根节点出发按 UCB 公式选择子节点平衡已知好的路径exploitation和未充分探索的路径exploration直到到达叶子节点。UCB 公式Q(s,a)/N(s,a) c × √(ln N(s) / N(s,a))前半部分是已知收益后半部分是探索奖励。Expansion在叶子节点处用 LLM 生成一个或多个新的子状态候选下一步把这些节点加入搜索树。这一步是 LLM 的生成能力发挥作用的地方——LLM 比传统规则引擎更擅长生成高质量的合理下一步。Simulation从新扩展的节点开始做一次快速模拟——让 LLM 用较低质量但速度快的方式比如只做一步贪心 CoT走到终点得到一个模拟结果。这步不要求结果准确只需要大致判断这个方向有没有前景。Backprop把模拟结果成功/失败/得分反向传播回搜索树中所有经过的节点更新它们的 Q 值和访问次数 N 值。这使得通过这个节点走向成功的路径获得更高的 Q 值下次 Selection 时会优先选择它。4.2 LLM MCTS 的具体形态python # LLM 在 MCTS 里承担两个角色 # 角色一策略网络Policy Network—— 生成候选下一步 def policy_llm(state: str, n_candidates: int 3) - list[str]: return [llm.call(f当前状态{state}\n生成下一个推理步骤) for _ in range(n_candidates)] # 角色二价值网络Value Network—— 评估节点的前景分数 def value_llm(state: str, goal: str) - float: score llm.call( f目标{goal}\n当前状态{state}\n f此状态距离目标的接近程度0.0-1.0 ) return float(score) # 关键区别ToT 是每层评估选最优MCTS 是反复模拟统计收益更新 # MCTS 通过大量迭代让搜索逐渐聚焦到好的路径不依赖单次评估的准确性 # 这让它对评估噪声有更好的鲁棒性——一次评估出错不会致命因为后续迭代会纠偏MCTS LLM 的现状目前仍然主要是研究阶段的技术工程落地的挑战很大单次搜索需要几百次 LLM 调用延迟从秒级变成分钟级成本从毛级变成元级在棋盘游戏里有效是因为状态空间有限且奖励信号明确LLM 推理的状态空间是无界的自然语言奖励信号模糊MCTS 的优势被大幅稀释。当前更多作为离线优化工具使用——比如在训练阶段用 MCTS 生成高质量的推理轨迹数据来微调出更强的策略模型这是 OpenAI o1/o3 使用的方向之一。05 自我反思Reflexion 与错误驱动的迭代前面三种技术CoT/ToT/MCTS都是在首次作答之前做规划。Reflexion2023Northeastern MIT换了思路让 Agent 先做失败了之后再反思自己哪里错了把反思结论写入语言记忆下次重试时带着这个记忆再做。这是错误驱动的迭代改进而不是事前的系统性规划。5.1 Reflexion 的三个核心组件组件说明Actor执行者按照当前策略包括过往反思记忆执行任务产出 trajectory行动轨迹。就是我们之前讲的 ReAct Agent 或标准 Agent 循环。Evaluator评估者对 Actor 的执行结果打分。可以是规则评估代码能否运行通过测试也可以是另一个 LLM对回答质量做判断。输出是成功/失败或量化分数。Self-Reflection自我反思者在 Actor 失败后被触发接收完整的执行轨迹trajectory和失败原因生成一段语言反思——具体分析哪里出了问题、下次该怎么避免。这段反思被存入反思记忆下次 Actor 执行前会把这段记忆注入 context。5.2 完整运行轨迹Reflexion 多轮迭代示例任务写一段能通过所有测试的 Python 代码轮次过程试验 1Actor 写了代码Evaluator 运行测试3/5 通过失败在边界情况空输入和超大整数。反思 1Self-Reflection 分析轨迹 → 输出我没有处理空列表输入的情况也没有考虑整数溢出。下次需要在函数开头加输入校验并使用 Python 的 arbitrary precision int。试验 2Actor 带着反思记忆重新写代码context 里包含反思 1 的内容Evaluator 运行测试4/5 通过仍失败在浮点精度问题。反思 2Self-Reflection上次我解决了空输入和整数溢出但浮点比较用了 而不是 math.isclose()这是新问题。下次使用 math.isclose(a, b, rel_tol1e-9)。试验 3Actor 带着反思 1 反思 2 的合并记忆重新写代码 → 5/5 测试通过任务完成。python # Reflexion 核心循环伪代码 def reflexion_loop(task, max_trials5): reflections [] # 历次反思的语言记忆跨试验累积 for trial in range(max_trials): # Actor带着所有历史反思执行任务 trajectory actor.run( tasktask, memory\n.join(reflections) # 反思记忆注入 context ) # Evaluator评估结果 result evaluator.score(trajectory) if result.success: return trajectory # 成功提前退出 # Self-Reflection生成反思存入记忆 reflection self_reflect_llm.call( f任务{task}\n执行轨迹{trajectory}\n失败原因{result.reason}\n f请分析失败原因并给出下次应该怎么做的具体建议 ) reflections.append(reflection) return None # 达到最大试验次数任务失败Reflexion 的适用边界Reflexion 的核心假设是失败有可以语言化的原因且语言化的反思能有效指导下次执行。适用场景编程任务有明确的测试用例做评估失败原因可以从报错信息里提取和推理任务不适用场景评估器本身不可靠主观任务失败原因难以语言化物理操作同一类型的错误 LLM 反复犯已经进入了能力边界反思无法突破。每次试验仍然消耗完整的 Agent 循环多次迭代的成本也不可忽视。06 四种范式的工程选型矩阵讲完四种技术回到工程视角——在实际项目里面对一个具体任务应该用哪个下面的矩阵从成本、适用场景、局限三个维度做横向对比帮助快速选型。范式调用次数最适合的任务类型核心局限生产可用性CoT1次同一次调用内单步推理、数学计算、逻辑判断、分析类问题单路径无法回溯推理链错一步则全错✅ 立即可用ToTO(k × depth × branch)需要系统性探索的问题创意写作、数学证明、战略规划成本极高评估质量决定搜索质量工程复杂⚠️ 精简变体可用MCTS数百次搜索树规模有明确评估函数的优化问题训练数据生成延迟分钟级奖励信号模糊时效果差目前偏研究❌ 离线/研究场景Reflexion每次试验一个完整循环N次试验有明确外部评估的任务编程单元测试、问答可验证答案需要可靠的外部评估器能力边界内的错误无法通过反思突破✅ 编程/可验证任务实用选型原则从 CoT 开始因为它成本最低且效果往往足够好如果发现单次推理失败率高且失败有规律可循尝试Reflexion前提是有可靠评估器如果任务本身需要探索多种方案用ToT 的精简版生成 2-3 个备选方案让模型选最优MCTS留给有大量计算预算的离线优化和训练数据生成场景。07 面试高频问题QCoT 里的步骤和 ReAct 里的Thought是一回事吗有重叠但不完全一样。CoT 的推理步骤是自包含的——全靠模型参数里已有的知识不访问外部信息ReAct 的 Thought是推理行动规划的混合体——Thought 里会出现我需要调用工具来获取这个信息然后通过 Action 去真正获取。之前评论区有朋友不理解的问题可以说ReAct 的 Thought 是 CoT 在有工具可用场景下的自然延伸推理链里除了纯逻辑推导还包括决定调用什么工具这个元层面的规划。QToT 和 Beam Search 有什么区别形式上很相似——都是在每步保留 top-k 个候选状态然后继续扩展。但有两个本质区别维度Beam SearchToT评估方式用语言模型的 token 概率log likelihood来评分用一个独立的 LLM 调用来语义评估每个候选状态的前景语义层面判断操作粒度在 token 级别操作每次选 top-k 个下一个 token在思维步骤级别操作paragraph 或解题阶段一个步骤可能包含几十到几百个 tokenToT 更像是语义级别的 Beam Search。QReflexion 和 RLHF基于人类反馈的强化学习维度RLHFReflexion阶段训练时技术推理时技术改进方式用人类评分作为奖励信号通过强化学习更新模型权重把改进固化到模型参数里不改变模型权重只是在 context 里积累自然语言形式的反思影响范围之后所有调用都受益影响仅限当次任务的多轮迭代换个任务就从头开始本质持久性学习临时性自适应两者是互补的RLHF 提升模型的基础能力Reflexion 在推理时让这个能力针对具体任务进一步自适应。QOpenAI o1/o3 的extended thinking和这几种技术有什么关系o1/o3 的具体实现 OpenAI 没有完全公开但从外部行为和论文线索推测推理时用了大规模的 CoT在生成最终回答前先生成一个很长的内部思维链这部分在 API 里看不到只能看到 thinking token 数量训练阶段可能使用了 MCTS 或类似的搜索方法生成高质量推理轨迹来做强化学习即 Process Reward Model MCTS 的组合把更好的搜索能力通过训练内化到了模型参数里。换句话说o1/o3 不是在推理时跑 MCTS而是用 MCTS 生成的训练数据训练出了一个内化了搜索能力的更强模型。这是把推理时昂贵的搜索转化为训练时的一次性投入的工程思路。