1. 四个框架的定位差异与选型逻辑
1.1 先搞清楚它们各自解决什么问题
Spring AI、LangChain4j、AgentScope、Embabel 这四个名字放在一起比较,本身就说明提问者已经意识到它们不是同一层面的东西。我接触过不少团队在选型时踩坑,根本原因就是没分清“框架”和“平台”的区别。
Spring AI 的定位是 Spring 生态里的 AI 能力抽象层。它做的事情是把各家大模型 API、向量库、Embedding 模型统一成 Spring 风格的接口,让你用依赖注入和自动配置的方式接入 AI 能力。它不负责编排复杂的 Agent 流程,也不提供多智能体协作机制。你可以把它理解成 Spring 生态里的“AI 适配器集合”。
LangChain4j 的定位更接近“Java 版的 LangChain”。它提供了 Chain、Memory、Tool、Retriever、Agent 等抽象,目标是让开发者用声明式的方式搭建 LLM 应用。它的强项在于 RAG 场景和中等复杂度的 Agent 编排,社区活跃度高,文档相对完善。
AgentScope 的定位是多智能体协作平台。它原生支持多个 Agent 之间的消息传递、角色分配、协作决策,适合做仿真、博弈、复杂任务分解这类场景。AgentScope 2.0 在 RAG as a Service 和企业级实战方面做了不少增强,但它的核心优势仍然在“多 Agent 协同”这个层面。
Embabel 的定位比较特殊,它更偏向“Agent 行为建模与决策引擎”。它关注的是 Agent 如何根据环境状态做出决策、如何规划动作序列、如何在不确定条件下选择最优策略。它不太关心你用什么大模型,更关心 Agent 的“大脑”怎么设计。
注意:这四个框架不是互斥关系。实际项目中,你完全可以用 Spring AI 做模型接入层,用 LangChain4j 做 RAG 和工具调用,用 AgentScope 做多 Agent 协作,用 Embabel 做决策逻辑。选型的关键是搞清楚你的核心需求落在哪一层。
1.2 选型决策树:从业务场景倒推框架
我一般建议团队按下面的顺序问自己几个问题:
第一个问题:你的核心需求是“接入模型”还是“编排流程”?
如果只是想让 Spring Boot 应用能调用大模型、做简单的问答或文本生成,Spring AI 足够了。它的学习曲线最平缓,和现有 Spring 项目的集成成本最低。但如果你需要多轮对话管理、工具调用、RAG 检索增强,Spring AI 也能做,只是需要自己写不少胶水代码。
第二个问题:你需要多 Agent 协作吗?
如果你的场景是“一个 Agent 完成一个任务”,LangChain4j 或 Spring AI 都能胜任。但如果你的场景是“多个 Agent 分别扮演不同角色,通过消息传递协作完成复杂任务”,比如模拟谈判、多角色仿真、分布式问题求解,那 AgentScope 是更自然的选择。它内置了消息总线、角色管理、协作协议这些基础设施。
第三个问题:你的 Agent 需要复杂的决策逻辑吗?
有些场景下,Agent 不是简单地“收到请求→调用工具→返回结果”,而是需要根据环境状态、历史经验、当前目标做多步规划。比如自动化运维场景里,Agent 需要判断“当前告警是否由某个变更引起→是否需要回滚→回滚后是否要通知相关方”。这种场景下,Embabel 的决策建模能力会更有优势。
第四个问题:你的团队技术栈是什么?
如果团队是 Spring 重度用户,Spring AI 的集成成本最低。如果团队有 Python 背景、习惯 LangChain 的思维方式,LangChain4j 的上手速度会更快。AgentScope 有 Java 和 Python 两个版本,Java 团队用 AgentScope Java 2.0 做企业级实战也比较顺手。
下面这张表可以帮你快速定位:
| 框架 | 核心定位 | 最适合的场景 | 学习曲线 | 与 Spring 集成难度 |
|---|---|---|---|---|
| Spring AI | 模型接入与抽象 | 简单 AI 功能嵌入、快速原型 | 低 | 极低 |
| LangChain4j | LLM 应用编排 | RAG、工具调用、中等复杂度 Agent | 中 | 低 |
| AgentScope | 多智能体协作 | 多角色仿真、协作任务、复杂工作流 | 中高 | 中 |
| Embabel | Agent 决策建模 | 自动化决策、规划、策略选择 | 高 | 中高 |
1.3 一个常见的选型误区
很多团队一上来就问“哪个框架最好”,这本身就是个错误问题。我见过一个团队用 AgentScope 做了一个简单的客服问答机器人,结果发现 80% 的代码都在处理 AgentScope 的协作协议,而实际业务只需要一个 RAG 检索加一个 LLM 调用。这就是典型的“杀鸡用牛刀”。
反过来,也有团队用 Spring AI 硬扛多 Agent 协作场景,自己手写消息队列、状态管理、角色切换,最后代码量比用 AgentScope 还大,而且稳定性差很多。
我的经验是:先用最简单的框架把核心流程跑通,遇到瓶颈再换或叠加。不要一开始就追求“架构完美”,AI 应用迭代速度很快,过早优化架构反而会拖慢进度。
2. 核心能力拆解与实操对比
2.1 Spring AI:Spring 生态的 AI 接入标准
Spring AI 的核心价值在于“统一抽象”。它定义了一套 ChatClient、EmbeddingClient、VectorStore 的接口,让你在切换模型提供商时只需要改配置,不用改代码。这对企业级应用很重要,因为今天用这个模型、明天可能换另一个,业务代码不应该绑死在某个厂商的 SDK 上。
我实测下来,Spring AI 的自动配置确实省事。在 Spring Boot 项目里加一个 starter 依赖,配一下 API Key,就能直接注入 ChatClient 使用。下面是一个最小可运行示例:
@RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient = builder.build(); } @GetMapping("/chat") public String chat(@RequestParam String message) { return chatClient.prompt() .user(message) .call() .content(); } }这段代码看起来简单,但背后 Spring AI 帮你做了很多事情:模型客户端初始化、请求参数组装、响应解析、异常处理。如果你用原生 SDK,这些都要自己写。
Spring AI 的 RAG 支持也比较完整。它提供了 VectorStore 抽象,支持多种向量数据库,还有 DocumentReader、TextSplitter、EmbeddingModel 这些组件。你可以用 Advisors 机制把 RAG 逻辑织入 ChatClient 调用链,代码很干净。
但 Spring AI 的短板也很明显:它的 Agent 编排能力比较弱。虽然新版本加了 Tool Calling 和 Function Calling 支持,但多步推理、循环调用、状态管理这些还需要自己实现。Spring AI Alibaba 在 NL2SQL 等场景做了增强,但整体上它仍然是一个“接入层框架”,不是“编排层框架”。
实操心得:如果你用 Spring AI 做 RAG,建议把 DocumentLoader 和 TextSplitter 的配置外化到 application.yml 里。我试过把 chunk size 和 overlap 硬编码在代码里,后来调优时改一次就要重新编译,很麻烦。外化之后可以直接改配置重启,效率高很多。
2.2 LangChain4j:Java 开发者的 LLM 应用工具箱
LangChain4j 的设计哲学和 Spring AI 不同。它更强调“组合”和“声明式”。你可以用 AiServices 接口声明一个服务,框架自动帮你生成实现:
interface Assistant { String chat(String userMessage); } Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .tools(new CalculatorTool()) .build();这种声明式风格的好处是代码量少、可读性高。你定义一个接口,框架帮你处理对话历史、工具调用、结果解析。对于 RAG 场景,LangChain4j 提供了 RetrievalAugmentor、ContentRetriever、EmbeddingStore 等组件,组合起来很灵活。
LangChain4j 的 Tool Calling 机制也比较好用。你只需要在方法上加 @Tool 注解,框架会自动生成工具描述、解析模型返回的工具调用请求、执行方法、把结果回传给模型。下面是一个例子:
public class WeatherTool { @Tool("查询指定城市的天气") public String getWeather(@P("城市名称") String city) { // 实际调用天气 API return city + "今天晴,25度"; } }LangChain4j 的社区很活跃,开发文档也比较全。但它的版本迭代比较快,API 偶尔会有 breaking change。我建议在生产项目里锁定版本号,升级前先看 release notes。
LangChain4j 做 RAG 的典型流程是:加载文档→切分→向量化→存入 EmbeddingStore→检索→注入 Prompt。这个流程和 Python 版 LangChain 基本一致,Java 开发者迁移过来不会有太大障碍。
但 LangChain4j 在多 Agent 协作方面支持有限。它有一些 Agent 抽象,但主要是单 Agent 的工具调用循环,没有内置的多 Agent 消息传递和角色管理。如果你需要多 Agent 协作,要么自己实现,要么换 AgentScope。
2.3 AgentScope:多智能体协作的基础设施
AgentScope 的核心竞争力在于“多 Agent 原生支持”。它提供了 Msg、AgentBase、Pipeline、MsgHub 这些抽象,让你可以像搭积木一样组合多个 Agent。
AgentScope 2.0 在企业级实战方面做了不少增强,比如 RAG as a Service、分布式部署、可观测性等。AgentScope Java 2.0 也让 Java 团队可以用熟悉的技术栈做多 Agent 应用。
AgentScope 的典型使用场景是:多个 Agent 分别扮演不同角色,通过消息传递协作完成任务。比如一个“需求分析 Agent”负责理解用户需求,一个“方案设计 Agent”负责生成方案,一个“评审 Agent”负责检查方案质量,它们通过 MsgHub 交换消息。
// 伪代码示意 MsgHub hub = MsgHub.builder() .addAgent(analystAgent) .addAgent(designerAgent) .addAgent(reviewerAgent) .build(); hub.run();AgentScope 的学习曲线比 Spring AI 和 LangChain4j 都要陡一些,因为你需要理解它的消息模型、Agent 生命周期、协作协议。但如果你确实需要多 Agent 协作,这些概念是绕不开的,用其他框架自己实现反而更麻烦。
AgentScope 中文文档比较全,这对国内团队是个加分项。AgentScope 官网和教程也提供了不少示例,上手不算太难。
注意事项:AgentScope 的多 Agent 协作会带来额外的 token 消耗和延迟。每个 Agent 之间的消息传递都需要调用 LLM,如果 Agent 数量多、协作轮次长,成本和响应时间会显著上升。我建议在原型阶段先用少量 Agent 验证流程,确认价值后再扩展。
2.4 Embabel:Agent 决策建模的另一种思路
Embabel 的定位和前三个都不太一样。它不太关注“怎么调用模型”或“怎么传递消息”,而是关注“Agent 怎么做决策”。
Embabel 提供了一套行为建模的抽象,让你可以定义 Agent 的状态、动作、目标、约束,然后由框架来规划动作序列。这种思路在自动化决策场景下很有价值,比如:
- 自动化运维:根据告警状态决定是否回滚、是否扩容、是否通知
- 智能客服:根据用户情绪和历史记录决定升级策略
- 游戏 AI:根据战场态势决定单位行动
Embabel 的学习曲线是四个框架里最陡的,因为它引入了一套新的建模语言和思维方式。但如果你确实需要复杂的决策逻辑,这套抽象能帮你把代码组织得更清晰。
Embabel 和前面三个框架不是竞争关系。你完全可以用 Spring AI 做模型接入,用 LangChain4j 做 RAG,用 Embabel 做决策层。实际项目中,框架组合使用是很常见的。
3. 从零搭建一个对比验证项目
3.1 项目目标与技术栈选择
光看文档对比不够直观,我建议自己动手搭一个最小验证项目,把四个框架都跑一遍。下面是我实际用过的一个验证方案。
项目目标:做一个“智能运维助手”,功能包括:
- 接收告警信息
- 检索历史处理记录(RAG)
- 判断告警类型和严重程度
- 决定处理动作(重启、回滚、通知)
- 执行动作并记录结果
这个场景覆盖了模型接入、RAG、工具调用、决策逻辑,能比较全面地对比四个框架。
技术栈:
- Java 17
- Spring Boot 3.2
- 大模型:用 OpenAI 兼容接口(方便切换)
- 向量库:内存版 EmbeddingStore(验证阶段够用)
- 构建工具:Maven
3.2 Spring AI 版本实现
先加依赖:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M5</version> </dependency>配置:
spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.3RAG 部分,Spring AI 提供了 VectorStore 和 Advisors:
@Configuration public class RagConfig { @Bean public VectorStore vectorStore(EmbeddingModel embeddingModel) { return new SimpleVectorStore(embeddingModel); } @Bean public ChatClient chatClient(ChatClient.Builder builder, VectorStore vectorStore) { return builder .defaultAdvisors(new QuestionAnswerAdvisor(vectorStore)) .build(); } }工具调用部分,Spring AI 用 @Tool 注解:
@Component public class OpsTools { @Tool(description = "重启指定服务") public String restartService(String serviceName) { // 实际重启逻辑 return "服务 " + serviceName + " 已重启"; } @Tool(description = "回滚到上一个版本") public String rollback(String serviceName) { return "服务 " + serviceName + " 已回滚"; } }Spring AI 的优点是集成简单,缺点是决策逻辑需要自己写。你需要手动判断告警类型、决定调用哪个工具,框架不帮你做规划。
3.3 LangChain4j 版本实现
LangChain4j 的依赖:
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>0.35.0</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-easy-rag</artifactId> <version>0.35.0</version> </dependency>RAG 配置:
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() .documentSplitter(DocumentSplitters.recursive(500, 50)) .embeddingModel(embeddingModel) .embeddingStore(embeddingStore) .build(); ingestor.ingest(Document.from("历史告警处理记录..."));Agent 定义:
interface OpsAssistant { @SystemMessage("你是一个运维助手,根据告警信息决定处理动作") String handleAlert(String alert); } OpsAssistant assistant = AiServices.builder(OpsAssistant.class) .chatLanguageModel(model) .contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore)) .tools(new OpsTools()) .build();LangChain4j 的 AiServices 会自动处理工具调用循环,你不需要手动写“调用模型→解析工具请求→执行工具→回传结果”这个流程。这是它比 Spring AI 方便的地方。
3.4 AgentScope 版本实现
AgentScope Java 2.0 的依赖和配置方式与前面两个差异较大。你需要先定义 Agent 角色:
// 伪代码示意 public class AnalystAgent extends AgentBase { @Override public Msg reply(Msg msg) { // 分析告警 return Msg.builder() .content("告警类型:服务不可用,严重程度:高") .build(); } } public class DecisionAgent extends AgentBase { @Override public Msg reply(Msg msg) { // 根据分析结果决定动作 return Msg.builder() .content("建议动作:重启服务") .build(); } }然后用 MsgHub 串联:
MsgHub hub = MsgHub.builder() .addAgent(new AnalystAgent()) .addAgent(new DecisionAgent()) .addAgent(new ExecutorAgent()) .build(); hub.run(initialAlertMsg);AgentScope 的优势在于角色分离清晰,每个 Agent 只关注自己的职责。但你需要自己处理 Agent 之间的消息格式约定、异常处理、超时控制。
3.5 Embabel 版本实现
Embabel 的建模方式又不一样。你需要定义状态、动作、目标:
// 伪代码示意 public class AlertHandlingDomain extends Domain { @Action public void analyzeAlert(Alert alert, State state) { // 分析告警,更新状态 } @Action public void decideAction(State state) { // 根据状态决定动作 } @Goal public boolean isResolved(State state) { return state.isResolved(); } }Embabel 会根据当前状态和目标,自动规划动作序列。这种声明式的方式在复杂决策场景下很有优势,但学习成本也最高。
3.6 四个版本的对比结果
我实际跑下来,几个关键维度的对比如下:
| 维度 | Spring AI | LangChain4j | AgentScope | Embabel |
|---|---|---|---|---|
| 代码量 | 中 | 少 | 多 | 中 |
| 上手难度 | 低 | 中 | 中高 | 高 |
| RAG 支持 | 好 | 很好 | 好 | 一般 |
| 工具调用 | 支持 | 很好 | 支持 | 不关注 |
| 多 Agent | 弱 | 弱 | 很强 | 中 |
| 决策建模 | 弱 | 弱 | 中 | 很强 |
| 与 Spring 集成 | 极好 | 好 | 中 | 中 |
| 社区活跃度 | 高 | 很高 | 中 | 低 |
从验证项目的结果看,如果你的场景是“单 Agent + RAG + 工具调用”,LangChain4j 的开发效率最高。如果你需要多 Agent 协作,AgentScope 是唯一原生支持的选择。如果你需要复杂决策逻辑,Embabel 值得投入学习成本。如果你只是想在 Spring 项目里快速加 AI 能力,Spring AI 最省事。
4. 常见问题与避坑指南
4.1 版本兼容性问题
Spring AI 和 LangChain4j 都还在快速迭代,版本兼容性是高频问题。我遇到过 Spring AI 某个 milestone 版本和 Spring Boot 3.2 不兼容的情况,启动时报 NoSuchMethodError。解决办法是查官方 compatibility matrix,或者直接用最新稳定版。
LangChain4j 的 breaking change 也比较频繁。0.3x 版本之间 API 变化不小,升级时建议先跑一遍集成测试。我一般会在 pom.xml 里锁定版本,升级前先在一个分支上验证。
AgentScope 的 Java 版本和 Python 版本 API 不完全一致,文档有时候会混在一起。建议以对应语言的官方文档为准,不要直接照搬另一个语言的示例。
4.2 Token 消耗与成本控制
多 Agent 协作和 RAG 都会显著增加 token 消耗。我实测过一个三 Agent 协作流程,完成一次任务消耗的 token 是单 Agent 的 4-5 倍。如果协作轮次多,成本会更高。
控制成本的几个手段:
- 限制对话历史长度,用 MessageWindowChatMemory 只保留最近 N 轮
- RAG 检索时限制返回的文档数量,不要把所有相关文档都塞进 Prompt
- 多 Agent 协作时设置最大轮次,避免无限循环
- 用便宜的小模型做路由和分类,用贵的大模型做最终决策
实操心得:我在项目里加了一个 TokenCounter 切面,每次 LLM 调用都记录 token 消耗。这样能快速定位哪些环节消耗最大,有针对性地优化。没有这个监控,成本很容易失控。
4.3 RAG 检索质量优化
RAG 的效果很大程度上取决于检索质量。我踩过的坑包括:
- chunk size 太大,检索到的文档包含太多无关信息
- chunk size 太小,上下文不完整
- 没有做重排序,检索结果相关性差
- Embedding 模型和查询语言不匹配
我的经验值是:中文文档 chunk size 在 300-500 字之间,overlap 在 50-100 字之间。英文文档可以稍大一些。如果检索质量不理想,可以加一个重排序模型(Reranker),先检索 top 20,再重排取 top 5。
4.4 多 Agent 协作的稳定性问题
AgentScope 的多 Agent 协作在原型阶段很美好,但生产环境会遇到不少问题:
- Agent 之间消息格式不一致,导致解析失败
- 某个 Agent 响应超时,整个流程卡住
- Agent 陷入循环对话,无法收敛
- 异常处理不完善,一个 Agent 出错导致整个流程崩溃
我的建议是:给每个 Agent 设置超时和重试机制,消息格式用 JSON Schema 严格约束,协作流程设置最大轮次,异常时降级到人工处理。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 | 解决方案 |
|---|---|---|---|
| 启动报 NoSuchMethodError | 版本不兼容 | 查依赖树 | 锁定兼容版本 |
| RAG 检索结果不相关 | chunk 策略不合理 | 检查切分粒度 | 调整 chunk size 和 overlap |
| 工具调用失败 | 工具描述不清晰 | 检查 @Tool 描述 | 补充参数说明和示例 |
| 多 Agent 流程卡住 | 消息格式不匹配 | 打印消息日志 | 统一消息 Schema |
| Token 消耗过高 | 历史消息太长 | 统计 token 分布 | 限制历史窗口 |
| 响应延迟高 | 模型调用次数多 | 分析调用链 | 合并调用、缓存结果 |
4.6 选型的最终建议
回到最初的问题:哪个框架更好?我的答案是:看你的场景。
如果你在做 Spring Boot 餐饮 SaaS 的 AI 集成,只是想让系统能回答用户问题、做简单推荐,Spring AI 足够了。它的集成成本最低,团队学习负担最小。
如果你在做 LangChain4j RAG 应用,需要处理大量文档检索和问答,LangChain4j 的 RAG 组件更成熟,开发效率更高。
如果你在做 AgentScope Java 2.0 企业级实战,需要多 Agent 协作完成复杂任务,AgentScope 是更自然的选择。
如果你在做自动化决策系统,需要 Agent 根据环境状态做多步规划,Embabel 的建模能力值得投入。
如果你还在纠结“现在到底用 Spring AI 还是 LangGraph4j”,我的建议是:先用 Spring AI 把核心流程跑通,遇到编排瓶颈再考虑引入 LangChain4j 或 AgentScope。不要一开始就追求“完美架构”,AI 应用迭代速度很快,先跑起来比什么都重要。
最后分享一个小技巧:不管你选哪个框架,都建议把 LLM 调用层做一层薄封装。这样将来换框架时,业务代码不用大改。我见过太多项目把框架 API 直接散落在业务代码里,后来想换框架时改到崩溃。封装一层虽然多写点代码,但长期看绝对值得。