ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring AI Alibaba停更后,Java AI应用的替代方案与出路

Spring AI Alibaba停更后,Java AI应用的替代方案与出路

先说说我看到这条消息的感受。社区里这两天一直在传 Spring AI Alibaba 停更的事,不少 Java 开发者心里确实咯噔一下。我第一反应倒不是“完了”,而是“终于等到这一天了”。为什么这么说?因为从去年开始,那个仓库的提交频率就已经肉眼可见地慢了,issues 里的回复也越来越佛系,版本号基本停在某个节点上不动。这种迹象在开源项目里其实很常见,只是大家平时不太愿意往坏处想。

作为一个从 Spring Boot 2.x 时代一路写过来的老 Java,我很理解这种消息为什么会让不少人焦虑:阿里系的项目都停了,Java 搞 AI 是不是真的没戏了?是不是该转 Go 或者直接转 Python?如果你也有这种想法,我劝你先别急。这篇文章我不打算做和事佬,也不打算灌鸡汤,我就把这件事拆开揉碎了讲清楚:Spring AI Alibaba 停更到底意味着什么,Java 生态里真正能用的 AI 武器有哪些,以及我实际落地的替代方案和踩过的坑。

1. Spring AI Alibaba停更,先看看到底发生了什么

1.1 停更消息是怎么传开的

Spring AI Alibaba 这个项目,最初出现的背景很简单:Spring 官方在 2024 年推出了 Spring AI,目标是把大模型能力整合进 Spring 生态。但 Spring AI 早期版本里对国内云厂商大模型的支持比较弱,基本上以海外模型为主。国内开发者用起来不太顺手,于是就有了基于 Spring AI 的增强项目,专门针对国内大模型接口做适配,把通义系模型、DashScope 之类的东西包装成 Spring 风格的 Bean,方便大家直接注入使用。

这个思路本身非常受欢迎,因为 Java 开发者最熟悉的就是 Spring Boot 那套“自动配置 + Starter”模式。如果接大模型也能像接一个数据库连接池一样简单,那当然好。所以 Spring AI Alibaba 一开源,关注度非常高。但后来的走向大家也看到了:主干提交越来越少,新版本迟迟不出,最后基本处于一种“挂着但没人管”的状态。

我印象最深的是去年年底,我尝试在新项目里引入它适配某个新出的模型接口,结果发现它内置的模型版本还停留在几个月前的。当时我就意识到,这个项目可能等不到大版本更新了。果然,后面社区里有人发帖确认停更,消息就这么传开了。

1.2 停更背后的原因拆解

开源项目停更,原因往往不是单一的。以我对这类项目的观察,Spring AI Alibaba 走到这一步,至少有三个层面的原因。

第一层是上游变化太快。Spring AI 本身还在快速迭代期,API 一直在调整,从早期版本到现在,接口变化很大。第三方增强项目想要紧跟上游,就必须不断做适配。这种适配工作非常消耗精力,而且上游每次大版本改动,你都得重写一遍兼容层。长期下来,维护成本远远大于收益。

第二层是项目定位的尴尬。Spring AI Alibaba 本质上是个“中间商”,上游看 Spring AI,下游看国内大模型接口。模型接口本身也在频繁变,今天出一个新模型,明天改一个鉴权方式,后天又推出新的参数格式。中间商两头都要追,追着追着就会疲于奔命。

第三层是公司战略层面的取舍。开源项目一旦挂在公司名义下,就不可避免地要服从公司整体方向。当团队评估后发现,与其维护一个第三方增强包,不如把精力收回去做更核心的业务,停更就是大概率事件。这也是为什么很多红极一时的项目突然就不动了——不是技术不行,是优先级变了。

基于我看到的公开信息,这几点是说得通的。至于更内部的决策过程,咱们没法拿到一手消息,也别去猜。

1.3 对Java AI生态的真实冲击有多大

先说结论:有影响,但远没有到伤筋动骨的程度。

受影响最直接的,是那些已经把 Spring AI Alibaba 作为核心依赖写进生产系统的人。项目停了,意味着以后不会再有新版本适配新模型,遇到安全漏洞也不会有修复,甚至如果上游 Spring AI 把某个 API 改掉,你的系统可能就没法升级了。这部分人确实需要尽快规划替代方案。

但对于大多数还没上车的 Java 开发者来说,这个停更消息的实际影响几乎为零。你没用它,它停不停更跟你有什么关系?真正决定 Java 在 AI 领域还有没有戏的,是整个生态的基础设施,而不是某一个增强包。

