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

SpringAI对话记忆实战:手把手教你用MySQL+MyBatis实现多轮聊天上下文持久化 本文详细介绍了如何使用SpringAI结合MySQL和MyBatis实现多轮对话记忆的持久化存储。通过设计核心数据表和实现`ChatMemory`接口,解决了传统内存缓存会话重启记忆清零的问题,并支持分布式部署。文章还涵盖了流式响应处理、上下文长度控制及多租户隔离等实战技巧,帮助开发者构建具备长期记忆能力的AI对话系统。 阅读详情

版本
SpringAI:1.1.6
SpringBoot:3.5.14

JdbcChatMemoryRepository

JdbcChatMemoryRepository是一个内置实现,使用 JDBC 将消息存储在关系数据库中。
下面所有配置完成后,应用会在启动时,会读取内置建表语句,schema-mysql.sql,自动创建一张名为 spring_ai_chat_memory 的表,用于存储对话记录
IDEA中双击shift搜索schema-mysql.sql,就能看到建表语句。

使用

引入依赖

 <!-- 引入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文件建表

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

代码

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
在这里插入图片描述

SpringAI对话记忆持久化实战:从内存到MySQL的自定义演进 本文详细介绍了如何将SpringAI的对话记忆从内存存储迁移到MySQL持久化,解决数据易丢失、内存占用高及多实例共享问题。通过技术选型、架构设计、数据库优化及MyBatis-Plus整合,实现高性能的对话记忆存储,显著提升智能客服系统的连贯性和用户体验。 阅读详情

相关推荐

SpringAI对接MySQL实现生产级会话存储实战

ChatMemory是SpringAI中管理对话上下文的核心抽象,其本质是为大模型服务的状态持久化机制。理解其add/get/clear/prune四方法的语义约束,是构建可靠会话存储的前提。MySQL作为最通用的关系型数据库,凭借事务一致性、成熟运维生态和高并发能力,成为Java系AI应用落地的首选持久化方案。但直接套用JDBC模板极易引发OOM、顺序错乱、连接池耗尽等线上故障。本文聚焦SpringAI与MySQL集成的关键路径:从表结构设计(含sequence_num防乱序)、分阶段事务适配流式响应,到

weixin_34061440的博客 230

SpringAI--基于MySQL的持久化对话记忆实现

Spring AI对话记忆的持久化实现。

Debug Dog 2489

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 641

【SpringAI】会话记忆实现——基于MYSQL进行存储

本文介绍了SpringAI中实现上下文记忆功能的两种主要方式:内存存储和JDBC持久化存储。内存存储基于InMemoryChatMemoryRepository实现,配置简单、性能高,适合开发和测试环境,但存在数据易失和无法共享的缺点。JDBC存储通过JdbcChatMemoryRepository将对话记录持久化到关系型数据库,支持多实例共享和服务重启后的数据恢复,更适合生产环境。文章详细分析了两种方式的实现原理、代码配置和优缺点对比,并给出了选型建议:开发测试推荐内存存储,生产环境应采用JDBC持久化存

27届Java后端炒粉练习生,AICoding中........ 1585

深入解析Buck开关电源中的死区时间设计及其对系统性能的影响

本文深入解析了Buck开关电源中死区时间的设计原理及其对系统性能的关键影响。死区时间通过防止上下管同时导通来避免穿通电流,确保系统安全。文章详细探讨了其工作机制、设置时的效率与安全权衡,以及不当设置对效率、稳定性和EMI的连锁反应,并提供了基于实测的调试方法与实战案例。

Apple的专栏 1130

时间同步中 TOD 与GPRMC和IRIG-B的区别

时间同步中 TOD 与GPRMC和IRIG-B的区别

ftdlk的博客 1726

SpringAI聊天记忆ChatMemory

本文介绍了SpringAI中实现多轮对话记忆存储的三种方式:内存存储、MySQL存储和Redis存储。重点分析了chat-memory组件的核心作用,即通过存储对话历史解决大语言模型无状态问题。文章详细展示了每种存储方式的配置步骤和使用示例,包括依赖导入、Bean配置和代码实现。特别对比了PromptChatMemoryAdvisor和MessageChatMemoryAdvisor两种拦截器的区别,并指出后者可能存在的兼容性问题。针对MySQL存储方案,还提出了自定义增强器保存完整历史记录的建议。

