Spring AI 对接 DeepSeek 基于 OpenAI API 规范实现 聊天记录持久化 快速接入 人工智能
摘要 Spring AI是Spring官方推出的Java生成式AI开发框架,支持OpenAI、Claude等主流模型的无缝切换,提供同步/流式响应、结构化输出等功能。框架内置RAG能力,支持文档处理、向量存储及智能检索,同时具备函数调用、聊天记忆等企业级特性。通过OpenAI规范实现底层封装,简化Java开发者接入AI的成本,兼容Spring Boot 3.x和JDK17+。配置示例展示了如何集成
介绍
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表情存入数据会报错。
更多推荐



所有评论(0)