Skip to content

Spring AI 1.0 正式发布,属于 Java 开发者的 AI 框架

Published: at 22:38:28

前言

最近,Spring 家族迎来了新成员——Spring AI 1.0 正式发布了!作为一个常年和 Spring 打交道的 Java 开发者,这个消息让我兴奋不已。终于,我们 Java 开发者也有了自己的 AI 开发框架,不用羡慕 Python 生态的 LangChain 了!

其实从去年就开始关注 Spring AI 项目了,一直处于快速迭代中。现在 1.0 版本正式发布,意味着 API 稳定,功能完善,可以放心在生产环境使用了。这篇文章就来聊聊 Spring AI 到底是什么,它能帮我们做什么,以及怎么上手使用。

Spring AI 是什么?

简单来说,Spring AI 是一个 AI 工程应用框架,它的目标是将 Spring 生态系统的设计原则(可移植性和模块化设计)应用到 AI 领域,并推广使用 POJO 作为应用程序的构建块。

Spring AI 集成图

Spring AI 的核心价值在于解决 AI 集成的基本挑战:连接企业数据和 API 与 AI 模型。这句话很关键,因为这正是我们在实际项目中最常遇到的问题——如何让 AI 模型和我们的业务数据、业务逻辑结合起来。

Spring AI 的核心特性

说实话,第一次看到 Spring AI 支持的功能清单时,我都惊呆了,几乎覆盖了当前 AI 应用开发的所有核心需求:

1. 支持多种 AI 模型提供商

Spring AI 支持市面上几乎所有主流的 AI 模型提供商:

支持的模型类型包括:

2. 统一的可移植 API

这个特性真的太 Spring 了!无论你使用哪家提供商的 AI 模型,Spring AI 都提供了统一的 API 接口。这意味着你可以轻松地在不同的 AI 提供商之间切换,而不需要大量修改代码。

// 使用OpenAI
ChatClient openaiClient = new OpenAiChatClient(apiKey);

// 切换到Claude只需要修改实现类
ChatClient claudeClient = new AnthropicChatClient(apiKey);

// API调用方式完全一致
String response = chatClient.prompt("Tell me a joke").call().content();

3. 结构化输出

这个功能太实用了!可以直接将 AI 模型的输出映射到 Java POJO 对象,不需要手动解析 JSON。

public record Person(String name, int age, List<String> hobbies) {}

Person person = chatClient.prompt("Generate a random person")
    .withResponseType(Person.class)
    .call();

System.out.println("生成的人物: " + person.name() + ",年龄: " + person.age());

4. 向量数据库支持

Spring AI 支持 14+ 种向量数据库,包括:

并且,Spring AI 提供了一个类似 SQL 的元数据过滤 API,可以在不同的向量存储提供商之间移植。这对于实现 RAG (检索增强生成) 模式非常有用!

5. 工具/函数调用

Spring AI 可以让 AI 模型调用你的 Java 服务和函数。这个功能对于构建 AI Agent 非常关键!可以用 @Tool 注解标记方法,或者使用 Java Function 对象。

@Tool("getCurrentWeather")
public WeatherInfo getWeatherInfo(String location) {
    // 实际调用天气API...
    return weatherService.getWeatherFor(location);
}

6. RAG 支持

检索增强生成 (RAG) 是当前最流行的 AI 应用模式之一,可以解决大语言模型的幻觉问题,让AI基于企业自有数据回答问题。Spring AI提供了强大的RAG支持,包括模块化架构和开箱即用的功能。

RAG 基础组件

首先,需要添加相关依赖:

<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>

Spring AI中的RAG功能主要通过两个关键组件提供:

  1. QuestionAnswerAdvisor:简单易用的问答顾问,适合基础RAG场景
  2. RetrievalAugmentationAdvisor:高级RAG顾问,提供模块化组件和更灵活的配置

使用QuestionAnswerAdvisor实现RAG

QuestionAnswerAdvisor适合快速实现基于向量数据库的问答功能:

// 假设vectorStore已经加载了你的企业文档数据
ChatResponse response = ChatClient.builder(chatModel)
        .build().prompt()
        .advisors(new QuestionAnswerAdvisor(vectorStore))
        .user("Spring Boot中如何配置数据源?")
        .call()
        .chatResponse();

还可以设置相似度阈值和返回结果数量:

var qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
        .searchRequest(SearchRequest.builder()
                .similarityThreshold(0.8d)
                .topK(6)
                .build())
        .build();

在运行时动态设置过滤条件:

String answer = chatClient.prompt()
    .user("Spring Security如何配置权限?")
    .advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "type == 'Spring' AND version >= '5.0'"))
    .call()
    .content();

高级RAG:RetrievalAugmentationAdvisor

如果需要更灵活的RAG实现,可以使用RetrievalAugmentationAdvisor,它提供了一个模块化架构:

// 基础RAG实现
Advisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .similarityThreshold(0.50)
                .vectorStore(vectorStore)
                .build())
        .build();

String answer = chatClient.prompt()
        .advisors(retrievalAugmentationAdvisor)
        .user("Java虚拟机如何管理内存?")
        .call()
        .content();

