Spring AI Alibaba 1.1.2.2 Graph 多智能体企业级实战:从 StateGraph 到 Multi-Agent 编排的生产级落地
当下 Java 工程师做 AI最容易踩的坑不是调不通大模型 API而是AI 应用怎么做生产。本文围绕 Spring AI Alibaba 1.1.2.2 最新发布的 Graph 多智能体引擎深入 StateGraph / Node / Edge / OverAllState / KeyStrategy / ParallelEdgeProcessor / RoutingEdgeAction 的源码细节围绕一个真实的智能工单系统示例把 Multi-Agent 协作从 if-else 走向工程化状态机。一、为什么 AI 工作流必须走 Graph而不是拼接几个 Service很多团队第一次接触 AI 编排时习惯把问题理解成调一次模型拿一段结果返回给前端。这种方式适合玩具 Demo却很难支撑真实业务——在线客服、智能工单、运维诊断、审核流、知识助理、任务代理本质上都不是一次调用而是一条有状态、可恢复、可审计、可扩展的长链路。Spring AI Alibaba Graph 的价值正是在 Java 生态里把这条长链路显式建模出来它不是简单把多个 Prompt 串起来而是把 AI 应用提升为一个可以被编排、暂停、恢复、追踪、治理的状态机运行时。真正决定系统能不能进生产的也不是模型答得像不像人而是以下几个问题一个节点失败后状态能不能恢复而不是整条任务重跑人工审核插入后任务能不能断点续跑而不是靠前端临时兜底并发上来后状态、限流、超时、重试、幂等、补偿是否有完整闭环多租户、成本、审计、观测、灰度发布是否有工程化抓手本文不再停留在如何写一个 Graph Demo而是从运行时原理、架构设计、流程知识、工程化治理和高并发演进五个层面把 Spring AI Alibaba Graph 讲成一套可以直接落地的生产方案。二、Spring AI Alibaba Graph 解决了什么具体问题根据 Spring AI Alibaba 官方仓库与 Graph 文档Graph 是其 Agent Framework 的底层运行时核心能力包括状态管理、工作流编排、流式执行、持久化以及复杂流程需要的条件路由、嵌套图和并行执行能力。换句话说Agent Framework 更像高层智能体模式封装Graph 才是真正的底层执行引擎。如果用架构语言来描述它至少补上了四层能力2.1 控制面——负责定义任务怎么运行有哪些节点、节点之间如何跳转、哪些点允许人工中断、哪些分支允许重试、降级、补偿、任务采用什么执行配置与持久化策略。2.2 执行面——负责真正跑节点调用 LLM、调用检索系统、调用 MCP 工具或存量微服务、调用消息队列、审批系统、Bug 平台、通知平台。2.3 状态面——负责跨节点共享上下文并让当前进度可恢复、可追踪、可审计。一个生产级 AI 工作流必须把状态当成一等公民而不是顺手拼个 Map 就结束。2.4 治理面——负责把链路纳入生产控制限流、熔断、隔离、Token 与成本治理、审计与安全脱敏、指标日志 Trace、灰度发布与版本回滚。这四层结构才是 Spring AI Alibaba Graph 能在企业 Java 架构里站住脚的原因。三、核心原理Graph 不是 DAG 图纸而是状态驱动的运行时很多文章把 Graph 解释成节点加边这只说对了一半。生产上真正重要的是下面这句话Graph 节点拓扑 状态模型 路由规则 持久化恢复语义3.1 运行时四要素在spring-ai-alibaba-graph-core的源码里真正决定行为的只有四个抽象组件位置核心职责StateGraphcom.alibaba.cloud.ai.graph.StateGraph工作流定义容器管理节点与边提供addNode()/addEdge()/compile()Node/NodeActioncom.alibaba.cloud.ai.graph.action.NodeAction任务执行单元封装业务逻辑apply(state)返回状态增量Edge/EdgeActioncom.alibaba.cloud.ai.graph.action.EdgeAction节点间连接定义流转规则execute(state)返回下一个节点名OverAllStatecom.alibaba.cloud.ai.graph.OverAllState全局状态容器共享任务数据get()/value()状态读写编译产物是CompiledGraph它负责实际调度——这是 Graph 在生产里最关键的分层定义是声明式的运行时是可恢复的。3.2 为什么 KeyStrategy 是 Graph 的关键不是附属配置Graph 状态的最大风险不是字段太少而是字段更新语义错误。同样一个 key可能代表完全不同的状态行为有的字段只能覆盖比如classification、final_answer有的字段需要累加比如messages、audit_logs有的字段需要合并比如多个子任务输出的tool_results。KeyStrategy的价值就是把写入行为显式化避免并发节点、重试节点、恢复节点把状态写坏。一个常见的线上事故是节点 A 写入messages [分类完成]节点 B 写入messages [知识库检索完成]如果没有追加策略B 会直接覆盖 A最后不是业务没跑而是运行轨迹丢了排障和审计都会失真。3.3 生产视角下的状态设计原则状态不是越多越好而是要满足以下原则只存跨节点必须持久化的信息只存原始事实不存临时拼装 Prompt只存后续节点真的会消费的字段区分业务状态、运行状态和治理状态。推荐把状态分成四类-业务状态工单号、租户、用户问题、知识检索结果、草稿回复-运行状态当前节点、分支选择、重试次数、错误码、耗时-人工状态审核意见、审批人、暂停原因、恢复版本-治理状态token 消耗、模型选择、敏感字段脱敏标记、traceId。四、Spring AI Alibaba 1.1.2.2 的 Multi-Agent 内置模式1.1.2.2 是当前最新的稳定版本其 Multi-Agent 模块通过ReactAgent 内置 Flow Agent 组合把研究里的多智能体模式正式产品化。内置五种模式// 摘自 com.alibaba.cloud.ai.graph.agent.flow.agent SequentialAgent // 顺序执行A → B → C ParallelAgent // 并行执行A、B、C 同时跑结果汇聚 LlmRoutingAgent // LLM 一次性决策路由到某 sub-agent SupervisorAgent // MainAgent 迭代路由输出 JSON 数组调度 LoopAgent // 单 sub-agent 按 LoopStrategy 反复执行源码中的路由模式选型矩阵基于官方文档5.8 Agent Routing Patterns and Best PracticesPatternUse CaseDecision AuthorityBest ForSequentialAgent固定流程步骤预定义顺序已知工作流、数据转换管道ParallelAgent独立任务预定义并行独立分析、多视角评估LlmRoutingAgent简单路由决策LLM 一次性基础任务分类、简单分发SupervisorAgent复杂编排MainAgent 迭代多步工作流、动态任务委派LoopAgent迭代优化循环策略精炼循环、批处理4.1 SupervisorAgent 的源码秘密SupervisorAgent 是 1.1.2.x 里最值得深挖的类。它的内部实际上是 MainAgent 作为StateGraph节点跑出来的——MainAgentNodeAction负责抽取路由决策关键源码片段简化// MainAgentNodeAction.extractRoutingFromMessages() ListMessage messages (ListMessage) state.value(messages).orElseThrow(); Message last messages.get(messages.size() - 1); // 解析文本为 JSON 数组自动剥离 markdown 代码块 ListString next parseJsonArrayOfStrings(last.getText()); // 校验每个名字都在注册的 sub-agent 里 for (String name : next) { if (!subAgents.containsKey(name)) { throw new IllegalStateException(Unknown agent: name); } } // 写入状态SupervisorNodeFromState 读取并跳转 return new Command(Map.of(SUPERVISOR_NEXT_KEY, next), gotoBasedOnNext(next));注意两个细节SUPERVISOR_NEXT_KEY是常量字符串supervisor_next决策结果既写到 state也同时作为下一跳节点——这就是Command命令模式它把修改状态和决定路由原子化。生产上看到这个模式意味着我们可以做一个 retry counter、限制最长迭代次数避免 Supervisor 死循环烧 Token。4.2 RoutingEdgeAction 的 retry 设计RoutingEdgeAction.getDecisionWithRetry()是一段非常生产友好的代码——LLM 路由不能完全信任所以必须重试。简化源码// RoutingEdgeAction.getDecisionWithRetry() private String getDecisionWithRetry(OverAllState state, int maxRetries) { for (int i 0; i maxRetries; i) { String decision singleDecision(state); if (registeredAgents.containsKey(decision)) return decision; log.warn(Routing decision {} not in registry, retry {}/{}, decision, i, maxRetries); } // 兜底把失败原因写进状态让上游节点决定兜底策略 state.update(routing_failure, max retries exceeded); return FALLBACK_AGENT; }这段代码的关键是注册表校验——LLM 幻觉出来的 agent 名必须丢弃。生产项目里这是一个非常容易踩的坑如果没有这一步Supervisor 把任务路由给一个不存在的 sub-agent整个 Graph 直接抛missingNodeInEdgeMapping端到端用户体验是我发了一句话回了一个 500。五、ParallelConditionalEdges 与 AllOf/AnyOf1.1.2.2 的并行能力升级1.1.2.0 起Graph 引擎引入ParallelConditionalEdges和聚合策略AllOf/AnyOf让先把请求广播给多个 Agent再按规则汇总成为内置模式不必自己写汇合节点// Conditional Branch Parallel aggregation MapString, KeyStrategy keyStrategyHashMap new HashMap(); keyStrategyHashMap.put(query, new ReplaceStrategy()); keyStrategyHashMap.put(branch_a_result, new ReplaceStrategy()); keyStrategyHashMap.put(branch_b_result, new ReplaceStrategy()); StateGraph stateGraph new StateGraph(keyStrategyFactory) .addNode(branch_a, node_async(new BranchANode(chatClientBuilder))) .addNode(branch_b, node_async(new BranchBNode(chatClientBuilder))) .addNode(merge, node_async(new MergeAllNode())) // 并行入口 .addEdge(StateGraph.START, branch_a) .addEdge(StateGraph.START, branch_b) // 汇聚 .addEdge(branch_a, merge) .addEdge(branch_b, merge) .addEdge(merge, StateGraph.END);这里的源码细节很多人忽略当一个节点有多条出边fan-outParallelEdgeProcessor在编译期把它升级为ParallelNode如果并行分支路径长度大于 2则进一步包装为SubStateGraphNode或SubCompiledGraphNode确保每个分支的 state 是隔离的且只有KeyStrategy允许的字段才会被合并回去。这是 1.1.2.x 在多 Agent 编排上跟 LangGraph / LangChain LCEL 拉开差距的关键能力并行分支之间的状态不会互相污染合并规则是数据驱动的。5.1 生产视角的并行聚合策略AllOf要求所有分支都成功AnyOf是任一成功即可。在生产里这两者的语义差别很微妙用AllOf的典型场景客服请求 → 同时查订单 查权限 查知识库三份都拉到才能生成答案用AnyOf的典型场景知识检索 → 同时查 ES 查 Milvus谁先返回用谁的结果避免慢节点拖累。1.1.2.x 把这个选择从业务自己写 Node 判断提升到了 Graph DSL 内置能力意味着我们可以把超时后的回退建模进图本身而不是散落在 if-else 里。六、实战示例智能工单编排系统下面用示例场景贯穿本节一个 SaaS 企业要建设智能工单系统。用户在官网、邮件、App、开放平台发起问题后系统需要完成自动识别工单类型与紧急级别咨询类问题 → 检索知识库生成答复缺陷类问题 → 调用缺陷系统创建记录高风险账单投诉或复杂技术故障 → 进入人工审核审核通过 → 消息系统投递回复全流程保留执行轨迹支持中断恢复、重试和审计。这类业务天然适合 Graph因为它同时包含模型决策、外部工具调用、多分支路由、Human-in-the-Loop、长链路恢复。6.1 项目结构按真实工程拆分smart-ticket-orchestrator/ ├── ai-starter/ # Spring AI Alibaba Graph 通用配置模型、监控、限流 ├── ai-graph-ticket/ # 工单 StateGraph Node 实现核心调度 ├── ai-domain/ # 工单、用户、租户等普通业务领域 ├── ai-tools/ # 检索、缺陷创建、消息投递等 MCP/Mock 工具 ├── ai-web/ # Spring Boot Web 启动入口 Controller └── pom.xml6.2 总体架构图Web / App / Email / API │ ┌────▼──────────┐ │ API Gateway │ ← 鉴权 / 租户 / 限流 / 入口审计 └────┬──────────┘ │ ┌────▼────────────────┐ │ Ticket Orchestrator │ │ Spring Boot Graph │ │ Classify / Search / │ │ Bug / Draft / Review│ │ / Send │ └────┬────────────────┘ │ ┌─────┼─────────────┬─────────────┐ ▼ ▼ ▼ ▼ LLM ES / Vector Issue Sys MQ 模型 知识库 缺陷 消息 │ ┌────▼──────────┐ │ Checkpoint │ ← Redis / DB中断恢复 └───────────────┘ │ ┌────▼──────────┐ │ Observability │ ← OTel / Prometheus / Grafana └───────────────┘ │ ┌────▼──────────┐ │ Config/Gov │ ← Nacos / Sentinel / 额度 └───────────────┘6.3 StateGraph 的具体节点设计StateGraphTicketState graph new StateGraph(ticket-orchestrator, stateSerializer); // 1. 注册节点Agent 节点全部异步避免阻塞工作线程 graph.addNode(entry, node_async(new EntryNode())); graph.addNode(classify, node_async(new ClassifyNode(chatModel))); graph.addNode(intent_router, node_async(new IntentRouterNode(chatModel))); graph.addNode(search_node, node_async(new KnowledgeSearchNode(retriever))); graph.addNode(bug_node, node_async(new BugNode(bugClient))); graph.addNode(draft_node, node_async(new DraftNode(chatModel))); graph.addNode(human_review, new InterruptableAction(new HumanReviewNode())); graph.addNode(send_node, node_async(new SendNode(messageClient))); graph.addNode(audit_node, node_async(new AuditNode(auditStore))); // 2. 入口 graph.addEdge(StateGraph.START, entry); // 3. 入口 → 基础校验与租户识别 → 分类 graph.addEdge(entry, classify); // 4. 分类 → 意图路由条件边多分支配 AllOf/AnyOf graph.addConditionalEdges( intent_router, edge_async(new IntentRouteDispatcher()), Map.of( KNOWLEDGE, search_node, BUG, bug_node, BILLING_RISK,human_review, COMPLEX, human_review, CHITCHAT, StateGraph.END ) ); // 5. 知识检索 / Bug → 草稿生成 → 审计 → 结束 graph.addEdge(search_node, draft_node); graph.addEdge(bug_node, draft_node); graph.addEdge(draft_node, audit_node); graph.addEdge(audit_node, StateGraph.END); // 6. 人工审核 → 投递 / 拒绝 graph.addConditionalEdges( human_review, edge_async(new ReviewDispatcher()), Map.of( APPROVE, send_node, REJECT, StateGraph.END ) ); // 7. 消息投递 → 结束 graph.addEdge(send_node, StateGraph.END);6.4 状态模型设计public record TicketState( String ticketId, String tenantId, String userId, String channel, String userMessage, Classification classification, ListKnowledgeChunk knowledgeChunks, ToolResult bugResult, Draft draft, ReviewDecision reviewDecision, String workflowStatus, RuntimeMeta runtimeMeta, ListAuditLog auditLogs ) { public record Classification(String intent, String urgency, String topic, String summary) {} public record KnowledgeChunk(String docId, String title, String snippet, Double score) {} public record ToolResult(String externalId, String status, String detail) {} public record Draft(String content, String model, Integer inputTokens, Integer outputTokens) {} public record ReviewDecision(Boolean approved, String reviewer, String comment) {} public record RuntimeMeta(Integer retryCount, String currentNode, String traceId, Long startedAt, Long updatedAt) {} } Bean public KeyStrategyFactory ticketKeyStrategyFactory() { return () - Map.of( ticketId, new ReplaceStrategy(), tenantId, new ReplaceStrategy(), userInput, new ReplaceStrategy(), classification, new ReplaceStrategy(), knowledgeChunks, new ReplaceStrategy(), bugResult, new ReplaceStrategy(), draft, new ReplaceStrategy(), reviewDecision, new ReplaceStrategy(), workflowStatus, new ReplaceStrategy(), runtimeMeta, new ReplaceStrategy(), auditLogs, new AppendStrategy(), // 关键日志字段必须追加 messages, new AppendStrategy() // 关键对话历史必须追加 ); }这里有一个实践细节很重要auditLogs和messages必须用AppendStrategy否则并行分支、恢复节点一旦写串最后排障找不到完整轨迹。knowledgeChunks不能简单追加因为检索结果通常按一次查询完整替换否则多轮重试后不同版本叠加污染 Prompt。6.5 节点实现把智能决策和工程控制分开Component public class IntentRouterNode implements NodeAction { private final ChatModel chatModel; private final RoutingEdgeAction routingEdgeAction; Override public MapString, Object apply(OverAllState state) throws Exception { // 1) 从状态读上下文 TicketState ts (TicketState) state.value(ticketState).get(); // 2) 业务控制先做租户与白名单过滤 if (!isWithinBusinessHours(ts.tenantId()) !isHighUrgency(ts)) { return Map.of(route, CHITCHAT, earlyExit, true); } // 3) LLM 路由决策自动重试、自动注册名校验 OverAllState subState OverAllState.builder() .put(messages, List.of(new UserMessage(ts.userMessage()))) .put(availableAgents, List.of( new AgentDef(KNOWLEDGE, 咨询类问题检索知识库生成答复), new AgentDef(BUG, 缺陷类问题自动创建缺陷记录), new AgentDef(BILLING_RISK, 高风险账单投诉转人工), new AgentDef(COMPLEX, 复杂技术故障转人工), new AgentDef(CHITCHAT, 闲聊问候直接结束) )).build(); String route routingEdgeAction.getDecisionWithRetry(subState, 3); // 4) 写回状态 → Command 模式保证 update goto 原子化 return Command.of(Map.of(route, route), nextNodeOf(route)); } private String nextNodeOf(String route) { return switch (route) { case KNOWLEDGE - search_node; case BUG - bug_node; case BILLING_RISK - human_review; case COMPLEX - human_review; default - StateGraph.END; }; } }把租户白名单、工作时间判断放在路由前把路由决策放在路由中把goto 决定放在路由后。这是 Graph 节点的标准三段式业务控制 → 模型决策 → 工程落地。如果你的节点是一坨 Prompt if-else 日志那生产一定调不动。6.6 Human-in-the-Loop在 Graph 上挂中断 恢复InterruptableAction是 1.1.2.x 里专门为人工审核设计的节点抽象。源码逻辑在节点内部抛出InterruptException框架捕获后把当前 threadId、checkpointVersion、pendingNode 持久化到 store调用方再以同样的 threadId 调用compile().invokeFromCheckpoint(...)续跑。public class HumanReviewNode implements NodeAction { Override public MapString, Object apply(OverAllState state) { TicketState ts (TicketState) state.value(ticketState).get(); if (!ts.classification().urgency().equals(P0)) { return Map.of(reviewDecision, new ReviewDecision(true, auto, non-P0 auto-approve)); } // 抛中断框架会自动持久化 throw new InterruptException( Awaiting human review for ticket ts.ticketId(), Map.of(reviewer, ops-team, slaMinutes, 30) ); } }Controller 侧的恢复 API简化PostMapping(/tickets/{ticketId}/review) public ResponseEntityMapString, Object review( PathVariable String ticketId, RequestBody ReviewDecision decision) { // 通过 ticketId 反查 threadId恢复 Graph 执行 return orchestrator.resume(ticketId, decision); }七、流程知识一条生产链路应该如何流转如果只讲代码很容易忽略流程边界。真正稳定的系统先有流程知识再有代码实现。7.1 主流程┌──────────────────────┐ │ 入口校验租户识别 │ └──────────┬───────────┘ ▼ ┌────────────────┐ │ 分类节点决策 │ └────┬───────┬───┘ │ │ 咨询/功能 │ │ 缺陷 / 高风险账单 / 复杂 ┌──────────────▼─┐ ┌──▼──────────────┐ │ 知识检索生成草稿 │ │ 转人工审核 │ └────────┬───────┘ └──┬────────┬─────┘ ▼ ▼ ▼ ┌─────────┐ ┌──────┐ ┌──────────┐ │ 是否通过 │ │ 通过 │ │ 拒绝/补充 │ └────┬────┘ └──┬───┘ └─────┬────┘ 是 │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ 投递回复 │ │ 投递回复 │ │ 归档通知│ └────┬────┘ └────┬────┘ └─────┬────┘ │ │ │ └───────────┼────────────┘ ▼ ┌────────────────┐ │ 更新状态 审计 │ └────────────────┘7.2 失败流程生产链路一定不是出错就抛异常。正确做法是按错误类型拆治理策略瞬时错误超时、429、短时网络波动 → 指数退避重试可降级错误检索失败、次级工具失败 → 写状态并进入降级分支业务可修复错误信息不足、用户上下文缺失 → 挂起等待人工或用户补充致命错误状态损坏、关键依赖不可用 → 终止任务并告警。7.3 恢复流程恢复的关键不是重新调用接口而是基于同一个 threadId 和持久化状态继续执行。这要求每个工作流实例必须有稳定主键中断点之前的状态必须已落盘恢复时必须能判断当前版本、当前节点和上次执行结果。八、生产级踩坑清单八个真问题下面这 8 个问题是把 Spring AI Alibaba Graph 推到生产环境最容易翻车的环节每个都附源码定位KeyStrategy 全部默认覆盖并行分支审计日志丢一半症状auditLogs只剩最后一条Otel 上看不到完整轨迹。修复显式声明messages/auditLogs用AppendStrategy编译期KeyStrategyFactory检查。ParallelEdgeProcessor 把 fan-out 误判为单一分支症状以为开了并行结果还是串行。调试在编译后调用stateGraph.print()或getGraph(GraphRepresentation.Type.PLANTUML)查看是否真的生成了ParallelNode而不是普通 node。LlmRoutingAgent 路由到不存在的 agent 名导致 missingNodeInEdgeMapping症状Errors.java里的missingNodeInEdgeMapping抛出Graph 终止。修复用RoutingEdgeAction.getDecisionWithRetry内置重试 注册名校验在 NodeAction 里加 fallback。InterruptableAction 持久化失败导致恢复时重新跑整条链路症状人工审核后从入口重新跑Token 翻倍。修复必须把 CheckpointStore 接入 Redis/DB框架的MysqlSaver/RedisSaver参考官方 1.1.2.x 文档开起来校验恢复时threadId与 checkpoint version 一致。SupervisorAgent 无限循环烧 Token症状MainAgent 反复调度同一个 sub-agent节点重复执行。修复在状态里加supervisor_step_count到 N 次强制结束extractRoutingFromMessages后判断重复度。ParallelAgent 异步节点拿不到 OverAllState 的最新值症状并行分支读到旧 state。修复每个分支内部重新从 state 快照读取不要缓存保证KeyStrategy的ReplaceStrategy不是覆盖场景下的并发安全漏洞。状态字段业务 vs 治理未分离敏感数据写进 audit症状审计日志里包含用户手机号触发合规扫描。修复状态字段设计阶段区分业务/运行/治理三类敏感字段单独路径携带或脱敏后再写。图越来越长从 8 节点扩到 30 节点后没人敢动症状每次改动上线都有意外分支被触发。修复用 Studio 可视化梳理图结构1.1.2.0 起 Studio 支持 CORS 可选配置能跟生产内部端口打通每次改图要求 PR 附 PlantUML diff。九、与 Spring AI 2.0 生态的协同关系2.0 GA 之后Spring AI 官方把模型调用抽象为 ChatClient Advisor 链Spring AI Alibaba 在之上提供 Graph 作为面向工作流的运行时。两者不是替代关系而是分层关系Spring AI 负责模型怎么调ChatModel、Tool、Advisor、Structured Output、MemoryGraph 负责流程怎么跑StateGraph、Node、Edge、Checkpoint、Human-in-the-Loop。这也是 Java AI 生态跟 Python 最大的区别——Python 当下主要靠 LangGraph / LangChain LCEL 去做编排Java 直接有了一个工业级的运行时。这意味着 Java 工程师做 AI本质上不需要关心图引擎怎么实现只需要像写 Spring Boot 业务一样写 Node剩下的交给 Graph。十、回到立意Java 工程师做 AI为什么不用转 Python很多人把Java 做 AI理解成用 Java 调一次 LLM然后得出结论Python 生态更成熟。但真正的企业级 AI 应用七成代码是工程三成代码才是模型。工程侧的事多智能体协作Multi-Agent Orchestration长链路状态恢复Checkpoint Resume人工审核Human-in-the-Loop多租户隔离、成本治理、审计可观测并行分支编排、回退策略、降级方案这些都跟AI无关都是 Java 工程师过去十几年在 Spring 生态里做熟的事。Spring AI Alibaba Graph 1.1.2.2 的发布本质上让 Java 工程师可以继续用熟悉的 Spring 编程模型写多智能体而不是去学 Python 的 asyncio / Celery / LangGraph Pythonic 状态机。一个 Spring Boot 工程师 Spring AI Alibaba Graph 通义千问/DeepSeek可以在一周内搭出一个企业级的 Multi-Agent 工单系统。这件事本身就是 Java AI 生态最大的护城河。下一步你要做的是把 Graph 引入到一个真实业务模块里——订单客服、运维诊断、知识助理、内部数据查询——任何一个有 if-else 决策树的场景都是好选择。先在小范围验证 key strategy、checkpoint store、可观测性后再推广到核心链路。Java AI 的工程化红利才刚刚开始被兑现。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →