随着 Spring AI 首个正式版本 1.0 的发布,国产之光 Spring AI Alibaba 也发布了 1.0 GA 正式版本,更新速度真的很快!
我对框架的更新真的是又爱又恨,爱的是功能更丰富更好用,恨的是又要学习新东西了、老项目又要更新了。
不过下面通过我的分享,相信能帮大家节约很多时间,快速了解:
- 什么是 Spring AI Alibaba?
- 新版本有哪些大更新?
- 如何将项目升级到新版本?
该踩的坑都帮大家踩完了,坚持看完这期内容,你一定会有所收获。
什么是 Spring AI Alibaba?
Spring AI 是知名 Java 开发框架 Spring 官方维护的 AI 开发框架,能够让你用更少的代码、更快开发各种 AI 应用。而 Spring AI Alibaba 在 Spring AI 的基础上进行扩展,深度集成阿里自家的大模型平台和各种技术组件,并且额外支持工作流、多智能体应用的快速开发。
因为它是兼容 Spring AI 的,而且功能更丰富、更新更及时、文档更清晰,更适合国人体质,所以我会更建议大家选择它来开发 AI 应用。
官方也是很贴心,基于 Spring AI Alibaba 提供了一个现成的 智能体调试广场,而且代码开源,这不就是一个现成的、可以学习 AI 开发的项目么?
直接复制官方提供的 Docker 命令就可以把项目跑起来了:
然后就可以在本地体验聊天机器人、多轮对话、图片生成、工具调用、RAG 知识库、MCP 集成等框架的核心能力。
新版本有哪些更新?
结合官方文档和我自己的理解,我觉得 Spring AI Alibaba 1.0 的更新可以用两个字来概括 —— 突破。
为什么这么说?我们先来看看这次值得关注的几点更新:
1、Graph 多智能体框架
这是本次更新的重头戏。基于 Spring AI Alibaba Graph,开发者可以快速构建复杂的工作流和多智能体应用,完全无需关心底层的流程编排、上下文记忆管理等复杂实现细节。
举个小例子,比如我们现在想做一个 “自媒体自动发文工具”,可以利用一些可视化 AI 智能体开发平台快速创建工作流:
有时别人的平台可能无法满足我们定制化的开发需求,这时就可以使用 Graph 多智能体框架,利用预置的节点快速定义出一套工作流。上图对应的工作流代码如下:- // 创建工作流<br>StateGraph stateGraph = new StateGraph("内容生成工作流", stateFactory)<br> // 添加工作流节点<br> .addNode("start", node_async(new StartNode())) // 初始化工作流<br> .addNode("topic_generation", node_async(new TopicGenerationNode())) // 根据输入生成文案<br> .addNode("content_collection", node_async(new ContentCollectionNode())) // 从网络收集相关素材<br> .addNode("content_integration", node_async(new ContentIntegrationNode())) // 组合文案和素材<br> .addNode("api_publish", node_async(new ApiPublishNode())) // 调用接口发布文章<br> .addNode("result_output", node_async(new ResultOutputNode())) // 输出最终结果<br> // 定义节点间的执行顺序<br> .addEdge(START, "start") // 工作流启动 → 开始节点<br> .addEdge("start", "topic_generation") // 开始节点 → 主题生成<br> .addEdge("topic_generation", "content_collection") // 主题生成 → 素材收集<br> .addEdge("content_collection", "content_integration") // 素材收集 → 内容整合<br> .addEdge("content_integration", "api_publish") // 内容整合 → API 发布<br> .addEdge("api_publish", "result_output") // API 发布 → 结果输出<br> .addEdge("result_output", END); // 结果输出 → 工作流结束
复制代码 虽然给出的例子并不复杂,但智能体工作流的水还是很深的,涉及到智能体协作、任务分解、路由策略、状态管理等等。后面我会在 编程导航 的项目和个人账号中分享更多这方面的实战和技术解析。
2、生态集成
Spring AI Alibaba 1.0 继续放大自身的优势,将传统后端开发与新兴的 AI 开发进行了融合,通过集成更多技术组件和云服务,帮助传统业务更快地接入 AI、加速 AI 应用的落地。
举几个典型的集成案例:
1)集成 Nacos 管理 MCP
Nacos 是主流的服务注册中心,是微服务架构的实现关键,用于帮助某个服务发现其他服务,从而进行调用。如果 AI 项目需要使用很多 MCP 服务,我们就可以把各种 MCP 服务的信息注册到 Nacos 上;AI 项目需要使用 MCP 时,就可以到 Nacos 上获取到 MCP 服务的信息了。这样就实现了对 MCP 服务的集中管理和动态更新,更加规范化。
官方文档:https://java2ai.com/docs/1.0.0.2/tutorials/basics/spring-ai-alibaba-mcp-nacos-introduce
2)集成 Nacos 管理 Prompt
传统的 AI 应用开发中,Prompt 往往是硬编码在代码里的,这就带来了一个问题:每次想要调整 Prompt,都需要重新发布代码,非常不灵活。而 Spring AI Alibaba 通过集成 Nacos,解决了这个痛点。
开发者可以将 Prompt 模板存储在 Nacos 配置中心,AI 应用启动时会自动从 Nacos 拉取最新的 Prompt 配置。而且当我们在 Nacos 中修改 Prompt 后,应用可以实时感知到变化并自动更新,无需重启服务,让 Prompt 的迭代优化变得更灵活。
参考文档:https://java2ai.com/docs/1.0.0.2/practices/dynamic-prompt/dynamic-prompt
3)集成 AI 模型和云知识库
虽然这是之前就有的能力,但我觉得还是值得介绍一下。与阿里云百炼平台无缝对接,一键接入通义千问等阿里系大模型;还能直接对接云知识库平台,企业只需要利用可视化界面上传切分文档、制作知识库,然后几行代码就能让 AI 利用知识库回答问题。
4)可观测性支持
Spring AI 本身提供了 可观测性 能力,可以在项目运行时获取到 AI 的调用情况,比如调用次数、响应时间、Token 消耗等关键指标。这些指标数据可以轻松接入阿里云的应用实时监控服务 ARMS、Zipkin 等监控工具,开发者可以实时监控 AI 模型,快速定位和解决性能瓶颈。
3、前沿案例
最近 Spring AI Alibaba 连续发布了几个新项目,包括:
1)JManus 通用智能体平台:可以说是 Java 版本的 OpenManus 通用智能体平台,用户可以通过自然语言描述需求,让 AI 自动规划并执行规划,直到完成任务。
2)NL2SQL 智能体框架:专为 Java 开发者设计的自然语言转 SQL 工具,用户只需用中文描述查询数据库的需求,AI 就能自动生成对应的 SQL 语句,让数据分析变得更简单。
3)DeepResearch 深度调研智能体:基于多智能体架构的调研工具,整合了网络搜索、网页爬取、数据分析等功能,可以自动完成复杂调研报告的撰写工作。
虽然这些并不是框架本身的功能更新,但是很好地展示了 Spring AI Alibaba 在不同场景的应用效果。如果你要开发类似的项目,可以直接参考官方提供的这些案例。
4、细节优化
此外,Spring AI Alibaba 1.0 还优化了一些功能和细节,比如我发现 会话记忆能力 支持了 jdbc、redis、elasticsearch 等多种存储插件,让 AI 对话能够持久化保存。
更多的内容大家可以自己阅读官方文档探索。
前面提到我认为这次框架的更新是一种突破,因为它完成了 能对话 的 AI 助手到 能做事 的 AI 智能体的进化。
在以前,我们使用 Spring AI 只能开发一些简单的对话型 AI 应用,功能相对单一。而现在,借助 Spring AI Alibaba 1.0 的 Graph 能力和生态集成,我们可以更快速地开发出复杂的智能体应用。
当然,Spring AI Alibaba 并不是唯一的 AI 应用开发框架,像 LangChain4j、LangGraph,以及 Spring 之父最新推出的 embabel-agent 都是不错的选择。
在框架选择上,我比较看重的因素是 生态。可以思考一下,你的项目是否需要和其他服务进行深度集成?
就拿我们团队来说,目前也在用 Spring AI Alibaba 框架,主要是因为我们使用了不少阿里开源的技术中间件和云服务,使用 Spring AI Alibaba 的开发成本更低。毕竟有技术大厂背书,我还是很看好它的发展,但有一说一,现在文档更新的速度有点跟不上框架更新的速度了,智能体框架的学习成本还是有点高的。
官方也提供了 主流 Java AI 框架的选型对比,供大家参考:
如何升级框架版本?
接下来进入实战环节,我会用自己之前开源的 AI 超级智能体项目 来详细演示如何将老版本的 Spring AI Alibaba 项目升级到 1.0 版本。大家一定要认真看,因为有些变动连官方文档都没有明确指出,是我在升级过程中踩坑摸索出来的宝贵经验。
项目指路:https://github.com/liyupi/yu-ai-agent
友情提醒:这个项目涉及到向量数据库、MCP 服务、API Key 等外部依赖,直接下载项目是跑不起来的,这是正常现象。必须要按照项目说明补充相应的配置,所有需要配置的地方我都已经详细标注出来了。
建议大家先新建一个本地配置文件,然后让我们开始将 Spring AI Alibaba 从 1.0.0-M6.1 版本升级到 1.0.0.2 版本。
第一步:依赖更新
我们的项目分为主项目和 MCP 服务子项目两部分,需要分别进行更新。
主项目依赖更新
1)更新 Spring AI Alibaba 基础依赖,从官方文档复制依赖管理配置并引入依赖:- <dependencyManagement><br> <dependencies><br> <dependency><br> <groupId>com.alibaba.cloud.ai</groupId><br> spring-ai-alibaba-bom</artifactId><br> <version>1.0.0.2</version><br> <type>pom</type><br> <scope>import</scope><br> </dependency><br> </dependencies><br></dependencyManagement><br><br><dependencies><br> <dependency><br> <groupId>com.alibaba.cloud.ai</groupId><br> spring-ai-alibaba-starter-dashscope</artifactId><br> </dependency><br></dependencies>
复制代码
2)更新 Spring AI 相关依赖
参考 官方文档 进行升级,首先引入仓库配置,确保能够正确拉取到 Spring AI 相关的依赖:- <repositories><br> <repository><br> <id>spring-snapshots</id><br> <name>Spring Snapshots</name><br> <url>https://repo.spring.io/snapshot</url><br> <releases><br> <enabled>false</enabled><br> </releases><br> </repository><br> <repository><br> <name>Central Portal Snapshots</name><br> <id>central-portal-snapshots</id><br> <url>https://central.sonatype.com/repository/maven-snapshots/</url><br> <releases><br> <enabled>false</enabled><br> </releases><br> <snapshots><br> <enabled>true</enabled><br> </snapshots><br> </repository><br></repositories>
复制代码 在这个过程中,你可以通过 Maven 仓库 来查看最新版本信息:
然后添加依赖管理配置,注意版本号不用添加 SNAPSHOT 后缀,就 1.0.0 版本:- <dependencyManagement><br> <dependencies><br> <dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-bom</artifactId><br> <version>1.0.0</version><br> <type>pom</type><br> <scope>import</scope><br> </dependency><br> </dependencies><br></dependencyManagement>
复制代码 具体要修改的依赖项如下,修改前的依赖配置:- <br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-ollama-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-markdown-document-reader</artifactId><br> <version>1.0.0-M6</version><br></dependency><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-pgvector-store</artifactId><br> <version>1.0.0-M6</version><br></dependency><br><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-mcp-client-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency>
复制代码 修改后的依赖配置,鱼皮是依次参考官方文档进行确认和更新的:
- Ollama:https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html
- Markdown Document Reader:https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdown
- PGvector:https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html#_manual_configuration
- MCP:https://docs.spring.io/spring-ai/reference/api/mcp/mcp-client-boot-starter-docs.html
- <dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-starter-model-ollama</artifactId><br></dependency><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-markdown-document-reader</artifactId><br></dependency><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-pgvector-store</artifactId><br></dependency><br><br><dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-starter-mcp-client</artifactId><br></dependency>
复制代码
3)更新完依赖后,建议安装 Maven Helper 插件来检测依赖冲突:
检查结果显示没有 Spring AI 相关冲突,说明依赖配置正确:
MCP 服务端项目依赖更新
MCP 服务端项目的更新相对简单,跟前面一样,引入仓库和依赖管理配置,然后只需要更新 spring-ai-starter-mcp-server-webmvc 依赖即可:- <dependencyManagement><br> <dependencies><br> <dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-bom</artifactId><br> <version>1.0.0</version><br> <type>pom</type><br> <scope>import</scope><br> </dependency><br> </dependencies><br></dependencyManagement>
-
- <repositories><br> <repository><br> <id>spring-snapshots</id><br> <name>Spring Snapshots</name><br> <url>https://repo.spring.io/snapshot</url><br> <releases><br> <enabled>false</enabled><br> </releases><br> </repository><br> <repository><br> <name>Central Portal Snapshots</name><br> <id>central-portal-snapshots</id><br> <url>https://central.sonatype.com/repository/maven-snapshots/</url><br> <releases><br> <enabled>false</enabled><br> </releases><br> <snapshots><br> <enabled>true</enabled><br> </snapshots><br> </repository><br></repositories>
-
- org.springframework.ai
- spring-ai-starter-mcp-server-webmvc
复制代码
第二步:代码问题修复
依赖更新完成后,接下来需要修复由于版本变更导致的代码问题。
1、Advisor 顾问功能修复
这是一个 破坏性变更,很多 advisor 相关的接口和方法都更新了,但坑爹的是官方文档并未明确说明这个变更!
遇到这种情况,我们可以参考源码(比如 SimpleLoggerAdvisor)的实现方式对之前开发的 advisor 进行修改。
1)修改后的 MyLoggerAdvisor 自定义日志拦截器代码:- @Slf4j<br>public class MyLoggerAdvisor implements CallAdvisor, StreamAdvisor {<br><br>@Override<br>public String getName() {<br>return this.getClass().getSimpleName();<br>}<br><br>@Override<br>public int getOrder() {<br>return 0;<br>}<br><br>private ChatClientRequest before(ChatClientRequest request) {<br>log.info("AI Request: {}", request.prompt());<br>return request;<br>}<br><br>private void observeAfter(ChatClientResponse chatClientResponse) {<br>log.info("AI Response: {}", chatClientResponse.chatResponse().getResult().getOutput().getText());<br>}<br><br>@Override<br>public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain chain) {<br>chatClientRequest = before(chatClientRequest);<br>ChatClientResponse chatClientResponse = chain.nextCall(chatClientRequest);<br>observeAfter(chatClientResponse);<br>return chatClientResponse;<br>}<br><br>@Override<br>public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain chain) {<br>chatClientRequest = before(chatClientRequest);<br>Flux<ChatClientResponse> chatClientResponseFlux = chain.nextStream(chatClientRequest);<br>return (new ChatClientMessageAggregator()).aggregateChatClientResponse(chatClientResponseFlux, this::observeAfter);<br>}<br>}
复制代码 2)同样需要修复 ReReadingAdvisor,需要重新编写修改用户提示词的代码:- /**<br>* 自定义 Re2 Advisor<br>* 可提高大型语言模型的推理能力<br>*/<br>public class ReReadingAdvisor implements CallAdvisor, StreamAdvisor {<br><br> /**<br> * 执行请求前,改写 Prompt<br> *<br> * @param chatClientRequest<br> * @return<br> */<br> private ChatClientRequest before(ChatClientRequest chatClientRequest) {<br> String userText = chatClientRequest.prompt().getUserMessage().getText();<br> // 添加上下文参数<br> chatClientRequest.context().put("re2_input_query", userText);<br> // 修改用户提示词<br> String newUserText = """<br> %s<br> Read the question again: %s<br> """.formatted(userText, userText);<br> Prompt newPrompt = chatClientRequest.prompt().augmentUserMessage(newUserText);<br> return new ChatClientRequest(newPrompt, chatClientRequest.context());<br> }<br><br> @Override<br> public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain chain) {<br> return chain.nextCall(this.before(chatClientRequest));<br> }<br><br> @Override<br> public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain chain) {<br> return chain.nextStream(this.before(chatClientRequest));<br> }<br><br> @Override<br> public int getOrder() {<br> return 0;<br> }<br><br> @Override<br> public String getName() {<br> return this.getClass().getSimpleName();<br> }<br>}
复制代码
2、工具调用功能修复
1)ToolRegistration 工具注册类的包名发生了变更,需要修改:- // 原来:<br>import org.springframework.ai.tool.ToolCallbacks;<br><br>// 改为:<br>import org.springframework.ai.support.ToolCallbacks;
复制代码 2)LoveApp 中的工具调用方法需要修改:- // 修改为:<br>.toolCallbacks(toolCallbackProvider)
复制代码 3)ToolCallAgent 的配置也需要修改,这是为了禁用 Spring AI 内置的工具调用机制,自己处理工具调用的流程和消息上下文:- public ToolCallAgent(ToolCallback[] availableTools) {<br> super();<br> this.availableTools = availableTools;<br> this.toolCallingManager = ToolCallingManager.builder().build();<br> // 禁用 Spring AI 内置的工具调用机制,自己维护选项和消息上下文<br> this.chatOptions = DashScopeChatOptions.builder()<br> .withInternalToolExecutionEnabled(false)<br> .build();<br>}
复制代码
3、RAG 知识库功能修复
1)PgVector 配置修改
由于我们原本就是手动引入 PgVector,没有使用 Spring Boot 的自动配置包,所以只需要移除项目启动类的自动配置即可:
代码如下:- @SpringBootApplication(exclude = {<br> // 为了便于大家开发调试和部署,取消数据库自动配置<br> // 需要使用 PgVector 时把 DataSourceAutoConfiguration.class 删除<br> DataSourceAutoConfiguration.class<br>})<br>public class YuAiAgentApplication {<br><br> public static void main(String[] args) {<br> SpringApplication.run(YuAiAgentApplication.class, args);<br> }<br>}
复制代码 2)RAG 相关类包名修复
自定义 RAG 知识库相关的 LoveAppRagCloudAdvisorConfig 和 LoveAppRagCustomAdvisorFactory 类,包名发生了变更:- // 原来:<br>import org.springframework.ai.chat.client.advisor.RetrievalAugmentationAdvisor;<br><br>// 改为:<br>import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
复制代码 3)DashScopeApi 构建方式修改,之前是 new,改为 builder 模式:- DashScopeApi dashScopeApi = DashScopeApi.builder()<br> .apiKey(dashScopeApiKey)<br> .build();
复制代码 4)如果在 LoveApp 中想使用 QuestionAnswerAdvisor,需要引入新的依赖,因为包名发生了变更:- <dependency><br> <groupId>org.springframework.ai</groupId><br> spring-ai-advisors-vector-store</artifactId><br></dependency>
复制代码
4、对话记忆功能修复
对话记忆的写法变更还挺大的,参考 官方文档。
1)修改 LoveApp 类中对话记忆的设置方式,新版本将算法和存储进行了分离,支持了更多的存储方式:- // 初始化基于内存的对话记忆<br>MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()<br> .chatMemoryRepository(new InMemoryChatMemoryRepository())<br> .maxMessages(20)<br> .build();
复制代码 2)修改对话记忆 Advisor 的创建方式,感觉 Spring AI 要统一用建造者模式创建对象了:- chatClient = ChatClient.builder(dashscopeChatModel)<br> .defaultSystem(SYSTEM_PROMPT)<br> .defaultAdvisors(<br> MessageChatMemoryAdvisor.builder(chatMemory).build(),<br> )
复制代码 3)会话 ID 键名修改:- .advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId))
复制代码 4)修改基于文件持久化的会话记忆 FileBasedChatMemory 类,调整 get 方法,因为 ChatMemory 接口的 get 方法参数发生了变更:- @Override<br>public List<Message> get(String conversationId) {<br> return getOrCreateConversation(conversationId);<br>}
复制代码
5、 其他
还有个小细节,要修改 MyKeywordEnricher 类,因为关键词元信息增强器的包名发生了变更:- // 原来:<br>import org.springframework.ai.transformer.KeywordMetadataEnricher;<br><br>// 改为:<br>import org.springframework.ai.model.transformer.KeywordMetadataEnricher;
复制代码
总结
以上就是 Spring AI Alibaba 框架的升级过程,涉及的修改点还是比较多的、而且还要对所有功能进行测试,很耗时间,这就是为什么在企业中 “项目能运行,就不要动它”。
所有的代码修改我都已经开源到 GitHub 上了,每一次的提交记录都非常清晰,方便大家对照学习。如果有遗漏的地方,也欢迎大家评论区指出,我会继续补充和完善。
不得不感叹技术的更新真的是太太太太快了,但也正是这种快速迭代让我们能够享受到越来越强大的 AI 开发能力。很快我会再带大家用更新的技术做一套全新的 AI 全栈项目,点个关注,敬请期待吧~
更多编程学习资源
- Java前端程序员必做项目实战教程+毕设网站
- 程序员免费编程学习交流社区(自学必备)
- 程序员保姆级求职写简历指南(找工作必备)
- 程序员免费面试刷题网站工具(找工作必备)
- 最新Java零基础入门学习路线 + Java教程
- 最新Python零基础入门学习路线 + Python教程
- 最新前端零基础入门学习路线 + 前端教程
- 最新数据结构和算法零基础入门学习路线 + 算法教程
- 最新C++零基础入门学习路线、C++教程
- 最新数据库零基础入门学习路线 + 数据库教程
- 最新Redis零基础入门学习路线 + Redis教程
- 最新计算机基础入门学习路线 + 计算机基础教程
- 最新小程序入门学习路线 + 小程序开发教程
- 最新SQL零基础入门学习路线 + SQL教程
- 最新Linux零基础入门学习路线 + Linux教程
- 最新Git/GitHub零基础入门学习路线 + Git教程
- 最新操作系统零基础入门学习路线 + 操作系统教程
- 最新计算机网络零基础入门学习路线 + 计算机网络教程
- 最新设计模式零基础入门学习路线 + 设计模式教程
- 最新软件工程零基础入门学习路线 + 软件工程教程
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |