1.1. 什么是Spring AI

Spring AI 是面向 Java 和 Spring 生态的原生生成式人工智能框架。它不是简单地将 Python 中的 LangChain 或 LlamaIndex 移植到 Java,而是依据 Spring 的设计理念——如依赖注入、POJO、模块化和可配置——重构生成式 AI 的全流程。通过 Spring Boot 的自动装配机制,开发者可以像调用数据库或 Web API 一样轻松地接入聊天、嵌入、图像生成、语音处理等 AI 能力,并且能够毫不费力地将企业内部数据与 AI 模型关联起来(如同 RAG 检索增强生成中常用的数据注入方式)。

image.png

Spring AI 倡导"一套接口,多种实现",开发者无须为不同 AI 提供商逐一适配,而是可以通过统一抽象实现轻松切换,比如 OpenAI、Anthropic、Bedrock、Hugging Face、Vertex AI、Ollama 等服务。

  • Spring AI 官网地址

https://spring.io/projects/spring-ai

  • Spring AI 文档地址

https://docs.spring.io/spring-ai/reference/index.html

  • Spring AI 中文文档地址

https://spring-ai.spring-doc.cn/docs/1.0.0/index.html

1.2. Spring AI 特点

Spring AI 功能模块丰富,涵盖 AI 应用开发的各个环节,具备如下特点:

1. 多供应商模型支持

支持主流的 AI 模型提供商,例如:Anthropic、OpenAI、Microsoft、Amazon、Google、Ollama 等模型服务。通过这些模型可以实现聊天、文本嵌入、文生图、音频转录、文本转语音、内容审核等多种能力。

2. 统一抽象 API

提供如 ChatClient、EmbeddingModel、ImageModel 等统一接口,无论切换到哪家 AI 平台,调用方式一致,同时支持同步与流式调用,也能够访问模型特定功能。

3. Spring Boot 集成

以 Starter 和自动装配方式支持 AI 模型、向量数据库、ETL 工具等,开发者可通过 Initializr 快速上手。

4. 结构化输出与类型安全

模型的响应可解析并映射到 Java POJO,保证后续处理的类型安全与可维护性。

5. 向量存储与 RAG

集成了主流向量数据库(PostgreSQL/pgvector、Pinecone、Qdrant、Redis、Weaviate 等)及其元数据过滤,通过内置的 ETL 文档处理流程,结合检索增强生成(RAG)实现文档问答和聊天检索。

6. Tool/Function Calling

支持模型发起函数调用(类似 OpenAI Function Calling),可以注册 Spring Bean 作为可调用工具,从而访问实时业务系统或执行外部操作。

7. 可观测性与评估

内建对于 AI 调用的监控指标与日志、模型评估工具,可用于检测响应准确性、防止"幻觉"。

1.3. Spring AI 快速上手

1.3.1. 环境要求

Spring AI 构建在 Spring Boot 3.x 之上,Spring Boot 3.x 系列最低 Java 要求版本是 JDK 17,不支持 Java 8/11/16 等低于 17 的版本,推荐使用 Maven 3.6 及以上版本。

我们后续使用 Spring AI 时,对应环境版本如下:

  • Spring Boot 3.5.0 版本
  • JDK 17 版本
  • Maven 3.9.9 版本

这里在 Windows 中下载并安装 JDK 17。使用如下链接下载 JDK 17 后进行安装,这里安装在 D 盘 D:\Program Files\Java\jdk17\jdk 中,不需要配置环境变量,只需要在相应的 Spring Boot 项目中设置使用的 JDK 17 版本即可。

JDK 17 下载地址:https://www.oracle.com/cn/java/technologies/downloads/#java17

1.3.2. DeepSeek 对话案例

下面以 Spring AI 中通过与 DeepSeek 模型对话为例,演示 Spring AI 相关配置。

