大气绿色网站模板,韵博工业设计,php怎么建立网站,网站建设优化公司哪家好CangjieMagic框架#xff1a;使用华为仓颉编程语言编写#xff0c;专门用于开发AI Agent#xff0c;支持鸿蒙、Windows、macOS、Linux等系统。
这篇文章剖析一下 CangjieMagic 框架中的 PlanReactExecutor。
1 PlanReactExecutor的工作原理 #mermaid-svg-OqJUCSoxZkzylbDY…CangjieMagic框架使用华为仓颉编程语言编写专门用于开发AI Agent支持鸿蒙、Windows、macOS、Linux等系统。
这篇文章剖析一下 CangjieMagic 框架中的 PlanReactExecutor。
1 PlanReactExecutor的工作原理 #mermaid-svg-OqJUCSoxZkzylbDY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-OqJUCSoxZkzylbDY .error-icon{fill:#552222;}#mermaid-svg-OqJUCSoxZkzylbDY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OqJUCSoxZkzylbDY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-OqJUCSoxZkzylbDY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OqJUCSoxZkzylbDY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OqJUCSoxZkzylbDY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OqJUCSoxZkzylbDY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OqJUCSoxZkzylbDY .marker{fill:#666;stroke:#666;}#mermaid-svg-OqJUCSoxZkzylbDY .marker.cross{stroke:#666;}#mermaid-svg-OqJUCSoxZkzylbDY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OqJUCSoxZkzylbDY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-OqJUCSoxZkzylbDY .cluster-label text{fill:#333;}#mermaid-svg-OqJUCSoxZkzylbDY .cluster-label span{color:#333;}#mermaid-svg-OqJUCSoxZkzylbDY .label text,#mermaid-svg-OqJUCSoxZkzylbDY span{fill:#000000;color:#000000;}#mermaid-svg-OqJUCSoxZkzylbDY .node rect,#mermaid-svg-OqJUCSoxZkzylbDY .node circle,#mermaid-svg-OqJUCSoxZkzylbDY .node ellipse,#mermaid-svg-OqJUCSoxZkzylbDY .node polygon,#mermaid-svg-OqJUCSoxZkzylbDY .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-OqJUCSoxZkzylbDY .node .label{text-align:center;}#mermaid-svg-OqJUCSoxZkzylbDY .node.clickable{cursor:pointer;}#mermaid-svg-OqJUCSoxZkzylbDY .arrowheadPath{fill:#333333;}#mermaid-svg-OqJUCSoxZkzylbDY .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-OqJUCSoxZkzylbDY .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-OqJUCSoxZkzylbDY .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-OqJUCSoxZkzylbDY .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-OqJUCSoxZkzylbDY .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-OqJUCSoxZkzylbDY .cluster text{fill:#333;}#mermaid-svg-OqJUCSoxZkzylbDY .cluster span{color:#333;}#mermaid-svg-OqJUCSoxZkzylbDY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OqJUCSoxZkzylbDY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户提问 PlanReactExecutor 知识提取 问题分解 生成多个子任务 执行子任务 汇总结果 返回最终答案 当你要组织一场生日派对时你会怎么做你不会一头扎进去就开始准备而是会先
了解寿星的喜好知识提取分解任务场地、食物、娱乐、礼物问题分解一个个完成这些子任务执行子任务最后把所有准备工作整合起来举办一场成功的派对汇总结果
PlanReactExecutor就是这样工作的它不会直接尝试解决一个复杂问题而是先分析、分解然后一步步解决最后整合答案。
2 深入代码构造函数和核心组件
我们先来看看PlanReactExecutor的构造函数
protected class PlanReactExecutor : AgentExecutor {protected PlanReactExecutor() { }// 其他成员...
}这个构造函数非常简单它背后连接了几个强大的组件 #mermaid-svg-DpwomIt11psAKMeK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-DpwomIt11psAKMeK .error-icon{fill:#552222;}#mermaid-svg-DpwomIt11psAKMeK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DpwomIt11psAKMeK .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DpwomIt11psAKMeK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DpwomIt11psAKMeK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DpwomIt11psAKMeK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DpwomIt11psAKMeK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DpwomIt11psAKMeK .marker{fill:#666;stroke:#666;}#mermaid-svg-DpwomIt11psAKMeK .marker.cross{stroke:#666;}#mermaid-svg-DpwomIt11psAKMeK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DpwomIt11psAKMeK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-DpwomIt11psAKMeK .cluster-label text{fill:#333;}#mermaid-svg-DpwomIt11psAKMeK .cluster-label span{color:#333;}#mermaid-svg-DpwomIt11psAKMeK .label text,#mermaid-svg-DpwomIt11psAKMeK span{fill:#000000;color:#000000;}#mermaid-svg-DpwomIt11psAKMeK .node rect,#mermaid-svg-DpwomIt11psAKMeK .node circle,#mermaid-svg-DpwomIt11psAKMeK .node ellipse,#mermaid-svg-DpwomIt11psAKMeK .node polygon,#mermaid-svg-DpwomIt11psAKMeK .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-DpwomIt11psAKMeK .node .label{text-align:center;}#mermaid-svg-DpwomIt11psAKMeK .node.clickable{cursor:pointer;}#mermaid-svg-DpwomIt11psAKMeK .arrowheadPath{fill:#333333;}#mermaid-svg-DpwomIt11psAKMeK .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-DpwomIt11psAKMeK .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-DpwomIt11psAKMeK .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-DpwomIt11psAKMeK .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-DpwomIt11psAKMeK .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-DpwomIt11psAKMeK .cluster text{fill:#333;}#mermaid-svg-DpwomIt11psAKMeK .cluster span{color:#333;}#mermaid-svg-DpwomIt11psAKMeK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DpwomIt11psAKMeK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PlanReactExecutor 知识提取器 问题分解器 ReactWorker 结果汇总器 就像一个专业厨师虽然看起来很简单地做了一道菜但背后有一套完整的厨具和步骤一样PlanReactExecutor看似简单实则整合了多个专业组件。
3 同步执行流程像项目经理一样工作
现在让我们看看同步执行函数的实现
override public func run(agent: Agent, request: AgentRequest): AgentResponse {// Extract necessary knowledgelet knowledge knowledgeExtract(agent, request)// Decompose the problemlet subtasks: ArraySubtask problemDecompose(agent, request)let planTask PlanTask(agent, request, subtasks, knowledge)// Solve each subtaskfor (subtask in subtasks) {let worker ReactWorker(planTask)let result worker.solve(subtask)subtask.result result}// Summarize the resultlet result resultSummarize(planTask)LogUtils.info(agent.name, Summarized answer: ${result})return AgentResponse(result)
}我们来用一个房屋装修的例子来理解这个过程 #mermaid-svg-F0kBL5Lp8OVxN4B9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .error-icon{fill:#552222;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .marker{fill:#666;stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .marker.cross{stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actor{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-F0kBL5Lp8OVxN4B9 text.actortspan{fill:#333;stroke:none;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actor-line{stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .sequenceNumber{fill:white;}#mermaid-svg-F0kBL5Lp8OVxN4B9 #sequencenumber{fill:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .messageText{fill:#333;stroke:#333;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .labelBox{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .labelText,#mermaid-svg-F0kBL5Lp8OVxN4B9 .labelTexttspan{fill:#333;stroke:none;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .loopText,#mermaid-svg-F0kBL5Lp8OVxN4B9 .loopTexttspan{fill:#333;stroke:none;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(0, 0%, 83%);fill:hsl(0, 0%, 83%);}#mermaid-svg-F0kBL5Lp8OVxN4B9 .note{stroke:#999;fill:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .noteText,#mermaid-svg-F0kBL5Lp8OVxN4B9 .noteTexttspan{fill:#fff;stroke:none;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actorPopupMenu{position:absolute;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actorPopupMenuPanel{position:absolute;fill:#eee;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actor-man line{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-F0kBL5Lp8OVxN4B9 .actor-man circle,#mermaid-svg-F0kBL5Lp8OVxN4B9 line{stroke:hsl(0, 0%, 83%);fill:#eee;stroke-width:2px;}#mermaid-svg-F0kBL5Lp8OVxN4B9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户 PlanReactExecutor 知识提取 问题分解 ReactWorker 结果汇总 我要装修一套北欧风格的房子 提取需求和关键信息 返回用户喜好和关键需求 分解成多个施工任务 返回水电、木工、油漆等任务 分配子任务 完成子任务并报告 loop [每个子任务] 整合所有工作成果 提供最终验收报告 交付装修完成的房子 用户 PlanReactExecutor 知识提取 问题分解 ReactWorker 结果汇总 知识提取就像设计师了解业主的喜好和需求 let knowledge knowledgeExtract(agent, request)问题分解就像项目经理将装修分解为水电、木工、油漆等工序 let subtasks: ArraySubtask problemDecompose(agent, request)创建计划任务汇总需求和任务清单形成施工方案 let planTask PlanTask(agent, request, subtasks, knowledge)执行每个子任务安排工人团队依次完成各个工序 for (subtask in subtasks) {let worker ReactWorker(planTask)let result worker.solve(subtask)subtask.result result
}汇总结果整合所有工作形成最终成果 let result resultSummarize(planTask)返回结果向业主交付完工的房子 return AgentResponse(result)这个过程既有条理又高效每个步骤都有明确的职责就像一个专业的项目团队
4 异步执行流程实时查看进度的魔力
当我们需要实时查看任务执行进度时就可以使用异步执行函数
override public func asyncRun(agent: Agent, request: AgentRequest): AsyncAgentResponse {let planTask PlanTask(agent, request)// Create the worker threadlet fut: FutureIteratorString spawn {try {return workFn(planTask)} catch(ex: Exception) {planTask.execInfo.verboseChannel.close()throw ex}throw UnsupportedException(Unreachable)}return AsyncAgentResponse(IteratorWrapper(planTask, fut), execInfo: planTask.execInfo)
}这就像你在手机APP上订购一份外卖可以实时看到商家接单→厨师制作→骑手取餐→配送中→已送达的全过程而不是只能干等结果。 #mermaid-svg-uIfnVTA3B4rFPlYM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-uIfnVTA3B4rFPlYM .error-icon{fill:#552222;}#mermaid-svg-uIfnVTA3B4rFPlYM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uIfnVTA3B4rFPlYM .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-uIfnVTA3B4rFPlYM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uIfnVTA3B4rFPlYM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uIfnVTA3B4rFPlYM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uIfnVTA3B4rFPlYM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uIfnVTA3B4rFPlYM .marker{fill:#666;stroke:#666;}#mermaid-svg-uIfnVTA3B4rFPlYM .marker.cross{stroke:#666;}#mermaid-svg-uIfnVTA3B4rFPlYM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uIfnVTA3B4rFPlYM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-uIfnVTA3B4rFPlYM .cluster-label text{fill:#333;}#mermaid-svg-uIfnVTA3B4rFPlYM .cluster-label span{color:#333;}#mermaid-svg-uIfnVTA3B4rFPlYM .label text,#mermaid-svg-uIfnVTA3B4rFPlYM span{fill:#000000;color:#000000;}#mermaid-svg-uIfnVTA3B4rFPlYM .node rect,#mermaid-svg-uIfnVTA3B4rFPlYM .node circle,#mermaid-svg-uIfnVTA3B4rFPlYM .node ellipse,#mermaid-svg-uIfnVTA3B4rFPlYM .node polygon,#mermaid-svg-uIfnVTA3B4rFPlYM .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-uIfnVTA3B4rFPlYM .node .label{text-align:center;}#mermaid-svg-uIfnVTA3B4rFPlYM .node.clickable{cursor:pointer;}#mermaid-svg-uIfnVTA3B4rFPlYM .arrowheadPath{fill:#333333;}#mermaid-svg-uIfnVTA3B4rFPlYM .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-uIfnVTA3B4rFPlYM .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-uIfnVTA3B4rFPlYM .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-uIfnVTA3B4rFPlYM .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-uIfnVTA3B4rFPlYM .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-uIfnVTA3B4rFPlYM .cluster text{fill:#333;}#mermaid-svg-uIfnVTA3B4rFPlYM .cluster span{color:#333;}#mermaid-svg-uIfnVTA3B4rFPlYM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uIfnVTA3B4rFPlYM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户请求 创建计划任务 创建工作线程 异步执行workFn 返回异步响应 实时进度更新 用户界面 这里的关键是spawn表达式它创建了一个新的工作线程来执行workFn函数这样主线程就不会被阻塞。用生活中的例子来说这就像你在餐厅点菜后服务员会给你一个电子呼叫器你可以去做其他事情等菜好了会通知你。
5 workFn函数异步工作的实际执行者
workFn函数是实际执行异步工作的地方让我们仔细看看它的实现
private func workFn(planTask: PlanTask): IteratorString {let agent planTask.agentlet request planTask.request// Extract necessary knowledgeplanTask.knowledge knowledgeExtract(agent, request)// Decompose the problemlet subtasks: ArraySubtask problemDecompose(agent, request)planTask.subtasks subtasksif (request.verbose) {let strBuilder StringBuilder()strBuilder.append(# The Plan\n)for (subtask in subtasks) {strBuilder.append(subtask.toMarkdown())strBuilder.append(\n)}planTask.execInfo.verboseChannel.put(strBuilder.toString().withTag(ReactTag.PLAN))}// Solve each subtaskfor (subtask in subtasks) {if (request.verbose) {planTask.execInfo.verboseChannel.put(Solve the subtask: ${subtask.name}.withTag(ReactTag.PLAN))}let worker ReactWorker(planTask)let asyncResp worker.asyncSolve(subtask, verbose: request.verbose)if (request.verbose) {// Transfer the internal information from the react worker to this agentfor (data in asyncResp.execInfo.getOrThrow().verboseInfo) {planTask.execInfo.verboseChannel.put(data)}}subtask.result asyncResp.contentif (request.verbose) {planTask.execInfo.verboseChannel.put(# Subtask DONE!\n${subtask.toMarkdown()}.withTag(ReactTag.INFO))}}if (request.verbose) {planTask.execInfo.verboseChannel.close()}// Summarize the resultreturn asyncResultSummarize(planTask)
}让我们用一个建造乐高模型的例子来理解这个过程 #mermaid-svg-WS9yGpUcjhem5Cjy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-WS9yGpUcjhem5Cjy .error-icon{fill:#552222;}#mermaid-svg-WS9yGpUcjhem5Cjy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WS9yGpUcjhem5Cjy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WS9yGpUcjhem5Cjy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WS9yGpUcjhem5Cjy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WS9yGpUcjhem5Cjy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WS9yGpUcjhem5Cjy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WS9yGpUcjhem5Cjy .marker{fill:#666;stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .marker.cross{stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WS9yGpUcjhem5Cjy .actor{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-WS9yGpUcjhem5Cjy text.actortspan{fill:#333;stroke:none;}#mermaid-svg-WS9yGpUcjhem5Cjy .actor-line{stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy .sequenceNumber{fill:white;}#mermaid-svg-WS9yGpUcjhem5Cjy #sequencenumber{fill:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy .messageText{fill:#333;stroke:#333;}#mermaid-svg-WS9yGpUcjhem5Cjy .labelBox{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-WS9yGpUcjhem5Cjy .labelText,#mermaid-svg-WS9yGpUcjhem5Cjy .labelTexttspan{fill:#333;stroke:none;}#mermaid-svg-WS9yGpUcjhem5Cjy .loopText,#mermaid-svg-WS9yGpUcjhem5Cjy .loopTexttspan{fill:#333;stroke:none;}#mermaid-svg-WS9yGpUcjhem5Cjy .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(0, 0%, 83%);fill:hsl(0, 0%, 83%);}#mermaid-svg-WS9yGpUcjhem5Cjy .note{stroke:#999;fill:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .noteText,#mermaid-svg-WS9yGpUcjhem5Cjy .noteTexttspan{fill:#fff;stroke:none;}#mermaid-svg-WS9yGpUcjhem5Cjy .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WS9yGpUcjhem5Cjy .actorPopupMenu{position:absolute;}#mermaid-svg-WS9yGpUcjhem5Cjy .actorPopupMenuPanel{position:absolute;fill:#eee;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-WS9yGpUcjhem5Cjy .actor-man line{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaid-svg-WS9yGpUcjhem5Cjy .actor-man circle,#mermaid-svg-WS9yGpUcjhem5Cjy line{stroke:hsl(0, 0%, 83%);fill:#eee;stroke-width:2px;}#mermaid-svg-WS9yGpUcjhem5Cjy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户 PlanReactExecutor 计划 子任务 ReactWorker 结果 准备阶段 我想搭建一个乐高城堡 提取关键信息 生成搭建计划 展示整体计划和分步骤 执行阶段 开始执行当前步骤 使用合适的零件和工具 完成当前部分 实时展示搭建进度 loop [每个搭建步骤] 完成阶段 整合所有部分 展示完整的乐高城堡 用户 PlanReactExecutor 计划 子任务 ReactWorker 结果 在这个过程中最有价值的部分是用户可以看到计划和每个子任务的执行过程这就是verbose模式的作用
if (request.verbose) {let strBuilder StringBuilder()strBuilder.append(# The Plan\n)for (subtask in subtasks) {strBuilder.append(subtask.toMarkdown())strBuilder.append(\n)}planTask.execInfo.verboseChannel.put(strBuilder.toString().withTag(ReactTag.PLAN))
}这段代码就像是向用户展示乐高说明书的全貌让用户知道接下来会发生什么。然后在执行每个子任务时不断更新进度
if (request.verbose) {planTask.execInfo.verboseChannel.put(Solve the subtask: ${subtask.name}.withTag(ReactTag.PLAN))
}这就像是告诉用户现在正在搭建城堡的塔楼部分让用户了解当前进度。
6 与其他执行器的对比 #mermaid-svg-6a9xYA33poJ7UGPZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-6a9xYA33poJ7UGPZ .error-icon{fill:#552222;}#mermaid-svg-6a9xYA33poJ7UGPZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6a9xYA33poJ7UGPZ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6a9xYA33poJ7UGPZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6a9xYA33poJ7UGPZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6a9xYA33poJ7UGPZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6a9xYA33poJ7UGPZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6a9xYA33poJ7UGPZ .marker{fill:#666;stroke:#666;}#mermaid-svg-6a9xYA33poJ7UGPZ .marker.cross{stroke:#666;}#mermaid-svg-6a9xYA33poJ7UGPZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6a9xYA33poJ7UGPZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-6a9xYA33poJ7UGPZ .cluster-label text{fill:#333;}#mermaid-svg-6a9xYA33poJ7UGPZ .cluster-label span{color:#333;}#mermaid-svg-6a9xYA33poJ7UGPZ .label text,#mermaid-svg-6a9xYA33poJ7UGPZ span{fill:#000000;color:#000000;}#mermaid-svg-6a9xYA33poJ7UGPZ .node rect,#mermaid-svg-6a9xYA33poJ7UGPZ .node circle,#mermaid-svg-6a9xYA33poJ7UGPZ .node ellipse,#mermaid-svg-6a9xYA33poJ7UGPZ .node polygon,#mermaid-svg-6a9xYA33poJ7UGPZ .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-6a9xYA33poJ7UGPZ .node .label{text-align:center;}#mermaid-svg-6a9xYA33poJ7UGPZ .node.clickable{cursor:pointer;}#mermaid-svg-6a9xYA33poJ7UGPZ .arrowheadPath{fill:#333333;}#mermaid-svg-6a9xYA33poJ7UGPZ .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-6a9xYA33poJ7UGPZ .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-6a9xYA33poJ7UGPZ .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-6a9xYA33poJ7UGPZ .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-6a9xYA33poJ7UGPZ .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-6a9xYA33poJ7UGPZ .cluster text{fill:#333;}#mermaid-svg-6a9xYA33poJ7UGPZ .cluster span{color:#333;}#mermaid-svg-6a9xYA33poJ7UGPZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6a9xYA33poJ7UGPZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 执行器类型 NaiveExecutor ReActExecutor PlanReactExecutor 特点: 简单直接 场景: 简单问答 特点: 思考-行动-观察循环 场景: 需要使用工具 特点: 先规划后执行 场景: 复杂多步骤问题 如果用餐厅来比喻三种执行器
NaiveExecutor快餐店直接点餐、直接出餐ReActExecutor普通餐厅厨师根据订单现做现卖PlanReactExecutor高档餐厅主厨先设计菜单然后团队分工协作制作多道菜肴最后组合成一顿完美的大餐
PlanReactExecutor最适合那些需要多步骤、多角度思考的复杂问题。
7 实际应用案例
案例一学术研究助手
当用户请求研究神经网络的最新进展时执行过程可能是 #mermaid-svg-a1qYalUuhS7iWRG7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-a1qYalUuhS7iWRG7 .error-icon{fill:#552222;}#mermaid-svg-a1qYalUuhS7iWRG7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a1qYalUuhS7iWRG7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-a1qYalUuhS7iWRG7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a1qYalUuhS7iWRG7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a1qYalUuhS7iWRG7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a1qYalUuhS7iWRG7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a1qYalUuhS7iWRG7 .marker{fill:#666;stroke:#666;}#mermaid-svg-a1qYalUuhS7iWRG7 .marker.cross{stroke:#666;}#mermaid-svg-a1qYalUuhS7iWRG7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a1qYalUuhS7iWRG7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-a1qYalUuhS7iWRG7 .cluster-label text{fill:#333;}#mermaid-svg-a1qYalUuhS7iWRG7 .cluster-label span{color:#333;}#mermaid-svg-a1qYalUuhS7iWRG7 .label text,#mermaid-svg-a1qYalUuhS7iWRG7 span{fill:#000000;color:#000000;}#mermaid-svg-a1qYalUuhS7iWRG7 .node rect,#mermaid-svg-a1qYalUuhS7iWRG7 .node circle,#mermaid-svg-a1qYalUuhS7iWRG7 .node ellipse,#mermaid-svg-a1qYalUuhS7iWRG7 .node polygon,#mermaid-svg-a1qYalUuhS7iWRG7 .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-a1qYalUuhS7iWRG7 .node .label{text-align:center;}#mermaid-svg-a1qYalUuhS7iWRG7 .node.clickable{cursor:pointer;}#mermaid-svg-a1qYalUuhS7iWRG7 .arrowheadPath{fill:#333333;}#mermaid-svg-a1qYalUuhS7iWRG7 .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-a1qYalUuhS7iWRG7 .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-a1qYalUuhS7iWRG7 .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-a1qYalUuhS7iWRG7 .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-a1qYalUuhS7iWRG7 .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-a1qYalUuhS7iWRG7 .cluster text{fill:#333;}#mermaid-svg-a1qYalUuhS7iWRG7 .cluster span{color:#333;}#mermaid-svg-a1qYalUuhS7iWRG7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-a1qYalUuhS7iWRG7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户请求: 研究神经网络最新进展 知识提取: 确定研究领域为神经网络和图像识别 问题分解 子任务1: 查找最新论文 子任务2: 阅读关键论文 子任务3: 总结主要发现 子任务4: 比较不同方法 执行子任务 汇总: 综合报告 最终结果: 全面的研究报告 案例二旅行规划助手
想象一个用户想规划一次欧洲之旅
用户: 请帮我规划一次为期7天的法国巴黎和意大利罗马的旅行包括景点、住宿和交通。使用PlanReactExecutor执行过程可能是
知识提取了解用户想去巴黎和罗马时间为7天问题分解 子任务1规划巴黎部分的行程3天子任务2规划罗马部分的行程3天子任务3规划两地之间的交通1天子任务4提供住宿建议子任务5整合完整行程 执行每个子任务分别解决每个子任务汇总结果生成完整的7天旅行计划
案例三复杂数学问题求解
用户: 请求解下列方程组
3x 2y - z 10
2x - 3y 2z -5
x y z 7使用PlanReactExecutor解决这个问题
知识提取确定这是一个三元一次方程组问题分解 子任务1使用消元法消去z变量子任务2解出x和y的关系子任务3代回求解x、y、z的值子任务4验证结果是否正确 执行子任务依次解决每个数学步骤汇总结果提供完整的解答和解释
8 核心组件深度解析
PlanReactExecutor不是独立工作的它依赖几个核心组件 #mermaid-svg-fCRsAirTg9hGVKBL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-fCRsAirTg9hGVKBL .error-icon{fill:#552222;}#mermaid-svg-fCRsAirTg9hGVKBL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fCRsAirTg9hGVKBL .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fCRsAirTg9hGVKBL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fCRsAirTg9hGVKBL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fCRsAirTg9hGVKBL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fCRsAirTg9hGVKBL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fCRsAirTg9hGVKBL .marker{fill:#666;stroke:#666;}#mermaid-svg-fCRsAirTg9hGVKBL .marker.cross{stroke:#666;}#mermaid-svg-fCRsAirTg9hGVKBL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fCRsAirTg9hGVKBL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-fCRsAirTg9hGVKBL .cluster-label text{fill:#333;}#mermaid-svg-fCRsAirTg9hGVKBL .cluster-label span{color:#333;}#mermaid-svg-fCRsAirTg9hGVKBL .label text,#mermaid-svg-fCRsAirTg9hGVKBL span{fill:#000000;color:#000000;}#mermaid-svg-fCRsAirTg9hGVKBL .node rect,#mermaid-svg-fCRsAirTg9hGVKBL .node circle,#mermaid-svg-fCRsAirTg9hGVKBL .node ellipse,#mermaid-svg-fCRsAirTg9hGVKBL .node polygon,#mermaid-svg-fCRsAirTg9hGVKBL .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-fCRsAirTg9hGVKBL .node .label{text-align:center;}#mermaid-svg-fCRsAirTg9hGVKBL .node.clickable{cursor:pointer;}#mermaid-svg-fCRsAirTg9hGVKBL .arrowheadPath{fill:#333333;}#mermaid-svg-fCRsAirTg9hGVKBL .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-fCRsAirTg9hGVKBL .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-fCRsAirTg9hGVKBL .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-fCRsAirTg9hGVKBL .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-fCRsAirTg9hGVKBL .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-fCRsAirTg9hGVKBL .cluster text{fill:#333;}#mermaid-svg-fCRsAirTg9hGVKBL .cluster span{color:#333;}#mermaid-svg-fCRsAirTg9hGVKBL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fCRsAirTg9hGVKBL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PlanReactExecutor knowledgeExtract problemDecompose ReactWorker resultSummarize 功能: 提取关键知识 实现: 使用LLM分析问题 功能: 分解为子任务 实现: 让LLM进行任务规划 功能: 解决单个子任务 实现: 使用ReAct方法 功能: 整合所有结果 实现: 让LLM综合所有信息 knowledgeExtract就像研究生开始论文前的文献综述先了解相关知识 problemDecompose就像建筑师在开工前绘制详细的施工图纸 ReactWorker就像专业工人按照图纸完成具体工作 resultSummarize就像编辑将多篇文章整合成一本完整的书
这些组件协同工作使得PlanReactExecutor能够处理非常复杂的问题。
9 PlanReactExecutor的优势与局限 #mermaid-svg-EzjVB2hx0xQrI5M6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-EzjVB2hx0xQrI5M6 .error-icon{fill:#552222;}#mermaid-svg-EzjVB2hx0xQrI5M6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EzjVB2hx0xQrI5M6 .marker{fill:#666;stroke:#666;}#mermaid-svg-EzjVB2hx0xQrI5M6 .marker.cross{stroke:#666;}#mermaid-svg-EzjVB2hx0xQrI5M6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-EzjVB2hx0xQrI5M6 .cluster-label text{fill:#333;}#mermaid-svg-EzjVB2hx0xQrI5M6 .cluster-label span{color:#333;}#mermaid-svg-EzjVB2hx0xQrI5M6 .label text,#mermaid-svg-EzjVB2hx0xQrI5M6 span{fill:#000000;color:#000000;}#mermaid-svg-EzjVB2hx0xQrI5M6 .node rect,#mermaid-svg-EzjVB2hx0xQrI5M6 .node circle,#mermaid-svg-EzjVB2hx0xQrI5M6 .node ellipse,#mermaid-svg-EzjVB2hx0xQrI5M6 .node polygon,#mermaid-svg-EzjVB2hx0xQrI5M6 .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .node .label{text-align:center;}#mermaid-svg-EzjVB2hx0xQrI5M6 .node.clickable{cursor:pointer;}#mermaid-svg-EzjVB2hx0xQrI5M6 .arrowheadPath{fill:#333333;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-EzjVB2hx0xQrI5M6 .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-EzjVB2hx0xQrI5M6 .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-EzjVB2hx0xQrI5M6 .cluster text{fill:#333;}#mermaid-svg-EzjVB2hx0xQrI5M6 .cluster span{color:#333;}#mermaid-svg-EzjVB2hx0xQrI5M6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EzjVB2hx0xQrI5M6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PlanReactExecutor 优势 局限 能解决复杂问题 思路清晰可追踪 结果全面系统 可并行执行子任务 执行时间较长 资源消耗较大 简单问题反而复杂化 优势
解决复杂问题像专业律师处理复杂案件有条不紊思路清晰用户可以看到完整的思考过程增强可信度结果全面考虑问题的多个方面不会遗漏重要内容可追踪性出现问题可以定位到具体哪个子任务
局限
执行时间长就像做一道复杂的菜肴需要更多时间资源消耗大需要更多的API调用和计算资源简单问题反而复杂化用大炮打蚊子对简单问题过度设计
10 何时选择PlanReactExecutor #mermaid-svg-ygWt9cYeO2JMnw4u {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaid-svg-ygWt9cYeO2JMnw4u .error-icon{fill:#552222;}#mermaid-svg-ygWt9cYeO2JMnw4u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ygWt9cYeO2JMnw4u .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ygWt9cYeO2JMnw4u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ygWt9cYeO2JMnw4u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ygWt9cYeO2JMnw4u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ygWt9cYeO2JMnw4u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ygWt9cYeO2JMnw4u .marker{fill:#666;stroke:#666;}#mermaid-svg-ygWt9cYeO2JMnw4u .marker.cross{stroke:#666;}#mermaid-svg-ygWt9cYeO2JMnw4u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ygWt9cYeO2JMnw4u .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#mermaid-svg-ygWt9cYeO2JMnw4u .cluster-label text{fill:#333;}#mermaid-svg-ygWt9cYeO2JMnw4u .cluster-label span{color:#333;}#mermaid-svg-ygWt9cYeO2JMnw4u .label text,#mermaid-svg-ygWt9cYeO2JMnw4u span{fill:#000000;color:#000000;}#mermaid-svg-ygWt9cYeO2JMnw4u .node rect,#mermaid-svg-ygWt9cYeO2JMnw4u .node circle,#mermaid-svg-ygWt9cYeO2JMnw4u .node ellipse,#mermaid-svg-ygWt9cYeO2JMnw4u .node polygon,#mermaid-svg-ygWt9cYeO2JMnw4u .node path{fill:#eee;stroke:#999;stroke-width:1px;}#mermaid-svg-ygWt9cYeO2JMnw4u .node .label{text-align:center;}#mermaid-svg-ygWt9cYeO2JMnw4u .node.clickable{cursor:pointer;}#mermaid-svg-ygWt9cYeO2JMnw4u .arrowheadPath{fill:#333333;}#mermaid-svg-ygWt9cYeO2JMnw4u .edgePath .path{stroke:#666;stroke-width:2.0px;}#mermaid-svg-ygWt9cYeO2JMnw4u .flowchart-link{stroke:#666;fill:none;}#mermaid-svg-ygWt9cYeO2JMnw4u .edgeLabel{background-color:white;text-align:center;}#mermaid-svg-ygWt9cYeO2JMnw4u .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#mermaid-svg-ygWt9cYeO2JMnw4u .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#mermaid-svg-ygWt9cYeO2JMnw4u .cluster text{fill:#333;}#mermaid-svg-ygWt9cYeO2JMnw4u .cluster span{color:#333;}#mermaid-svg-ygWt9cYeO2JMnw4u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ygWt9cYeO2JMnw4u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 简单 复杂 只需一两个工具 需要多步规划 面对一个问题 是否复杂? 使用NaiveExecutor 需要工具吗? 使用ReActExecutor 使用PlanReactExecutor 适合使用PlanReactExecutor的场景
多步骤问题如规划旅行、制定学习计划需要多角度分析如进行SWOT分析、评估风险需要综合信息如撰写研究报告、市场分析组织创作内容如写一本书的大纲、设计课程体系
不适合的场景
简单问答如今天天气怎么样单一工具调用如计算123 456快速响应场景如紧急情况下的决策
11 总结
PlanReactExecutor就像一位经验丰富的项目经理能够将复杂问题分解为可管理的小任务然后一步步解决最终整合成完整的解决方案。在处理复杂问题时它的表现远超简单的执行器。
当你的AI应用需要处理复杂的多步骤问题时不妨考虑使用PlanReactExecutor它将帮助你的Agent像专业团队一样有条不紊地解决问题。