从LangChain到LangGraph:Python与Java双栈Agent开发实战对比
当Python开发者用LangGraph构建生产级Agent时,Java开发者并非只能旁观。LangChain4j让Java生态拥有了对标的Agent编排能力。本文从架构设计、代码实战到选型建议,系统对比Python与Java双栈的Agent开发范式。
引言:Java开发者的AI焦虑
"Python生态的LangChain已经卷出天际了,Java开发者怎么办?"
这是我在技术社区看到最多的问题之一。2026年,AI Agent开发已从"能不能做"进入"怎么做更好"的阶段。Python凭借LangChain、LangGraph、AutoGen等框架统治了原型开发,但企业级生产环境中的Java开发者面临一个尴尬的现实:
- 企业核心业务系统大多跑在Java上
- 团队熟悉Spring Boot,但不熟悉Python生态
- 用Python写Agent,和生产环境集成时处处碰壁
LangChain4j的出现改变了这一格局。它不是Python LangChain的简单移植,而是完全遵循Java编程范式------注解、依赖注入、与Spring Boot无缝集成。截至2026年,LangChain4j已迭代至1.0.x版本,成为Java生态中最成熟的大模型应用框架。
本文将从架构设计、代码实战、选型建议三个维度,系统对比Python LangGraph与Java LangChain4j的Agent开发范式。
一、核心概念对比
1.1 定位差异
| 维度 | LangGraph(Python) | LangChain4j(Java) |
|---|---|---|
| 核心定位 | 图状态机编排引擎 | 全场景大模型应用工具箱 |
| Agent能力 | 原生图编排,状态持久化 | AiService声明式,工具调用 |
| 学习曲线 | 中等 | 低(Spring风格) |
| 生态集成 | LangSmith、LangServe | Spring Boot、Quarkus |
| 适用场景 | 复杂有状态Agent | 企业级RAG、工具调用 |
1.2 Agent范式对比
Python LangGraph:图状态机
LangGraph将Agent建模为有向图:节点代表动作,边定义状态转移逻辑。
Java LangChain4j:声明式AiService
LangChain4j通过@AiService注解让AI服务像Spring Service一样自然。
java
@AiService
public interface Assistant {
@SystemMessage("你是一个专业的智能助手")
String chat(@UserMessage String userMessage);
}
二、代码实战:从简单Agent到复杂编排
2.1 环境配置
Python(LangGraph)
bash
pip install langgraph langchain-openai
Java(LangChain4j)
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.0.0-beta3</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
<version>1.0.0-beta3</version>
</dependency>
2.2 基础Agent实现
Python(LangGraph)
python
from langgraph.graph import StateGraph, MessagesState
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
def call_model(state: MessagesState):
response = llm.invoke(state["messages"])
return {"messages": [response]}
graph = StateGraph(MessagesState)
graph.add_node("model", call_model)
graph.set_entry_point("model")
agent = graph.compile()
result = agent.invoke({"messages": [{"role": "user", "content": "你好"}]})
Java(LangChain4j)
java
@AiService
public interface SimpleAgent {
@SystemMessage("你是一个专业的智能助手")
String chat(@UserMessage String message);
}
@RestController
@RequiredArgsConstructor
public class AgentController {
final SimpleAgent agent;
@GetMapping("/chat")
public String chat(String message) {
return agent.chat(message);
}
}
2.3 工具调用对比
Python:装饰器 + 显式绑定
python
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
@tool
def get_weather(city: str) -> str:
"""查询城市天气"""
return f"{city}今天晴,25°C"
tools = [get_weather]
tool_node = ToolNode(tools)
# 绑定工具到模型
model_with_tools = llm.bind_tools(tools)
graph = StateGraph(MessagesState)
graph.add_node("model", lambda s: {"messages": [model_with_tools.invoke(s["messages"])]})
graph.add_node("tools", tool_node)
# 条件边:有工具调用 → tools节点
graph.add_conditional_edges("model", should_continue, {"tools": "tools", "__end__": "__end__"})
Java:@Tool注解 + 自动注入
java
@Component
public class WeatherTools {
@Tool("查询城市天气,参数为城市名")
public String getWeather(@P("城市名") String city) {
return city + "今天晴,25°C";
}
}
@Configuration
public class AiConfig {
@Bean
public Assistant assistant(ChatLanguageModel model, WeatherTools tools) {
return AiServices.builder(Assistant.class)
.chatModel(model)
.tools(tools) // 自动注入工具
.build();
}
}
核心差异:
- Python需要手动
bind_tools、手动构建ToolNode、手动写条件边 - Java只需在方法上加
@Tool注解,框架自动完成绑定和路由
2.4 状态管理与人工审批
Python(LangGraph)
python
from langgraph.checkpoint.memory import MemorySaver
# 持久化 + 中断审批
graph = StateGraph(OrderState)
graph.add_node("risk_check", check_risk)
graph.add_node("approve", approve_order)
graph.set_edge("risk_check", "approve", interrupt_before=True)
checkpointer = MemorySaver()
agent = graph.compile(checkpointer=checkpointer)
# 执行到approve前会暂停
config = {"configurable": {"thread_id": "order-123"}}
agent.invoke({"order_id": "123", "amount": 50000}, config)
# 人工确认后继续
agent.update_state(config, {"approved": True})
agent.invoke(None, config)
Java(LangChain4j)
LangChain4j的AiService不支持图级别的状态持久化,但可以通过Spring的状态管理实现:
java
@Service
public class OrderAgentService {
@Autowired
private Assistant assistant;
public String processOrder(Order order) {
if (order.getAmount() > 10000) {
// 高风险订单,等待人工审批
return "订单金额过大,需要人工审批";
}
return assistant.chat("处理订单:" + order.getId());
}
}
核心差异:
- LangGraph的图状态持久化是原生能力,支持中断、恢复、时间旅行调试
- LangChain4j目前缺少同等的图编排能力,复杂状态管理需要自己用Spring实现
三、架构设计对比
3.1 LangGraph的图编排模型
┌─────────────────────────────────────────────────────────────┐
│ LangGraph 状态图 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ model │───▶│ tools │───▶│ model │───▶ END │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ▲ │ │
│ └──────────────────────────────┘ │
│ │
│ 核心:状态在图中流转,每个节点可读写状态 │
└─────────────────────────────────────────────────────────────┘
3.2 LangChain4j的声明式模型
┌─────────────────────────────────────────────────────────────┐
│ LangChain4j AiService │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ @AiService │ │
│ │ interface Assistant { │ │
│ │ @SystemMessage("...") │ │
│ │ String chat(@UserMessage String msg); │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 框架自动完成: │ │
│ │ · 注入ChatModel │ │
│ │ · 绑定Tool │ │
│ │ · 管理ChatMemory │ │
│ │ · 处理流式响应 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
四、选型建议
4.1 决策矩阵
| 场景 | 推荐 | 理由 |
|---|---|---|
| 复杂有状态Agent | LangGraph | 图状态持久化、中断恢复 |
| 企业级RAG | LangChain4j | Spring Boot无缝集成 |
| 多Agent协作 | LangGraph | 原生图编排支持 |
| 快速原型 | LangChain | 生态最成熟 |
| Java团队AI转型 | LangChain4j | 零学习成本 |
4.2 混合架构实践
对于Java团队,推荐混合架构:
前端/业务层:Spring Boot
↓ HTTP/gRPC
Agent编排层:LangGraph(Python服务)
↓ MCP协议
工具层:Java微服务
Java负责业务逻辑和工具暴露,Python负责Agent编排和推理。两者通过HTTP或MCP协议通信。
五、总结
| 对比维度 | LangGraph | LangChain4j |
|---|---|---|
| 语言 | Python | Java |
| 核心抽象 | 图状态机 | AiService注解 |
| 状态管理 | 原生持久化 | Spring管理 |
| 工具调用 | 手动绑定 | @Tool自动注入 |
| 学习曲线 | 中等 | 低 |
| 企业集成 | 需自行封装 | Spring Boot原生 |
一句话总结:需要复杂状态管理和图编排,选LangGraph;需要与Spring Boot深度集成,选LangChain4j。两者不是替代关系,而是互补------Java负责业务,Python负责智能,通过协议桥接构成完整的企业级Agent系统。