学了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)
相关推荐
跨境联盟10 小时前
行业思考|精准营养会成为社区健康驿站的核心竞争力吗?
大数据·人工智能·健康医疗·健康管理·精准营养
龙亘川10 小时前
长假大客流复盘|数字化助力城市交通与文旅态势智能管控
大数据·人工智能·智慧城市·开源软件·数据可视化
糖炒狗子10 小时前
NeurIPS 2025 最佳论文逐行拆解:一个 sigmoid 门控,让 Attention Sink 从 46.7% 掉到 4.8%
人工智能·深度学习
步行cgn10 小时前
MySQL 报错:Access denied for user ‘root‘@‘localhost‘ 详解
java·数据库·spring
zmsup10 小时前
AI Agent 架构详解:从 ReAct、规划执行到多智能体协作
人工智能·架构·agent·运维工具·运维智能体
玩AI的奶茶10 小时前
从零到跑通:在算家云上部署大模型的完整操作手册(实例创建 / 镜像选择 / 远程连接 / 成本控制)
人工智能·ai·gpu算力·token·算力租赁
超级架构师10 小时前
迈向数字文明的秩序基石:全面解析 AICTRI 开源 AI 智能体身份与访问管理规范(AgentIAM)
人工智能·开源·ai编程·安全架构
智能制造爱好者10 小时前
7 类新能源汽车驱动电机梳理:从技术特性到量产落地
人工智能·汽车
DcMedia元宇宙10 小时前
智能体丛林法则1:人类的存活与演进
人工智能
田里的水稻10 小时前
EI_策略训练--机器人策略训练的神经网络种类一
人工智能·神经网络·机器人