Java 开发者做 AI Agent,为什么纠结选型
过去两年,Python 生态在 AI Agent 领域几乎是垄断态势——LangChain、LlamaIndex、AutoGen,工具链成熟得让 Java 开发者眼红。但 2025 年之后局面变了,Java 侧的两个主要框架都快速迭代到了可用甚至好用的阶段:LangChain4j 在 Agent 编排和 RAG 管线上持续深耕,Spring AI 则以 Spring Boot 生态整合为核心卖点,到了 2.0 里程碑版本已经重构了整个 Tool Calling 体系。
很多团队的困惑是:这两个框架看起来功能高度重叠,都支持大模型对接、工具调用、RAG、多模态,那到底该选哪个?是不是随便挑一个就行?
答案没那么简单。两者的设计哲学、抽象层次和工程取舍差异很大,选错了不是”能用但别扭”的问题,而是后期 Agent 逻辑复杂化之后会碰到框架本身的天花板。这篇文章不打算做功能清单式罗列,而是从实际 Agent 开发中最关键的几个维度——编排能力、工具调用机制、记忆管理、RAG 管线、生态兼容和生产稳定性——来拆解两者的真实差异。
先厘清一个核心误区:这不是”二选一”的关系
很多对比文章把 LangChain4j 和 Spring AI 描述成竞争关系,仿佛选了一个就得放弃另一个。但实际上,两者的定位有明显的错位设计。
Spring AI 的核心叙事是”让 AI 开发融入 Spring Boot 工程体系”。它的自动配置、Starter 依赖、Bean 管理和配置文件体系,本质上是在把 AI 能力”工程化”——限流、多租户隔离、审计日志、可观测性,这些企业级需求是它的重点。你可以理解为,Spring AI 更关注”AI 能力怎么在现有 Spring 工程里安全、可控地跑起来”。
LangChain4j 的核心叙事则更接近”Java 版 LangChain”。它不强依赖任何特定框架(虽然提供了 Spring Boot 集成模块,但也支持 Quarkus、Micronaut、Helidon),把精力集中在 AI 能力本身的深度上——声明式 Agent 接口、多 Agent 编排模式、高级 RAG 管线(查询路由、重排序、倒数排名融合)、多模态输入输出,这些是它的强项。
所以在很多海外落地实践中,你甚至能看到两者共存的架构:Spring AI 负责工程治理层,LangChain4j 负责 AI 编排核心。这种组合并非没有成本,但在复杂企业项目中并不罕见。
Agent 编排能力:LangChain4j 走得更深
AI Agent 开发的核心不在于”能不能调大模型”,而在于”能不能把多个步骤、多个工具、多个 Agent 串联起来形成工作流”。这恰恰是两个框架差异最大的地方。
LangChain4j 在 AgenticServices 模块里提供了五种编排模式:基础调用、顺序编排、循环编排、并行编排和 Supervisor 模式。它的 Agent 定义方式是声明式的——你写一个接口,用注解描述角色和任务,框架自动处理工具发现、记忆注入和结果传递。
public interface ResearchAgent {
@Agent("研究指定主题并生成详细的研究报告")
@SystemMessage("""
你是一个专业的技术研究员。
关于网络搜索工具的使用原则:
- 仅当主题涉及近期事件或实时数据时才使用搜索工具
- 对于已有充分知识的成熟技术概念,直接基于自身知识撰写报告
""")
@UserMessage("请研究以下主题:{{topic}}")
String research(@V("topic") String topic);
}
这段代码定义了一个研究型 Agent,@Agent 描述任务,@SystemMessage 设定角色约束,@UserMessage 模板化输入。如果你需要流式输出,把返回类型从 String 改成 TokenStream 就行——声明式的好处在这里体现得很明显。
反观 Spring AI,它的 Agent 能力构建在 Advisor Chain 之上。2.0 版本把 Tool Calling 循环提升为 Advisor 链中的一等公民(ToolCallingAdvisor),这是一个递归 Advisor——模型每次返回工具调用请求时,Advisor 执行对应工具,把结果拼回上下文,然后重新进入下游链,直到模型不再请求工具调用为止。这个设计比 1.x 版本(工具循环埋在每个 ChatModel 内部)灵活得多,但它的编排能力更偏向”单 Agent 多轮工具调用”,而不是 LangChain4j 那种显式的多 Agent DAG 编排。
如果你的 Agent 场景是”一个 Agent 串联多步推理 + 工具调用”,Spring AI 2.0 完全够用。但如果你需要”多个 Agent 分工协作,研究 Agent 把结果传给写作 Agent,写作 Agent 再交给审核 Agent 校验”,LangChain4j 的多 Agent 编排模式会更直接。
| 维度 | LangChain4j | Spring AI 2.0 |
|---|---|---|
| Agent 定义方式 | 声明式接口 + 注解 | ChatClient + Advisor Chain |
| 多 Agent 编排 | 5 种内置模式(顺序/循环/并行/Supervisor 等) | 需自行组合 Advisor 实现 |
| 工具调用循环 | 框架内部管理 | ToolCallingAdvisor,可观测每次迭代 |
| 流式输出 | TokenStream 原生支持 | .stream() 支持 |
| 记忆与工具交互 | AI Service 自动注入记忆 | Advisor 位置决定记忆粒度,可捕获完整工具对话 |
| 框架依赖 | 轻量,可选 Spring Boot / Quarkus / Micronaut | 强依赖 Spring Boot |
Tool Calling:Spring AI 2.0 的架构更灵活
虽然 LangChain4j 在多 Agent 编排上更成熟,但 Spring AI 2.0 在 Tool Calling 的架构设计上做了一个更先进的决策:把工具调用循环从模型实现层提升到 Advisor 层。
这个改动的实际意义是什么?在 1.x 时代,每个 ChatModel 实现内部都有自己的工具执行循环,你没办法在循环过程中插入自定义逻辑——比如记录每次工具调用的耗时、在工具返回后做安全检查、或者限制单次对话的最大工具调用次数。2.0 把这个循环变成 Advisor 链的一个环节后,所有这些都变得可组合。
举个具体场景:一个企业内部的 AI 助手需要调用内部 API,但某些 API 有权限分级。你希望在工具调用之前拦截并校验权限。在 Spring AI 2.0 里,你可以把一个自定义 Advisor 放在 ToolCallingAdvisor 之前,每次模型请求工具调用时都会先经过你的校验逻辑。在 LangChain4j 里实现类似效果需要用 Guardrails(护栏机制)或者自行扩展工具执行流程,灵活度不差,但侵入性稍高。
Spring AI 2.0 的工具定义也足够简洁:
class WeatherTools {
@Tool(description = "Get the current weather for a given city")
public String getWeather(String city) {
return weatherService.fetch(city);
}
@Tool(description = "Book a flight between two cities")
public BookingConfirmation bookFlight(
String origin, String destination,
@ToolParam(description = "Date in YYYY-MM-DD") String date) {
return flightService.book(origin, destination, date);
}
}
String response = ChatClient.create(chatModel)
.prompt("What's the weather in Amsterdam?")
.tools(new WeatherTools())
.call()
.content();
@Tool 注解标注方法,@ToolParam 描述参数,框架自动生成 JSON Schema 传给大模型。这和 LangChain4j 的 @Tool 注解在写法上已经很接近了,双方在这个层面的差距不大。
但 Spring AI 2.0 还有一个值得关注的点:ToolSearchToolCallingAdvisor。当你的 Agent 注册了几十个甚至上百个工具时,把所有工具定义都塞给模型会导致 Token 消耗暴增且模型容易混淆。Spring AI 2.0 提供了一个基于向量检索的工具搜索 Advisor,只把跟当前问题相关的工具定义发给模型。这对于工具数量多的企业场景来说是个实用的设计。LangChain4j 目前在这块还缺少类似的内置方案。
记忆管理:Advisor 位置决定了你能记住多少
Agent 的记忆管理看似简单,实际上在工具调用场景下有不少坑。核心问题是:工具调用的中间过程(模型请求调用什么工具、工具返回了什么)要不要存入记忆?
Spring AI 2.0 对这个问题的处理方式很有工程感——它通过 MessageChatMemoryAdvisor 在 Advisor 链中的位置来决定记忆粒度:
- 放在
ToolCallingAdvisor外层(默认位置):记忆只保存最终的用户消息和助手回复,工具调用过程不持久化。这对大多数场景足够,且对所有 ChatMemoryRepository 实现都安全。 - 放在
ToolCallingAdvisor内层:每次工具调用的请求和响应都会被持久化,模型在后续对话中能”回忆”之前尝试过什么、结果如何。但前提是你的 Repository 实现要支持序列化工具消息——目前只有 InMemory、Redis 和 Neo4j 的内置实现支持。
这个设计的好处是:把选择权交给开发者,而不是框架替你做决定。但坏处也很明显——如果你不理解 Advisor 链的执行顺序,很容易在不经意间把工具对话历史写满数据库,或者反过来发现 Agent “失忆”了却不知道为什么。
LangChain4j 的记忆管理更”自动化”一些。AI Service 默认会管理聊天记忆,支持消息窗口和 Token 窗口两种策略,你不需要操心工具消息要不要存的问题。但代价是灵活性略低——如果你想精细控制哪些消息进入记忆,需要绕过 AI Service 使用底层 API。
RAG 管线:LangChain4j 的深度优势明显
检索增强生成是 AI Agent 的核心场景之一,尤其是在企业知识库问答场景。这个领域 LangChain4j 积累的优势比较明显。
LangChain4j 的 RAG 管线覆盖了从数据摄入到检索的完整链路:文档加载支持文件系统、URL、GitHub、Azure Blob、Amazon S3 等多种来源;分割算法提供递归分割、按行分割、按段落分割等策略;检索阶段支持查询转换(扩展、压缩)、查询路由、重排序和倒数排名融合(RRF)。这些组件都是模块化的,你可以用 RetrievalAugmentor 接口自由组合。
相比之下,Spring AI 的 RAG 能力更基础。它提供了 VectorStore 抽象和 ETL 管线(文档读取、分割、嵌入、存储),但在检索阶段的高级策略上——查询路由、重排序、RRF 融合——还需要开发者自行实现或等待社区扩展。如果你做的 RAG 系统只需要”把文档切片存进去,问答时检索 top-K”,Spring AI 够用。但如果检索质量是核心指标,你需要做查询改写、多路召回、结果融合这些操作,LangChain4j 的开箱即用程度高得多。
生态与集成:Spring AI 的主场优势
如果你的技术栈本身就是 Spring Boot + Spring Cloud,Spring AI 的集成体验是碾压级的。自动配置、配置文件统一管理、Actuator 监控、Spring Security 权限控制——这些 Spring 生态的标准能力都能直接复用到 AI 应用上。
一个很实际的场景:你的 AI 服务需要做多租户隔离——不同租户使用不同的模型实例、不同的向量库、不同的工具集。在 Spring AI 里,这基本就是标准的 Spring 多租户模式:用 @Configuration 做条件装配,用 SpEL 做租户路由,用 Spring Security 做权限校验。你的团队不需要学新的架构模式,现有经验直接迁移。
在 LangChain4j 里做同样的事情,需要更多的手动编码。虽然它也提供了 Spring Boot Starter,但这只是简化了 Bean 配置,并不像 Spring AI 那样在框架层面内建了对多租户、限流、审计等企业级需求的支持。
模型和向量库的集成覆盖面上,两者差距不大。LangChain4j 号称对接了 20+ LLM 提供商和 30+ 向量存储,Spring AI 也有类似规模的集成矩阵。但 Spring AI 2.0 做了一个值得注意的调整:移除了 Azure OpenAI 的独立模块,改为在标准 spring-ai-openai 模块中通过 deployment 机制统一支持。同时 Vertex AI 模型模块和智谱 AI 集成也被移出了主仓库。这说明 Spring AI 在做集成收敛——与其维护一堆半生不熟的集成模块,不如把核心路径做稳。
常见误区与选型建议
误区一:功能列表长 = 能力强
两个框架的 README 看起来都支持 RAG、工具调用、多模态、流式输出,似乎打个平手。但”支持”和”好用”之间差了很远。LangChain4j 的 RAG 是模块化管线,每个环节可替换;Spring AI 的 RAG 更像是 ETL 管线 + 向量检索的基础设施。如果你的核心场景是 RAG,不要只看”是否支持”,要看”检索阶段能做多细的优化”。
误区二:Spring AI 只适合 Spring Boot 项目
虽然 Spring AI 确实强依赖 Spring Boot,但并不意味着你的整个系统必须是 Spring Boot。很多团队的做法是:主业务系统用什么框架都行,AI 微服务单独用 Spring Boot + Spring AI 搭建,通过 HTTP/gRPC 对外暴露接口。AI 服务本身作为独立微服务部署,和主系统的技术栈解耦。
误区三:LangChain4j 不适合企业级生产
这个认知在 2024 年可能还有点道理——那时候 LangChain4j 的 API 还在频繁变动。但到 2026 年,它的核心 API 已经趋于稳定,社区也提供了 Guardrails(输入输出护栏)、ChatModelListener(Token 用量和耗时监控)等生产级能力。如果你不是特别依赖 Spring 生态的治理能力,LangChain4j 完全可以在生产环境使用。
实战选型建议
说了这么多,落到实际选型上,建议从以下几个问题出发:
- 你的团队是否已经有成熟的 Spring Boot 工程体系?如果是,Spring AI 的上手成本几乎为零,工程治理能力直接复用。
- 你的 Agent 是否需要多 Agent 协作编排?如果需要研究 Agent → 写作 Agent → 审核 Agent 这种链式或并行编排,LangChain4j 的 AgenticServices 更直接。
- RAG 检索质量是否是核心指标?如果是,LangChain4j 的高级 RAG 管线能帮你省掉大量自研工作。
- 你的工具数量是否会超过 50 个?如果是,Spring AI 2.0 的 ToolSearchToolCallingAdvisor 值得重点评估。
- 你是否需要非 Spring Boot 的运行时支持?如果技术栈是 Quarkus 或 Micronaut,LangChain4j 是更自然的选择。
一个比较务实的路径是:先用你更熟悉的那一个快速验证 MVP,在 Agent 逻辑复杂化之后再评估是否需要引入另一个框架的特定能力。两个框架都支持通过 HTTP 暴露 AI 能力,跨框架组合在架构上是可行的。
写在最后
Java AI Agent 开发还处于快速演进期,两个框架都在以月为单位迭代。LangChain4j 的优势在于 AI 编排的深度——多 Agent 模式、高级 RAG 管线、声明式 Agent 定义,这些能力让它在复杂 Agent 场景下更得心应手。Spring AI 的优势在于工程化治理——Spring 生态整合、可组合的 Tool Calling 架构、多租户和可观测性支持,这些能力让它在企业级部署中更省心。
选型不是选”更好的框架”,而是选”更适合你的团队和场景的框架”。理解了两者在设计哲学上的差异,后续不管是单独使用还是组合使用,都能做出更清醒的判断。
原创文章,作者:,如若转载,请注明出处:https://fudengji.cn/article/312/