LangChain4j全集-20-Agents-五种workflow大体使用方式

发布时间:2026/7/27 18:35:05
LangChain4j全集-20-Agents-五种workflow大体使用方式 下面我用Spring Boot 开发者视角把这 5 种 workflow 怎么“落到项目里”讲清楚。你已经会 Tool 了所以我不再讲 Tool 注解细节而是重点讲在 Spring Boot 里大体怎么组织每种 workflow 适合什么场景一个简单案例你代码层面大概怎么写/怎么串你该怎么理解它和普通 Service 流程的关系你可以把它理解成Tool 是“能力”Workflow 是“能力怎么组织起来完成任务”。一、先建立一个总认知在 Spring Boot 里 workflow 到底放哪你可以先把整个项目理解成这几层Controller ↓ AI Application / Agent Facade ↓ Workflow Orchestrator顺序/并行/路由/条件/分工 ↓ Tools / Services ↓ DB / 外部接口 / 内部系统如果翻译成你熟悉的话Controller接收用户请求AgentFacadeAI 能力统一入口Workflow Orchestrator决定流程怎么跑Tools/Services你已经会了就是具体业务能力DB/API真实数据和系统所以你学习 workflow 时可以先记住一句话Workflow 不是替代 Service而是在 Service 之上增加一层“任务编排”。二、给你一个统一业务场景电商客服助手为了让 5 种 workflow 容易对比我统一用一个场景场景做一个 Spring Boot 的“电商智能客服助手”用户会问查订单查物流退款进度催发货投诉问题生成处理建议你已经有这些 Tool/ServiceOrderServiceLogisticsServiceRefundServiceInventoryServiceTicketServiceNotificationService假设你已经把这些能力通过 Tool 暴露给 LLM 了。三、1Sequential Workflow 在 Spring Boot 里怎么用1. 适合什么场景固定步骤、前后依赖明显的任务。比如用户问帮我查订单状态并告诉我物流进度。这个事情通常是先查订单再查物流最后整理答复2. 在 Spring Boot 里怎么理解这其实最像一个“顺序调用的 Service”。你可以理解为controller-workflowService-step1-step2-step33. 一个简单流程用户输入查询订单 A10086 的状态和物流流程Step1: 查订单是否存在 Step2: 查订单状态 Step3: 如果已发货再查物流 Step4: 组装结果返回用户4. 大概代码组织ControllerRestControllerRequestMapping(/ai)publicclassAiController{AutowiredprivateCustomerSupportWorkflowServiceworkflowService;GetMapping(/order-summary)publicStringorderSummary(RequestParamStringorderId){returnworkflowService.handleOrderSummary(orderId);}}Workflow ServiceServicepublicclassCustomerSupportWorkflowService{AutowiredprivateOrderServiceorderService;AutowiredprivateLogisticsServicelogisticsService;publicStringhandleOrderSummary(StringorderId){OrderorderorderService.findById(orderId);if(ordernull){return订单不存在;}StringBuildersbnewStringBuilder();sb.append(订单状态).append(order.getStatus());if(SHIPPED.equals(order.getStatus())){LogisticslogisticslogisticsService.queryByOrderId(orderId);sb.append(物流进度).append(logistics.getCurrentNode());}returnsb.toString();}}5. 如果接入 LangChain4j 怎么理解这里有两种做法做法 ALLM 负责自然语言理解Workflow 你自己写死比如用户说帮我查一下 A10086LLM 先提取出意图和订单号然后调用你的顺序工作流workflowService.handleOrderSummary(A10086);做法 B每一步都交给 Agent/ToolAgent先调用查订单 Tool再根据结果决定调用物流 Tool再生成最终回答但从工程稳定性上讲很多业务型顺序流程建议你自己在 Spring Service 里写死流程更稳定。6. 你该怎么记Sequential workflow 在 Spring Boot 里本质就是“有步骤依赖的链式 Service 编排”。四、2Parallel Workflow 在 Spring Boot 里怎么用1. 适合什么场景多个子任务互不依赖可以同时执行。比如帮我分析这个订单包括订单状态、物流状态、退款状态。这三个查询其实可以一起查。2. 在 Spring Boot 里怎么理解最像你熟悉的CompletableFuture线程池异步并发并行远程调用聚合结果返回3. 一个简单流程用户输入帮我综合查询订单 A10086 的所有处理情况流程并行执行 - 查订单状态 - 查物流状态 - 查退款状态 全部完成后 - 汇总结果 - 返回用户4. 大概代码组织配置线程池ConfigurationpublicclassAsyncConfig{BeanpublicExecutorworkflowExecutor(){returnExecutors.newFixedThreadPool(10);}}Workflow ServiceServicepublicclassParallelWorkflowService{AutowiredprivateOrderServiceorderService;AutowiredprivateLogisticsServicelogisticsService;AutowiredprivateRefundServicerefundService;AutowiredprivateExecutorworkflowExecutor;publicStringqueryFullOrderInfo(StringorderId)throwsException{CompletableFutureOrderorderFutureCompletableFuture.supplyAsync(()-orderService.findById(orderId),workflowExecutor);CompletableFutureLogisticslogisticsFutureCompletableFuture.supplyAsync(()-logisticsService.queryByOrderId(orderId),workflowExecutor);CompletableFutureRefundrefundFutureCompletableFuture.supplyAsync(()-refundService.queryByOrderId(orderId),workflowExecutor);CompletableFuture.allOf(orderFuture,logisticsFuture,refundFuture).join();OrderorderorderFuture.get();LogisticslogisticslogisticsFuture.get();RefundrefundrefundFuture.get();returnString.format(订单状态%s物流状态%s退款状态%s,order.getStatus(),logistics.getCurrentNode(),refundnull?无退款:refund.getStatus());}}5. LangChain4j 在这里怎么参与这里也有两种方式方式 A你自己并行编排LLM 只负责最后润色输出比如你并行查完三个服务最后把结果交给 LLM 生成用户友好的答复。方式 B多个 Agent 并行做子任务再汇总比如Agent1 分析订单Agent2 分析物流Agent3 分析退款最后一个总结 Agent 汇总但对 Spring Boot 业务项目来说并行查询部分一般还是你用 Java 控制比较稳。6. 你该怎么记Parallel workflow 把多个独立子任务并发执行最后统一汇总。五、3Routing Workflow 在 Spring Boot 里怎么用1. 适合什么场景用户输入很多种问题但不同问题要走不同流程。比如查订单 - 订单流程查退款 - 退款流程催发货 - 催发货流程投诉 - 售后工单流程2. 在 Spring Boot 里怎么理解非常像Controller 分发策略模式命令模式路由器模式你可以理解成先识别“意图”再把请求交给对应处理器。3. 一个简单流程用户输入我的订单怎么还没发货路由判断识别意图为DELIVERY_URGE然后走催发货处理器4. 代码组织方式一if/else 简单版ServicepublicclassRoutingWorkflowService{AutowiredprivateOrderWorkflowHandlerorderWorkflowHandler;AutowiredprivateRefundWorkflowHandlerrefundWorkflowHandler;AutowiredprivateComplaintWorkflowHandlercomplaintWorkflowHandler;publicStringroute(Stringintent,Stringcontent){if(ORDER_QUERY.equals(intent)){returnorderWorkflowHandler.handle(content);}elseif(REFUND_QUERY.equals(intent)){returnrefundWorkflowHandler.handle(content);}elseif(COMPLAINT.equals(intent)){returncomplaintWorkflowHandler.handle(content);}return暂时无法识别你的问题类型;}}5. 代码组织方式二策略模式版这个更适合 Spring Boot 项目。定义处理器接口publicinterfaceWorkflowHandler{Stringintent();Stringhandle(Stringcontent);}订单处理器ComponentpublicclassOrderWorkflowHandlerimplementsWorkflowHandler{OverridepublicStringintent(){returnORDER_QUERY;}OverridepublicStringhandle(Stringcontent){return进入订单查询流程content;}}退款处理器ComponentpublicclassRefundWorkflowHandlerimplementsWorkflowHandler{OverridepublicStringintent(){returnREFUND_QUERY;}OverridepublicStringhandle(Stringcontent){return进入退款查询流程content;}}路由器ServicepublicclassWorkflowRouter{privatefinalMapString,WorkflowHandlerhandlerMapnewHashMap();publicWorkflowRouter(ListWorkflowHandlerhandlers){for(WorkflowHandlerhandler:handlers){handlerMap.put(handler.intent(),handler);}}publicStringroute(Stringintent,Stringcontent){WorkflowHandlerhandlerhandlerMap.get(intent);if(handlernull){return未找到对应处理器;}returnhandler.handle(content);}}6. LangChain4j 在这里怎么参与最典型的方式就是第一步LLM 识别用户意图例如把用户输入识别成ORDER_QUERYREFUND_QUERYCOMPLAINTDELIVERY_URGE第二步Spring Boot 路由到对应 workflow然后router.route(intent,userInput);这其实是最常见、最好落地的一种做法。7. 你该怎么记Routing workflow LLM 负责“看懂用户想干嘛”Spring Boot 负责“把任务送到正确处理链路”。六、4Orchestrator-workers Workflow 在 Spring Boot 里怎么用1. 适合什么场景适合一个大任务要拆给多个子任务。比如帮我分析最近 30 天差评订单从商品、仓库、物流三个角度总结原因并给出改进建议。这就不是一个简单查询了而是一个“综合分析任务”。2. 在 Spring Boot 里怎么理解你可以把它看成一个总控 Service多个子 Worker Service总控负责拆任务、调度、汇总结果这和传统系统里的聚合服务编排服务调度服务很像。3. 一个简单流程用户输入分析最近 30 天差评订单Orchestrator 拆任务Worker1分析商品维度差评原因Worker2分析仓库维度差评原因Worker3分析物流维度差评原因最后汇总成完整分析报告4. 代码结构示例Worker 接口publicinterfaceAnalysisWorker{Stringname();Stringanalyze(ListOrderorders);}商品分析 WorkerComponentpublicclassProductAnalysisWorkerimplementsAnalysisWorker{OverridepublicStringname(){returnproduct;}OverridepublicStringanalyze(ListOrderorders){return商品维度分析发现尺寸问题较多;}}仓库分析 WorkerComponentpublicclassWarehouseAnalysisWorkerimplementsAnalysisWorker{OverridepublicStringname(){returnwarehouse;}OverridepublicStringanalyze(ListOrderorders){return仓库维度分析华东仓发货延迟较明显;}}物流分析 WorkerComponentpublicclassLogisticsAnalysisWorkerimplementsAnalysisWorker{OverridepublicStringname(){returnlogistics;}OverridepublicStringanalyze(ListOrderorders){return物流维度分析某物流公司丢件率偏高;}}OrchestratorServicepublicclassReviewAnalysisOrchestrator{AutowiredprivateOrderServiceorderService;AutowiredprivateListAnalysisWorkerworkers;publicStringanalyzeBadReviews(){ListOrderbadOrdersorderService.findBadReviewOrdersLast30Days();StringBuilderresultnewStringBuilder(差评订单分析报告\n);for(AnalysisWorkerworker:workers){result.append(worker.analyze(badOrders)).append(\n);}returnresult.toString();}}5. LangChain4j 在这里怎么参与可以这样配合方式 ASpring Boot 拆任务LLM 只做每个子任务的分析比如先由 Java 拿到最近 30 天差评订单数据再把数据分别交给不同分析 Agent/Prompt 去分析商品、仓库、物流最后汇总方式 BLLM 当 orchestrator大模型先决定应该拆成哪些子任务再调用不同 worker/Tool最后总结但企业项目里建议先让 Java 做主流程编排LLM 做分析和生成可控性更好。6. 你该怎么记Orchestrator-workers workflow 一个总控拆任务多个子模块各做一部分最后再汇总。七、5Conditional Workflow 在 Spring Boot 里怎么用1. 适合什么场景某一步执行后要根据结果决定下一步怎么走。比如查订单如果未发货就催发货如果已发货就查物流如果已签收就提示用户。2. 在 Spring Boot 里怎么理解就是典型的if/elseswitch状态机分支流程AI 里只是把这个逻辑和 Tool/Agent 结合起来了。3. 一个简单流程用户输入帮我看一下订单 A10086现在什么情况必要的话帮我催一下条件流程Step1: 查订单状态 Step2: - 如果 WAIT_SHIP - 调用催发货 Tool - 如果 SHIPPED - 调用物流 Tool - 如果 DELIVERED - 返回已签收4. 大概代码ServicepublicclassConditionalWorkflowService{AutowiredprivateOrderServiceorderService;AutowiredprivateLogisticsServicelogisticsService;AutowiredprivateNotificationServicenotificationService;publicStringhandle(StringorderId){OrderorderorderService.findById(orderId);if(ordernull){return订单不存在;}switch(order.getStatus()){caseWAIT_SHIP:notificationService.notifyWarehouse(orderId);return订单尚未发货已帮你通知仓库尽快处理;caseSHIPPED:LogisticslogisticslogisticsService.queryByOrderId(orderId);return订单已发货当前物流状态logistics.getCurrentNode();caseDELIVERED:return订单已签收;default:return订单状态暂时无法识别;}}}5. LangChain4j 在这里怎么参与最常见的方式是Tool 负责查状态 / 发通知 / 查物流Agent 根据 Tool 返回结果决定后续动作或者你在 Java 里自己做条件判断LLM 只负责自然语言输出如果你在做的是“严肃业务逻辑”比如通知仓库、发退款、提工单这类有副作用的操作建议条件判断尽量由 Java 控制不要完全交给 LLM。6. 你该怎么记Conditional workflow 根据执行结果动态分支很适合有状态变化和副作用操作的业务。八、把这五种 workflow 放到一个完整 Spring Boot 项目里大概怎么组合真实项目里通常不是只用一种而是混合使用。我给你一个完整点的例子。场景智能客服统一入口Controller接收用户问题PostMapping(/chat)publicStringchat(RequestBodyUserMessagereq){returnaiCustomerSupportApp.handle(req.getUserId(),req.getMessage());}AI App 主流程1. LLM 识别用户意图 - Routing 2. 路由到对应业务流程 3. 某个业务流程内部 - 可能 Sequential - 可能 Parallel - 可能 Conditional 4. 如果是复杂分析任务 - 用 Orchestrator-workers 5. 最终把结果交给 LLM 润色 6. 返回前端比如用户问 1查一下订单 A10086走Routing - ORDER_QUERYSequential - 查订单 查物流Conditional - 看是否发货决定要不要查物流用户问 2帮我综合分析这个订单的问题走Routing - ORDER_ANALYSISParallel - 并行查订单、物流、退款LLM 汇总分析用户问 3帮我分析最近 30 天差评原因走Routing - REVIEW_ANALYSISOrchestrator-workers - 商品/仓库/物流 多 worker 分析最后总结九、你在项目里到底该怎么选这是最实用的一部分。1. 如果流程固定、步骤简单选Sequential比如查订单 - 查物流 - 输出结果2. 如果多个查询互不依赖选Parallel比如同时查订单、退款、物流3. 如果用户问题类型很多选Routing比如订单、退款、投诉、推荐不同处理器分开4. 如果任务很大需要拆工协作选Orchestrator-workers比如多维度分析报告多角色内容生成5. 如果下一步取决于当前结果选Conditional比如未发货催仓已发货查物流已签收结束流程十、对你这种“已经会 Tool 的 Spring Boot 开发者”最推荐的落地方式我建议你刚开始不要把 workflow 全交给 Agent 自己推理而是用这种方式推荐架构Java 控流程LLM 做理解和表达LLM 负责理解用户自然语言提取参数分类意图总结结果生成用户友好回复Spring Boot 负责工作流编排顺序/并行/分支控制调用 Tool/Service权限校验异常处理风险控制为什么这么做因为这样更稳更可控更适合企业项目更容易调试更符合你现在 Spring Boot 的开发习惯你可以把它理解成不是让 LLM 接管你的系统而是让 LLM 变成你的智能入口和智能解释器。十一、给你一个最简化的“记忆口诀”你可以用这 5 句话记住Sequential按顺序一个个做Parallel能一起做就一起做Routing先判断是什么问题再分配处理器Orchestrator-workers大任务拆小任务分工协作Conditional根据中间结果决定下一步十二、给你一个最适合练手的学习顺序如果你要自己练我建议第一步先做 Routing做一个统一客服入口识别订单、退款、投诉三类问题。第二步加 Sequential订单查询流程查订单 - 查物流 - 组装回复。第三步加 Conditional根据订单状态决定是否催仓、是否查物流。第四步加 Parallel同时查询订单/物流/退款做综合分析。第五步再尝试 Orchestrator-workers做一个“多维度分析报告”。这是最适合你这种 Spring Boot 开发者的学习路径。如果你愿意我下一步可以直接继续帮你做下面两种东西之一方案 1给你代码骨架我可以直接给你一套Spring Boot 项目结构示例把这 5 种 workflow 的类怎么分、包怎么分、接口怎么设计写出来。方案 2给你完整 demo我可以直接写一个Spring Boot LangChain4j 的订单助手 Demo里面包含RoutingSequentialConditional这三个最常用的 workflow。如果你想继续直接回复我一句继续给我项目结构设计或者继续给我一个订单助手 demo