1、react和Plan-and-Execute是什么,分别在什么场景下使用?
ReAct(Reason + Act)与 Plan-and-Execute(规划 - 执行)是大语言模型(LLM)驱动智能体(Agent)的两大核心范式,核心差异在于推理与执行的时序关系——ReAct 走 “边想边做” 的即时迭代路线,Plan-and-Execute 走 “先定方案再执行” 的结构化流水线路线。以下结合典型场景与技术栈展开说明。
一、ReAct:边想边做的即时迭代范式
1. 核心逻辑
遵循 思考→行动→观察→再思考 的闭环循环,LLM 每一步决策都依赖实时外部反馈,适合动态不确定环境。例如回答 “北京今日天气并对比上海温差” 时,先思考 “需查两地天气”,行动调用天气 API,观察结果后再思考 “是否计算温差、如何组织答案”。
2. 典型场景与示例
| 典型场景 | 具体示例 | 适用原因 |
|---|---|---|
| 实时数据问答 | “查询今日美元兑人民币汇率,计算 1 万元可兑换金额” | 依赖实时外部数据,需即时调用 API 获取最新结果 |
| 多跳信息检索 | “对比 2025 年中美欧新能源车销量与政策差异,给出投资建议” | 需多轮搜索、筛选、整合信息,动态调整检索方向 |
| 运维故障排查 | “分析服务器 500 错误原因,定位日志并给出修复方案” | 故障场景动态多变,需根据中间结果(如日志关键词)调整排查步骤 |
| 代码辅助开发 | “写一个 Java 递归转非递归工具类,并用 JUnit 测试” | 需分步编写代码、执行测试、调试报错,动态调整实现逻辑 |
| 日程与邮件自动化 | “给项目组 5 人发会议邀请,附日程并抄送领导邮箱” | 需分步查询联系人、组装邮件内容、调用发送 API,中途可验证参数 |
3. 核心技术栈
| 技术层级 | 核心工具 / 框架 | 作用 |
|---|---|---|
| LLM 基础层 | OpenAI API、DeepSeek、Claude、Ollama(本地部署) | 提供推理能力,生成 “思考 - 行动” 决策 |
| 工具调用层 | LangChain、LangGraph、AutoGen、DSPy | 封装工具(API、数据库、代码执行器),实现 Agent 与外部系统交互 |
| 搜索与数据层 | SerpAPI、DuckDuckGo、Wikipedia API、Weather API | 获取实时 / 权威外部信息,抑制幻觉 |
| 开发与部署层 | Python/TypeScript、FastAPI、Docker、Kubernetes | 实现 Agent 服务化、容器化部署,支持高可用 |
| 监控与调试层 | LangSmith、Prometheus、Grafana | 追踪 Agent 推理轨迹,监控工具调用成功率与响应时间 |
4. 适用优势与局限
- ✅ 优势:即时响应,适合动态环境;轻量灵活,无需复杂任务分解;自然适配人类交互,推理过程可解释。
- ❌ 局限:长任务易失控,多步骤复杂任务易遗漏或逻辑混乱;成本较高,多轮工具调用增加 API 开销。
二、Plan-and-Execute:先定方案再执行的结构化范式
1. 核心逻辑
拆分为 规划(Planning) 和 执行(Execution) 两个独立阶段:先由 Planner 生成结构化、可审计的步骤计划,再由 Executor 按计划逐项执行,支持动态重规划。例如 “规划北京三日游” 时,Planner 先生成 “查景点→查交通→订酒店→安排行程” 的计划,Executor 再分步执行。
2. 典型场景与示例
| 典型场景 | 具体示例 | 适用原因 |
|---|---|---|
| 复杂多步骤任务 | “生成公司年度财务分析报告,包含数据提取、环比计算、图表生成、结论撰写” | 需明确任务分解与依赖关系,确保每一步可追溯、可审计 |
| 企业审批流程 | “审核合同付款申请,校验合同金额、执行进度、发票合规性,输出审批意见” | 流程固定、合规要求高,结构化计划便于流程审计与风险控制 |
| 数据处理流水线 | “从 MySQL 加载销售数据→清洗异常值→按地区聚合→生成可视化报表” | 流程标准化,需保证步骤顺序与数据流转确定性 |
| 旅行 / 活动规划 | “规划广州 5 人家庭 3 日游,覆盖老人与儿童需求,预算 5000 元” | 需全局统筹多约束(人数、预算、人群),先定整体方案再填充细节 |
| 科研文献综述 | “收集近 3 年 AI 大模型论文→分类整理→分析研究热点→撰写综述” | 步骤明确、流程固定,结构化计划提升效率与完整性 |
3. 核心技术栈
| 技术层级 | 核心工具 / 框架 | 作用 |
|---|---|---|
| 规划层(Planner) | LangChain Plan-and-Execute、LangGraph Planner、AutoGen Planner | 基于 LLM 生成结构化步骤计划,明确目标、依赖与工具 |
| 执行层(Executor) | LangChain Executor、LangGraph StateGraph、Dify | 按计划调用工具、处理步骤依赖、累积上下文结果 |
| 工具与数据层 | MySQL/PostgreSQL、MinIO、Pandas、Matplotlib、Email API | 支撑数据读取、处理、可视化、外部系统交互 |
| 流程编排层 | Airflow、Dagster、Temporal | 企业级流水线调度,支持重试、失败恢复与定时执行 |
| 开发与部署层 | Python、Java、Spring Boot、Docker、Kubernetes | 实现高可靠、可扩展的服务化部署,适配生产环境 |
| 合规与审计层 | Pydantic(结构化输出)、ELK Stack、PostgreSQL | 确保计划与执行结果可追溯,满足企业合规要求 |
4. 适用优势与局限
- ✅ 优势:稳定性高,结构化计划避免逻辑混乱;可审计性强,符合企业合规需求;支持并行执行,提升长任务效率。
- ❌ 局限:灵活性不足,计划外的突发场景难适配;前期规划成本高,复杂任务需精细设计计划。
三、场景选型与混合实践
1. 快速选型指南
| 任务特征 | 优先范式 | 典型案例 |
|---|---|---|
| 实时性强、动态多变 | ReAct | 实时问答、故障排查、即时交互 |
| 步骤固定、合规要求高 | Plan-and-Execute | 企业审批、数据流水线、结构化报告 |
| 长周期、多约束复杂任务 | 混合模式 | 大型项目规划、跨领域研究、全流程业务自动化 |
2. 混合实践案例
实际生产中常结合两者优势,例如 智能客服:
- 用 Plan-and-Execute 制定服务流程(如 “查询用户信息→验证权限→处理问题→记录反馈”);
- 遇到复杂问题(如 “查询历史订单并分析退款原因”)时,切换至 ReAct 模式,多轮调用搜索与数据库工具获取数据;
- 执行完成后,再用 Plan-and-Execute 汇总结果并生成标准化回复。
dify属于Plan-and-Execute吗?
结论: Dify Workflow 是 “固定流程”,Plan-and-Execute 是 “动态生成流程”。长得像,但本质完全不是一回事。
Dify 的 Workflow(工作流)之所以接近 Plan-and-Execute 范式,是因为两者都遵循“分步执行”的核心逻辑,均强调按既定步骤推进任务、完成目标,在执行形态上高度相似,但本质上存在核心差异,因此并非真正的 Plan-and-Execute 范式,核心区别集中在“规划能力”的归属与灵活性上。
Dify Workflow 的核心是“静态执行”,所有执行步骤、分支逻辑、工具调用顺序,都需要人工提前通过可视化拖拽配置完成,相当于人预先画好“执行地图”,Workflow 仅负责按地图一步步推进,无法自主调整。运行过程中,它不会根据任务变化、执行结果动态新增步骤、删除步骤或调整顺序,即使遇到预设之外的情况,也无法自主决策,只能按既定流程执行或报错,本质是“执行人工预设的流程”,没有自主规划的能力。
而 Plan-and-Execute 范式的核心是“动态规划+执行”,它包含独立的规划模块(Planner)和执行模块(Executor)。面对任务时,Planner 会自主分析任务目标,动态生成完整的执行计划,明确每一步的目的、顺序和依赖关系;Executor 按计划执行后,若发现结果不符合预期或存在新问题,Planner 还能自主重规划,调整步骤、补充工具调用,全程无需人工干预。
简单来说,两者的关键差异的是“流程由谁制定、能否动态调整”:Dify Workflow 是“人定流程、机器执行,不可调整”,仅具备执行能力;Plan-and-Execute 是“机器定流程、机器执行,可动态调整”,核心在于自主规划能力。 因此,Dify Workflow 只是接近 Plan-and-Execute 的执行形态,缺乏其核心的自主规划能力,并非真正的 Plan-and-Execute 范式。
四、总结
ReAct 以即时迭代适配动态场景,适合轻量、实时、交互密集型任务;Plan-and-Execute 以结构化流水线适配稳定场景,适合复杂、合规、长周期任务。技术栈选择需结合业务需求(实时性 / 合规性)、团队能力(开发效率)、部署环境(本地 / 云 / 混合)综合决策,多数企业会采用混合模式平衡灵活性与稳定性。
2、工具描述写得再好,模型也瞎传参数怎么办
一、问题本质
大模型做工具调用时,只靠自然语言描述约束不住参数,一定会出现:
- 漏参、错参、类型乱填
- 编造不存在的参数 / 工具
- 格式不规范、语义乱写
解决思路只有一条:
模型负责 “意图理解”,你负责 “参数强约束”
二、第一层:给模型的强约束(前端治理,减少犯错)
在工具定义前加上刚性指令,并使用 JSON Schema 而不是纯文字描述:
【工具调用强制规则】
1. 只调用已定义工具,禁止编造工具名
2. 必须传全所有 required 参数,禁止缺参漏参
3. 禁止编造参数值,不确定必须反问用户
4. 禁止添加未定义字段
5. 严格遵守参数类型、格式、枚举范围
再配上结构化工具定义:
{
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"required": ["city"],
"properties": {
"city": {
"type": "string",
"description": "中文城市名"
},
"date": {
"type": "string",
"description": "日期格式 YYYY-MM-DD,可选"
}
}
}
}
作用:
- 大幅降低模型乱传概率
- 但不能完全杜绝
三、第二层:轻量级路由层(后端兜底,彻底根治)
1. 作用放在模型输出和真实工具执行之间的一层极薄中间逻辑,只做三件事:
- 工具路由:根据 tool_name 分发到对应处理逻辑
- 参数校验:检查必填、类型、格式、枚举是否合法
- 参数清洗:过滤多余字段、修正格式、统一值
本质就是:工具调用的守门员
2. 特点
- 极轻量,无框架依赖
- 完全可控、可预测、可调试
- 不侵入业务工具代码
- 是解决 “模型乱传参数” 的标准工程方案
3. 性能与成本
- 规则:1ms
- 小模型:几十~几百 ms
- 高并发下完全不是一个量级。
4. 可调试、可审计
规则错了一眼定位。
模型错了,你根本不知道它为啥这么判。
三、参数校验:用 Pydantic 实现(最推荐)
路由层里的校验,不要手写一堆 if-else,直接用 Pydantic。
1. 为什么用 Pydantic
- 声明式定义参数结构,比手写规则清晰太多
- 自动校验:必填、类型、格式、长度、枚举
- 自动过滤模型瞎传的多余字段
- 抛出标准化错误,可直接返回给模型重传
- 轻、快、稳,完全符合 “轻量级路由” 定位
2. 典型结构
- 为每个工具定义一个 Pydantic 参数模型
- 路由层根据 tool_name 选择对应模型做解析校验
- 校验通过 → 调用真实工具
- 校验失败 → 返回错误信息让模型修正
四、完整结构(最终标准架构)
用户请求
↓
大模型生成:tool_name + model_args
↓
【轻量级路由层】
1. 校验 tool_name 是否在白名单
2. 根据工具找到对应 Pydantic 模型
3. 用 Pydantic 校验、清洗参数
↓
合法 → 执行真实工具
非法 → 返回参数错误 → 模型重新生成调用
这一套就是工业界通用、最轻量、最稳定的工具调用参数治理方案。
五、几个关键疑问统一澄清
- 轻量级路由层只能是规则式吗?
是的,主体必须是规则式。
路由分发、必填校验、格式校验、枚举校验这类强确定性逻辑,必须用硬规则保证稳定。
2. 能用小模型代替这套规则校验吗?
不能完全替代,只能辅助。
- 小模型仍然会 幻觉、乱判、漏判
- 参数校验要求100% 确定,模型做不到
- 性能、可调试性、成本都不如规则
合理用法:
- Pydantic + 路由做兜底强校验
- 小模型只做:语义补全、模糊值转换、自然语言错误解释
六、极简总结
- 轻量级路由层是工具调用的入口分发与参数治理层
- Pydantic 是路由层里最优雅、最轻量的参数校验实现
- 路由 + Pydantic 共同解决:模型乱传参数、漏参、瞎编参数
- 主体必须是规则式,小模型只能辅助,不能替代