Reasoning Patterns
大语言模型(LLM)本身的推理能力是有限的——它们倾向于一步到位地给出答案,而非经过深思熟虑的多步推演。为了弥补这一局限,研究者们提出了多种推理模式(Reasoning Patterns),使LLM能够更系统、更可靠地解决复杂问题。这些推理模式是构建现代AI Agent的核心基础。
CoT (Chain of Thought)
基本原理
CoT(Chain of Thought,思维链)是所有现代Agent框架的基础。其核心思想非常直观:与其让模型直接输出最终答案,不如引导它逐步展示推理过程,就像人类在解题时会在草稿纸上写下中间步骤一样。
CoT的理论依据在于:当模型被要求生成中间推理步骤时,它能够将复杂问题分解为更简单的子问题,从而显著提升在算术推理、常识推理和符号推理等任务上的表现。
Few-shot CoT
Few-shot CoT由Wei et al. (2022)在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中提出。其方法是在prompt中提供若干包含详细推理步骤的示例(exemplars),引导模型模仿这种逐步推理的模式:
Q: Roger有5个网球,他又买了2筒网球,每筒有3个,请问他现在有多少个网球?
A: Roger一开始有5个网球。2筒网球共有2×3=6个。5+6=11。答案是11。
Q: 食堂有23个苹果,用掉20个后又买了6个,请问现在有多少个?
A: 食堂一开始有23个苹果。用掉20个后剩23-20=3个。又买了6个,3+6=9。答案是9。
Zero-shot CoT
Kojima et al. (2022) 发现,仅需在prompt末尾添加一句 "Let's think step by step",即可在不提供任何示例的情况下激发模型的逐步推理能力。这一发现意义重大——它表明大型语言模型内部已经具备了链式推理的潜力,只需要一个简单的触发指令即可释放。
Q: 一个杂货商有一些苹果,他卖掉40%后剩下420个,他原来有多少个?
A: Let's think step by step.
Self-Consistency (SC)
Self-Consistency(自一致性)由Wang et al. (2023)提出,是对CoT的重要增强。其核心思想是:对同一问题多次采样不同的推理路径,然后通过多数投票(majority voting)选出最一致的答案。
工作流程如下:
- 对同一个问题,使用较高的temperature进行多次CoT推理(例如采样10~40条不同的推理链)
- 每条推理链独立地得出一个答案
- 对所有答案进行多数投票,选择出现频率最高的答案作为最终输出
SC的优势在于:它不依赖于单一推理路径的正确性,而是通过多条路径的"民主投票"来提高结果的可靠性。即使某些推理链出错,只要多数路径能收敛到正确答案,最终结果就是正确的。
ReAct
基本原理
ReAct(Reason + Act)由Yao et al. (2023)在论文《ReAct: Synergizing Reasoning and Acting in Language Models》中提出。其核心理念是:不要指望LLM一步就能给出最终答案,而是让Agent像人一样,思考与行动交错进行。
ReAct的关键创新在于将推理(Reasoning)和行动(Acting)统一在一个交错的循环中:
Thought: 我需要查找某个信息来回答这个问题
Action: Search["关键词"]
Observation: [搜索返回的结果]
Thought: 根据搜索结果,我现在知道了...但还需要确认...
Action: Lookup["补充信息"]
Observation: [查找返回的结果]
Thought: 现在我有足够的信息来回答问题了
Action: Finish["最终答案"]
与纯CoT和纯Act的对比
| 方法 | 推理能力 | 行动能力 | 局限性 |
|---|---|---|---|
| 纯CoT | 有 | 无 | 无法获取外部信息,容易产生幻觉 |
| 纯Act | 无 | 有 | 缺乏规划,行动盲目 |
| ReAct | 有 | 有 | 推理与行动相互支撑,更可靠 |
纯CoT的问题在于,模型只能依赖其训练数据中的知识进行推理,无法与外部世界交互——当遇到需要实时信息或模型不确定的知识时,容易产生事实性错误(幻觉)。纯Act的问题则在于,模型在没有明确推理的情况下直接采取行动,缺乏对目标和策略的深度思考。ReAct将两者结合,让推理指导行动的方向,让行动的结果(Observation)反馈给推理,形成一个正向循环。
ReAct在Agent中的应用
ReAct模式是当前主流Agent框架(如LangChain、LlamaIndex)的默认推理模式。在实际应用中,ReAct循环通常与工具调用(Tool Use)结合:Agent的"Action"就是调用某个工具(搜索引擎、代码解释器、API等),"Observation"就是工具返回的结果。
Reflexion
基本原理
Reflexion由Shinn et al. (2023)在论文《Reflexion: Language Agents with Verbal Reinforcement Learning》中提出。它引入了一种自我反思(self-reflection)机制,使Agent能够从失败中学习,而无需更新模型权重。
传统强化学习通过标量奖励信号(如+1/-1)来更新策略,但这种信号过于稀疏,难以指导具体的行为改进。Reflexion的核心洞见是:用自然语言形式的反思(linguistic feedback)代替标量奖励,让Agent用语言描述自己的错误和改进方向。
工作流程
Reflexion的完整循环包含三个核心组件:
- Actor(行动者):执行任务并生成动作轨迹(trajectory)
- Evaluator(评估者):评估Actor的输出质量,判断任务是否成功
- Self-Reflection(自我反思):当任务失败时,生成自然语言形式的反思总结
具体流程如下:
第1次尝试:
Actor执行任务 → 得到结果 → Evaluator判断:失败
→ Self-Reflection: "我在第3步犯了错误,我把X误认为Y,
下次应该先验证X的准确性再继续"
第2次尝试:
Actor执行任务(参考之前的反思) → 得到结果 → Evaluator判断:失败
→ Self-Reflection: "虽然这次避免了上次的错误,但在最后一步
我遗漏了约束条件Z,下次需要在最终检查时加入Z的验证"
第3次尝试:
Actor执行任务(参考所有历史反思) → 得到结果 → Evaluator判断:成功!
Verbal Reinforcement Learning
Reflexion可以被视为一种"语言强化学习"(Verbal RL):
- 传统RL:通过数值奖励更新网络权重 → 改变策略
- Verbal RL:通过自然语言反思更新记忆 → 改变行为
这种方法的优势在于:反思内容是人类可读的,便于调试和理解Agent的学习过程;同时不需要梯度更新,适用于任何黑盒LLM。
应用场景
Reflexion在以下场景中表现出色:
- 代码生成:生成代码 → 运行测试 → 根据错误信息反思 → 修复代码
- 决策任务:在交互式环境中(如ALFWorld)完成多步任务
- 推理任务:在需要多次尝试的复杂推理问题中逐步逼近正确答案
ToT (Tree of Thoughts)
基本原理
ToT(Tree of Thoughts,思维树)由Yao et al. (2024)在论文《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》中提出。如果说CoT是一条线性的推理链,那么ToT则将推理过程拓展为一棵树状结构,允许模型在多个可能的推理方向上进行探索和回溯。
ToT的核心思想是:
- 思维分解:将问题的解决过程分解为若干中间步骤(thoughts)
- 多路径生成:在每个步骤上生成多个候选思维
- 评估与选择:对每个候选思维进行评估(可由LLM自身评估或外部评估)
- 搜索策略:使用系统化的搜索算法在思维树中寻找最优路径
搜索策略:BFS vs DFS
ToT支持两种经典的搜索策略:
广度优先搜索 (BFS):
- 在每一层保留最有希望的 \(k\) 个节点
- 适合需要全局比较的问题
- 优势:不容易错过全局最优解
- 劣势:内存和计算开销较大
深度优先搜索 (DFS):
- 沿着最有希望的分支一路深入
- 遇到死路时回溯到上一层,尝试其他分支
- 适合搜索空间很深但正确路径相对集中的问题
- 优势:内存效率高
- 劣势:可能陷入局部最优
与CoT的关键区别
| 特性 | CoT | ToT |
|---|---|---|
| 推理结构 | 线性链 | 树状结构 |
| 候选路径 | 1条(或SC中多条独立链) | 每步多个分支,可回溯 |
| 搜索策略 | 无(顺序生成) | BFS / DFS |
| 中间评估 | 无 | 每步评估候选思维 |
| 适用场景 | 一般推理任务 | 需要探索和回溯的复杂问题 |
| 计算开销 | 低 | 较高(多次LLM调用) |
典型应用
ToT在以下类型的问题中优势明显:
- 24点游戏:用4个数字和四则运算得到24,需要尝试多种组合
- 创意写作:需要探索不同的叙事方向并选择最佳路径
- 数学证明:需要尝试不同的证明策略
Plan-and-Execute
基本原理
Plan-and-Execute是一种相对稳健的Agent设计思路,其核心在于将规划与执行解耦:
- 规划 (Planning):首先,让LLM完整地分析用户需求,并制定出一个详细的、分步骤的行动计划(Plan)
- 执行 (Executing):然后,Agent(或另一个LLM)严格按照这个计划,一步一步地执行,直到计划完成
这种设计的灵感来源于经典AI规划领域,与ReAct的"边想边做"形成鲜明对比——Plan-and-Execute强调"先想清楚,再动手做"。
LLMCompiler
LLMCompiler (Kim et al., 2024) 是Plan-and-Execute模式的一个重要优化。其核心思想是:在规划阶段生成一个任务DAG(有向无环图),然后识别其中可以并行执行的任务,从而大幅提升执行效率。
工作流程:
- Planner:分析任务依赖关系,生成任务DAG
- Task Fetching Unit:调度可并行的任务同时执行
- Joiner:汇总所有任务结果,判断是否需要重新规划
动态重规划 (Replanning)
在实际应用中,初始计划往往无法完美执行——环境可能发生变化,某些步骤可能失败,或者执行过程中发现了新的信息。因此,现代Plan-and-Execute框架通常支持动态重规划:
- 每执行完一个步骤后,评估当前状态
- 如果发现偏离预期,触发重规划
- 基于已完成的步骤和新信息,生成更新后的计划
- 继续执行更新后的计划
这种机制使得Plan-and-Execute在保持结构化优势的同时,也具备了一定的灵活性。
各方法对比总结
| 方法 | 核心思想 | 推理结构 | 外部交互 | 自我修正 | 计算开销 | 典型应用场景 |
|---|---|---|---|---|---|---|
| CoT | 逐步推理 | 线性链 | 无 | 无(SC可部分弥补) | 低 | 数学推理、常识问答 |
| ReAct | 思考-行动交替 | 线性循环 | 有(工具调用) | 通过观察修正 | 中 | 信息检索、多步任务 |
| Reflexion | 从失败中反思 | 多轮迭代 | 可有 | 有(语言反思) | 中~高 | 代码生成、决策任务 |
| ToT | 树状探索 | 树状结构 | 无 | 通过回溯修正 | 高 | 需要搜索的创意/数学问题 |
| Plan-and-Execute | 先规划后执行 | 分阶段 | 有(工具调用) | 动态重规划 | 中 | 复杂多步工作流 |
如何选择
- 简单推理任务:CoT已足够
- 需要外部信息的任务:ReAct
- 允许多次尝试且有明确反馈的任务:Reflexion
- 搜索空间大、需要探索的问题:ToT
- 结构化的多步工作流:Plan-and-Execute
在实际的Agent系统中,这些推理模式往往不是孤立使用的,而是根据任务特点进行组合。例如,一个Agent可能使用Plan-and-Execute进行整体规划,在每个执行步骤中使用ReAct与工具交互,并在失败时触发Reflexion进行反思和重试。