从零实现智能体:深入理解三种经典范式
本文分析了智能体开发的三种经典范式:ReAct范式通过"思考-行动-观察"循环实现边想边做,适合需要实时信息的任务;Plan-and-Solve范式先制定完整计划再执行,适用于步骤明确的多步任务;Reflection范式通过自我反思修正结果,能提高回答质量。作者结合中医RAG系统开发实践,指出实际应用中往往需要融合多种范式优势。这三种范式各有适用场景,开发者可根据任务特点灵活组
本文是《从零开始构建智能体》第四章学习笔记,深入分析 ReAct、Plan-and-Solve、Reflection 三种经典范式的原理与代码实现。
引言
在上一章中,我们深入探讨了作为智能体"大脑"的大语言模型(LLM)。但光有大脑不够,智能体还需要能够与外部世界交互、调用工具、自主决策。
本章将介绍三种经典的智能体架构范式,帮助你理解如何组织智能体的"思考"与"行动"过程。
一、为什么需要范式?
智能体面临的核心挑战:
-
幻觉问题:LLM 可能产生错误信息
-
推理循环:在复杂任务中可能陷入无限循环
-
工具滥用:错误使用工具导致任务失败
为了解决这些问题,业界总结出了三种经典范式。
二、三种经典范式
1. ReAct:边想边做
核心思想:让智能体在推理过程中同时调用工具,实现"思考-行动-观察"的循环。
用户:今天天气怎么样? ↓ 思考:需要查天气 ↓ 行动:调用天气API ↓ 观察:返回"晴,25度" ↓ 判断:已回答,停止 回答:今天天气晴,25度
代码实现:
def react_agent(query, llm, tools):
# 1. 思考
thought = llm.generate(f"分析这个问题: {query}")
# 2. 决定行动
action = llm.generate(f"决定调用哪个工具: {thought}")
# 3. 执行
result = tools[action].execute(query)
# 4. 观察
observation = result
# 5. 判断是否完成(关键!)
if llm.generate(f"问题{query}是否已回答? {observation}"):
return observation
# 6. 循环
return react_agent(query, llm, tools)
停止条件:由 LLM 自主判断"问题是否已回答",而不是人为规定循环次数。
适用场景:
-
需要实时信息的任务(天气、股票、新闻)
-
多步推理且需要外部知识的任务
2. Plan-and-Solve:三思而后行
核心思想:先制定完整计划,再按计划执行。
用户:帮我规划一周的健康饮食 ↓ 计划:①查每日卡路里需求 ②选食材 ③列购物清单 ↓ 执行:查卡路里 → 选食材 → 列清单 ↓ 汇总:生成完整计划 回答:一周健康饮食计划
代码实现:
def plan_and_solve_agent(query, llm, tools):
# 1. 制定计划
plan = llm.generate(f"制定解决步骤: {query}")
# 2. 分解步骤
steps = plan.split("\n")
# 3. 逐个执行
results = []
for step in steps:
result = tools[step].execute(query)
results.append(result)
# 4. 汇总结果
final_answer = llm.generate(f"综合结果: {results}")
return final_answer
vs ReAct:
-
ReAct:动态调整,随机应变
-
Plan-and-Solve:先想好再动手,稳定但不够灵活
适用场景:
-
复杂多步骤任务(旅行规划、项目管理)
-
步骤明确、可预判的任务
3. Reflection:反思修正
核心思想:让智能体能反思自己的回答,通过自我批判和修正来优化结果。
用户:解释什么是中医的辨证论治 ↓ 生成初始回答:辨证论治是... ↓ 反思:回答是否准确?有没有遗漏? ↓ 判断:需要修正 → 补充内容 → 修正后回答 回答:(更完善的版本)
代码实现:
def reflection_agent(query, llm, tools):
# 1. 生成初始回答
initial_answer = llm.generate(query)
# 2. 反思
reflection = llm.generate(f"反思这个回答: {initial_answer}")
# 3. 判断是否需要修正
needs_correction = llm.generate(f"需要修正吗? {reflection}")
if needs_correction == "是":
# 4. 修正
corrected_answer = llm.generate(f"修正: {initial_answer} 基于 {reflection}")
return corrected_answer
return initial_answer
适用场景:
-
需要高质量输出的任务
-
复杂概念的解释(中医理论等)
-
需要避免幻觉的严谨场景
三、三种范式对比
| 范式 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| ReAct | 边想边做 | 灵活、动态调整 | 可能过度循环 | 实时信息、多步推理 |
| Plan-and-Solve | 先计划后执行 | 稳定、可预测 | 不够灵活 | 复杂多步骤任务 |
| Reflection | 反思修正 | 质量高、避免幻觉 | 额外调用开销 | 高质量输出、严谨场景 |
四、我的中医RAG系统属于哪种范式?
在开发中医问诊RAG系统过程中,我逐渐意识到系统实际上融合了多种范式思想:
ReAct 思想
# query检索流程:分析问题 → 检索 → 获取结果 → 生成回答 response, context = rag_pipeline.query( user_query, patient_info=patient_info, history_context=history_context )
Reflection 思想
# 自反思:过滤噪音 candidates = self._self_reflection(query, candidates) # 跨章节整合:多书籍合并 candidates = self._cross_chapter_merge(candidates, top_k)
通过自反思机制过滤检索结果中的噪音,通过跨章节整合确保结果来自不同古籍(伤寒论、金匮要略、温病条辨等),提高回答的可信度。
五、总结
-
ReAct:适合需要动态调整的任务,强调"边做边想"
-
Plan-and-Solve:适合步骤明确的任务,强调"三思而后行"
-
Reflection:适合需要高质量输出的任务,强调"反思修正"
在实际开发中,这三种范式并非互斥,可以根据具体场景组合使用。例如,一个复杂的智能体系统可能同时具备 ReAct 的动态调整能力和 Reflection 的质量保证能力。
参考资料
更多推荐



所有评论(0)