介绍

Spring AI 是 Spring 官方推出的面向 Java 开发者的生成式 AI 应用开发框架,一套代码即可无缝切换 OpenAI、Claude、Gemini、Ollama、通义千问、文心一言等国内外主流模型,支持同步与流式响应、结构化输出直接映射为 Java 对象。在 RAG 方面内置文档读取、文本分块、向量化以及统一向量存储接口,兼容 Chroma、Milvus、PGVector、Redis 等主流向量库,支持元数据过滤与智能检索。同时支持函数调用,让大模型自动调用 Java 方法,还提供聊天记忆、重试熔断、可观测性、提示词缓存等企业级能力,适合快速构建智能问答、知识库、内容生成、数据分析、智能代理等 AI 应用,兼容 Spring Boot 3.x 和 JDK 17 及以上版本,是 Java 生态接入生成式 AI 的主流方案。

OpenAI 规范是底层的接口标准,定义了怎么请求大模型、返回什么数据、支持哪些功能,Spring AI 则是基于 OpenAI 规范做的上层 Java 封装框架,二者配合使用时,Spring AI 会完全遵循 OpenAI 的官方接口规范,自动完成请求组装、身份认证、参数映射、响应解析、异常处理、流式输出等所有底层细节,Java 开发者不需要手动写 HTTP 请求、拼接 JSON、处理 SSE 流式数据,只需要通过 Spring AI 提供的统一接口注入 ChatModel,简单几行代码就能调用 OpenAI 的对话、嵌入、文生图、语音、函数调用等全部能力,同时还能享受 Spring 生态的自动配置、依赖注入、重试、日志、可观测性等企业级特性,切换模型厂商时也不需要修改业务代码,只需要更换配置和依赖,就能无缝对接其他兼容 OpenAI 规范的模型服务,既保留了 OpenAI 完整的功能规范,又大幅简化了 Java 项目接入 AI 的开发成本,让开发者专注于业务逻辑而非底层接口调用。

依赖导入

<dependencies>
    <!-- Spring Boot Web 核心依赖,用于构建 Web 接口、接收 HTTP 请求 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring AI 官方 OpenAI 模型启动器,自动集成 GPT 对话、嵌入、函数调用等能力 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>

    <!-- Lombok 工具,简化 Java 代码,自动生成 getter/setter/构造器等,减少样板代码 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>

    <!-- MySQL 官方驱动,项目连接 MySQL 数据库必须依赖 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
    </dependency>

    <!-- Spring AI JDBC 聊天记忆存储,将 AI 对话历史持久化到 MySQL 等关系型数据库 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
    </dependency>

    <!-- Spring Boot 测试依赖,用于单元测试、接口测试等 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<!-- 依赖版本管理,统一管理 Spring AI 所有组件版本,避免版本冲突 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置文件

# 服务端口配置,项目启动后访问 8080 端口
server:
  port: 8080

spring:
  # MySQL 数据库连接配置
  datasource:
    # 数据库连接地址,指定库名 xfj,时区上海,编码 UTF-8
    url: jdbc:mysql://localhost:3306/xfj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    # 数据库用户名
    username: root
    # 数据库密码
    password: 123456
    # MySQL 8.x 驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver

  # Spring 应用名称
  application:
    name: deepseek

  # Spring AI 配置(对接 DeepSeek,兼容 OpenAI 规范)
  ai:
    # 使用 OpenAI 兼容适配接入 DeepSeek
    openai:
      # DeepSeek API 密钥
      api-key: XXXX
      # DeepSeek 接口地址(非 OpenAI 官方地址)
      base-url: https://api.deepseek.com
      # 对话模型配置
      chat:
        options:
          # 使用的模型名称:deepseek-chat
          model: deepseek-chat

    # AI 对话记忆配置(持久化到数据库)
    chat:
      memory:
        repository:
          jdbc:
            # 项目启动时自动初始化对话记忆所需的数据库表(always=每次都初始化)
            initialize-schema: always

