找回密码
 立即注册
首页 业界区 安全 Agent设计模式学习(基于langchain4j实现)(11) - PlanAnd ...

Agent设计模式学习(基于langchain4j实现)(11) - PlanAndExecute

毋献仪 前天 15:30
上篇学习了ReACT,今天继续学习PlanAndExecute模式
1.gif

与ReACT模式的关键区别如下
对比维度ReAct AgentPlan-and-Execute Agent思考模式单步思考-行动循环两阶段分离:先规划后执行执行流程Thought → Action → Observation (循环)Plan → Execute Step 1 → Execute Step 2 → ...规划范围只规划下一步一次性规划完整执行路径LLM调用每次循环都需要LLM规划时一次,执行时可能多次优势:


  • 效率更高:减少重复的"思考"步骤
  • 可预测性:预先知道完整执行路径
  • 易于调试:每个步骤都有明确的状态
  • 适合复杂任务:结构化处理多步骤流程
适用场景:


  • ✅ 数据处理的ETL流程
  • ✅ 自动化工作流
  • ✅ 需要审计的合规任务
  • ✅ 批量处理任务
  • ❌ 探索性任务(路径不确定)
  • ❌ 需要实时交互的对话
 
示例代码:
定义规划器Planner
2.gif
3.gif
  1. 1 public interface Planner {
  2. 2
  3. 3     @SystemMessage("""
  4. 4            你是一个任务规划专家。请将用户的任务分解为详细的执行步骤。
  5. 5
  6. 6            输出格式必须是严格的JSON格式:
  7. 7            {
  8. 8                "plan_name": "任务名称",
  9. 9                "steps": [
  10. 10                    {
  11. 11                        "step_number": 1,
  12. 12                        "description": "步骤描述",
  13. 13                        "tool": "使用的工具名称",
  14. 14                        "parameters": {"参数名": "参数值"}
  15. 15                    }
  16. 16                ],
  17. 17                "expected_output": "预期输出"
  18. 18            }
  19. 19
  20. 20            可用工具列表:
  21. 21            1. add - 两数相加
  22. 22            2. getWeather - 天气查询
  23. 23            3. calculateCircleArea - 计算圆的面积
  24. 24            4. getCurrentDateTime - 获取当前时间
  25. 25            5. calculateCuboidVolume - 计算长方体体积
  26. 26            6. multiply - 两数相乘
  27. 27            7. divide - 两数相除
  28. 28            8. queryExpressOrder - 查询快递单
  29. 29            9. queryRefundProgress - 查询退款进度
  30. 30           """)
  31. 31     @UserMessage("问:{{request}}")
  32. 32     @Agent("基于用户提供的问题生成计划")
  33. 33     String createPlan(@V("request") String request);
  34. 34 }
复制代码
Planner 注:20-29行硬编码的方式指定需要用到的工具列表,也可以去掉,在运行时,类似ReAct一样,一股脑把sampleTools全扔给Planner调用的LLM,从运行结果来看,一样能跑通,但是使用token量就会大很多。
定义执行器
4.gif
5.gif
  1. 1 public interface Executor {
  2. 2
  3. 3     @SystemMessage("""
  4. 4             你是一个任务执行器。根据给定的步骤执行任务。
  5. 5            
  6. 6             每次只执行一个步骤,然后等待下一个指令。
  7. 7             执行完成后,报告结果和下一步建议。
  8. 8            
  9. 9             输出格式:
  10. 10             步骤 {n}: [工具名称]
  11. 11             输入: {参数}
  12. 12             输出: {结果}
  13. 13             状态: [成功/失败]
  14. 14            
  15. 15             如果步骤失败,请说明原因和建议。
  16. 16             """)
  17. 17     @UserMessage("{{step}}")
  18. 18     @Agent("基于用户提供的问题生成计划")
  19. 19     String executeStep(@V("step") String step);
  20. 20 }
复制代码
Executor定义协调器
6.gif
7.gif
[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("
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册