原创 志字辈小蚂蚁 2025-11-11 08:30 重庆
作为 Java 领域的资深从业人员 ,对 Java 在 AI 领域的一些进度一直是有一些关注的 。 但是基于一些语言本身的限制 ,Java 在 AI 方面几乎没有希望成为主流语言。
点击关注公众号,“技术干货” 及时达!
版本
发布时间
核心变更
「0.8.1」2024 年 3 月
首个公开版本,基础 AI 模型集成
「1.0.0-M1」2024 年 5 月
ChatClient API、结构化输出、对话记忆
「1.0.0-M2」2024 年 8 月
扩展提供商支持、工具调用
「1.0.0-M6」2025 年 2 月
@Tool 注解、MCP 协议集成
「1.0.0-M7」2025 年 4 月
独立 RAG 模块、模块化架构
「1.0.0-RC1」2025 年 5 月 13 日
API 锁定、生产准备
「1.0.0 GA」2025 年 5 月 20 日
首个生产版本
「1.0.3」2025 年 10 月
GraalVM 原生镜像支持
「1.1.0-M3」2025 年 10 月 15 日
MCP SDK 升级、多文档支持
整体来说 ,SpringAI 是在不断发展的 ,其本身定位我认为也很准确 ,不介入 AI 逻辑运算 ,只是一个外层的服务层 。通过 Java 在服务端强大的能力 ,来提供一个 AI 服务端应用 ,为其他的微服务提供 AI 能力。三. 功能点一栏3.1 API 接口API 接口是 SpringAI 生产化最核心的环节 ,「其最终的效果是封装 AI 调用细节 ,只需要简单的操作就可以完成不同渠道的 AI 调用」。 (┌─────────────────────────────────────────────────────────┐│ 应用层 (Application) ││ ChatClient API | Prompt Templates | Structured Output │└─────────────────────────────────────────────────────────┘↓┌─────────────────────────────────────────────────────────┐│ 集成层 (Integration) ││ Spring Boot Auto-Config | Dependency Injection │└─────────────────────────────────────────────────────────┘↓┌─────────────────────────────────────────────────────────┐│ 核心层 (Core) ││ Model Abstraction | Embedding | Vector Store | Memory │└─────────────────────────────────────────────────────────┘↓┌─────────────────────────────────────────────────────────┐│ 扩展层 (Extension) ││ RAG | Agent | MCP | Tool Calling | Observability │└─────────────────────────────────────────────────────────┘
符合 Spring 一贯的定位)。如果对接过海外供应商的朋友 ,应该知道 Claude / Google Gemini / OpenAI 3 者的接口规范是不同的 。还包括 BigModel(智谱) 等也会在 OpenAI 的规范上有一些变化 。这也就「意味着多种规范和写法」。 Spring AI 的统一 ChatClient、EmbeddingClient 等接口,屏蔽底层差异 ,「通过配置切换模型,无需修改业务代码」。现阶段已经支持了 OpenAI、Anthropic、Google Gemini、AWS Bedrock、阿里通义千问、DeepSeek、智谱 AI、Ollama 等 20+ 模型提供商。❝常规代码写法 :❞基于简单的几句话 ,就可以完成一个供应商的调用, 而不用关注具体的细节。❝提出问题 :❞统一的 API 虽然好 ,但是其实不同的供应商细节挺多的 ,最常见的就是上下文的量和 Max Token 等都不一样 ,效果也不一样。所以想一键切换模型 / 供应商,那就得明白如何对配置进行微调 ,保证最佳得输出效果。❝相关高级功能 :❞「Prompt 工程与模板化」 : 可以为 System/User/Assistant/Tool 多角色定义不同得提示词 ,可以规范化提示词 ,通过模板变量渲染return chatClient.prompt().system("你是一个专业的文本摘要助手,能够提取关键信息并生成简洁的摘要。").user("请为以下文本生成摘要:\n" + text).options(OpenAiChatOptions.builder().withTemperature(0.3).withMaxTokens(300).build())v.call()v.content();
「流式响应与异步处理」 : 基于 Reactor 响应式编程 , 支持长文本沟通 ,支持同步、流式(SSE/Flux)、异步三种调用模式这里说白了就是SystemPromptTemplate sysTpl = new SystemPromptTemplate("以{role}风格回答");Message sysMsg = sysTpl.createMessage(Map.of("role", "技术专家"));UserMessage userMsg = new UserMessage("解释Spring Boot自动装配");Prompt prompt = new Prompt(List.of(sysMsg, userMsg));String result = chatClient.prompt(prompt).call().content();
Reactor 的相关功能,比如代码也是像下面这样好处就是 Spring AI 的流式处理会很简单 , 除了通过注解使用到了高级功能 ,其他的基本上不用配置3.2 RAG(检索增强生成)这里主要说的就是「向量化及向量库」了 ,SpringAI 支持内置向量存储抽象,支持 PGVector、Milvus、Pinecone、Redis、Chroma 等 20+ 向量数据库。 还支持 SpringData 模块对向量进行持久化的处理。RAG = Retrieval(检索)+ Augmented(增强)+ Generation(生成)「Retrieval」 : 根据用户问题,从外部知识库(文档、数据库)中检索相关内容「Augmented」 : 将检索到的内容注入到 Prompt 中作为上下文「Generation」 : 大模型基于增强后的 Prompt 生成答案这也就一般我们说的知识库 ,也是在我看来非常重要 ,在各大应用里面都能看到的核心组件。在这个环节里面 ,又涉及到 : 「向量存储 / 向量化 / 相似度检索 / 提示词工程」 等很多小部分。Spring 就是简化了这个环节 ,通过极少的代码(VectorStore ) ,就能实现相关的功能 :(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatResponse> stream( String msg) {return chatClient.prompt().user(msg).stream().chatResponse();}
3.3 对话记忆与上下文管理相比自己通过 API 进行调用的时候 ,自己去维护上下文和记忆 。 或者通过一个 Token 将记忆托管的 AI 服务商。Spring AI 支持通过内置 「ChatMemory」 接口,「从而支持多轮对话历史存储,还支持数据库级别的存储,各种策略的处理等。」对话记忆是一个服务的基础 ,业务活动一旦产生 ,肯定不是一个回合就结束了。public class RagService {private VectorStore vectorStore;private ChatClient chatClient;public String query(String question) {List<Document> docs = vectorStore.similaritySearch(question);String context = docs.stream().map(Document::getContent).collect(Collectors.joining("\n"));return chatClient.prompt().user("基于以下内容回答:\n" + context + "\n问题:" + question).call().content();}}
默认只提供一个 「InMemoryChatMemory」 的内存记忆 ,可以通过实现接口来扩展更多的方式3.4 多模态支持支持文本、图像、音频等多种输入输出。 重要性不言而喻吧。 只支持图片的对话 , 业务面要小得多。连 GPT 等主流梯队都早早的支持了多模态 ,没这个环节可太惨了。private ChatMemory chatMemory;private ChatClient chatClient;public String chat(String sessionId, String msg) {List<Message> history = chatMemory.get(sessionId);history.add(new UserMessage(msg));String reply = chatClient.prompt(new Prompt(history)).call().content();chatMemory.add(sessionId, new AssistantMessage(reply));return reply;}public class InMemoryChatMemory implements ChatMemory {Map<String, List<Message>> conversationHistory = new ConcurrentHashMap();
3.5 Agent 工作流工作流属于去年年底 ,今年年初就爆火的功能 , 通过多个角色 ,让一个任务的复杂度和准确性都大大提高。至于好不好用还待评测 ,但是功能上其实已经很容易上手了 。UserMessage msg = new UserMessage("描述这张图片",new Media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("photo.png")));String description = chatClient.prompt(new Prompt(msg)).call().content();
3.6 其他的功能❝函数调用和工具集成❞去年 MCP 就出来了 ,出来的时候那是非常火热的 ,后面 Spring AI 的 MCP 能力我也尝试过 ,初衷是通过 Spring AI 搭建一个 MCP 项目 ,跟一下去年那股 MCP 风。但是效果其实中规中矩 ,最后也没什么好用的场景做出来(主要是 Python 写一个太简单了,真不想上 Spring)❝更多 :❞「结构化输出映射」 : 将 LLM 输出直接映射为 Java 对象(POJO、枚举、List 等// Agent A: 能调用天气 + 数据库两个工具(name = "opsAgent")public Agent opsAgent(ChatClient.Builder builder, WeatherTool weatherTool, DatabaseTool databaseTool) {ChatClient client = builder.defaultSystem("你是智能助手,可调用工具完成任务").build();return Agent.builder().chatClient(client).tools(List.of(weatherTool, databaseTool)).systemPrompt("你是智能助手,可调用工具完成任务").build();}// Agent B: 只读天气查询,不做数据库保存(name = "readonlyWeatherAgent")public Agent readonlyWeatherAgent(ChatClient.Builder builder, WeatherTool weatherTool) {ChatClient client = builder.defaultSystem("你是天气顾问,只提供天气信息,不做任何持久化").build();return Agent.builder().chatClient(client).tools(List.of(weatherTool)).systemPrompt("你是天气顾问,只提供天气信息,不做任何持久化").build();}
chatClient.prompt().user("我的世界").call().entity(MovieReview.class);「注解式开发与 AOP 集成」 : 通过 @AiPrompt 等注解声明式调用 AI四. 稍微复杂一点的项目家里事有点多 ,时间有限暂时启动还有一些问题 ,这里就不放了 ,可以先关注哦总结总的来说 ,「投入生产没有太大的问题了」 ,肯定不会通过它来部署模型什么的, 但是用来作为对外的第一层接口还是没有什么问题了 。一般业务场景里面的东西该有就都有了。「如果没太多的定制功能 ,用 SpringAI 来完成项目效率应该会很高, 配合 AI 写代码 ,简直不要太简单。」点击"阅读原文"了解详情~
