学了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 + Annotated OverAllState + KeyStrategy
状态追加 Annotated[list, operator.add] KeyStrategy.APPEND
状态覆盖 不加注解的字段 KeyStrategy.REPLACE

Python版:

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

Java版:

bash 复制代码
KeyStrategyFactory factory = KeyStrategyFactory.builder()
    .keyStrategy("messages", KeyStrategy.APPEND)
    .keyStrategy("nextAction", KeyStrategy.REPLACE)
    .build();

StateGraph graph = new StateGraph(factory);

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


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

概念 LangGraph Spring 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:

bash 复制代码
workflow.add_conditional_edges(
    "reviewer", route_decision,
    {"continue": "planner", "done": END, "retry": "executor"}
)

Java:

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

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

并行写法差异

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

bash 复制代码
workflow.add_edge(START, "code_check")
workflow.add_edge(START, "style_check")
workflow.add_edge(["code_check", "style_check"], "merge")

Java可以一步传List:

bash 复制代码
graph.addEdge(START, List.of("codeCheck", "styleCheck"));
graph.addEdge(List.of("codeCheck", "styleCheck"), "merge");

Java这边反而更简洁。


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

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

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


四、人机交互:Python更灵活

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

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


五、ReAct Agent写法

LangGraph:一行搞定

bash 复制代码
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(model, tools, checkpointer=MemorySaver())

Spring AI Graph:两种方式

简单场景用ChatClient:

bash 复制代码
var chatClient = ChatClient.builder(chatModel)
    .defaultTools(toolCallbackProvider)
    .build();

复杂场景用Graph编排:

bash 复制代码
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。


六、术语速查表

bash 复制代码
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
团队技术栈 Python Java/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
相关推荐
Z-D-K1 小时前
考验AI的“自我和意识“-AI对《红楼梦》后40回的改写(16)
人工智能·ai·aigc·交互·agi
AI破壁猿1 小时前
我做了一个 AI 工具,把 GitHub 仓库 5 分钟转成专利交底书
人工智能·llm·saas
升鲜宝供应链及收银系统源代码服务1 小时前
升鲜宝 AI助手模块功能关联、调用关系与软件开发说明(二)---升鲜宝生鲜配送供应链管理系统源代码服务
人工智能·生鲜配送系统·生鲜供应链源代码·供应链源代码出售·生鲜配送源代码服务·猪肉生产加工系统源代码·生鲜供应链系统
AskHarries1 小时前
Workspace:文件系统、项目上下文和执行边界
java·服务器·前端
摇滚侠1 小时前
JavaWeb 全套教程 Servlet 66-74
java·servlet·tomcat·intellij-idea·jar
杨江1 小时前
codex开始使用
人工智能
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月6日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
落羽的落羽1 小时前
【项目】JsonRpc框架——开发实现1(细节功能、字段定义、抽象层、具象层)
linux·服务器·网络·c++·人工智能·算法·机器学习
Harvy_没救了2 小时前
【github爆款】Headroom:AI代理的智能上下文压缩层 —— 深度解析与洞察
人工智能·github