虽迟但到 :盘一盘 SpringAI 现在发展得怎么样了?

一. 前言

作为 Java 领域的资深从业人员 ,对 Java 在 AI 领域的一些进度一直是有一些关注的 。 但是基于一些语言本身的限制 ,Java 在 AI 方面几乎没有希望成为主流语言

但是这不是说 Java 就不能介入这个领域了 ,作为主要的服务端语言 ,为 B/C 端提供 AI 的转发是其比较主要的使用场景之一

而这一期关注的 SpringAI , 就是其主要发展对象。 该框架在其刚发布的时候就有所关注 ,但是整体效果并不好 ,不适合生产能力。

随着这2年的发展 ,整体上还是有了很大的发展 ,是否值得我们开始输入学习了呢?

二. Spring 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 能力。

三. 功能点一栏

java 复制代码
┌─────────────────────────────────────────────────────────┐
│                    应用层 (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       │
└─────────────────────────────────────────────────────────┘

3.1 API 接口

API 接口是 SpringAI 生产化最核心的环节 ,其最终的效果是封装 AI 调用细节 ,只需要简单的操作就可以完成不同渠道的 AI 调用 。 (符合 Spring 一贯的定位)。

如果对接过海外供应商的朋友 ,应该知道 Claude / Google Gemini / OpenAI 3者的接口规范是不同的 。还包括BigModel(智谱) 等也会在 OpenAI 的规范上有一些变化 。

这也就意味着多种规范和写法 。 Spring AI 的统一 ChatClient、EmbeddingClient 等接口,屏蔽底层差异 ,通过配置切换模型,无需修改业务代码

现阶段已经支持了 OpenAI、Anthropic、Google Gemini、AWS Bedrock、阿里通义千问、DeepSeek、智谱 AI、Ollama 等 20+ 模型提供商。

常规代码写法 :

java 复制代码
return chatClient.prompt()
    .system("你是一个专业的文本摘要助手,能够提取关键信息并生成简洁的摘要。")
    .user("请为以下文本生成摘要:\n" + text)
    .options(OpenAiChatOptions.builder()
        .withTemperature(0.3)
        .withMaxTokens(300)
        .build())
v.call()
v.content();

基于简单的几句话 ,就可以完成一个供应商的调用, 而不用关注具体的细节。

提出问题 :

统一的 API 虽然好 ,但是其实不同的供应商细节挺多的 ,最常见的就是上下文的量和 Max Token 等都不一样 ,效果也不一样

所以想一键切换模型/供应商,那就得明白如何对配置进行微调 ,保证最佳得输出效果。

相关高级功能 :

  • Prompt 工程与模板化 : 可以为 System/User/Assistant/Tool 多角色定义不同得提示词 ,可以规范化提示词 ,通过模板变量渲染
java 复制代码
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 响应式编程 , 支持长文本沟通 ,支持同步、流式(SSE/Flux)、异步三种调用模式
    • 这里说白了就是 Reactor 的相关功能,比如代码也是像下面这样
    • 好处就是 Spring AI 的流式处理会很简单 , 除了通过注解使用到了高级功能 ,其他的基本上不用配置
java 复制代码
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ChatResponse> stream(@RequestParam String msg) {
    return chatClient.prompt().user(msg).stream().chatResponse();
}

3.2 RAG(检索增强生成)

这里主要说的就是向量化及向量库 了 ,SpringAI 支持内置向量存储抽象,支持 PGVector、Milvus、Pinecone、Redis、Chroma 等 20+ 向量数据库。 还支持 SpringData 模块对向量进行持久化的处理。

  • RAG = Retrieval(检索)+ Augmented(增强)+ Generation(生成)
    • Retrieval : 根据用户问题,从外部知识库(文档、数据库)中检索相关内容
    • Augmented : 将检索到的内容注入到 Prompt 中作为上下文
    • Generation : 大模型基于增强后的 Prompt 生成答案

这也就一般我们说的知识库 ,也是在我看来非常重要 ,在各大应用里面都能看到的核心组件。

在这个环节里面 ,又涉及到 : 向量存储 / 向量化 / 相似度检索 / 提示词工程 等很多小部分。

Spring 就是简化了这个环节 ,通过极少的代码(VectorStore ) ,就能实现相关的功能 :

java 复制代码
@Service
public class RagService {
    @Autowired private VectorStore vectorStore;
    @Autowired 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();
    }
}

