当前位置: 首页 > news >正文

学了Spring AI Graph再看LangGraph,发现API几乎一模一样

Java开发者看LangGraph文档最痛苦的不是概念难,而是同一个东西换了名字。本文6张对照表+代码对比,帮你5分钟打通两个框架。


先说结论

LangGraph和Spring AI Graph,底层模型完全一样:有向图 + 共享状态 + 节点执行 + 边路由。甚至StateGraph这个类名都一样。

真正的差异只有两处:

  1. 术语不同:Reducer→KeyStrategy,TypedDict→OverAllState
  2. 语言表达不同:Python用装饰器/字典,Java用Builder/Map

这篇文章把这两处差异一次性讲清楚。


一、状态管理:术语差异最大

这是最容易搞混的部分。

概念LangGraph (Python)Spring AI Graph (Java)
状态定义TypedDict+AnnotatedOverAllState+KeyStrategy
状态追加Annotated[list, operator.add]KeyStrategy.APPEND
状态覆盖不加注解的字段KeyStrategy.REPLACE

Python版:

class AgentState(TypedDict): messages: Annotated[list, operator.add] # 追加 next_action: str # 覆盖

Java版:

KeyStrategyFactory factory = KeyStrategyFactory.builder() .keyStrategy("messages", KeyStrategy.APPEND) .keyStrategy("nextAction", KeyStrategy.REPLACE) .build(); StateGraph graph = new StateGraph(factory);

本质一样:追加还是覆盖,就是Reducer/KeyStrategy要解决的事。


二、节点与边:API比想象中更像

概念LangGraphSpring AI Graph
添加节点add_node("name", fn)addNode("name", AsyncNodeAction.node_async(fn))
普通边add_edge("a", "b")addEdge("a", "b")
起始边add_edge(START, "a")addEdge(START, "a")
条件边add_conditional_edges(src, fn, map)addConditionalEdges(src, AsyncEdgeAction.edge_async(fn), map)
并行分叉多次add_edge(START, "a")addEdge(START, List.of("a", "b"))
并行汇聚add_edge(["a","b"], "c")addEdge(List.of("a","b"), "c")

注意看:addNode/addEdge/addConditionalEdges,连方法名都只差下划线和驼峰

条件边对比

Python:

workflow.add_conditional_edges( "reviewer", route_decision, {"continue": "planner", "done": END, "retry": "executor"} )

Java:

graph.addConditionalEdges( "reviewer", AsyncEdgeAction.edge_async(routeDecision), Map.of("continue", "planner", "done", END, "retry", "executor") );

映射逻辑完全一致,Java只是多了AsyncEdgeAction的异步包装。

并行写法差异

Python并行分叉需要多次连边:

workflow.add_edge(START, "code_check") workflow.add_edge(START, "style_check") workflow.add_edge(["code_check", "style_check"], "merge")

Java可以一步传List:

graph.addEdge(START, List.of("codeCheck", "styleCheck")); graph.addEdge(List.of("codeCheck", "styleCheck"), "merge");

Java这边反而更简洁。


三、持久化与恢复:几乎一致

概念LangGraphSpring AI Graph
内存检查点MemorySaver()InMemoryCheckpointSaver
数据库检查点PostgresSaver(conn)自定义实现
编译时启用compile(checkpointer=...)compile(config)
获取/恢复状态get_state()/update_state()getState()/updateState()

两边都是Pregel模型的标准实现,命名和用法几乎一致。


四、人机交互:Python更灵活

概念LangGraphSpring AI Graph
中断interrupt(value)interruptsBefore/interruptsAfter
恢复Command(resume=...)继续调用invoke

Python的interrupt()可以在节点函数内部随时中断,Java目前需要在编译时声明中断点。这是Java版目前的一个局限。


五、ReAct Agent写法

LangGraph:一行搞定

from langgraph.prebuilt import create_react_agent agent = create_react_agent(model, tools, checkpointer=MemorySaver())

Spring AI Graph:两种方式

简单场景用ChatClient:

var chatClient = ChatClient.builder(chatModel) .defaultTools(toolCallbackProvider) .build();

复杂场景用Graph编排:

StateGraph graph = new StateGraph(factory); graph.addNode("llm", AsyncNodeAction.node_async(llmNode)); graph.addNode("tool", AsyncNodeAction.node_async(toolNode)); graph.addEdge(START, "llm"); graph.addEdge("llm", "tool"); graph.addConditionalEdges("tool", AsyncEdgeAction.edge_async(routeNode), Map.of("continue", "llm", "done", "end")); graph.addEdge("end", END);

选型原则:简单工具调用用ChatClient,需要多步编排/人工介入才用Graph。


六、术语速查表

