智能体Agent的经典构建方式:ReAct、Plan-and-Solve和Reflection
react:思考与行动结合
ReAct由Shunyu Yao在2022年提出,核心思想是模仿人类解决问题的过程,将推理和行动明确结合起来,形成"思考-行动-观察"的循环。
在ReAct出现之前,主要方法分两类:一类是"纯思考"型,比如思维链,能引导模型进行复杂推理,但无法与外部交互,容易产生错误信息;另一类是"纯行动"型,模型直接输出要执行的动作,但缺少规划和纠正错误的能力。
ReAct巧妙之处在于认识到思考和行动是互相促进的。思考指导行动,行动结果又反过来修正思考。为此,ReAct通过特定的提示方式来引导模型,让每一步输出都遵循固定模式:
思考 (Thought):
这是智能体的"内心想法"。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步结果。
行动 (Action):
这是智能体决定采取的具体动作,通常是调用外部工具,比如Search['华为最新款手机']。
观察 (Observation):
这是执行行动后从外部工具返回的结果,比如搜索结果的摘要或api的返回值。
适用场景:
需要外部知识的任务:查询实时信息(天气、新闻、股价)、搜索专业领域知识
需要精确计算的任务:把数学问题交给计算器工具,避免大语言模型的计算错误
需要与API交互的任务:操作数据库、调用服务API完成特定功能
代码示例:
class ReActAgent:
def __init__(self):
self.memory = []
def react_cycle(self, query):
# 思考阶段
thought = self.think(query)
self.memory.append(f"Thought: {thought}")
# 行动阶段
action = self.decide_action(thought)
self.memory.append(f"Action: {action}")
# 观察阶段
observation = self.execute_action(action)
self.memory.append(f"Observation: {observation}")
# 继续循环直到完成
return thought, action, observation
def think(self, query):
# 实现思考逻辑
return f"我需要先搜索关于{query}的最新信息"
def decide_action(self, thought):
if "搜索" in thought:
return f"Search[{thought.split('搜索')[-1]}]"
return "思考下一步"
def execute_action(self, action):
# 模拟执行动作
return "搜索结果:相关数据..."Plan-and-Solve:先规划后执行
Plan-and-Solve,顾名思义,这种模式将任务处理明确分为两个阶段:先规划,后执行。核心目的是解决思维链在处理多步骤、复杂问题时容易"跑偏"的问题。与ReAct将思考和行动融合在每一步不同,Plan-and-Solve将整个流程分成两个核心阶段:
规划阶段 (Planning Phase):
首先,智能体接收用户的完整问题。第一个任务不是直接去解决问题或调用工具,而是将问题分解,制定出清晰、分步骤的行动计划。
执行阶段 (Solving Phase):
获得完整计划后,智能体进入执行阶段。它会严格按照计划中的步骤,逐一执行。每一步的执行都可能是一次独立的大语言模型调用,或者是对上一步结果的加工处理,直到计划中所有步骤都完成,最终得出答案。
适用场景:
多步数学应用题:需要先列出计算步骤,再逐一求解
需要整合多个信息源的报告撰写:需要先规划好报告结构,再逐一填充内容
代码生成任务:需要先构思好函数、类和模块的结构,再逐一实现
代码示例:
class PlanAndSolveAgent:
def __init__(self):
self.plan = []
self.solution = ""
def process(self, problem):
# 规划阶段
self.create_plan(problem)
print("规划完成:", self.plan)
# 执行阶段
for step in self.plan:
result = self.execute_step(step)
self.solution += f"\n步骤{step}: {result}"
return self.solution
def create_plan(self, problem):
# 根据问题类型创建计划
if "数学题" in problem:
self.plan = [
"分析问题类型",
"列出已知条件",
"制定解题步骤",
"逐步计算",
"验证答案"
]
elif "写报告" in problem:
self.plan = [
"确定报告结构",
"收集相关资料",
"撰写引言部分",
"撰写主体内容",
"撰写结论部分",
"检查修改"
]
def execute_step(self, step_description):
# 执行单个步骤
if step_description == "分析问题类型":
return "这是一个代数应用题"
elif step_description == "列出已知条件":
return "已知:速度、时间、距离"
# ... 其他步骤执行逻辑
return "步骤执行完成"Reflection:自我反思优化
Reflection机制的核心思想是为智能体引入事后自我校正的循环,让它能像人类一样,检查自己的工作,发现不足,并进行迭代优化。核心工作流程可以概括为三步循环:执行 → 反思 → 优化。
执行 (Execution):
首先,智能体用熟悉的方法(如ReAct或Plan-and-Solve)尝试完成任务,生成初步的解决方案或行动轨迹。可以看作是"初稿"。
反思 (Reflection):
接着,智能体进入反思阶段。它会调用一个独立的、或者有特殊提示的大语言模型实例,扮演"评审员"角色。这个"评审员"会检查第一步生成的"初稿",从多个角度评估:
事实错误:是否有与常识或已知事实不符的内容?
逻辑漏洞:推理过程是否有不连贯或矛盾的地方?
效率问题:是否有更直接、更简洁的方法来完成任务?
遗漏信息:是否忽略了问题的某些关键约束或方面?
根据评估,生成结构化的反馈,指出具体问题和改进建议。
优化 (Refinement):
最后,智能体将"初稿"和"反馈"作为新的上下文,再次调用大语言模型,要求它根据反馈内容修正初稿,生成更完善的"修订稿"。
Reflection机制是典型的"用成本换质量"策略。非常适合对最终结果的质量、准确性和可靠性有极高要求,且对任务完成的实时性要求相对宽松的场景。
适用场景:
生成关键的业务代码或技术报告
科学研究中的复杂逻辑推演
需要深度分析和规划的决策支持系统
代码示例:
class ReflectionAgent:
def __init__(self):
self.drafts = []
self.feedbacks = []
self.final_results = []
def execute_with_reflection(self, task):
# 第一轮:执行
draft = self.execute_task(task)
self.drafts.append(draft)
# 最多进行3轮反思优化
for i in range(3):
print(f"第{i+1}轮反思优化...")
# 反思:检查初稿
feedback = self.reflect_on_draft(draft)
self.feedbacks.append(feedback)
# 优化:根据反馈改进
refined_draft = self.refine_draft(draft, feedback)
# 检查是否还需要继续优化
if self.is_good_enough(refined_draft, feedback):
self.final_results.append(refined_draft)
return refined_draft
draft = refined_draft
return draft
def execute_task(self, task):
# 初始执行逻辑
return f"初始解决方案:{task}"
def reflect_on_draft(self, draft):
# 反思逻辑:检查问题
issues = []
if "错误" in draft:
issues.append("发现事实错误")
if "逻辑矛盾" in draft:
issues.append("发现逻辑漏洞")
if "效率低下" in draft:
issues.append("可以优化效率")
return f"反馈:需要改进的问题:{', '.join(issues)}"
def refine_draft(self, draft, feedback):
# 根据反馈优化
return f"优化后的方案:基于反馈{feedback}改进了{draft}"
def is_good_enough(self, draft, feedback):
# 判断是否达到质量要求
return "没有发现问题" in feedback or "问题已解决" in draft实际应用示例:综合使用三种模式
class IntelligentAssistant:
def __init__(self):
self.react_agent = ReActAgent()
self.plan_agent = PlanAndSolveAgent()
self.reflect_agent = ReflectionAgent()
def solve_complex_problem(self, problem):
print(f"处理问题:{problem}")
# 根据问题复杂度选择方法
if self.is_simple_query(problem):
# 简单问题用ReAct
result = self.react_agent.react_cycle(problem)
print("使用ReAct模式")
elif self.is_structured_problem(problem):
# 结构化问题用Plan-and-Solve
result = self.plan_agent.process(problem)
print("使用Plan-and-Solve模式")
else:
# 复杂重要问题用Reflection
result = self.reflect_agent.execute_with_reflection(problem)
print("使用Reflection模式")
# 最后用Reflection检查所有结果
final_result = self.reflect_agent.refine_draft(
str(result),
"最终检查:确保结果准确完整"
)
return final_result
def is_simple_query(self, problem):
# 判断是否简单查询
simple_keywords = ["搜索", "查询", "查找", "什么是"]
return any(keyword in problem for keyword in simple_keywords)
def is_structured_problem(self, problem):
# 判断是否结构化问题
structured_keywords = ["步骤", "计划", "方案", "计算", "编程"]
return any(keyword in problem for keyword in structured_keywords)选择建议
简单交互任务:用ReAct模式
实时查询
简单信息获取
快速响应场景
结构化任务:用Plan-and-Solve模式
项目规划
代码生成
报告撰写
高质量要求任务:用Reflection模式
重要文档编写
关键代码审查
复杂问题求解
混合使用:根据任务类型灵活组合
先用Plan-and-Solve制定计划
用ReAct执行具体步骤
用Reflection检查和优化结果
总结
三种智能体构建方式各有特点,适用于不同场景:
ReAct:适合需要与外部交互的实时任务
Plan-and-Solve:适合结构化的复杂任务
Reflection:适合对质量要求极高的关键任务
理解这些模式的特点和适用场景,能帮助你设计出更智能、更可靠的AI应用系统。在实际开发中,可以根据具体需求选择合适的模式,或者组合使用多种模式,达到最佳效果。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!