另一个比较容易忽略的点是,Spring AI Alibaba 停更,不等于它的代码被删了、思想消失了。很多搞 Spring AI 的人,其实都在看它的源码、借鉴它的设计思路。它里面对于模型调用抽象、自动配置、流式响应的处理方式,放到今天依然是值得参考的。一个项目即便停止更新,它留下的设计遗产也还在影响这个生态。从这个角度讲,“停更”和“彻底消失”是两码事。

2. 冷静盘点:Java身边的AI家底到底够不够厚

2.1 先看主线:Spring AI本身在做什么

先说结论:Spring AI 官方项目不仅没有停,反而迭代得越来越快。这可能是很多人忽略的事实。

Spring AI 目前已经形成了比较清晰的能力矩阵。最基础的就是 ChatClient,用链式调用把模型请求拼装起来,代码写起来和平时写业务代码差不多:

ChatClient chatClient = ChatClient.builder(model).build(); String answer = chatClient.prompt() .user("用一句话解释什么是RAG") .call() .content(); System.out.println(answer);

这只是最简单的一层。再往上有结构化输出,可以让模型直接返回 Java 对象而不是纯文本;有函数调用(Function Calling),可以把 Java 方法注册给模型,让模型在对话过程中按需调用;有向量数据库抽象,可以对接各种 Embedding 和向量存储,实现 RAG 流程;还有 Advisor 机制,可以在 prompt 处理链路上插入各种增强逻辑,比如做知识库检索、做日志记录、做多轮记忆管理。

这套东西如果你的项目只是接一个模型 API 聊聊天,确实感觉不到有什么特别的。但如果你要做一个复杂一点的企业级 AI 应用,比如“内部知识库问答助手”“数据分析智能体”“工单自动分类系统”,Spring AI 提供的那套抽象就能帮你省掉大量重复代码。

我个人的体会是,Spring AI 目前的迭代节奏非常快,几乎每个月都有新版本。你只要不去依赖 Spring AI Alibaba 里那些特有的自动配置和云厂商封装,单纯用 Spring AI 官方库,体验是非常顺畅的。

2.2 再看备选:LangChain4j和其他老熟人

除了 Spring AI,Java 生态里还有一批能做 AI 应用的工具。其中最值得关注的是 LangChain4j,这个名字摆明了是借鉴 Python 社区里那个 LangChain 的设计思路,但它不是简单照搬,而是真正按照 Java 的习惯重新设计过。

LangChain4j 的抽象粒度比 Spring AI 更细。它提供了独立的 Model、ChatMemory、EmbeddingStore、Tool 等模块,你可以自由组合。如果遇到比较复杂的 Agent 流程,比如模型需要根据用户输入判断调用哪个工具、检索哪段知识、然后基于检索结果生成答案,LangChain4j 用起来会比 Spring AI 更顺。

ChatLanguageModel model = OpenAiChatModel.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .modelName("gpt-4o-mini") .build(); String response = model.chat("你好,介绍一下你自己"); System.out.println(response);

除了这两个“框架级”的选择,还有几个方向值得注意。一个是各家大模型厂商的官方 SDK,大部分国产模型平台都会提供 Java 版本,而且维护得不错。另一个是直接裸调 REST API,大模型的对话接口本质上就是一个 HTTP POST,格式基本都是 OpenAI 兼容的,你用 Spring 的 RestClient 或者 WebClient 手写一个调用层,几十行代码就能跑通。再往下深挖还有 DJL、ONNX Runtime for Java 这类模型推理工具,不过在纯大模型应用场景里用得不多,更多是在传统深度学习部署时才会碰到。

所以你看,Java 生态里能用能打的工具其实不少。那些说“Java 没有 AI 库”的人,大概率是没怎么实际调研过。

2.3 为什么“Java没希望”的论调特别容易传播

这种论调之所以传得广,我觉得有三个心理层面的原因。

第一是幸存者偏差。AI 领域曝光率最高的话题永远是“某个新模型效果多好”“某个团队训练了什么大模型”,而这些话题的主场在 Python。Python 社区的声音天然就大。Java 开发者做的 AI 应用大多是后端的、业务侧的、不炫酷的,自然不容易被看到。

第二是技术圈里的“造神叙事”。大家总喜欢把某个语言与某个方向绑定在一起,比如“Python = AI”“Go = 云原生”“Java = 旧系统”。这种标签化思维让很多人忽略了一个事实:真正复杂的 AI 应用系统里,语言只是其中一个环节。