LangGraph Spring AI Graph ────────── ────────────── StateGraph ↔ StateGraph(同名!) TypedDict ↔ OverAllState Annotated + Reducer ↔ KeyStrategy add_node() ↔ addNode() + AsyncNodeAction add_edge() ↔ addEdge() add_edge()×N (fan-out) ↔ addEdge(src, List.of(...)) add_edge([...], tgt) ↔ addEdge(List.of(...), tgt) add_conditional_edges() ↔ addConditionalEdges() + AsyncEdgeAction compile() ↔ compile() MemorySaver ↔ InMemoryCheckpointSaver PostgresSaver ↔ 自定义CheckpointSaver interrupt() ↔ interruptsBefore/After Command(goto=) ↔ 条件路由 create_react_agent() ↔ ChatClient + Tools LangSmith ↔ Micrometer + OTel

选型建议

场景选LangGraph选Spring AI Graph
团队技术栈PythonJava/Spring
可观测性LangSmith深度集成Micrometer + OTel
企业级部署需自建Spring安全体系天然支持
和业务集成需跨语言直接融入Spring微服务
生态丰富度LangChain生态最全快速追赶中

Java开发者的现实问题:用Python写Agent、Java写业务,两套代码库维护成本翻倍。Spring AI Graph的价值就是——不换语言,做同样的事。

但核心观点是:框架只是实现,图状态机这个模型才是本质。理解了模型,换框架只是API转换。


参考资料:

  • LangGraph 官方文档(langchain-ai/langgraph,2026)
  • Spring AI Alibaba Graph 源码(alibaba/spring-ai-alibaba,2026)
  • Spring AI Alibaba Graph 并行节点文档(java2ai.com)
http://www.jsqmd.com/news/971734/

相关文章:

  • 电力工程师必看:手把手教你用Python解析COMTRADE文件(含CFG/DAT文件实战)
  • 从MATLAB到C语言:手把手教你实现db4小波四层分解与重构(附完整代码)
  • TVA为什么是企业智能化升级的战略支点(13)
  • 全场景提效!职场人导航覆盖程序员开发+职场办公所有需求
  • 2026年东莞知识产权诉讼律师推荐:5位实战经验丰富的专才 - 本地品牌推荐
  • 从‘黑盒’到‘白盒’:在金融风控和医疗诊断中,我们为什么必须给AI模型一个解释?
  • Windows 10/11 下用 Visual Studio 2019 编译 ZLMediaKit 流媒体服务,保姆级避坑指南
  • 2026年广州知识产权诉讼律师推荐 钟泽江双资质专业护航 - 本地品牌推荐
  • 2026年中山知识产权律师推荐指南:从灯饰照明到五金家电 - 本地品牌推荐
  • 2026年AI营销获客工具盘点:4大核心选型维度
  • 从停等协议到ARQ:手把手图解RDT协议如何一步步实现可靠数据传输(附状态机详解)
  • ESP32 I2C驱动OLED屏幕实战:从硬件接线到显示‘Hello World‘的完整流程
  • 如何3步解决机械键盘连击问题:Keyboard Chatter Blocker实战指南
  • opencv 5.0.0发布:从构建要求到DNN引擎、模块拆分、Python绑定,OpenCV 4升级5最全迁移指南
  • Empire 4.2监听器与后门生成实战:从HTTP到多种Stager的配置与免杀思路
  • 2026年武汉离婚律师推荐榜单:5位资深律师实战经验丰富 - 本地品牌推荐
  • 赤峰离婚纠纷解决太困难?2026年这5家离婚律师推荐 - 本地品牌推荐
  • 从‘能用’到‘好用’:Nsight Systems (nsys) 搭配CUDA Best Practices指南的优化实战
  • Android音频策略配置实战:手把手教你读懂audio_policy_configuration.xml(附源码解析)
  • 终极Bazzite游戏系统指南:如何在手持设备上获得最佳游戏体验
  • 告别卡顿与依赖错误:保姆级优化你的Unitree Go1 Nano主控开发环境(换源、网关、jtop监控全攻略)
  • 2026年深圳知识产权诉讼律师推荐榜单:5位深耕实务的实力派 - 本地品牌推荐
  • 告别杂乱报表!手把手教你为若依(RuoYi)前后端分离项目添加Excel智能合并行功能
  • KMS_VL_ALL_AIO:Windows与Office批量激活的终极技术方案
  • Jsxer:如何快速解码Adobe JSXBIN二进制脚本文件?
  • C语言企业项目实战(四)
  • 告别杂乱报表!手把手教你用若依框架定制个性化Excel导出(合并行实战)
  • FSDB文件太大导致Verdi卡死?试试这5个波形文件瘦身与性能优化技巧
  • 用Delphi7和SPComm手撸一个SBUS调试助手:从串口抓包到通道数据可视化
  • 从手电筒到汽车大灯:手把手用ZEMAX中的Étendue概念搞定光源准直设计