Agent设计模式学习(基于langchain4j实现)(11) - PlanAndExecute
上篇学习了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定义协调器
1 /**2* @author junmingyang3*/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; 101112 public Coordinator(ChatModel model, SampleTools tools) { 1314 this.tools = tools; 15 this.context = new HashMap(); 1617 //创建规划器 18 this.planner = AgenticServices.agentBuilder(Planner.class) 19 .chatModel(model) 20 .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(15)) 21 // 如果明确知道工具的列表,可以显式提供,这里就无需再绑定,以减少token使用 22 //.tools(this.tools) 23 .build(); 2425 //创建执行器 26 this.executor = AgenticServices.agentBuilder(Executor.class) 27 .chatModel(model) 28 .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(15)) 29 .tools(this.tools) 30 .build(); 31 } 323334 public Map executeTask(String task) { 35 System.out.println("\n" + "=".repeat(80)); 36 System.out.println("
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 新版吗?好像是停更了吧。 分享、互助 让互联网精神温暖你我 感谢分享 鼓励转贴优秀软件安全工具和文档! 感谢分享,学习下。 不错,里面软件多更新就更好了 分享、互助 让互联网精神温暖你我 谢谢楼主提供! 分享、互助 让互联网精神温暖你我 用心讨论,共获提升! 新版吗?好像是停更了吧。 感谢分享,学习下。 yyds。多谢分享 收藏一下 不知道什么时候能用到 感谢分享,下载保存了,貌似很强大 这个好,看起来很实用 懂技术并乐意极积无私分享的人越来越少。珍惜 东西不错很实用谢谢分享 东西不错很实用谢谢分享
页:
[1]