版本
SpringAI:1.1.6
SpringBoot:3.5.14
JdbcChatMemoryRepository
JdbcChatMemoryRepository是一个内置实现,使用 JDBC 将消息存储在关系数据库中。
下面所有配置完成后,应用会在启动时,会读取内置建表语句,schema-mysql.sql,自动创建一张名为 spring_ai_chat_memory 的表,用于存储对话记录
IDEA中双击shift搜索schema-mysql.sql,就能看到建表语句。
使用
引入依赖
xml
<!-- 引入jdbc -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>
<!-- 引入mysql -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
修改配置
使用的是阿里云百炼平台中的大模型,配置如下
spring.ai.chat.memory.repository.jdbc.initialize-schema有三个选项
embedded:默认值,只能用于嵌入式数据库(如 H2、HSQL、Derby 等)always:自动使用内置sql创建表never:不初始化,手动创建自定义表
spring.ai.chat.memory.repository.jdbc.platform的值,是你的数据库类型,当initialize-schema=always时,springai会根据platform使用对应的schema-{platform}.sql文件建表
groovy
spring.ai.openai.chat.api-key=
spring.ai.openai.chat.base-url=https://dashscope.aliyuncs.com/compatible-mode
spring.ai.openai.chat.options.model=deepseek-v4-flash
spring.ai.chat.memory.repository.jdbc.initialize-schema=always
spring.ai.chat.memory.repository.jdbc.platform=mysql
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ai_demo
spring.datasource.username=root
spring.datasource.password=1111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
代码
java
package com.cry.chatmemorymysql.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository;
import org.springframework.ai.chat.messages.Message;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class ChatMemoryMysqlController {
private ChatClient chatClient;
private JdbcChatMemoryRepository chatMemoryRepository;
public ChatMemoryMysqlController(ChatClient.Builder builder, JdbcChatMemoryRepository chatMemoryRepository) {
this.chatMemoryRepository = chatMemoryRepository;
// 创建聊天存储器
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(5) // 数据库中同一id,最多保存5条
.build();
this.chatClient = builder
.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) // 使用聊天存储器
.build();
}
@GetMapping("/chat")
public String chat(@RequestParam(value = "message",defaultValue = "你是谁") String message,@RequestParam(value = "chatId",defaultValue = "1") String chatId) {
return chatClient.prompt(message)
// 设置会话id
.advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, chatId))
.call()
.content();
}
@GetMapping("/chat/list")
public List<String> chatList() {
return chatMemoryRepository.findConversationIds();
}
@GetMapping("/chat/history")
public List<Message> chatHistory(@RequestParam(value = "chatId",defaultValue = "1") String chatId) {
return chatMemoryRepository.findByConversationId(chatId);
}
}
验证
http://localhost:8080/chat?message=我是ccc&chatId=1
http://localhost:8080/chat?message=我是谁&chatId=1
