Spring AI 权威指南:为Java企业级应用注入生成式AI新活力

32 阅读6分钟

当生成式AI以前所未有的速度重塑各行各业时,作为占据企业级开发半壁江山的 Java 开发者,我们不禁思考:如何能在熟悉的 Spring 生态中,无缝地接入这股技术浪潮?过去,Python 是 AI 开发的首选语言,而 Java 开发者往往需要面对不同模型厂商的异构 API、复杂的提示词管理和缺失的标准化抽象。

Spring AI 的诞生正是为了解决这一痛点。它是 Spring 官方团队的战略性项目,旨在将 Spring 生态系统的设计哲学——可移植性、模块化、POJO(Plain Old Java Object)为中心的开发方式——应用于 AI 工程领域 。简单来说,Spring AI 之于大语言模型(LLM),就像 Spring Data 之于关系型数据库:它提供了一套统一的抽象层,让开发者可以用几行代码切换不同的 AI 提供商,而无需改动核心业务逻辑

本文将带你深入了解 Spring AI 的架构、核心功能,并通过实战案例演示如何快速构建一个具备检索增强生成(RAG)能力的智能应用。

一、Spring AI 核心设计理念

Spring AI 并非重复造轮子,而是将 AI 能力标准化。其核心设计围绕两大基石展开

  1. 可移植的抽象层

    • ChatClient:统一了与各种大语言模型(如 OpenAI、Anthropic、Ollama、通义千问)的交互接口。开发者面向 ChatClient 编程,底层的模型实现可以通过配置文件轻松切换

    • EmbeddingClient:抽象了文本向量化的过程,这是构建知识库和相似性搜索的基础。

    • VectorStore:提供了统一的向量数据库操作接口,支持从 Elasticsearch、Redis、Milvus 到 PGVector 等多种实现,解决了锁定特定向量库厂商的风险

  2. “惯例优于配置”的Spring Boot集成
    通过 Spring Boot 的自动配置和 Starter 机制,集成 AI 功能变得像添加一个 Web 依赖一样简单。只需在 pom.xml 中添加对应的 spring-ai-starter,并在 application.yml 中配置 api-key,一个功能完备的 AI 客户端 Bean 就准备就绪了

二、快速上手:三步集成AI到Spring Boot

实践出真知,我们通过一个简单的例子来感受 Spring AI 的魅力。假设我们要构建一个聊天接口,对接 DeepSeek 模型。

pom.xml 中引入 Spring AI 的 BOM 和 OpenAI Starter(因为 DeepSeek 兼容 OpenAI 的 API 规范)

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring AI OpenAI Starter -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>
</dependencies>

第二步:配置凭证
application.yml 中配置 API 密钥和端点地址。利用 Spring Boot 的属性注入,我们可以通过环境变量管理敏感信息,避免硬编码

yaml

spring:
  ai:
    openai:
      api-key: ${DEEPSEEK_API_KEY} # 从环境变量读取
      base-url: https://api.deepseek.com
      chat:
        options:
          model: deepseek-chat
          temperature: 0.7 # 控制创造性

第三步:编写业务代码
Spring AI 会自动配置好 ChatClient.Builder,我们只需将其注入到 Controller 或 Service 中即可

java

@RestController
@RequestMapping("/api/chat")
public class ChatController {

    private final ChatClient chatClient;

    public ChatController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping("/simple")
    public String simpleChat(@RequestParam String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content(); // 同步获取完整响应
    }
}

启动应用后,访问 /api/chat/simple?message=请介绍一下Spring AI,你就能得到模型的流利回答。至此,你仅用三步就完成了 AI 能力的集成

三、进阶实战:构建企业级RAG应用

基础的对话能力只是冰山一角。在企业场景中,我们需要让 AI 基于私域知识(如产品文档、内部手册)回答问题,这就要用到检索增强生成技术。Spring AI 提供了完备的 RAG 支持

1. 核心流程

RAG 的核心分为“入库”和“查询”两个阶段

  • 数据入库:加载文档 -> 分割文本(Chunking)-> 向量化(Embedding)-> 存入向量数据库。

  • 查询增强:用户提问 -> 问题向量化 -> 向量库相似性检索 -> 将检索到的上下文 + 问题合并为提示词 -> 调用 LLM 生成答案。

2. 实战:让AI读懂业务文档

以下示例展示了如何利用 Spring AI 结合 Elasticsearch 实现 RAG。

配置向量存储
pom.xml 中添加 Elasticsearch 的 VectorStore Starter

xml

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

编写服务代码

java

@Service
public class RagService {

    private final VectorStore vectorStore;
    private final ChatClient chatClient;

    public RagService(VectorStore vectorStore, ChatClient.Builder chatClientBuilder) {
        this.vectorStore = vectorStore;
        this.chatClient = chatClientBuilder.build();
    }

    // 1. 文档入库:上传并处理PDF
    public void ingestDocument(MultipartFile file) {
        // 读取PDF文档
        PdfDocumentReader pdfReader = new PdfDocumentReader(new InputStreamResource(file.getInputStream()));
        List<Document> documents = pdfReader.read();

        // 文本分割器(避免超过LLM上下文限制)
        TextSplitter textSplitter = new TokenTextSplitter(800, 200, 5, 10000, true);
        List<Document> splitDocuments = textSplitter.apply(documents);

        // 写入向量数据库(自动调用Embedding模型生成向量)
        vectorStore.accept(splitDocuments);
    }

    // 2. 智能问答
    public String queryWithRag(String question) {
        // 将搜索与生成结合
        return chatClient.prompt()
                .user(question)
                .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults())) // RAG顾问
                .call()
                .content();
    }
}

在这个例子中,QuestionAnswerAdvisor 是 Spring AI 提供的 RAG 模式顾问。它内部自动完成了“检索文档 -> 增强提示词 -> 调用模型”的全流程,极大地简化了代码逻辑 。你可以使用 Kibana 查看存储的向量数据,通过 POST /rag/query 接口提问,模型将基于上传的文档内容进行回答,有效避免了“幻觉”

四、高级特性与生态展望

除了基础的 Chat 和 RAG,Spring AI 还提供了丰富的企业级特性:

  • 函数调用:允许模型在需要时调用你预先定义好的 Java 方法,例如查询数据库、调用外部 API,让 AI 具备了“执行动作”的能力

  • 多模态支持:不仅支持文本,还集成了文本转图像(OpenAI Image)、音频转录(OpenAI Whisper)等功能

  • 可观测性:通过与 Micrometer 和 Spring Boot Actuator 集成,可以监控 AI 调用的 Token 消耗、延迟等关键指标,这对生产环境的成本控制和性能分析至关重要

  • 国产化适配:通过 spring-ai-alibaba 等社区项目,完美适配通义千问、百川等国产大模型,满足国内企业的合规与定制化需求

结语

Spring AI 的出现,不仅仅是 Spring 家族又多了一个新成员,它是 Java 在企业级 AI 应用开发领域的一次重要进化。它将复杂的 AI 工程化问题——模型切换、提示词管理、向量存储集成、函数调用——封装在开发者熟悉的编程模型之下

对于拥有庞大 Spring 技术栈的企业而言,Spring AI 无疑是拥抱生成式 AI 时代的最优路径。它让开发者能将注意力从“如何连接模型”转移到“如何解决业务问题”上,正如 Spring 当年简化 Java EE 开发一样,Spring AI 正在重新定义 Java 开发者构建智能应用的新范式 。无论你是要构建智能客服、知识库问答,还是复杂的 AI Agent,Spring AI 都值得你重点关注。