当前位置: 首页 > 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.zskr.cn/news/1483460.html

相关文章:

  • 电力工程师必看:手把手教你用Python解析COMTRADE文件(含CFG/DAT文件实战)
  • 2026年AI营销获客工具盘点:4大核心选型维度
  • KMS_VL_ALL_AIO:Windows与Office批量激活的终极技术方案
  • Jsxer:如何快速解码Adobe JSXBIN二进制脚本文件?
  • Android音频策略配置实战:手把手教你读懂audio_policy_configuration.xml(附源码解析)
  • 告别卡顿与依赖错误:保姆级优化你的Unitree Go1 Nano主控开发环境(换源、网关、jtop监控全攻略)
  • ESP32 I2C总线扫盲:如何用Arduino框架和PlatformIO快速扫描并连接你的传感器
  • 用Delphi7和SPComm手撸一个SBUS调试助手:从串口抓包到通道数据可视化
  • 别再死记叉乘公式了!用Python和NumPy玩转向量运算与反对称矩阵
  • F28335 SPI与EEPROM/Flash通信实战:从寄存器配置到数据读写全流程
  • ESP32 I2C驱动OLED屏幕:从硬件连接到显示‘Hello World’的完整流程(附代码)
  • 2026年精选8款文件夹加密软件分享
  • 单人创业,靠 StarLny 搭建数字团队
  • py-spy:不改动代码就能分析 Python 性能
  • F28335 DSP驱动AD7606避坑指南:从原理图焊接到CCS代码调试的完整流程
  • 从‘旋转时钟’到‘整数模n’:手把手用Python代码验证群同构与同态(附完整代码)
  • 告别ifup/ifconfig:Ubuntu 18.04+网络配置,用Netplan这一篇就够了(含YAML避坑指南)
  • 北京GEO优化哪家靠谱?2026主流服务商横向对比与选型指南
  • Almanac:基于行动层面的智能体协作心智模型标注数据集与行为预测基准
  • 保姆级教程:用OpenCV+Python一步步搞定双目相机标定与三维重建
  • Proteus仿真中PCF8574驱动LCD1602的5个常见坑点及解决方法
  • uniapp小兔新儿day2
  • 别再让数据裸奔了!手把手教你为Hadoop HDFS 3.x配置透明加密(附KMS避坑指南)
  • 在AutoDL云服务器上无图形界面安装Matlab 2018b:一份给深度学习研究者的保姆级教程
  • AD20库管理实战:从零创建一个带3D封装的STM32芯片集成库
  • KMS智能激活终极指南:5分钟永久激活Windows和Office的完整教程
  • 打通资产数据壁垒,固定资产管理系统实现全流程数字化
  • 大模型微调避坑指南:LoRA/QLoRA 从数据清洗到部署的实战全录
  • 在Windows电脑上畅享酷安社区:Coolapk UWP桌面版完全指南
  • Agent模型冷启动问题