上篇学习了ReACT,今天继续学习PlanAndExecute模式
与ReACT模式的关键区别如下:
对比维度ReAct AgentPlan-and-Execute Agent思考模式单步思考-行动循环两阶段分离:先规划后执行执行流程Thought → Action → Observation (循环)Plan → Execute Step 1 → Execute Step 2 → ...规划范围只规划下一步一次性规划完整执行路径LLM调用每次循环都需要LLM规划时一次,执行时可能多次优势:
- 效率更高:减少重复的"思考"步骤
- 可预测性:预先知道完整执行路径
- 易于调试:每个步骤都有明确的状态
- 适合复杂任务:结构化处理多步骤流程
适用场景:
- ✅ 数据处理的ETL流程
- ✅ 自动化工作流
- ✅ 需要审计的合规任务
- ✅ 批量处理任务
- ❌ 探索性任务(路径不确定)
- ❌ 需要实时交互的对话
示例代码:
定义规划器Planner
- 1 public interface Planner {
- 2
- 3 @SystemMessage("""
- 4 你是一个任务规划专家。请将用户的任务分解为详细的执行步骤。
- 5
- 6 输出格式必须是严格的JSON格式:
- 7 {
- 8 "plan_name": "任务名称",
- 9 "steps": [
- 10 {
- 11 "step_number": 1,
- 12 "description": "步骤描述",
- 13 "tool": "使用的工具名称",
- 14 "parameters": {"参数名": "参数值"}
- 15 }
- 16 ],
- 17 "expected_output": "预期输出"
- 18 }
- 19
- 20 可用工具列表:
- 21 1. add - 两数相加
- 22 2. getWeather - 天气查询
- 23 3. calculateCircleArea - 计算圆的面积
- 24 4. getCurrentDateTime - 获取当前时间
- 25 5. calculateCuboidVolume - 计算长方体体积
- 26 6. multiply - 两数相乘
- 27 7. divide - 两数相除
- 28 8. queryExpressOrder - 查询快递单
- 29 9. queryRefundProgress - 查询退款进度
- 30 """)
- 31 @UserMessage("问:{{request}}")
- 32 @Agent("基于用户提供的问题生成计划")
- 33 String createPlan(@V("request") String request);
- 34 }
复制代码 Planner 注:20-29行硬编码的方式指定需要用到的工具列表,也可以去掉,在运行时,类似ReAct一样,一股脑把sampleTools全扔给Planner调用的LLM,从运行结果来看,一样能跑通,但是使用token量就会大很多。
定义执行器
- 1 public interface Executor {
- 2
- 3 @SystemMessage("""
- 4 你是一个任务执行器。根据给定的步骤执行任务。
- 5
- 6 每次只执行一个步骤,然后等待下一个指令。
- 7 执行完成后,报告结果和下一步建议。
- 8
- 9 输出格式:
- 10 步骤 {n}: [工具名称]
- 11 输入: {参数}
- 12 输出: {结果}
- 13 状态: [成功/失败]
- 14
- 15 如果步骤失败,请说明原因和建议。
- 16 """)
- 17 @UserMessage("{{step}}")
- 18 @Agent("基于用户提供的问题生成计划")
- 19 String executeStep(@V("step") String step);
- 20 }
复制代码 Executor定义协调器
[code] 1 /** 2 * @author junmingyang 3 */ 4 public class Coordinator { 5 6 private final Planner planner; 7 private final Executor executor; 8 private final SampleTools tools; 9 private final Map context; 10 11 12 public Coordinator(ChatModel model, SampleTools tools) { 13 14 this.tools = tools; 15 this.context = new HashMap(); 16 17 //创建规划器 18 this.planner = AgenticServices.agentBuilder(Planner.class) 19 .chatModel(model) 20 .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(15)) 21 // 如果明确知道工具的列表,可以显式提供,这里就无需再绑定,以减少token使用 22 //.tools(this.tools) 23 .build(); 24 25 //创建执行器 26 this.executor = AgenticServices.agentBuilder(Executor.class) 27 .chatModel(model) 28 .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(15)) 29 .tools(this.tools) 30 .build(); 31 } 32 33 34 public Map executeTask(String task) { 35 System.out.println("\n" + "=".repeat(80)); 36 System.out.println("
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |