SpringAI基于Mysql jdbc方式存储对话记忆

版本

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

相关推荐
mister_guo6 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
Lost_the_wind9 小时前
MySQL学习笔记五
mysql
silvamux_9 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
wang_yb9 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
ai·databook
GlobalInfo10 小时前
无人机机巢机库 行业地位与成长性研究报告:占有率跃升路径、收入增速与销量趋势
人工智能·ai·无人机
崎岖Qiu10 小时前
MCP 的架构、协议分层与通信过程
后端·ai·架构·agent·mcp
这个DBA有点耶10 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
SL_staff11 小时前
考勤同步工资核算总出错?破解企业级精准自动化的三个刚性支点
mysql·github·全栈
毕业设计70311 小时前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
太理摆烂哥12 小时前
MySQL库的操作
数据库·mysql