第三是情绪放大。当一个项目停更的消息传出来,大家很容易把“一个项目停更”放大成“整个生态完蛋”。但实际上,生态是由很多项目共同构成的,某一个项目停更只能说明这个项目自己的路走完了,不能说明这个方向完蛋了。

你要是真不信,去翻翻那些大型企业的 AI 落地案例,绝大多数系统的基础架构都是 Java 系的。模型可能是在 Python 里训练出来的,但承载企业推理服务的、对接业务系统的、处理高并发流量的,往往还是 Java 写的。

3. 停更之后怎么落地:三条可立刻上手的替代路径

3.1 路径一:留在Spring生态,直接用Spring AI

对于那些本来就把 Spring Boot 作为项目基座的人来说,最平滑的方案就是忘掉 Spring AI Alibaba,直接用 Spring AI 官方库。

为什么说平滑?因为两者本来就是同源的。Spring AI Alibaba 是基于 Spring AI 做的增强,你在它里面写的很多代码,比如 ChatClient 的用法,在 Spring AI 里是一样的。你需要做的只是把依赖替换掉,然后重新配置一下模型接入参数。

举个例子,如果你原来用 Spring AI Alibaba 接模型,可能需要配置类似这样的东西:

spring.ai.alibaba.dashscope.api-key=your-api-key spring.ai.alibaba.dashscope.chat.options.model=qwen-plus

换成 Spring AI 之后,配置方式差不多,只是前缀变了:

spring.ai.openai.api-key=your-api-key spring.ai.openai.chat.options.model=qwen-plus spring.ai.openai.base-url=https://your-model-provider-endpoint

现在的关键是,很多国产模型平台都提供 OpenAI 兼容接口,你只要把 base-url 指过去就行。Spring AI 官方对 OpenAI 协议的支持是最完整的,所以这种“曲线救国”的方式反而比用特定云厂商封装更稳定。

我的建议是:如果你的项目只是需要“调用大模型、处理一下对话、做点简单 RAG”,直接用 Spring AI 就够了,根本不需要再依赖任何第三方增强包。

3.2 路径二:换到LangChain4j,换一种抽象

如果你做的东西比较复杂,尤其是涉及多轮对话、动态规划、多个工具调用、知识库检索混合编排的场景,我建议你认真看看 LangChain4j。

LangChain4j 的优势在于它的模块化做得非常好。你可以先只引入 core,把模型聊天跑通,后面再按需添加 memory、embedding-store 等模块。这种渐进式的引入方式,对控制项目体积和维护成本很有帮助。

它的配置也比 Spring AI 更“原生 Java”一些,用 Builder 模式,没有太多不可见的魔法。表达起来很清楚,调试起来也很直观。

ChatLanguageModel model = OpenAiChatModel.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .modelName("qwen-plus") .baseUrl("https://your-model-provider-endpoint") .temperature(0.7) .build(); ChatMemory chatMemory = ChatMemory.memory(new MessageWindowChatMemory(20)); Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .chatMemory(chatMemory) .tools(new MyTools()) .build(); String answer = assistant.chat("请帮我看一下这个月的销售数据");

这种接口风格,熟悉 Spring 的人也能快速上手。还有很重要的一点,LangChain4j 社区比较活跃,GitHub 上的 issues 响应速度、新功能的更新频率都算健康。至少在可见的未来,这个项目比那些挂名的第三方增强包靠谱得多。

3.3 路径三:轻自研,自己封装一个通用AI调用层

如果有人问我最“稳”的方案是什么,我的回答其实是:根据你的业务规模,考虑自己封装。

这不是开玩笑。大模型的 HTTP 接口本质上就是“一个请求、一个 JSON 响应”的事,和调用任何普通第三方 API 没有本质区别。你完全可以自己定义一个接口,然后把各家模型厂商的 SDK 适配进去。

public interface ChatClient { String chat(String systemPrompt, String userMessage); } @Component public class OpenAiCompatibleChatClient implements ChatClient { private final RestClient restClient; private final String modelName; public OpenAiCompatibleChatClient(RestClient.Builder builder, @Value("${ai.model.api-key}") String apiKey, @Value("${ai.model.name}") String modelName) { this.restClient = builder .baseUrl("https://your-model-provider-endpoint") .defaultHeader("Authorization", "Bearer " + apiKey) .build(); this.modelName = modelName; } @Override public String chat(String systemPrompt, String userMessage) { Map<String, Object> body = Map.of( "model", modelName, "messages", List.of( Map.of("role", "system", "content", systemPrompt), Map.of("role", "user", "content", userMessage) ) ); ChatResponse response = restClient.post() .uri("/chat/completions") .body(body) .retrieve() .body(ChatResponse.class); return response.getChoices().get(0).getMessage().getContent(); } }

