稀土掘金技术社区 11月11日 09:43
Spring AI:Java 服务端集成 AI 能力的利器
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了Java领域资深从业者对Java在AI领域发展潜力的关注。文章指出,尽管Java因语言特性在AI核心计算方面可能难以成为主流,但其在服务端为B/C端提供AI转发服务方面具有巨大潜力。重点介绍了Spring AI框架的发展历程、核心功能和适用场景。Spring AI通过统一的API接口,屏蔽了不同AI模型提供商(如OpenAI, Google Gemini, Claude等)的技术差异,支持模型切换,并提供了Prompt工程、流式响应、RAG(检索增强生成)、对话记忆、多模态支持以及Agent工作流等丰富功能,极大地简化了Java开发者在服务端集成AI能力的复杂度,提升了开发效率,使其能够更好地为微服务提供AI能力,并已具备投入生产的条件。

✨ **Spring AI 的定位与价值**:Spring AI 并非直接介入 AI 的核心逻辑运算,而是定位于一个外层服务层。它利用 Java 在服务端强大的能力,为其他微服务提供 AI 能力的转发和集成,极大地简化了 Java 开发者在服务端集成 AI 的复杂性,提升了开发效率,并已具备投入生产的能力。

🚀 **核心功能与简化开发**:Spring AI 提供统一的 ChatClient、EmbeddingClient 等接口,屏蔽了 OpenAI、Google Gemini、Anthropic 等 20+ 模型提供商的底层差异,使得开发者可以通过简单的配置切换模型,无需修改业务代码。同时,它支持 Prompt 工程与模板化、流式响应与异步处理,以及结构化输出映射为 Java 对象,显著降低了开发门槛。

🧠 **RAG、对话记忆与多模态**:该框架集成了 RAG(检索增强生成)功能,通过对向量存储、向量化、相似度检索以及提示词工程的简化,开发者可以轻松实现知识库的集成。此外,Spring AI 内置的 ChatMemory 接口支持多轮对话历史存储,并具备多模态支持(文本、图像、音频等),满足了现代 AI 应用日益增长的需求。

🤖 **Agent 工作流与工具集成**:Spring AI 支持 Agent 工作流,允许通过多个角色和工具(如天气查询、数据库访问)来处理复杂任务,提高了任务的准确性和效率。同时,它还提供了函数调用和工具集成能力,进一步增强了 AI 的应用范围和灵活性。

原创 志字辈小蚂蚁 2025-11-11 08:30 重庆

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

点击关注公众号,“技术干货” 及时达!

一. 前言作为 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 能力。

三. 功能点一栏

    ┌─────────────────────────────────────────────────────────┐
    │                    应用层 (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+ 模型提供商。

    常规代码写法 :

      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 多角色定义不同得提示词 ,可以规范化提示词 ,通过模板变量渲染

        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 的流式处理会很简单 , 除了通过注解使用到了高级功能 ,其他的基本上不用配置

          @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
          public Flux<ChatResponsestream(@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 ) ,就能实现相关的功能 :

            @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」 接口,「从而支持多轮对话历史存储,还支持数据库级别的存储,各种策略的处理等。」

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

              @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<StringList<Message>> conversationHistory = new ConcurrentHashMap();

              默认只提供一个 「InMemoryChatMemory」 的内存记忆 ,可以通过实现接口来扩展更多的方式

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

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

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

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

                  // 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 写代码 ,简直不要太简单。」

                  ""~

                  阅读原文

                  跳转微信打开

                  Fish AI Reader

                  Fish AI Reader

                  AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

                  FishAI

                  FishAI

                  鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

                  联系邮箱 441953276@qq.com

                  相关标签

                  Spring AI Java AI 人工智能 服务端开发 微服务 RAG Agent
                  相关文章