简介langgraph4j是java技术栈ai agent框架深入掌握其源码与原理指导agent的开发重构/改造框架增加特性快速定位和修复bug发布私有版本系列内容 架构包括逻辑架构运行架构集成架构 状态图 状态和序列化 StatGraph分析 推理框架 编译图 执行图 检查点 aync-generator 执行分析 中断/恢复 取消执行 agent和集成 简单agent 多agent 观测 studio本文分析图编译本文基于langgraph4j v1.8.20关键词agentgraph缩写spring ai 缩写saspring ai alibaba 缩写saa参考资料Overview - LangGraph4j langgraph4j官网mp.weixin.qq.com/mp/appmsgalbum?actiongetalbumalbum_id4540202703779627014spring ai Alibaba原理源码分析包括spring ai部分lg4j概览上图 lg4j的逻辑架构图逻辑架构展示lg4j功能模块描述其职责模块通过精密的协作共同支撑起复杂 Agent 的构建与运行。逻辑架构解构为以下四个核心域图编排、执行与状态、基础设施扩展、集成外部能力生态、开发支持1. 核心编排层图的蓝图与引擎StateGraph (状态图)这是开发者构建 Agent 的核心抽象。它代表了整个工作流的“蓝图”开发者在这里定义有哪些节点Node以及它们之间的流转规则Edge。CompiledGraph (编译图)当 StateGraph 被构建完成后经过 compile() 方法转化而来。编译图重整了状态图的数据结构支持高效的图执行编译图包含了流执行逻辑、状态机引擎和调度策略的“可运行实例”。2.执行与状态层原子动作与数据流转3.基础设施扩展层持久化、异步与可观测4. agentagent有两部分core内agent包是lg4j提供; core外的agent框架spring ai alibaba移植提供完整的agent框架也包括基于core内agent重构的agent builder组件5.外部能力生态层AI核心能力这一层是LangGraph4j 与 AI 生态对接。Spring AI作为底层的能力供给层Spring AI 提供了 Agent 所需的原子能力包括 LLM model大语言模型、RAG检索增强生成、prompt提示词工程、memory长期记忆、mcptoolskills工具调用与技能扩展等。LangGraph4j也集成了langchain4j5.开发工具Studio (可视化开发工具)lg4j的Studio模块提供了一套完整的可视化调试和开发界面让开发者能够直观地看到图的执行路径和状态流转极大地降低了复杂 Agent 的开发门槛。graphlg4j是workflow框架以图的结构节点边构建处理流程节点执行动作实现逻辑边决定下一个节点。agentic是另一种模式整个流程大模型自主编排agentic省心省事但同时agentic容易失控纯粹看大模型心情因此目前比较好的方案主体使用flowable需要的时候使用agentic节点。在lg4j, agent的推理框架映射成graph以图的节点承载执行逻辑边决定下一节点支持检查点保存执行状态实现执行的暂停和恢复编译图上篇分析了状态图状态图是图的结构目的是为了方便构建图而编译图数据结构目的是为了高效执行上图是编译图类图编译把整个图包括子图的数据结构转换为扁平化的邻接表结构。并行分支使用并行节点节点内处理并行执行器无需处理并行。nodes 图的节点集类型MapString, AsyncNodeActionWithConfigStateedges 图的边集类型MapString, EdgeValueState结构是变种的邻接表与正常邻接表不同编译图有设定的起始节点START节点Id获取EdgeValue计算出后续的连接的节点EdgeValue: 封装了边的信息二选一字符串: 节点的id简单路由指向一个节点EdgeCondition: 条件EdgeCondition: 条件决定走哪条边。动作 (acton): 条件的判断逻辑AsyncCommandAction: 返回命令 (Command)。映射关系 (mappings): 条件和节点的映射关系集例如X:_x_ EdgeCondition返回‘X’边走’_x_’节点下面分析编译的原理和源码扁平化邻接表ProcessedNodesEdgesAndConfig负责扁平化状态图数据结构以示例解释代码逻辑介绍一下连接表A: [B],B: [C],C: []连接点结构左是head节点’A’,’B’,’C’; 右是数组代表head节点连接的节点对应的图进一步假设B是子图节点其子图 D-E, D-F,E-G,F-GProcessedNodesEdgesAndConfig处理过后A: [B-D],B-D: [B-E, B-F],B-E: [B-G],B-F: [B-G],B-G: [C],C: []图的数据结构扁平化合并到一个邻接表结构主图与子图节点(B)的连接重定向到子图的节点子图节点名称修改格式%s-%s最后返回子图的Node写入到nodes节点id为keyaction为value的mapCompiledGraph.CompiledGraph()nodes是最终的邻接表head节点集注意lg4j子图节点有两种一种是StateGraph也就是状态图另一种CompiledGraph编译图只有状态图编译打平编译图是保留独立的执行用在多agent的子agent边和并行处理ProcessedNodesEdgesAndConfig处理后返回边(edges)是list图遍历按节点找边需要遍历list因此边数据需要转为map以sourceNodeId为keyListEdge类型转为MapString, EdgeValue另外图有并行分支编译使用并行节点替代并行执行action完成在并行节点内完成不需要执行器介入下图边处理分多targes和单个targetelements是list类型下面是编译图的数据结构Map类型nodes 图的节点集类型MapString, AsyncNodeActionWithConfigStateedges 图的边集类型MapString, EdgeValueState上图target1直接put入edges虽然target1可以是只有一个边也可以是多个边当EdgeValue是EdgeConditionAsyncCommandActionS和边mappings支持多个边选一上图 target1并行分支上图的代码逻辑是从A找到[A1, A2, A3]再找到B分支的聚合点上图 图的约束规定并行分支只能聚合到同一个节点如上图B否则报错illegalMultipleTargetsOnParallelNode还有一个约束分支的边的值类型不能是条件也就是只能是字符串nodeId上图 并行分支action合并到并行节点执行并行节点写入nodes原分支节点前后节点连到新的并行节点到此图结构编译完成总结编译前其中节点B是子图编译中扁平的邻接点编译后上图是示例编译后的图可以理解为是一个”降维”的处理”摆平”多层的主图子图结构”摆平”并行处理降低执行器复杂度提高执行效率