3.3 对话记忆与上下文管理

相比自己通过 API 进行调用的时候 ,自己去维护上下文和记忆 。 或者通过一个Token将记忆托管的 AI 服务商。

Spring AI 支持通过内置 ChatMemory 接口,从而支持多轮对话历史存储,还支持数据库级别的存储,各种策略的处理等。

对话记忆是一个服务的基础 ,业务活动一旦产生 ,肯定不是一个回合就结束了。

java 复制代码
@Autowired private ChatMemory chatMemory;
@Autowired 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();
  • 默认只提供一个 InMemoryChatMemory 的内存记忆 ,可以通过实现接口来扩展更多的方式

3.4 多模态支持

支持文本、图像、音频等多种输入输出。 重要性不言而喻吧。 只支持图片的对话 , 业务面要小得多。

连 GPT 等主流梯队都早早的支持了多模态 ,没这个环节可太惨了。

java 复制代码
UserMessage msg = new UserMessage("描述这张图片", 
    new Media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("photo.png")));
String description = chatClient.prompt(new Prompt(msg)).call().content();

3.5 Agent 工作流

工作流属于去年年底 ,今年年初就爆火的功能 , 通过多个角色 ,让一个任务的复杂度和准确性都大大提高。

至于好不好用还待评测 ,但是功能上其实已经很容易上手了 。

java 复制代码
// Agent A: 能调用天气 + 数据库两个工具
@Bean(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: 只读天气查询,不做数据库保存
@Bean(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();
}

3.6 其他的功能

函数调用和工具集成

去年 MCP 就出来了 ,出来的时候那是非常火热的 ,后面 Spring AI 的 MCP 能力我也尝试过 ,初衷是通过 Spring AI 搭建一个 MCP 项目 ,跟一下去年那股 MCP 风。

但是效果其实中规中矩 ,最后也没什么好用的场景做出来(主要是 Python 写一个太简单了,真不想上 Spring)

更多 :

  • 结构化输出映射 : 将 LLM 输出直接映射为 Java 对象(POJO、枚举、List 等
    • chatClient.prompt().user("我的世界").call().entity(MovieReview.class);
  • 注解式开发与 AOP 集成 : 通过 @AiPrompt 等注解声明式调用 AI

四. 稍微复杂一点的项目

家里事有点多 ,时间有限暂时启动还有一些问题 ,这里就不放了 ,可以先关注哦

总结

总的来说 ,投入生产没有太大的问题了 ,肯定不会通过它来部署模型什么的, 但是用来作为对外的第一层接口还是没有什么问题了 。

一般业务场景里面的东西该有就都有了。

如果没太多的定制功能 ,用 SpringAI来完成项目效率应该会很高, 配合AI写代码 ,简直不要太简单。

最后的最后 ❤️❤️❤️👇👇👇

相关推荐
叶庭云3 小时前
一文掌握 CodeX CLI 安装以及使用!
人工智能·openai·安装·使用教程·codex cli·编码智能体·vibe coding 终端
ss2734 小时前
手写Spring第4弹: Spring框架进化论:15年技术变迁:从XML配置到响应式编程的演进之路
xml·java·开发语言·后端·spring
兩尛4 小时前
Spring面试
java·spring·面试
舒一笑4 小时前
🚀 PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼发布!
后端·ai编程·intellij idea
Java中文社群4 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
helloworddm5 小时前
Orleans 流系统握手机制时序图
后端·c#
开心-开心急了6 小时前
Flask入门教程——李辉 第三章 关键知识梳理
后端·python·flask
Code blocks7 小时前
GB28181视频服务wvp部署(一)
java·spring boot·后端
我命由我123457 小时前
Spring Boot - Spring Boot 静态资源延迟响应(使用拦截器、使用过滤器、使用 ResourceResolver)
java·spring boot·后端·spring·java-ee·intellij-idea·intellij idea