1) 创建 Spring Boot 项目,命名为 “SpringAIQuickStart”
![image.png](https://i-blog.csdnimg.cn/img_convert/e5cf12c04423b4d3a531ed0045e52584.jpeg

2) 配置项目 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringAIQuickStart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringAIQuickStart</name>
    <description>Spring AI Quick Start Demo</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <!-- 导入 Spring AI BOM,用于统一管理 Spring AI 依赖的版本,
         引用每个 Spring AI 模块时不用再写 <version>,只要依赖什么模块 Maven 自动使用 BOM 推荐的版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-deepseek</artifactId>
        </dependency>
    </dependencies>

    <!-- 声明仓库,用于获取 Spring AI 以及相关预发布版本 -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
        <repository>
            <name>Central Portal Snapshots</name>
            <id>central-portal-snapshots</id>
            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

3) 配置 resources/application.properties

spring.application.name=SpringAIQuickStart

server.port=8080

# 配置 DeepSeek 的基础 URL、密钥和使用模型
spring.ai.deepseek.base-url=https://api.deepseek.com
spring.ai.deepseek.api-key=sk-xxxxxxxxx
spring.ai.deepseek.chat.options.model=deepseek-chat

# 介于 0 和 2 之间,0 表示随机性最小,2 表示随机性最大
spring.ai.deepseek.chat.options.temperature=0.8

4) 创建 controller 包,并创建 ChatController.java 文件

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/ai")
public class ChatController {

    private final ChatClient chatClient;

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

    @GetMapping("/generate")
    public String generate(@RequestParam(value = "message", defaultValue = "给我讲个笑话") String message) {
        System.out.println("收到消息:" + message);
        String result = chatClient.prompt()
                .user(message)
                .call()
                .content();
        System.out.println("模型返回:" + result);
        return result;
    }
}

5) 启动项目并测试

启动项目后,浏览器输入 http://localhost:8080/ai/generate?message=你是谁,可以看到输出内容如下:

我是DeepSeek Chat,由深度求索公司(DeepSeek)开发的智能AI助手!✨ 我可以帮你解答问题、提供建议、陪你聊天,还能处理各种文本、文档等内容。无论是学习、工作,还是日常生活中的疑问,都可以来问我哦!😊 有什么我可以帮你的吗?

为了更好地可视化与 DeepSeek 模型聊天,我们还可以在项目的 resources/static 目录下创建 index.html 实现聊天可视化,index.html 内容如下:

重启 Spring Boot 项目后,直接访问 http://localhost:8080 可以直接访问到 resources/static/index.html 进行可视化与模型对话:

<!-- src/main/resources/static/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI 聊天</title>
    <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 20px;
            max-width: 800px;
            margin: 0 auto;
        }
        h1 {
            text-align: center;
            color: #333;
        }
        textarea {
            width: 100%;
            padding: 10px;
            font-size: 16px;
            border: 1px solid #ccc;
            border-radius: 4px;
            margin-bottom: 10px;
            box-sizing: border-box;
        }
        button {
            width: 100%;
            padding: 10px;
            font-size: 16px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #0056b3;
        }
        #response {
            margin-top: 20px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
            background-color: #f9f9f9;
        }
        #loading {
            display: none;
            margin: 20px auto;
            border: 4px solid #f3f3f3;
            border-top: 4px solid #3498db;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            animation: spin 2s linear infinite;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
    </style>
</head>
<body>
<h1>与 AI 聊天</h1>
<textarea id="userMessage" rows="4" placeholder="请输入您的问题..."></textarea><br><br>
<button onclick="sendMessage()">发送</button>

<div id="loading"></div>
<div id="response"></div>

<script>
    function sendMessage() {
        const message = document.getElementById('userMessage').value;
        if (!message) {
            alert('请输入消息');
            return;
        }

        document.getElementById('loading').style.display = 'block';

        fetch(`/ai/generate?message=${encodeURIComponent(message)}`)
            .then(response => response.text())
            .then(data => {
                document.getElementById('loading').style.display = 'none';
                document.getElementById('response').innerHTML = marked.parse(data);
            })
            .catch(error => {
                console.error('请求失败:', error);
                alert('请求失败,请稍后再试');
                document.getElementById('loading').style.display = 'none';
            });
    }
</script>
</body>
</html>

image.png

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