高级RAG实现可以包含查询转换、扩展等功能:

// 更高级的RAG实现,支持查询转换
Advisor advancedRagAdvisor = RetrievalAugmentationAdvisor.builder()
        // 查询重写,改善检索效果
        .queryTransformers(RewriteQueryTransformer.builder()
                .chatClientBuilder(chatClientBuilder)
                .build())
        // 文档检索
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .similarityThreshold(0.50)
                .vectorStore(vectorStore)
                .build())
        .build();

RAG 模块化组件

Spring AI的RAG架构受到了论文《Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks》的启发,提供了多种可组合的模块:

  1. 查询转换 (Query Transformation)

    // 将对话历史和后续问题压缩成一个独立的查询
    QueryTransformer queryTransformer = CompressionQueryTransformer.builder()
            .chatClientBuilder(chatClientBuilder)
            .build();
  2. 查询扩展 (Query Expansion)

    // 将一个查询扩展为多个语义变体
    MultiQueryExpander queryExpander = MultiQueryExpander.builder()
        .chatClientBuilder(chatClientBuilder)
        .numberOfQueries(3)
        .build();
  3. 文档检索 (Document Retrieval)

    // 基于元数据过滤的向量检索
    DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
        .vectorStore(vectorStore)
        .similarityThreshold(0.73)
        .topK(5)
        .filterExpression(new FilterExpressionBuilder()
            .eq("department", "engineering")
            .build())
        .build();

通过组合这些组件,可以构建适合特定用例的自定义RAG流程,大大提高对话AI的准确性和实用性。

7. 模型上下文协议 (MCP) 支持

Spring AI 1.0 中一个非常重要但很容易被忽视的特性是对模型上下文协议(Model Context Protocol,MCP)的支持。这是一个标准化协议,使 AI 模型能够以结构化方式与外部工具和资源交互。

MCP 的核心优势在于:

Spring AI 提供了完整的 MCP 集成方案,包括:

客户端启动器

服务器启动器

使用 MCP,我们可以构建更复杂的 AI 应用,实现 AI 模型与外部工具的无缝集成,特别适合构建 AI Agent 和需要与多种外部系统交互的应用场景。

8. 其他实用功能

各家模型能力对比

Spring AI 支持的各种模型能力并不相同,以下是一个简要对比:

提供商多模态能力工具调用流式响应本地部署
OpenAI文本、图像、音频
Anthropic文本、PDF、图像
Google Gemini文本、PDF、图像、音频、视频
百度千帆文本
智谱AI文本
Ollama文本、图像

(注:这里只列举了部分模型,完整对比请参考官方文档

快速开始

使用 Spring AI 非常简单,下面是一个快速入门的例子:

  1. 创建一个 Spring Boot 项目,添加 Spring AI OpenAI 依赖:
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>
  1. application.properties 中添加你的 OpenAI API 密钥:
spring.ai.openai.api-key=你的OpenAI密钥
  1. 创建一个简单的示例:
@SpringBootApplication
public class SpringAiDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringAiDemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner runner(ChatClient.Builder builder) {
        return args -> {
            ChatClient chatClient = builder.build();
            String response = chatClient.prompt("用中文讲个笑话").call().content();
            System.out.println(response);
        };
    }
}

就这么简单,运行应用就能看到 AI 回复的笑话了。

实用场景

Spring AI 让以下 AI 应用场景变得更容易实现:

1. 企业知识库问答

结合 RAG 技术,可以创建一个能回答企业内部文档问题的 AI 助手。

2. 智能客服机器人

使用 Spring AI 的工具调用功能,可以让 AI 查询订单状态、执行退款等操作。

3. 内容生成与总结

自动生成产品描述、邮件内容,或总结长篇文档。

4. 代码助手

帮助开发人员生成代码、解释代码、查找 Bug 等。

我的看法

作为一个 Java 开发者,Spring AI 的出现真是太及时了。之前用 Python 做 AI 应用时,总感觉和我们的 Java 后端有点”格格不入”。现在有了 Spring AI,我们可以直接在现有的 Spring 应用中集成 AI 功能,不需要引入额外的技术栈。

特别是 Spring AI 提供的统一抽象层,让我们可以轻松尝试不同的 AI 模型,甚至可以同时使用多家提供商的服务。这与 Spring 一贯的设计理念一致 —— 提供统一抽象,隐藏底层实现细节。

对于国内开发者来说,Spring AI 支持百度千帆和智谱 AI 是一个很大的亮点。毕竟国内访问 OpenAI 等服务并不容易。

如果你是一个 Spring 开发者,想要入门 AI 应用开发,Spring AI 绝对是你的首选。它让你可以用熟悉的方式开发 AI 应用,而不需要学习全新的技术栈。

总结

Spring AI 1.0 的正式发布,标志着 Java 生态在 AI 应用开发领域迈出了坚实的一步。它提供了丰富的功能和优雅的抽象,让 AI 应用开发变得更加简单和标准化。

如果你也对 Spring AI 感兴趣,可以访问官方文档了解更多信息。