Java 圈搞 Agent 的人最近多起来了。前两年大家默认 Python,觉得 Java 就是拖后腿的那个,现在情况有点变。LangChain4j 已经进入相对稳定的阶段,LangGraph4j 也跟着 Python 版 LangGraph 补齐了图式编排。摆在 Java 工程师面前的选择题,从"要不要用 Python"变成了"这俩到底选哪个"。
先给结论:如果你只是做工具调用、检索问答、简单串起来的助手类应用,用 LangChain4j;如果你的 Agent 有分支、循环、人机协同、需要能中断和续跑,直接上 LangGraph4j,别折腾。
编排能力,本质是两种世界观
LangChain4j 的核心是链(Chain)和 AiServices。它把一次 LLM 调用抽象成"输入 → 提示词模板 → 模型 → 输出解析 → 工具调用"这样一条流水线,用注解就能声明一个 Agent 接口,写起来非常 Spring。
问题也在这。链是有向无环的思维模型,一旦你的业务出现"根据模型判断结果决定下一步走哪条路"、"某个节点失败要回到上游重来"、"人工确认后再继续"这种诉求,链就开始别扭。你会发现自己在链里塞越来越多的 if-else,直到某天忍不住自己撸一个状态机。
LangGraph4j 直接把状态机摊开来给你写。节点是函数,边是条件,State 是显式对象。你要循环就画个回环,要人工介入就在某个节点前 interrupt,要断点续跑就把 State 序列化存起来下次接着跑。它天生适合"多轮决策"和"长时间运行"的 Agent。
代价是心智负担变重,简单场景写起来啰嗦。这是它换来灵活性的对价。
和 Spring 整合,成本差得不是一点
LangChain4j 官方直接提供langchain4j-spring-boot-starter,模型、向量库、Memory、Tool 全都能自动装配,@AiService注解一贴就能用。放到现有 Spring Boot 项目里几乎零迁移成本,这是它最大的护城河。
LangGraph4j 目前的 Spring 支持还比较薄,更多是把它当一个纯粹的编排库嵌进来。State、Node、Checkpoint 这些概念要自己想办法跟 Spring 的 Bean、事务、AOP 磨合。检查点存 Redis 或者 Postgres 也得自己接。生产项目上,这块的隐性成本要提前估进去。
一个折中做法是:LangChain4j 负责底层的模型调用、RAG、Memory,把它当成"AI 基础设施层";LangGraph4j 只负责最上层的流程编排。两个库可以共存,各干各的。
生产可观测、超时、重试怎么落
这块是 Java 相对 Python 的真优势,但前提是你别把这些东西全交给框架。
可观测上,LangChain4j 有ChatModelListener可以拿到每次调用的 request/response、token 用量、耗时,接到 Micrometer + Prometheus 里几行代码的事。LangGraph4j 的可观测粒度更细,每个节点的进出、State 变化都能拿到 Hook,配合 OpenTelemetry 做 tracing 效果更好。真到线上排查一个"Agent 卡了 30 秒"的问题,图式的 trace 比链式清楚太多。
超时不能只靠模型客户端的 timeout。生产里必须做两层:单次 LLM 调用一层,整个 Agent 会话一层。前者防止模型抽风,后者防止死循环把线程占死。LangGraph4j 里循环节点尤其要设最大迭代次数,别指望 LLM 一定会走到终止条件。
重试要区分两种:模型本身的瞬时错误(429、5xx)交给 HTTP 客户端层重试就够了;业务级重试(工具调用失败、输出解析不通过)必须在节点里显式处理,别一股脑抛出去让上游猜。LangGraph4j 的 State 天然适合承载"上次失败原因"这种上下文,让下一轮 LLM 知道该改哪里,这是链式做不到的事。
一点建议
不要因为"图更高级"就上 LangGraph4j。八成的 Agent 场景其实就是"接收请求 → 调工具 → 出结果",LangChain4j 的 AiServices 足够优雅。
真正的分水岭是你的 Agent 需不需要"记住自己走到哪了"。一旦要,选图;不要,选链。中间那点小分支用 LangChain4j 的 Router 也能糊过去,不值得为它上一整套图式框架。
最后一句多余的话:别把 Python 生态里那套"一切皆 Agent"的玩法直接搬到 Java 项目里。Java 工程更看重可预测、可观测、可回滚,能用工作流搞定的就别硬扭成 Agent。你的老板不会因为你用了图式编排就多给你发工资。