Java开发者看LangGraph文档最痛苦的不是概念难,而是同一个东西换了名字。本文6张对照表+代码对比,帮你5分钟打通两个框架。
先说结论
LangGraph和Spring AI Graph,底层模型完全一样 :有向图 + 共享状态 + 节点执行 + 边路由。甚至StateGraph这个类名都一样。
真正的差异只有两处:
- 术语不同:Reducer→KeyStrategy,TypedDict→OverAllState
- 语言表达不同: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)