# 日志级别配置
logging:
  level:
    # 开启 Spring AI 对话顾问调试日志,方便排查记忆、流程问题
    org.springframework.ai.chat.client.advisor: debug
    # 开启 DeepSeek 相关调试日志,便于查看请求/响应详情
    com.deepseek: debug

配置类

/**
 * DeepSeek 配置类
 * 基于 Spring AI + OpenAI 规范,配置 AI 对话客户端 + 数据库持久化对话记忆
 */
@Configuration
public class DeepSeekConfig {

    /**
     * 【内存版】对话记忆配置(已注释)
     * 重启服务后聊天记录会丢失,适合开发测试
     */
//    @Bean  聊天记录保存到内存中
//    public ChatMemory chatMemory(){
//        InMemoryChatMemoryRepository inMemoryChatMemoryRepository = new InMemoryChatMemoryRepository();
//        return MessageWindowChatMemory
//                .builder()
//                .chatMemoryRepository(inMemoryChatMemoryRepository) 
//                .build();
//    }

    /**
     * 【数据库版】对话记忆 Bean(MySQL 持久化)
     * 依赖 JDBC 存储器,聊天记录永久保存在 MySQL 中
     * @param chatMemoryRepository Spring AI 自动配置的 JDBC 记忆仓库
     * @return 带窗口管理的对话记忆
     */
    @Bean
    public ChatMemory chatMemory(JdbcChatMemoryRepository chatMemoryRepository) {
        return MessageWindowChatMemory.builder()
                .chatMemoryRepository(chatMemoryRepository) // 使用数据库存储对话历史
                .build();
    }

    /**
     * AI 对话客户端(核心调用对象)
     * @param chatModel OpenAI 规范模型(这里实际对接 DeepSeek)
     * @param chatMemory 对话记忆(数据库版)
     * @return 可直接使用的 ChatClient
     */
    @Bean
    public ChatClient chatClient(OpenAiChatModel chatModel,ChatMemory chatMemory){
        return ChatClient
                .builder(chatModel)
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),        // 日志顾问:打印请求/响应日志
                        MessageChatMemoryAdvisor.builder(chatMemory).build() // 对话记忆顾问:自动读取/保存聊天记录
                )
                .build();
    }
}

控制器

/**
 * AI 对话接口控制器
 * 提供流式对话 + 对话历史查询功能,基于 Spring AI + DeepSeek + MySQL 对话记忆
 */
@RestController
@RequestMapping("/ai")
// Lombok 注解,自动为 final 字段生成构造函数,实现依赖注入
@RequiredArgsConstructor
public class AiChatController {

    // Spring AI 核心对话客户端,用于发送请求、获取AI回复
    private final ChatClient chatClient;

    // 对话记忆管理器,负责读取/保存/查询对话历史
    private final ChatMemory chatMemory;

    /**
     * 流式对话接口(推荐)
     * @param chat 用户输入的提问内容
     * @param chatId 对话会话ID(同一个ID会自动关联上下文)
     * @return Flux<String> 流式返回AI回答内容
     */
    @GetMapping("/chat")
    public Flux<String> chat(@RequestParam String chat, @RequestParam String chatId){
        return chatClient
                .prompt()                  // 创建对话提示词
                .user(chat)                // 设置用户输入内容
                // 绑定对话ID,自动携带上下文记忆
                .advisors(a-> a.param(ChatMemory.CONVERSATION_ID, chatId))
                .stream()                 // 开启流式响应(逐字返回)
                .content();               // 只返回纯文本内容
    }

    /**
     * 查询指定会话的历史聊天记录
     * @param chatId 对话会话ID
     * @return 该会话下所有用户+AI的消息列表
     */
    @GetMapping("/list")
    public List<Message> list(@RequestParam String chatId){
        return chatMemory.get(chatId);
    }
}

自动建表

在这里插入图片描述
自动建表编码MySQL 默认字符集不支持 emoji、特殊符号、生僻字,必须用 utf8mb4,反正AI返回的emj表情存入数据会报错。
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