weixin_45948519的博客 2187

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 303

Spring Al——记忆持久化

SpringAI基于Redis和MySQL实现对话记忆持久化的技术方案:Redis适用于高速读写的短期对话场景,利用内存存储优势保存临时上下文;MySQL适合长期存储完整对话历史,提供可靠的数据持久化。实现步骤包括Maven依赖配置、MySQL连接设置,以及通过MessageWindowChatMemory管理对话记忆。代码示例展示了如何存储对话记录和检索历史消息,其中Redis处理实时交互,MySQL负责数据归档。该方案兼顾性能与可靠性,为智能对话系统提供完整记忆管理解决方案。

2301_81283571的博客 1661

ubuntu 24.04安装ros1 noetic

上面是参考链接给的修改内容。除了上面要修改的地方,我在编译的生活还有一个地方报错,修改成如下形式。因为我已经对文件rosconsole_log4cxx.cpp作了上面的修改,所有是不是188行不太确认了,如果报“log4cxx::spi::LocationInfo”问题,按照下面修改就可以了。我在编译时还报了一个问题,就是我之前安装的是jazzy。所以在编译时会报ros变量名不对,这时对变量名做修改就可以了。具体怎么修改,百度。a、将源文件中所有CMakelist中编译标准改为c++ 17.

yangpan011的博客 3205

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

大模型开发 - SpringAI之MySQL存储ChatMemory

本文介绍了如何将Spring AI中的ChatMemory从内存存储迁移到MySQL数据库持久化。内存存储存在数据丢失、无法共享等局限性,而MySQL持久化可解决这些问题,提供数据持久性、分布式共享和合规性支持。文章详细讲解了Maven依赖配置、MySQL连接设置和ChatMemory JDBC配置,并展示了只需修改一个Bean即可完成迁移的简洁实现方式。通过数据库持久化,开发者能够构建更稳定、可扩展的AI对话应用,满足生产环境需求。

小工匠 2142

STM32F103ZE驱动PMW3901光流模块,从SPI配置到数据读取的完整避坑指南

本文详细解析了STM32F103ZE驱动PMW3901光流模块的全过程,从SPI配置、硬件连接到数据读取与处理,提供了完整的避坑指南。重点介绍了SPI参数配置、初始化序列优化、运动数据滤波等关键技巧,帮助开发者快速实现精准的光流检测。

weixin_42631411的博客 514

SpringAi中使用MySQL作为聊天消息持久化产生的问题

在使用Spring AI的JdbcChatMemoryRepository作为MySQL持久化存储库时,可能会遇到BadSqlGrammarException异常。该异常是由于getSelectMessagesSql()方法生成的SQL语句需要两个参数(conversation_id和limit),但在实际调用时只提供了一个参数,导致SQL执行失败。具体表现为java.sql.SQLException: No value specified for parameter 2。该问题已在Spring AI的后续

2503_92145588的博客 918

【定位教程2----旋转中心标定之方法一】

【定位教程2----旋转中心标定之方法一】

Quintin 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringAI记忆机制:让大模型真正记住你

层级技术方案特点近期记忆实时、高频、低延迟中期记忆RAG + 向量数据库检索相关历史、按需加载长期记忆批处理/实时提取沉淀知识、精炼存储这种多层次记忆架构,能够在有限的 Token 窗口内最大化保留有用信息,让 AI 对话更接近"人"的自然交互体验。

qq_69304031的博客 278

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringAI对话记忆持久化实战:用MyBatis-Plus+MySQL替代官方JdbcChatMemory

本文详细介绍了如何使用MyBatis-Plus+MySQL替代SpringAI官方JdbcChatMemory实现对话记忆持久化。针对官方方案依赖获取困难、文档稀缺等问题,提供了完整的数据库设计、核心代码实现及性能优化建议,帮助开发者构建稳定可靠的AI对话系统。

weixin_29214199的博客 256

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring AI 聊天记忆

