摘要:Spring AI 是知名 Java 开发框架 Spring 官方维护的 AI 开发框架,能够让你用更少的代码、更快开发各种 AI 应用。而 Spring AI Alibaba 在 Spring AI 的基础上进行扩展,深度集成阿里自家的大模型平台和各种技术组
随着 Spring AI 首个正式版本 1.0 的发布,国产之光 Spring AI Alibaba 也发布了 1.0 GA 正式版本,更新速度真的很快!
我对框架的更新真的是又爱又恨,爱的是功能更丰富更好用,恨的是又要学习新东西了、老项目又要更新了。
不过下面通过我的分享,相信能帮大家节约很多时间,快速了解:
什么是 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 Graph,开发者可以快速构建复杂的工作流和多智能体应用,完全无需关心底层的流程编排、上下文记忆管理等复杂实现细节。
举个小例子,比如我们现在想做一个 “自媒体自动发文工具”,可以利用一些可视化 AI 智能体开发平台快速创建工作流:
有时别人的平台可能无法满足我们定制化的开发需求,这时就可以使用 Graph 多智能体框架,利用预置的节点快速定义出一套工作流。上图对应的工作流代码如下:
// 创建工作流StateGraph stateGraph = new StateGraph("内容生成工作流", stateFactory) // 添加工作流节点 .addnode("start", node_async(new StartNode)) // 初始化工作流 .addNode("topic_generation", node_async(new TopicGenerationNode)) // 根据输入生成文案 .addNode("content_collection", node_async(new ContentCollectionNode)) // 从网络收集相关素材 .addNode("content_integration", node_async(new ContentIntegrationNode)) // 组合文案和素材 .addNode("api_publish", node_async(new ApiPublishNode)) // 调用接口发布文章 .addNode("result_output", node_async(new ResultOutputNode)) // 输出最终结果 // 定义节点间的执行顺序 .addEdge(START, "start") // 工作流启动 → 开始节点 .addEdge("start", "topic_generation") // 开始节点 → 主题生成 .addEdge("topic_generation", "content_collection") // 主题生成 → 素材收集 .addEdge("content_collection", "content_integration") // 素材收集 → 内容整合 .addEdge("content_integration", "api_publish") // 内容整合 → API 发布 .addEdge("api_publish", "result_output") // API 发布 → 结果输出 .addEdge("result_output", END); // 结果输出 → 工作流结束虽然给出的例子并不复杂,但智能体工作流的水还是很深的,涉及到智能体协作、任务分解、路由策略、状态管理等等。后面我会在 编程导航 的项目和个人账号中分享更多这方面的实战和技术解析。
Spring AI Alibaba 1.0 继续放大自身的优势,将传统后端开发与新兴的 AI 开发进行了融合,通过集成更多技术组件和云服务,帮助传统业务更快地接入 AI、加速 AI 应用的落地。
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
传统的 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
虽然这是之前就有的能力,但我觉得还是值得介绍一下。与阿里云百炼平台无缝对接,一键接入通义千问等阿里系大模型;还能直接对接云知识库平台,企业只需要利用可视化界面上传切分文档、制作知识库,然后几行代码就能让 AI 利用知识库回答问题。
Spring AI 本身提供了 可观测性 能力,可以在项目运行时获取到 AI 的调用情况,比如调用次数、响应时间、Token 消耗等关键指标。这些指标数据可以轻松接入阿里云的应用实时监控服务 ARMS、Zipkin 等监控工具,开发者可以实时监控 AI 模型,快速定位和解决性能瓶颈。
最近 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 对话能够持久化保存。
更多的内容大家可以自己阅读官方文档探索。
在以前,我们使用 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 版本。
com.alibaba.cloud.aispring-ai-alibaba-bom1.0.0.2importspring-ai-alibaba-starter-dashscope2)更新 Spring AI 相关依赖
参考 官方文档 进行升级,首先引入仓库配置,确保能够正确拉取到 Spring AI 相关的依赖:
spring-snapshotsSpring SnapshotsCentral Portal Snapshotscentral-portal-snapshotsfalsetrue在这个过程中,你可以通过 Maven 仓库 来查看最新版本信息:
然后添加依赖管理配置,注意版本号不用添加 SNAPSHOT 后缀,就 1.0.0 版本:
org.springframework.aispring-ai-bom1.0.0pomimport具体要修改的依赖项如下,修改前的依赖配置:
org.springframework.aispring-ai-ollama-spring-boot-starter1.0.0-M6spring-ai-markdown-document-reader1.0.0-M6spring-ai-pgvector-store1.0.0-M6spring-ai-mcp-client-spring-boot-starter1.0.0-M6修改后的依赖配置,鱼皮是依次参考官方文档进行确认和更新的:
Ollama:https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.htmlMarkdown Document Reader:https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdownPGvector:https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html#_manual_configurationMCP:https://docs.spring.io/spring-ai/reference/api/mcp/mcp-client-boot-starter-docs.htmlorg.springframework.aispring-ai-starter-model-ollamaspring-ai-markdown-document-readerspring-ai-pgvector-storespring-ai-starter-mcp-client3)更新完依赖后,建议安装 Maven Helper 插件来检测依赖冲突:
检查结果显示没有 Spring AI 相关冲突,说明依赖配置正确:
这是一个 破坏性变更,很多 advisor 相关的接口和方法都更新了,但坑爹的是官方文档并未明确说明这个变更!
遇到这种情况,我们可以参考源码(比如 SimpleLoggerAdvisor)的实现方式对之前开发的 advisor 进行修改。
1)修改后的 MyLoggerAdvisor 自定义日志拦截器代码:
@Slf4jpublic class MyLoggerAdvisor implements CallAdvisor, StreamAdvisor {@Overridepublic String getName {return this.getClass.getSimpleName;}@Overridepublic int getOrder {return 0;}private ChatClientRequest before(ChatClientRequest request) {log.info("AI Request: {}", request.prompt);return request;}private void observeAfter(ChatClientResponse chatClientResponse) {log.info("AI Response: {}", chatClientResponse.chatResponse.getResult.getOutput.getText);}@Overridepublic ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain chain) {chatClientRequest = before(chatClientRequest);ChatClientResponse chatClientResponse = chain.nextCall(chatClientRequest);observeAfter(chatClientResponse);return chatClientResponse;}@Overridepublic FluxadviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain chain) {chatClientRequest = before(chatClientRequest);FluxchatClientResponseFlux = chain.nextStream(chatClientRequest);return (new ChatClientMessageAggregator).aggregateChatClientResponse(chatClientResponseFlux, this::observeAfter);}}2)同样需要修复 ReReadingAdvisor,需要重新编写修改用户提示词的代码:
/*** 自定义 Re2 Advisor* 可提高大型语言模型的推理能力*/public class ReReadingAdvisor implements CallAdvisor, StreamAdvisor { /** * 执行请求前,改写 Prompt * * @param chatClientRequest * @return */ private ChatClientRequest before(ChatClientRequest chatClientRequest) { String userText = chatClientRequest.prompt.getUserMessage.getText; // 添加上下文参数 chatClientRequest.context.put("re2_input_query", userText); // 修改用户提示词 String newUserText = """ %s Read the question again: %s """.formatted(userText, userText); Prompt newPrompt = chatClientRequest.prompt.augmentUserMessage(newUserText); return new ChatClientRequest(newPrompt, chatClientRequest.context); } @Override public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain chain) { return chain.nextCall(this.before(chatClientRequest)); } @Override public FluxadviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain chain) { return chain.nextStream(this.before(chatClientRequest)); } @Override public int getOrder { return 0; } @Override public String getName { return this.getClass.getSimpleName; }}1)ToolRegistration 工具注册类的包名发生了变更,需要修改:
// 原来:import org.springframework.ai.tool.ToolCallbacks;// 改为:import org.springframework.ai.support.ToolCallbacks;2)LoveApp 中的工具调用方法需要修改:
// 修改为:.toolCallbacks(toolCallbackProvider)3)ToolCallAgent 的配置也需要修改,这是为了禁用 Spring AI 内置的工具调用机制,自己处理工具调用的流程和消息上下文:
public ToolCallAgent(ToolCallback availableTools) { super; this.availableTools = availableTools; this.toolCallingManager = ToolCallingManager.builder.build; // 禁用 Spring AI 内置的工具调用机制,自己维护选项和消息上下文 this.chatOptions = DashScopeChatOptions.builder .withInternalToolExecutionEnabled(false) .build;}1)PgVector 配置修改
由于我们原本就是手动引入 PgVector,没有使用 Spring Boot 的自动配置包,所以只需要移除项目启动类的自动配置即可:
代码如下:
@SpringBootApplication(exclude = { // 为了便于大家开发调试和部署,取消数据库自动配置 // 需要使用 PgVector 时把 DataSourceAutoConfiguration.class 删除 DataSourceAutoConfiguration.class})public class YuAiAgentApplication { public static void main(String args) { SpringApplication.run(YuAiAgentApplication.class, args); }}2)RAG 相关类包名修复
自定义 RAG 知识库相关的 LoveAppRagCloudAdvisorConfig 和 LoveAppRagCustomAdvisorFactory 类,包名发生了变更:
// 原来:import org.springframework.ai.chat.client.advisor.RetrievalAugmentationAdvisor;// 改为:import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;3)DashScopeApi 构建方式修改,之前是 new,改为 builder 模式:
DashScopeApi dashScopeApi = DashScopeApi.builder .apiKey(dashScopeApiKey) .build;4)如果在 LoveApp 中想使用 QuestionAnswerAdvisor,需要引入新的依赖,因为包名发生了变更:
spring-ai-advisors-vector-store对话记忆的写法变更还挺大的,参考 官方文档。
1)修改 LoveApp 类中对话记忆的设置方式,新版本将算法和存储进行了分离,支持了更多的存储方式:
// 初始化基于内存的对话记忆MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder .chatMemoryRepository(new InMemoryChatMemoryRepository) .maxMessages(20) .build;2)修改对话记忆 Advisor 的创建方式,感觉 Spring AI 要统一用建造者模式创建对象了:
chatClient = ChatClient.builder(dashscopeChatModel) .defaultSystem(SYSTEM_PROMPT) .defaultAdvisors( MessageChatMemoryAdvisor.builder(chatMemory).build, )3)会话 ID 键名修改:
.advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId))4)修改基于文件持久化的会话记忆 FileBasedChatMemory 类,调整 get 方法,因为 ChatMemory 接口的 get 方法参数发生了变更:
@Overridepublic Listget(String conversationId) { return getOrCreateConversation(conversationId);}还有个小细节,要修改 MyKeywordEnricher 类,因为关键词元信息增强器的包名发生了变更:
// 原来:import org.springframework.ai.transformer.KeywordMetadataEnricher;// 改为:import org.springframework.ai.model.transformer.KeywordMetadataEnricher;以上就是 Spring AI Alibaba 框架的升级过程,涉及的修改点还是比较多的、而且还要对所有功能进行测试,很耗时间,这就是为什么在企业中 “项目能运行,就不要动它”。
所有的代码修改我都已经开源到 GitHub 上了,每一次的提交记录都非常清晰,方便大家对照学习。如果有遗漏的地方,也欢迎大家评论区指出,我会继续补充和完善。
不得不感叹技术的更新真的是太太太太快了,但也正是这种快速迭代让我们能够享受到越来越强大的 AI 开发能力。很快我会再带大家用更新的技术做一套全新的 AI 全栈项目,点个关注,敬请期待吧~
来源:程序员鱼皮