本文是《从零开始构建智能体》第四章学习笔记,深入分析 ReAct、Plan-and-Solve、Reflection 三种经典范式的原理与代码实现。

引言

在上一章中,我们深入探讨了作为智能体"大脑"的大语言模型(LLM)。但光有大脑不够,智能体还需要能够与外部世界交互、调用工具、自主决策。

本章将介绍三种经典的智能体架构范式,帮助你理解如何组织智能体的"思考"与"行动"过程。


一、为什么需要范式?

智能体面临的核心挑战:

  1. 幻觉问题:LLM 可能产生错误信息

  2. 推理循环:在复杂任务中可能陷入无限循环

  3. 工具滥用:错误使用工具导致任务失败

为了解决这些问题,业界总结出了三种经典范式。


二、三种经典范式

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)

通过自反思机制过滤检索结果中的噪音,通过跨章节整合确保结果来自不同古籍(伤寒论、金匮要略、温病条辨等),提高回答的可信度。


五、总结

  1. ReAct:适合需要动态调整的任务,强调"边做边想"

  2. Plan-and-Solve:适合步骤明确的任务,强调"三思而后行"

  3. Reflection:适合需要高质量输出的任务,强调"反思修正"

在实际开发中,这三种范式并非互斥,可以根据具体场景组合使用。例如,一个复杂的智能体系统可能同时具备 ReAct 的动态调整能力和 Reflection 的质量保证能力。


参考资料

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