这种做法的好处很明显:不依赖任何框架的节奏,接口是你自己定义的,想怎么扩展就怎么扩展。对于只需要接一两家大模型、要的就是稳定可控的中小型项目,这是性价比很高的选择。

坏处也很明显:RAG、Agent、记忆管理这些高级能力,你都需要自己实现。所以我的判断是,除非你真的只需要“对话”这一件事,否则还是先参考前两条路径。

4. 我踩过的几个坑,以及关于“Java有没有希望”的实话

4.1 实践中的坑:模型幻觉、上下文长度和网络超时

写 Java AI 应用这一年多,我踩过不少坑,挑几个有代表性的讲。

第一个坑是模型“幻觉”导致结构化输出解析失败。我做一个数据抽取功能时,让模型返回 JSON,结果模型偶尔会在 JSON 前面加一句确认话,比如“好的,我马上为你生成”,然后才输出 JSON。这个前缀直接让 JSON 解析抛异常。后来我调整了 System Prompt,加上“严格只输出 JSON,不要输出任何多余内容”的约束,同时在做解析时先截取第一个{[到最后一个}]之间的部分,基本解决了问题。

第二个坑是上下文长度管理。刚开始做多轮对话时,直接把所有历史消息都塞给模型,结果一长就报“上下文超限”。后来引入了滑动窗口+摘要策略,超过一定轮数就把旧对话用模型摘要成一段话,再接上最新一轮继续生成。这个思路其实和消息队列的“淘汰+压缩”很像,非常实用。

第三个坑是网络超时。默认 HTTP 客户端的超时时间往往只有几秒,而大模型生成一个长回答动辄几十秒。如果你是同步调模型接口,大概率会遇到超时。解决办法是把超时配置调大,并且加上重试机制。但注意,重试要分情况:对于网络断连可以重试,对于模型返回 4xx(参数错误、上下文超限这类)就不要无脑重试,否则只会白白浪费额度。

4.2 关于“希望”这个话题,我想说点实话

我理解很多人看到“框架停更”会慌,但我想把话说直白一点。

第一,大多数 AI 业务不是“训练模型”,而是“应用模型”。训练模型的领域确实 Python 一家独大,但那只占整个 AI 落地里很小的一部分。真正服务成千上万用户的、计费、鉴权、限流、灰度发布、日志监控、故障降级,这些全部都是应用工程的事,是 Java 的绝对主场。

第二,大模型不是数据库,它只是一个靠概率生成文本的系统。它需要被“工程化”地嵌到业务流程里,才能产生价值。一个能让大模型从一个企业内部知识库里稳定找到答案、并且按部门权限过滤结果的系统,核心技术难点不在“调用模型”,而在工程约束。这些东西 Python 能写,Java 也能写,但要说在企业环境里的成熟度,Java 生态的积累绝对不差。

第三,真实世界的系统是分层协作的。模型在最底层由专门团队去训练,应用中台上用 Java 搭服务,最后给到前端去展示。每一层都有自己的主流语言。你不需要和训练模型的人抢饭碗,你只要守好自己那一层,并且越来越熟练,就足够有价值。

4.3 给Java开发者的两条长期建议

第一条,不要把技术选择和一时热点绑死。框架可以停更是常态,不是意外。你今天因为某个框架火就无脑上车,明天因为它停更就恐慌,这种状态非常消耗自己。更正确的姿势是:每次引入一个新技术,都问自己“如果它半年后停更,我能不能快速替换”,然后提前做好抽象层。

第二条,在 AI 应用这条路上,真正值得深入学习的是那几个“分语言无关”的核心能力:Prompt 工程、RAG 检索策略、工具调用规划、结构化输出、评估与可观测性。这些能力才是硬通货。框架只是实现它们的工具,工具会换,思维方式不会。

我个人的体会是,这两年用 Java 写 AI 应用,遇到的困境从来不在“Java 能不能做”,而在“怎么把模型的能力稳定地约束在业务规则之内”。模型是出生牛犊,Java 恰好擅长做笼子。这个组合放到今天的市场环境下,非但不悲观,反而很有的做。如果你正准备启动一个 AI 项目,我的建议是:先用 Spring AI 跑通端到端 Demo,验证模型效果后再谈架构;RAG 逻辑复杂了再引入 LangChain4j 这类重武器。框架停更从来不是终点,Java 生态里解决问题的路,远比你想象的宽。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进