1. 引言
在人工智能领域,Agent(智能体)之所以区别于传统的聊天机器人,核心在于其具备感知、规划、记忆和使用工具的能力。而决定 Agent 如何思考、如何决策以及如何执行任务的底层逻辑,被称为"认知框架"。认知框架是 AI Agent 的大脑结构,从基础的思维链到复杂的反思机制,每种框架都在试图解决大模型幻觉、逻辑断层或工具使用不当的问题
选择合适的认知框架,直接决定了 Agent 的任务成功率、响应速度以及成本消耗。本文介绍最常用的五种认知框架:思维链(CoT)、思维树(ToT)、ReAct、Plan-and-Execute 以及 Reflexion。开发者应根据业务对成本、延迟和准确率的具体要求,灵活选择或组合使用上述框架。
2. 思维链(Chain of Thought, CoT)
2.1 核心原理
思维链是最基础的推理框架。它的核心思想是引导大模型不要直接输出答案,而是将复杂问题分解为多个中间步骤,一步一步进行推理。通过展示推理过程,模型能够显著提高在数学、逻辑推理等任务上的准确率。
2.2 工作流程
-
接收用户问题。
-
模型生成"让我们一步步思考"的提示。
-
模型输出中间推理步骤。
-
模型输出最终结论。
2.3 代码案例
# 伪代码示例:CoT 推理过程
def cot_reasoning(question):
prompt = f"""
问题:{question}
请一步步思考并解答:
"""
# 调用大模型
response = llm.generate(prompt)
return response
# 输入
question = "罗杰有 5 个网球,又买了两筒网球,每筒有 3 个,他现在有多少个?"
# 模型输出示例
# 1. 罗杰最初有 5 个球。
# 2. 买了 2 筒,每筒 3 个,即 2 * 3 = 6 个。
# 3. 总数是 5 + 6 = 11 个。
# 答案:11 个。
2.4 优缺点
优点:实现简单,显著提升逻辑推理能力,无需额外训练。 缺点:仅适用于文本推理,无法与外部工具交互,无法处理需要多路径探索的复杂任务。
2.5 案例
1.项目背景
某金融机构需要开发一个内部工具,能够自动读取长篇上市公司财报,并提取关键财务指标(如营收增长率、净利润、现金流等),最后生成简短的投资建议。
2.框架应用
在这个场景中,模型不需要调用外部工具,也不需要多路径探索,核心难点在于处理长文本的逻辑一致性。使用思维链(CoT)框架,强制模型在给出投资建议前,先列出提取到的数据依据。
3.工作流程
输入:上传某公司 2023 年年度财报 PDF 文本。
思维步骤 1:模型首先提取“总营收”数值。
思维步骤 2:模型提取“去年同期营收”数值。
思维步骤 3:模型计算增长率((今年 - 去年)/去年)。
思维步骤 4:模型提取“净利润”数值并判断盈亏。
最终输出:基于上述步骤,生成“买入/持有/卖出”建议。
4.为什么选择 CoT
该任务属于典型的逻辑推理任务。如果直接让模型生成建议,容易出现幻觉(胡乱编造数据)。通过 CoT 强制模型展示计算过程,开发人员可以核查中间步骤的准确性,显著提高了数据提取的可靠性。
3. 思维树(Tree of Thoughts, ToT)
3.1 核心原理
思维树是思维链的升级版。它允许模型在推理过程中探索多条可能的路径,形成树状结构。模型可以对每个思维步骤进行评估,选择最优路径继续,或者在遇到死胡同时回溯(Backtracking)。这模拟了人类面对难题时的"试错"过程。
3.2 工作流程
-
将问题分解为多个思维步骤。
-
每一步生成多个可能的选项(分支)。
-
评估每个选项的价值。
-
通过搜索算法(如 BFS 或 DFS)选择最佳路径。
-
回溯或继续直到找到解决方案。
3.3 代码案例
# 伪代码示例:ToT 搜索逻辑
def tot_solve(problem):
root = ThoughtNode(content=problem)
queue = [root]
while queue:
current_node = queue.pop(0)
# 1. 生成多个可能的下一步思维
next_thoughts = llm.generate_thoughts(current_node, num_branches=3)
for thought in next_thoughts:
# 2. 评估该思维的价值
score = llm.evaluate(thought)
node = ThoughtNode(content=thought, score=score, parent=current_node)
if is_solution(node):
return get_path(node)
if score > threshold:
queue.append(node)
# 如果分数低,则剪枝,不加入队列
return "未找到解决方案"
3.4 优缺点
优点:适合解决创意写作、复杂数学证明等需要全局规划的问题,具备自我纠错能力。 缺点:计算成本高,延迟大,需要多次调用模型进行评估和生成。
3.5 案例
1.项目背景
一家游戏公司希望开发一款 AI 驱动的文字冒险游戏。玩家需要扮演侦探破案,AI 作为游戏主持人(DM),需要根据玩家的选择生成合理的剧情分支,保证故事逻辑严密且有趣。
2.框架应用
剧情生成具有高度的不确定性,一条路径可能导致故事过早结束或逻辑矛盾。思维树(ToT)框架允许 AI 在后台预演多种剧情走向,评估哪种最精彩,再呈现给玩家。
3.工作流程
当前状态:玩家在仓库发现了一把带血的钥匙。
分支生成:模型生成三个可能的后续剧情:
分支 A:钥匙是凶手的,玩家被埋伏。
分支 B:钥匙是受害者的,指向另一个地点。
分支 C:钥匙是陷阱,引发爆炸。
评估:模型对三个分支进行打分(趣味性、逻辑性、连贯性)。
选择:分支 B 得分最高,被选中作为正式剧情输出给玩家。
回溯:如果玩家后续操作导致死胡同,系统可回溯到上一个节点重新生成分支。
4.为什么选择 ToT
创意类任务没有标准答案,需要全局规划。ToT 的多路径搜索能力避免了故事走向平庸或逻辑崩坏,提升了用户体验。虽然成本较高,但对于游戏内容生成来说,质量优于速度。
4. ReAct(Reasoning + Acting)
4.1 核心原理
ReAct 是目前最主流的 Agent 框架。它将"推理"(Reasoning)与"行动"(Acting)结合在一起。模型在生成动作之前先进行推理,然后根据动作的执行结果(Observation)再进行下一步推理。这种交替循环使得模型能够利用外部工具(如搜索引擎、计算器)来解决知识缺失或计算问题。
4.2 工作流程
-
思考(Thought):分析当前情况,决定下一步做什么。
-
行动(Action):调用工具或 API。
-
观察(Observation):获取工具返回的结果。
-
循环:基于观察结果再次思考,直到完成任务。
4.3 代码案例
# 伪代码示例:ReAct 循环
def react_agent(task):
history = []
while not is_finished(task):
# 1. 生成思考和行动
prompt = build_prompt(task, history)
response = llm.generate(prompt)
# 解析出 Thought 和 Action
thought, action, action_input = parse_response(response)
# 2. 执行行动
observation = execute_tool(action, action_input)
# 3. 记录历史
history.append({
"thought": thought,
"action": action,
"observation": observation
})
return history[-1]["thought"] # 最终答案
4.4 优缺点
优点:可解释性强,能够利用外部工具弥补模型知识短板,灵活适应动态环境。 缺点:串行执行效率较低,每一步都需要调用模型,Token 消耗较快。
4.5 案例
1.项目背景
某大型互联网公司的内部运维团队需要一个机器人,帮助员工处理常见 IT 问题,如重置密码、查询服务器状态、重启服务等。机器人需要权限验证和操作执行。
2.框架应用
这是典型的需要与外部系统交互的场景。机器人不能只靠内部知识,必须调用 API。ReAct 框架的“推理 - 行动 - 观察”循环非常适合此类任务。
3.工作流程
用户请求:帮我重启测试环境的数据库服务。
思考(Thought):用户需要重启服务,我需要先确认他的权限,然后执行重启命令。
行动(Action):调用 check_permission_api(user_id)。
观察(Observation):返回结果“权限不足”。
思考(Thought):用户权限不足,不能直接重启,需要引导其申请权限。
行动(Action):调用 send_reply_api("抱歉,您没有权限...")。
结束:任务完成。
4.为什么选择 ReAct
运维任务高度依赖实时状态和工具权限。ReAct 允许模型根据工具返回的实际结果(如权限不足、服务已停止)动态调整下一步策略,而不是盲目执行预设指令,极大地提高了操作的安全性。
5. Plan-and-Execute(计划 - 执行)
5.1 核心原理
该框架将任务分为两个阶段:规划阶段和执行阶段。首先由一个规划器(Planner)生成完整的任务步骤列表,然后由执行器(Executor)依次执行这些步骤。这种结构适合流程固定、步骤清晰的任务。
5.2 工作流程
-
规划器接收任务,生成步骤列表 [Step 1, Step 2, Step 3...]。
-
执行器遍历列表,依次执行每个步骤。
-
如有必要,可根据执行结果重新规划。
5.3 代码案例
# 伪代码示例:计划与执行
def plan_and_execute(task):
# 阶段 1:规划
plan_prompt = f"为任务生成步骤计划:{task}"
plan = llm.generate(plan_prompt)
# 假设输出为列表:["搜索天气", "查找穿衣建议", "总结"]
# 阶段 2:执行
results = []
for step in plan:
result = execute_step(step)
results.append(result)
# 阶段 3:合成最终结果
final_answer = llm.synthesize(results)
return final_answer
5.4 优缺点
优点:全局视角好,减少中途迷路的风险,执行阶段可使用小模型降低成本。 缺点:灵活性较差,遇到计划外情况需要重新规划,导致延迟增加。
5.5 案例
1.项目背景
某旅游平台希望推出一个 AI 规划师,用户输入目的地和天数,系统生成包含机票、酒店、景点、交通的完整行程单,并支持预订链接。
2.框架应用
旅行规划是一个强流程化的任务,必须先定机票再定酒店,最后安排景点。Plan-and-Execute 框架的“先规划后执行”模式能确保步骤不乱。
3.工作流程
规划阶段:
步骤 1:搜索往返机票。
步骤 2:根据机票时间搜索附近酒店。
步骤 3:搜索目的地热门景点。
步骤 4:规划每日路线。
步骤 5:生成最终 PDF 行程单。
执行阶段:
执行器依次调用机票 API、酒店 API、景点数据库。
将每一步的结果传递给下一步(例如将机票到达时间传递给酒店搜索模块)。
输出:完整的行程文档。
4.为什么选择 Plan-and-Execute
该任务步骤固定且依赖性强(没有到达时间无法推荐酒店)。先生成完整计划可以避免执行过程中遗漏关键环节。同时,规划阶段可以一次性完成,执行阶段可以批量处理,效率较高。
6. Reflexion(反思 - 迭代)
6.1 核心原理
Reflexion 框架强调"自我反思"。Agent 在执行任务后,会对结果进行评估。如果失败,它会生成反思文本,记录错误原因,并将这些反思存入记忆。在下一次尝试中,模型会参考之前的反思来避免重复错误。
6.2 工作流程
-
尝试执行任务。
-
评估执行结果(成功/失败)。
-
如果失败,生成反思内容(为什么失败,如何改进)。
-
将反思加入上下文,重新尝试。
-
直到成功或达到最大尝试次数。
6.3 代码案例
# 伪代码示例:Reflexion 循环
def reflexion_agent(task, max_trials=3):
memory = [] # 存储反思
for i in range(max_trials):
# 1. 尝试执行
response = llm.generate(task, context=memory)
result = execute(response)
# 2. 评估
feedback = evaluate(result)
if feedback.is_success:
return result
# 3. 生成反思并存入记忆
reflection = llm.reflect(response, feedback)
memory.append(f" trial {i} reflection: {reflection}")
return "任务失败"
6.4 优缺点
优点:具备自我进化能力,无需外部训练即可从错误中学习,适合代码生成等高精度任务。 缺点:可能需要多次迭代才能成功,耗时较长。
6.5 案例
1.项目背景
某软件开发团队希望引入一个 AI 助手,自动检测代码仓库中的 Bug 并提供修复补丁。由于代码编译报错信息复杂,一次性修复成功率低,需要反复尝试。
2.框架应用
代码修复是一个典型的“试错”过程。Reflexion 框架通过引入“反思”机制,让模型记住之前的错误原因,在下一次生成代码时避免重犯。
3.工作流程
第一次尝试:模型生成修复代码补丁。
执行测试:运行单元测试,发现报错“空指针异常”。
反思(Reflection):模型分析错误日志,生成反思文本:“上次修复未检查对象是否为空,下次需要增加判空逻辑”。
记忆存储:将反思文本存入上下文。
第二次尝试:模型结合原始代码和反思文本,生成新补丁(增加了判空逻辑)。
执行测试:测试通过,任务结束。
4.为什么选择 Reflexion
代码任务对准确性要求极高。普通框架一旦生成错误代码就可能终止,而 Reflexion 允许模型从错误中学习,显著提高了复杂 Bug 修复的成功率,模拟了人类程序员调试代码的过程。
7. 框架对比总结
下表总结了五种框架的核心差异,便于开发者选型。
| 框架 | 核心逻辑 | 工具交互 | 计算成本 | 适合场景 | 灵活性 |
|---|---|---|---|---|---|
| CoT | 线性逐步推理 | 无 | 低 | 逻辑题、数学题 | 低 |
| ToT | 多路径搜索与回溯 | 无 | 极高 | 创意写作、复杂规划 | 中 |
| ReAct | 推理与行动交替 | 强支持 | 高 | 问答、工具调用、搜索 | 高 |
| Plan-and-Execute | 先规划后执行 | 支持 | 中 | 结构化工作流、多步骤任务 | 中 |
| Reflexion | 执行后反思改进 | 支持 | 高 | 代码生成、高精度决策 | 高 |
以下表格总结了五个案例的核心特征:
| 框架 | 代表案例 | 核心优势 | 核心劣势 | 关键决策指标 |
|---|---|---|---|---|
| CoT | 财务研报分析 | 逻辑清晰,可解释性强 | 无法调用工具,无法多路径探索 | 任务是否仅需文本推理? |
| ToT | 侦探游戏生成 | 全局最优,创意丰富 | 成本高,延迟大,实现复杂 | 是否需要多方案择优? |
| ReAct | IT 运维机器人 | 灵活交互,工具利用率高 | 串行执行,步骤多时易迷失 | 是否需频繁调用外部工具? |
| Plan-and-Execute | 旅行行程规划 | 流程可控,步骤完整 | 灵活性差,遇意外需重规划 | 任务步骤是否固定清晰? |
| Reflexion | 代码修复助手 | 自我纠错,准确率随迭代提升 | 耗时较长,需多次尝试 | 是否允许试错且要求高准确率? |
8. 选型建议
在实际开发中,没有绝对最好的框架,只有最适合场景的框架。以下是具体的选型建议:
-
简单推理任务 :如果任务仅涉及逻辑计算或文本分析,不需要调用外部工具,直接使用 CoT 即可,成本最低。
-
需要调用工具 :如果 Agent 需要搜索网络、查询数据库或调用 API,ReAct 是首选标准方案,生态支持最完善。
-
复杂长流程任务 :如果任务步骤固定且较长(如数据处理流水线),Plan-and-Execute 能提供更好的全局控制。
-
高准确率要求 :对于代码生成或关键决策任务,建议结合 Reflexion,让模型有机会自我纠错。
-
探索性任务 :对于需要创意或多路径探索的任务(如游戏策略、故事创作),可以考虑 ToT,但需注意成本控制。
通过项目案例,我们可以看出,没有一种框架是万能的:
-
如果你的任务是纯文本处理且逻辑复杂 ,如合同审查、数学题解答,请优先选择 CoT。
-
如果你的任务需要高度创意或多路径决策 ,如游戏剧情、战略模拟,请考虑 ToT。
-
如果你的任务核心是操作外部系统 ,如客服机器人、数据查询,ReAct 是行业标准。
-
如果你的任务流程固定且步骤繁多 ,如数据清洗流水线、行程规划,Plan-and-Execute 更稳定。
-
如果你的任务对准确率要求极高且允许重试 ,如代码生成、SQL 编写,Reflexion 能带来质的提升。