Spring AI提供了多种聊天内存管理方案,支持内存存储和持久化存储。默认使用内存中的MessageWindowChatMemory,限制消息数量为20条。开发者可通过JdbcChatMemoryRepository实现关系型数据库持久化,支持PostgreSQL、MySQL等数据库,支持自动建表。ChatClient API通过MessageChatMemoryAdvisor等内置顾问管理对话上下文,支持按会话ID维护历史记录。示例代码展示了如何配置基于智谱AI模型的聊天客户端,实现带内存管理的对话功能

ling_zhi_xin的博客 1150

Springai对话记忆保存数据库配置

【代码】Springai对话记忆保存数据库配置。

qq_59534487的博客 42

大模型如何做到记忆存储

项目引入JDBC依赖与数据库驱动后,SpringAI可自动初始化记忆数据表,无需手动建表;生产环境需手动开启字段拓展,新增tenantId、userId实现三层隔离;配置定时清理任务,避免数据表数据无限累积;结合滑动窗口控制单次会话上下文长度,平衡对话完整性与Token成本;适配数据库读写分离,提升高并发记忆读写性能。项目接入Redis集群后,自定义RedisChatMemoryRepository重写原生存储逻辑,拼接三元组Key实现三层隔离;根据业务场景差异化配置TTL过期策略;

只要肯攀登,终有登顶时 436

Spring AI系列之对话记忆与工具调用指南

本文介绍了Spring AI中实现对话记忆和工具调用的方法。首先解释了对话记忆的必要性,对比了有无记忆的对话差异。然后详细剖析了Spring AI的记忆架构,包括ChatClient、MessageChatMemoryAdvisor和ChatMemory等核心组件。文章提供了基于内存的基础实现方案,展示了MessageWindowChatMemory的使用示例和工作原理。针对生产环境需求,介绍了JDBC数据库持久化方案和Redis高性能缓存方案,比较了两者的特性差异,并提供了自定义RedisChatMemo

Nicky's blog 498

Spring AI内存管理:对话历史存储与优化策略

在AI应用开发中,对话历史管理面临三大核心痛点: - **存储膨胀**:未经优化的对话历史会以指数级增长,导致存储成本激增 - **性能衰减**:随着对话轮次增加,检索与生成速度显著下降(实测显示超过50轮后响应延迟增加300%) - **隐私风险**:长期存储用户对话可能违反数据合规要求(如GDPR的"遗忘权"条款) Spring AI提供的内存管理框架通过分层存储架构解决这些问题,其核心组件...

gitblog_00475的博客 1193

Spring AI 1.1.2 多模型切换 + 聊天记忆持久化:基于 MySQL 的 JDBC 实现深度解析

ChatClient 每次请求动态构建(模型可变) → Advisor 拦截请求 → Memory 管理窗口 → Repository 全量替换 → MySQL 按 conversationId 存储排序(记忆不变)模型构建层(易变)和记忆存储层(稳定)通过解耦。ChatClient 随时可以换模型,但只要 conversationId 不变,ChatMemory 就能从 MySQL 中加载出完整的历史上下文,让新模型无缝接续对话。这就是"模型变,记忆不变"的全部秘密。

q377914753的博客 1648

Spring AI 入门:(8)会话记忆

本章中,主要学习了 Spring AI 的聊天记忆机制,了解为什么需要记忆,记忆的架构,一些核心组件,以及记忆的存储,会话隔离等。

qq_43745578的博客 560

Spring AI 封神之路(一)|会话记忆多存储 + 提示词工程(黑马 SpringAI+Deepseek大模型应用开发实战笔记)

本文介绍了基于Ollama本地部署的AI调用方案及SpringAI集成开发实践。主要内容包括:1)Ollama本地部署方法,包含下载安装和项目初始化;2)SpringAI版本选择建议(1.x稳定版与2.x预览版对比);3)两种模型调用方式(本地Ollama和官方API);4)会话记忆功能实现方案(内存、数据库和Redis存储);5)提示词工程应用实例(哄女友游戏场景);6)完整项目结构说明,包含pom.xml配置、数据库表设计、核心配置类和控制器实现。文章详细阐述了如何通过SpringAI框架集成大模型能力

小安同学的博客 1744

基于SpringAI的RAG系统

基于SpringAI的RAG系统设计实现

motiandashao的专栏 447
上一篇: windows中使用docker部署Milvus和Autt
下一篇: 使用Python上传文件到阿里云oss
My_Java_Life
博客等级 码龄11年 39粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值