Chapter 6:Graph 状态机深度实战
6.1 Graph 核心概念
什么是 StateGraph?
StateGraph 是 Spring AI Alibaba 的底层工作流引擎,它以有向图的形式描述 Agent 执行流程。与内置的四大 Agent 模式不同,StateGraph 提供了更灵活的自定义能力。
┌─────────────────────────────────────────────────────────────┐ │ StateGraph │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │Node │────────▶│Node │────────▶│Node │ │ │ │节点 │ │节点 │ │节点 │ │ │ └─────┘ └─────┘ └─────┘ │ │ │ │ │ │ │ ┌─────────┘ │ │ │ ▼ │ │ ┌─────┐ │ │ │Edge │ 边(路由规则) │ │ └─────┘ │ │ │ │ ┌─────┐ │ │ │State│ 状态(节点间传递的数据) │ │ └─────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
核心组件
| 组件 | 说明 |
|---|
| Node(节点) | 执行单元,可以是 Agent、Tool、或自定义逻辑 |
| Edge(边) | 节点间的连接,决定路由规则 |
| State(状态) | 在节点间传递的共享数据 |
| Graph(图) | 节点和边的集合,构成完整工作流 |
Graph vs 内置 Agent 模式
| 维度 | 内置 Agent | StateGraph |
|---|
| 复杂度 | 低(开箱即用) | 高(需要自定义) |
| 灵活性 | 固定模式 | 完全自定义 |
| 适用场景 | 标准场景 | 复杂定制流程 |
| 开发成本 | 低 | 高 |
| 调试难度 | 低 | 中等 |
6.2 StateGraph API 详解
基础构建
@ConfigurationpublicclassGraphConfig{@BeanpublicStateGraphmyWorkflow(ChatModelchatModel){returnStateGraph.builder()// 1. 定义状态.defineState(newMyState())// 2. 添加节点.addNode("start",newStartNode()).addNode("process",createProcessNode(chatModel)).addNode("evaluate",createEvaluateNode(chatModel)).addNode("end",newEndNode())// 3. 定义边(路由规则).addEdge("start","process").addConditionalEdge("evaluate",(state)->state.get("decision"),Map.of("continue","process","end","end"))// 4. 设置入口和出口.setEntryPoint("start").setFinishPoint("end")// 5. 编译.compile();}}
状态定义
publicclassMyStateimplementsMap<String,Object>{// 用户输入privateStringuserInput;// 处理结果privateStringprocessedResult;// 评估分数privatedoublescore;// 决策privateStringdecision;// 历史记录privateList<String>history;// Getter/SetterpublicStringgetUserInput(){returnuserInput;}publicvoidsetUserInput(Stringinput){this.userInput=input;}publicStringgetProcessedResult(){returnprocessedResult;}publicvoidsetProcessedResult(Stringresult){this.processedResult=result;}publicdoublegetScore(){returnscore;}publicvoidsetScore(doublescore){this.score=score;}publicStringgetDecision(){returndecision;}publicvoidsetDecision(Stringdecision){this.decision=decision;}publicList<String>getHistory(){returnhistory;}publicvoidsetHistory(List<String>history){this.history=history;}}
6.3 自定义节点实现
Agent 节点
publicclassAgentNodeimplementsNode{privatefinalReactAgentagent;privatefinalStringinputKey;privatefinalStringoutputKey;publicAgentNode(ReactAgentagent,StringinputKey,StringoutputKey){this.agent=agent;this.inputKey=inputKey;this.outputKey=outputKey;}@OverridepublicMyStateprocess(MyStatestate){Stringinput=state.get(inputKey);AssistantMessageresponse=agent.call(newUserMessage(input));// 更新状态state.put(outputKey,response.getText());state.put("lastAgent",agent.getName());returnstate;}}// 使用示例.addNode("analysis",newAgentNode(analysisAgent,"userInput","analysisResult"))
Tool 节点
publicclassToolNode