前两天在一个Java技术社群里,又有人把那个经典问题翻了出来:“现在到底用Spring AI还是LangChain4j?”结果底下跟帖直接把战线拉得更长,有人吼AgentScope,有人问Embabel是不是什么新出的Java版LangChain。
我盯着这个帖子想了很久,发现真正的问题不是“谁更好”,而是这四张牌压根就不在同一个牌桌上。你拿它们横向比较,就像问“电饭煲、电磁炉、蒸烤箱,哪个做菜更好”一样——虽然都能做吃的,但使用场景、操作门槛、厨房改造代价完全不同。
这篇文章我不想做“跑分式”的框架对比,那种对比网上已经够多了,多数看完整个人更懵。我打算换个角度:把这四个框架的真实出身、适用场景、落地路径讲清楚,然后给你一套可以直接套到项目里的选型决策方法。看完你能自己做判断,而不是等别人给你答案。
1. 先搞清楚这四张牌各自是什么
1.1 Spring AI:官方嫡系,Java生态的“亲儿子”
Spring AI是Spring官方在2024年推出的项目,目标非常明确:让Java开发者用Spring Boot那一套熟悉的方式接入大模型。它不是做某个单一功能的工具库,而是一个覆盖模型接入、Prompt管理、向量存储、记忆、Agent Tool调用、RAG等能力的“AI基础设施层”。
它的核心抽象和Spring的风格高度一致。你配置一个ChatModel,就像配置一个DataSource;你注入ChatClient,就像注入JdbcTemplate;你想让模型调用业务方法,就写一个带@Tool注解的Bean。整个开发体验对Java后端工程师来说几乎是零学习迁移成本。
比较关键的一点是,Spring AI从2025年初发布1.0.0正式版之后,API才算基本稳定下来,之前从M1到M6再到RC1,API变动频繁到很多教程发出来两周就过期。现在2.0已经在路上,Spring AI Alibaba这些分支项目也开始补上企业级能力(比如NL2SQL、更贴合国内模型体系的适配)。这个框架的本质定位是“让你在已有的Spring生态里顺手把AI用起来”,而不是“给你一套全新的AI世界观”。
1.2 LangChain4j:社区版的“Java LangChain”
LangChain4j是Java社区自发搞起来的项目,灵感来自Python生态里的LangChain,但它并没有直接搬运LangChain的代码,而是重新设计了一套更适合Java的API。它从来没有宣称自己是“官方”,而是以第三方库的身份在Java世界里提供一条类似LangChain的开发路径。
它最出名的几个能力:声明式AI服务接口AiServices、内容检索器ContentRetriever、内存向量存储EmbeddingStore,以及近几个版本越来越完善的开箱即用RAG能力。
和Spring AI相比,LangChain4j更轻、更面向通用Java应用(不依赖你必须是Spring项目),模型厂商的适配列表也相当长。但它和Spring生态的整合属于“外挂”性质,虽然有spring-boot-starter-langchain4j这类集成包,但整体体验和Spring AI那种“出生就在Spring里”的紧密程度还是不一样。如果你主要做RAG场景,LangChain4j的资料和生态会成熟一些,这也是“langchain4j rag”和“langchain4j easy rag”搜索热度持续走高的原因。
1.3 AgentScope:为多智能体协同而生的平台
AgentScope是阿里通义实验室开源的多智能体开发平台,官方文档和社区资料里,它的核心关键词是Agent协作、消息传递、可视化调试。它解决的不是“怎么调通一个模型”的问题,而是“怎么让多个Agent角色互相协作完成任务”的问题。
打个比方,你用Spring AI或LangChain4j,通常是自己作为主控,让模型回答一个问题或者跑一个工具调用;但AgentScope更像一个导演台,你可以定义“产品经理Agent”“技术评审Agent”“代码生成Agent”,设置它们的协作图和消息流转规则,然后让它们一起把一件复杂的事情拆掉。
在2.0版本里,AgentScope进一步强化了“RAG as a Service”和可观测性层面的能力,向企业级应用平台的方向靠拢。需要特别说明:它是以Python生态为主的项目,虽然社区里已经能看到“agentscope java”相关的内容在讨论,但整体资历和Java项目没法比。
1.4 Embabel:资料很少的“新名字”,需要一套验证方法
这个题目里的“Embabel”,我坦白说,即便是作为从业者,我在主流社区、文档站、搜索引擎里能找到的有效资料也极其有限。没有形成规模的社区讨论,没有足够多的生产实践案例,也很难找到维护活跃的痕迹。
这不是说它一定不行。框架圈子里常有这种情况:一个名字先在某个群里传开,背后可能是某家公司的内部封装、某个个人开发者的开源尝试,也可能是某个英文非主流项目的音译。真正的问题在于,当你看不到足够的信息来判断一个框架时,选型就变成了“赌”。所以后面我会专门给一套验证陌生框架的方法,你在任何“听起来很厉害”的新名字上都能用。
1.5 为什么“哪个更好”是个伪命题
把这四个名字摆在一起,你再看它们要解决的问题:Spring AI想让Java服务快速拥有AI能力;LangChain4j想让Java应用用通用方式调用模型和构建RAG;AgentScope想让复杂多智能体协作变得可控可观测;Embabel连信息都还不完整。它们的目标各不相同,何来“更好”一说?
这套对比里缺失的那一环是“你自己”。你的技术栈、团队背景、业务场景、交付节奏,才是决定选型的核心变量。在框架上投入学习成本之前,先搞清楚这三件事,文章后面我会逐个展开。
2. 三个问题,筛掉一半框架
2.1 你的技术栈是 Java/Spring 还是 Python?
这是个最基础的问题,但也是最容易被技术热度带偏的。如果项目主体是Spring Boot微服务,团队以Java后端工程师为主,那么引入Python体系的AgentScope,意味着你要养两条技术栈,还要建一套跨语言的服务调用通道。不是不行,是成本极高。
反过来,如果你的团队本身就是Python为主,做算法出身,日常本来就在碰LangChain那套生态,那AgentScope这类项目天然更顺。Java体系里的Spring AI和LangChain4j就不在你的首位考虑范围内了。
所以第一刀,先砍掉和你技术栈不匹配的选项。Java/Spring后端团队,基本就是在Spring AI和LangChain4j之间选;Python/算法团队,AgentScope值得认真看。
2.2 你的核心场景是“服务内嵌AI能力”还是“编排一群Agent”?
这个问题的分辨力比上一个更强。你说说到底要做一件什么事?
如果是在现有业务系统里加一个智能助手,比如餐饮SaaS的菜品推荐、会员问答、营业数据自然语言查询,这些场景的核心是“把AI能力嵌进业务服务里”,Spring AI是首选。因为你要的不是一个独立的AI应用,而是一套能和订单表、菜单表、会员系统无缝打通的AI接口。
如果是要做多Agent协作平台,比如几个角色互相讨论、分步处理复杂任务,还要可视化监控每一步的执行情况,那Spring AI和LangChain4j并不擅长,AgentScope才是把“多Agent编排”当一等公民的平台。
LangChain4j的位置在两者之间偏RAG。如果你的核心诉求是私有知识库问答、文档解析、检索增强生成,它的相关组件确实更成熟,上手路径更短。
2.3 你准备怎么上线、怎么维护?
很多人选框架只考虑“调通一个Demo要多久”,但不考虑“这个依赖出现CVE漏洞时谁能修”和“半年后框架API大改时项目要不要跟着重构”。
Spring AI有Spring官方背书,意味着它会被集成进Spring Boot的依赖管理,跟着大版本走,这对企业级项目非常关键。LangChain4j是社区项目,活跃度很高但维护主体是几个核心开发者,你要接受第三方库的不确定性。AgentScope背后是阿里通义实验室,在平台演进上投入足够,但Java生态的支持还不成熟。
一道选择题做完,候选名单基本就清楚了。
| 判断维度 | Spring AI | LangChain4j | AgentScope |
|---|---|---|---|
| 原生技术栈 | Java,深度集成Spring | Java,可脱离Spring | Python为主 |
| 核心场景 | 业务系统集成AI能力 | 通用调用模型/RAG | 多智能体协作编排 |
| Spring Boot适配 | 原生,自动配置 | 社区Starter支持 | 不适用 |
| RAG能力 | 有,随版本持续完善 | 较为成熟,生态丰富 | 2.0提供RAG as a Service |
| Agent能力 | 支持Tool调用/简易Agent | 有限支持 | 强项,可视化编排 |
| 生产风险 | 版本早期有API变动 | 社区维护依赖 | Java支持待观察 |
3. 用四个真实场景,把框架挨个“过一遍”
3.1 场景一:餐饮SaaS集成AI助手,选Spring AI没问题
假设你所在的公司做餐饮SaaS,系统里有菜单数据、订单数据、会员数据,现在想给商户提供一个AI助手,让它能回答“我们店招牌菜是什么”“今天营业到现在为止的客单价是多少”“帮我写一条周三会员日的促销文案”。
这种需求最大的特征是“必须和业务深度绑定”。AI不能只是聊天,还得能查库、能算数、能调用你们已经写好的业务服务。Spring AI在这里几乎是为Java项目量身定做。
核心代码如下,Spring AI的ChatClient加@Tool调用,可以做到在一个服务里既完成对话,又完成业务查询:
@Service public class MenuAssistant { private final ChatClient chatClient; public MenuAssistant(ChatModel chatModel) { this.chatClient = ChatClient.builder(chatModel) .defaultSystem("你是餐饮SaaS平台的智能助手,回答要简洁,涉及数据时先调用工具。") .build(); } @Tool(description = "查询菜品信息") public String getDish(String dishName) { // 这里调用Mapper查菜单表,返回结构化文本 return "剁椒鱼头,售价88元,招牌菜,日均销量60份"; } @Tool(description = "查询当日营业数据") public String getDailyBizStats() { // 这里调用订单汇总服务 return "今日营业额12800元,订单数156,客单价82元"; } public String ask(String question) { return chatClient.prompt() .user(question) .call() .content(); } }这种“工具调用”模式在Spring AI里非常自然,@Tool注解的方法会被自动注册给模型,模型判断用户问题需要数据时就会发起调用。整个链路里没有脱离Spring的体系,事务、连接池、监控这些东西该怎么用还怎么用。
Spring AI Alibaba生态里还有一个很有价值的补充,就是NL2SQL能力。它把自然语言查询直接转成SQL,对餐饮SaaS这种老板们根本不想学报表工具的场景非常实用。你问“上周哪三天营业额最高”,它直接查库给你答案。
补充一点实操心得:用Spring AI做这类集成时,一定要把@Tool的描述写好。模型是靠描述来“理解”该调哪个工具的,描述含糊,它会调用错或者不敢调用。
3.2 场景二:企业内部知识库RAG,LangChain4j更顺手
再来一个典型场景:公司要做员工入职知识库问答,把规章制度、操作手册、历史故障处理文档扔进去,员工提问时系统基于文档内容回答。
这类RAG需求,LangChain4j的路径非常清晰。它提供了AiServices声明式接口和ContentRetriever,代码写起来非常直观:
// 先定义一个业务接口,LangChain4j会自动生成实现 public interface Assistant { String chat(String userMessage); } // 构建模型和向量存储 ChatLanguageModel model = OpenAiChatModel.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .modelName("gpt-4o-mini") .build(); EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .build(); EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); // 把文档向量化后写入存储 embeddingStore.add( embeddingModel.embed("员工离职需要提前30天提交书面申请。").content(), TextSegment.from("员工离职需要提前30天提交书面申请。") ); // 构建RAG链路 ContentRetriever retriever = EmbeddingStoreContentRetriever.builder() .embeddingModel(embeddingModel) .embeddingStore(embeddingStore) .build(); Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .contentRetriever(retriever) .build(); // 调用即完成RAG String answer = assistant.chat("离职要提前多久申请?");这一段代码不需要你理解太多LangChain4j内部的复杂机制,声明式接口从0到跑通非常快。项目里还提供了EasyRag这类更简化的入口,配合文件加载器,几行代码就能做一个文档问答。
当然这不是说Spring AI做不了RAG,它在1.0版本里也提供了QuestionAnswerAdvisor配合向量存储的完整方案。但现阶段LangChain4j在RAG相关的资料、示例、组件丰富度上更厚。如果团队里没人踩过Spring AI RAG的坑,LangChain4j通常是更保险的起点。
3.3 场景三:需要一群Agent协作,AgentScope的主场
有些场景不是“问一个问题”就能解决的。比如你希望系统里有一个“内容生产小组”:一个Agent负责构思选题,一个Agent负责写初稿,一个Agent负责从合规角度挑毛病,一个Agent负责润色定稿。
这种多Agent协作,如果用Spring AI硬做,你需要自己维护多个会话、自己设计消息路由、自己处理并发状态,代码很快会变成一锅粥。AgentScope就是为这种场景准备的,它把Agent作为一等公民,用消息对象在Agent之间传递数据,并且提供了可视化调试工具。
在AgentScope 2.0中,它进一步把RAG做成了一种可独立部署的服务,配合消息追踪、性能分析和可视化面板,企业可以把整套多Agent能力作为平台层提供给多个业务线使用。
我还注意到社区里确实出现了“agentscope java 2.0企业级实战”这类关键词,说明Java工程师也在关注它。但客观讲,AgentScope的Java生态现在还处于很早期的状态,如果你不是算法团队背景、没有精力跨语言维护,至少现阶段不建议把它当Java项目的主框架。多Agent编排如果你实在想用Java生态,可以先观察LangGraph4j这类的Java版流程编排框架,它们和LangChain4j互补,和AgentScope定位更像。
3.4 场景四:遇到Embabel这种陌生名字,先跑五步验证
信息不足的陌生框架,我建议你按下面五步来验证,每一步都能快速淘汰大部分不靠谱的选项:
- 看官方文档是否完整:有没有Getting Started、有没有示例代码、API Reference是否齐全。一个连快速上手都没有的项目,后面全是坑。
- 看社区活跃度:GitHub的Star数只是参考,真正要看的是Release频率、Issue处理速度、PR合入情况。一个半年不更新的项目等于没人维护。
- 看License和背后组织:是个人项目还是公司项目?License是否允许商用?这些问题在企业选型里比技术本身重要。
- 跑通官方示例:按官方文档从零跑一遍,注意记录遇到的环境问题。示例都跑不通,直接放弃。
- 放进真实项目做POC:最关键的验证。在你们自己的业务系统里做一个小功能,观察依赖冲突、性能、可调试性,然后让团队里接手的人给一个主观评分。
提示:技术圈“新框架焦虑”是一种普遍现象,但成熟的架构师不会被新名字牵着鼻子走。框架的目的是解决问题,不是让你显得紧跟潮流。Embabel如果真有价值,过半年它自然会积累出足够的案例和文档,到那时再迁入也不迟。
4. 同一个RAG需求,用Spring AI和LangChain4j各写一遍
只谈场景和概念,还是有点虚。我把同一个最小需求——一个菜品知识库问答——分别用Spring AI和LangChain4j实现一遍,你看完就知道两者代码风格和集成成本的真实差异。
4.1 共同的前置条件
假设你已经有了OpenAI兼容的API Key,模型用gpt-4o-mini,向量化用同一个embedding模型。知识库内容就两条:招牌菜信息、会员日折扣信息。要做的效果是:用户问“会员日打几折”,系统从知识库中检索相关内容后回答。
4.2 Spring AI版本
先在pom.xml引入依赖。注意Spring AI的依赖管理比较特殊,要通过BOM引入,直接写版本号容易和Spring Boot版本冲突:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> </dependencies>然后写一个可运行的配置类:
@Configuration public class RagConfig { @Bean VectorStore vectorStore(EmbeddingModel embeddingModel) { // 生产环境建议用PGVector或Redis Vector,这里用内存实现演示 SimpleVectorStore store = new SimpleVectorStore(embeddingModel); store.add(List.of( new Document("我们店的招牌菜是剁椒鱼头,售价88元,日均销量60份。"), new Document("会员日每周三,全场菜品88折,生日当天赠送甜品一份。") )); return store; } @Bean ChatClient chatClient(ChatModel chatModel, VectorStore vectorStore) { return ChatClient.builder(chatModel) .defaultAdvisors(new QuestionAnswerAdvisor(vectorStore)) .build(); } }调用的时候只需要注入ChatClient:
String answer = chatClient.prompt() .user("会员日打几折?") .call() .content();Spring AI的QuestionAnswerAdvisor会自动从向量库检索相关内容,拼到Prompt上下文里再调用模型。你看代码量其实很少,核心价值在于“自动配置”和“Spring风格”。不需要你手动组装对话历史、检索结果,框架在ChatClient层面就完成了。
4.3 LangChain4j版本
引入依赖:
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>1.1.0</version> </dependency>然后构建完整的RAG链路:
public class RagDemo { public static void main(String[] args) { String apiKey = System.getenv("OPENAI_API_KEY"); ChatLanguageModel model = OpenAiChatModel.builder() .apiKey(apiKey) .modelName("gpt-4o-mini") .build(); EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder() .apiKey(apiKey) .build(); InMemoryEmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>(); store.add(embeddingModel.embed("我们店的招牌菜是剁椒鱼头,售价88元,日均销量60份。").content(), TextSegment.from("我们店的招牌菜是剁椒鱼头,售价88元,日均销量60份。")); store.add(embeddingModel.embed("会员日每周三,全场菜品88折,生日当天赠送甜品一份。").content(), TextSegment.from("会员日每周三,全场菜品88折,生日当天赠送甜品一份。")); ContentRetriever retriever = EmbeddingStoreContentRetriever.builder() .embeddingModel(embeddingModel) .embeddingStore(store) .build(); interface Assistant { String chat(String userMessage); } Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .contentRetriever(retriever) .build(); String answer = assistant.chat("会员日打几折?"); System.out.println(answer); } }这里最值得注意的设计是AiServices。它用声明式接口自动生成实现,你不关心背后怎么检索、怎么拼Prompt,接口定义的就是业务语言。这种编程体验在Java生态里确实不多见。
4.4 两个版本放在一起看
| 对比维度 | Spring AI | LangChain4j |
|---|---|---|
| 代码风格 | Spring Boot风格,依赖注入 | 更偏工具库,手动组装 |
| 关键概念 | ChatClient、Advisor、VectorStore | AiServices、ContentRetriever、EmbeddingStore |
| Spring集成 | 原生,自动配置 | 需要额外Starter支持 |
| RAG开发速度 | 快,但依赖你理解Advisor机制 | 快,声明式接口直观 |
| 生产可用性 | 官方迭代中,版本要跟紧 | 相对稳定,社区方案成熟 |
| 模型切换成本 | 改一个Starter依赖 | 换一个Model实现类 |
我的看法是:纯Java/Spring项目做RAG,两个都行,选择更多取决于你未来三年的演进路线。如果你们团队已经深度绑定Spring Boot,且希望用官方渠道解决问题,Spring AI长期看更省心;如果你们对RAG的依赖非常重,希望立刻有一堆现成模式和工具用,LangChain4j的上限验证更多。
5. 落地与上线:别只用“看起来能回答”当验收
5.1 用评估框架跑一遍,而不是靠肉眼抽测
我见过太多团队把Demo效果当成了正式效果。联调的时候测了20个问题,感觉“还行”,上线后真实用户一问,各种离谱答案就出来了。要避免这种情况,你需要一套结构化的评估流程。
如果项目里可以引入Python工具,deepeval这类LLM应用评估框架是比较实用的选择。它可以对你的RAG问答结果做自动化打分,核心关注三个指标:
- 回答忠实度:答案是否完全基于检索到的上下文,有没有模型自己编的内容。
- 上下文相关性:检索出来的文档片段是否和问题相关,检索环节是否真的捞到了有效内容。
- 答案正确性:最终回答和标准答案的语义一致程度,可以通过LLM评判或规则匹配得出。
实操上,你从测试集里整理50到100条典型问题,每条标注标准答案,让评估框架跑一遍,输出一个分数报告。这个过程可以做成发布流水线的一部分,每次改Prompt、换模型、调检索参数都重新跑一遍,用分数变化来判断改动是正向还是反向。
Java项目里用deepeval需要注意它是个Python库,跑评估时通常作为独立进程或CI任务运行,把结果吐成报告文件,Java应用不需要和它耦合。如果你团队不想引入Python,退而求其次的方案是维护一套“黄金问题集”,每次发版前人工过一遍,虽然粗糙,但比纯感觉强得多。
5.2 上线避坑清单
这里整理一下我在实际项目里真实踩过的坑,不一定全,但每一条都值得你注意:
版本漂移。Spring AI的API在正式版前后变化很大,网上很多教程用的是M版本代码,直接复制会编译失败。用Spring AI就尽量锁定一个正式版本,升级前看Release Notes,别随手升到最新。
模型供应商切换。如果你在项目里写死了OpenAI的类名和方法,后面想换国产模型就要改业务代码。选框架时要注意它有没有抽象出统一的接口,Spring AI的ChatModel、LangChain4j的ChatLanguageModel都属于这类抽象,尽量面向接口编程。
上下文长度与成本。RAG不是把越多文档塞进Prompt效果越好。检索片段过多,Token成本涨上去,回答质量还可能下降。建议从3到5个片段开始,用评估分数来帮你决定到底放几个。
幻觉问题。RAG系统最危险的输出就是“看起来非常有把握的编造”。在系统设计阶段就要要求模型在找不到资料时明确回答“知识库中没有相关内容”,不要强行生成。技术上可以在Prompt里强约束,产品上也应该做兜底话术。
调试链路。无论是哪个框架,都要把日志打好。一个典型的AI接口排查场景:用户说回答不对,你得能还原“模型收到的是什么Prompt”“检索到了哪些片段”“模型最终回复了什么”。没有日志,出了问题只能靠猜。
6. 我的最终决策清单
把前面内容压缩成一张可以直接用的决策清单,按顺序往下走就行:
- 团队技术栈是Java/Spring:优先看Spring AI和LangChain4j,Python系框架除非有专门团队否则不碰。
- 核心场景是RAG知识库问答,且现在就要上线:LangChain4j下手更快,坑少,资料多。
- 核心场景是业务系统加AI能力,需要深度调用业务方法和数据:Spring AI是正路,
@Tool和自动配置的优势在这里才真正发挥出来。 - 业务需要多智能体协作,且你接受Python技术栈:关注AgentScope 2.0,用它的Studio做编排和调试。
- 遇到一个新框架名字,社区资料还没成型:先按五步验证法跑一遍,别急着重构现有项目。
- 上线前必须做评估:Java项目也建一套黄金问题集,有条件就上deepeval这类评估框架,让每次改动都有数据说话。
我在实际工作中的默认方案是:Java/Spring集成首选Spring AI,快速RAG验证用LangChain4j,多智能体平台观察AgentScope,陌生框架一律先POC再说话。这套方法帮我避过不少因为追新框架而导致的返工。你拿去用,大概率也会发现,选型这件事最怕的不是选错,而是根本没想清楚拿框架来解决什么问题就开始动手。