当前位置: 首页 > article >正文

【SpringAI篇04】:从内存到MySQL,构建可重启的智能对话系统

1. 为什么需要从内存存储升级到数据库持久化刚开始接触SpringAI开发时很多开发者都会选择默认的内存存储方案。这种方案简单直接不需要额外配置数据库特别适合快速原型开发。但当你真正要把应用部署到生产环境时就会发现内存存储存在几个致命缺陷。最明显的问题就是数据易失性。内存中的数据在应用重启后会全部丢失这意味着用户每次重新打开聊天界面之前的对话记录都会消失。想象一下你正在和客服机器人讨论产品问题突然系统需要更新重启回来后发现之前的对话全没了这种体验有多糟糕。另一个问题是内存限制。MessageWindowChatMemory默认会限制保存的消息数量比如只保留最近的20条超出限制的旧消息会被自动丢弃。在实际业务场景中用户可能需要查阅几天前的对话记录这种限制显然无法满足需求。我去年开发过一个电商客服系统最初用的就是内存存储。结果上线第一天就收到大量投诉——用户反映每次刷新页面聊天记录就没了。更糟的是当并发用户数增加到500以上时服务器内存直接爆满。那次教训让我深刻认识到生产级应用必须使用数据库持久化。2. 内存存储与数据库持久化的技术对比2.1 内存存储的工作原理SpringAI默认的InMemoryChatMemoryRepository底层使用ConcurrentHashMap存储数据。这种实现有三大特点读写速度快直接操作内存没有磁盘I/O开销线程安全使用并发集合保证多线程环境下的数据安全临时存储数据生命周期与JVM进程绑定// 伪代码展示内存存储实现原理 public class InMemoryChatMemoryRepository implements ChatMemoryRepository { private final ConcurrentHashMapString, ListMessage storage new ConcurrentHashMap(); Override public void save(String conversationId, Message message) { storage.computeIfAbsent(conversationId, k - new ArrayList()).add(message); } }2.2 数据库持久化的优势相比之下基于MySQL的JdbcChatMemoryRepository带来了质的提升数据持久化服务器重启不影响对话记录存储容量大不受JVM内存限制历史追溯可以查询任意时间点的对话集群支持多实例应用可以共享对话记录通过实测对比两种方案的关键指标差异如下对比维度内存存储方案MySQL持久化方案数据持久性进程退出即丢失永久保存存储容量受JVM堆内存限制仅受磁盘空间限制读写性能微秒级响应毫秒级响应集群支持单实例有效多实例共享历史查询仅能访问当前会话支持全量历史检索3. 实现MySQL持久化的完整步骤3.1 环境准备与依赖配置首先需要在项目中添加必要的依赖。除了基础的Spring Boot Starter和MySQL驱动外关键是要引入spring-ai-starter-model-chat-memory-repository-jdbcdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-chat-memory-repository-jdbc/artifactId /dependency这里有个容易踩的坑版本兼容性问题。建议使用SpringAI的BOM管理依赖版本避免出现奇怪的类冲突。我在项目中是这样配置的dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement3.2 数据库表设计与初始化SpringAI要求特定的表结构来存储对话记录。建议创建一个schema-mysql.sql文件放在resources目录下CREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY ( conversation_id VARCHAR(36) NOT NULL, content TEXT NOT NULL, type VARCHAR(10) NOT NULL, timestamp TIMESTAMP NOT NULL, CONSTRAINT TYPE_CHECK CHECK (type IN (USER, ASSISTANT, SYSTEM, TOOL)) );这个表设计有几个关键点conversation_id使用UUID格式确保全局唯一content字段使用TEXT类型支持长文本存储type字段通过CHECK约束保证数据一致性在application.yml中配置自动初始化spring: ai: chat: memory: repository: jdbc: initialize-schema: always schema: classpath:schema-mysql.sql4. 核心代码实现与配置4.1 数据源配置详解MySQL连接配置是第一个容易出错的地方。以下是经过生产验证的推荐配置spring: datasource: url: jdbc:mysql://localhost:3306/spring_ai_chat?useSSLfalseuseUnicodetruecharacterEncodingUTF-8 username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 10 connection-timeout: 30000特别提醒一定要设置characterEncodingUTF-8否则中文对话内容会出现乱码。我曾经因为漏掉这个参数花了三天时间排查中文存储问题。4.2 ChatMemory的Bean配置配置类的实现非常简洁但内涵丰富Configuration RequiredArgsConstructor public class ChatConfig { private final JdbcChatMemoryRepository repository; Bean public ChatMemory chatMemory() { return MessageWindowChatMemory.builder() .chatMemoryRepository(repository) .maxMessages(50) .build(); } }这里有几个实践经验值得分享maxMessages建议设置为50-100既保证上下文完整又不会加载过多历史对于高并发场景可以添加EnableCaching提升性能考虑实现自定义的ChatMemoryRepository接口来扩展功能5. 效果验证与性能优化5.1 基础功能测试启动应用后可以通过简单三步验证功能发起新对话你好我想咨询产品问题重启应用服务器继续对话我昨天问的那个产品...如果系统能正确回忆之前的对话内容说明持久化成功。我建议使用Postman或curl脚本自动化这个测试流程。5.2 高并发场景下的优化当用户量增长时原始实现可能遇到性能瓶颈。通过JMeter测试我们发现两个优化点批量插入优化默认实现是单条插入可以重写save方法改用批量插入缓存层添加使用Caffeine缓存热点对话优化后的Repository实现示例public class OptimizedChatMemoryRepository implements ChatMemoryRepository { private final JdbcTemplate jdbcTemplate; private final CacheString, ListMessage cache; Override Transactional public void save(String conversationId, Message message) { // 批量插入逻辑 jdbcTemplate.batchUpdate( INSERT INTO SPRING_AI_CHAT_MEMORY VALUES (?,?,?,?), new BatchPreparedStatementSetter() { // 实现省略 }); // 更新缓存 cache.put(conversationId, loadMessages(conversationId)); } }6. 生产环境最佳实践6.1 数据清理策略对话数据会随时间不断增长需要制定清理策略。我推荐两种方案定时任务清理保留最近N天的数据Scheduled(cron 0 0 3 * * ?) // 每天凌晨3点执行 public void cleanupOldConversations() { jdbcTemplate.update( DELETE FROM SPRING_AI_CHAT_MEMORY WHERE timestamp ?, LocalDateTime.now().minusDays(30)); }归档策略将旧数据迁移到历史表6.2 监控与告警通过Spring Actuator添加健康检查management: endpoint: health: show-details: always endpoints: web: exposure: include: health,metrics关键监控指标包括对话记录增长速率数据库查询延迟存储空间使用率7. 扩展应用场景7.1 多模态对话存储除了文本消息现代对话系统还需要处理图片、文件等多媒体。可以通过扩展表结构实现ALTER TABLE SPRING_AI_CHAT_MEMORY ADD COLUMN media_type VARCHAR(20), ADD COLUMN media_url VARCHAR(255);7.2 跨会话分析持久化后的数据可以用于业务分析比如-- 统计最常被提及的产品 SELECT COUNT(*) as count, REGEXP_SUBSTR(content, 产品[:](\\w)) as product FROM SPRING_AI_CHAT_MEMORY WHERE type USER GROUP BY product ORDER BY count DESC;在实际项目中这类分析帮助我们发现了很多用户痛点。比如通过分析发现退货流程是被提及最多的问题我们随后优化了相关流程客户满意度提升了35%。

相关文章:

【SpringAI篇04】:从内存到MySQL,构建可重启的智能对话系统

1. 为什么需要从内存存储升级到数据库持久化 刚开始接触SpringAI开发时,很多开发者都会选择默认的内存存储方案。这种方案简单直接,不需要额外配置数据库,特别适合快速原型开发。但当你真正要把应用部署到生产环境时,就会发现内存…...

3种技术方案将ComfyUI模型下载速度提升400%:多线程加速与断点续传深度优化

3种技术方案将ComfyUI模型下载速度提升400%:多线程加速与断点续传深度优化 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 在AI创作工作流中,大模型文件的下载效率直接影响创作体验。当面对数G…...

CVAT:让计算机视觉标注效率提升80%的开源数据引擎

CVAT:让计算机视觉标注效率提升80%的开源数据引擎 【免费下载链接】cvat Annotate better with CVAT, the industry-leading data engine for machine learning. Used and trusted by teams at any scale, for data of any scale. 项目地址: https://gitcode.com/…...

Stable Yogi Leather-Dress-Collection 一键部署教程:基于Ubuntu的快速环境搭建

Stable Yogi Leather-Dress-Collection 一键部署教程:基于Ubuntu的快速环境搭建 最近在折腾AI图像生成,发现了一个挺有意思的模型叫Stable Yogi Leather-Dress-Collection。听名字就知道,它特别擅长生成皮革、连衣裙这类时尚单品的设计图。对…...

用Python和MATLAB/Simulink复现车辆二自由度模型:从理论公式到仿真验证(附代码)

从理论到实践:Python与MATLAB/Simulink实现车辆二自由度动力学仿真 在自动驾驶和车辆工程领域,理解车辆动力学模型是开发先进控制算法的基础。二自由度模型作为最简单的车辆动力学模型之一,能够有效描述车辆的侧向和横摆运动特性。本文将带您…...

OWL ADVENTURE编辑功能展示:一键换装、智能擦除,效果自然

OWL ADVENTURE编辑功能展示:一键换装、智能擦除,效果自然 1. 编辑功能概览:像玩游戏一样修图 OWL ADVENTURE的图片编辑功能让人眼前一亮。不同于传统修图软件的复杂操作,它通过自然语言指令就能完成各种编辑任务,效果…...

电子工程师如何提升专业英语能力

电子工程师的专业英语能力培养指南 1. 技术英语的重要性 1.1 行业历史背景 半导体IC产业起源于硅谷,从仙童半导体到Intel的发展历程奠定了现代电子技术的基础。编程语言从最早的机器语言发展到现代高级语言,操作系统从CP/M演进到今天的Windows、Linux和…...

CodeSys自定义HTML5控件:从零构建到工程实践

1. 为什么需要自定义HTML5控件? 在工业自动化领域,可视化监控是设备管理的重要环节。CodeSys作为主流的工业控制开发平台,其WebVisu功能虽然提供了基础控件库,但在实际项目中经常会遇到这样的尴尬:标准控件无法满足特定…...

Qwen2.5-7B LoRA微调入门:十分钟快速指南,轻松上手模型定制

Qwen2.5-7B LoRA微调入门:十分钟快速指南,轻松上手模型定制 1. 前言:为什么选择LoRA微调 在当今大模型技术快速发展的背景下,如何高效地对预训练模型进行定制化调整成为开发者面临的关键挑战。LoRA(Low-Rank Adaptat…...

从零开始:使用Deepspeed ZeRO3优化Qwen3-8B微调,解决多卡显存不足问题

从零开始:使用Deepspeed ZeRO3优化Qwen3-8B微调,解决多卡显存不足问题 当你面对一个8B参数规模的大语言模型时,单卡训练往往显得力不从心。显存不足的报错就像一堵高墙,阻挡着许多开发者的探索之路。而多卡并行训练又带来了新的挑…...

OCRmyPDF:让扫描PDF焕发新生的开源解决方案

OCRmyPDF:让扫描PDF焕发新生的开源解决方案 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF 在数字化办公的浪潮中&#xff0c…...

别再死记硬背TTS原理了!用Python+TensorFlow复现一个简易Deep Voice,从音素到语音全流程拆解

用PythonTensorFlow实战Deep Voice:从音素到语音的完整实现指南 当你第一次听到计算机生成的语音时,是否好奇过这背后的魔法是如何实现的?现代文本转语音(TTS)系统已经能够产生几乎与真人无异的语音,而Deep Voice作为早期端到端TT…...

StructBERT在代码仓库管理中的重复代码检测应用

StructBERT在代码仓库管理中的重复代码检测应用 你有没有遇到过这种情况?在代码审查时,总觉得某段代码似曾相识,但又说不清在哪见过。或者,团队里不同成员为了解决类似问题,各自写了一套逻辑相近但细节不同的代码&…...

COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型(附分步屏蔽法)

COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型 面对COMSOL多物理场耦合模型报错时,许多工程师会陷入"哪里出错—如何修复"的循环焦虑。实际上,这类问题最有效的解决方式不是盲目修改参数,而是建立系统化的调试思…...

Qwen3字幕生成工具实战:快速处理会议录音,输出带时间戳字幕

Qwen3字幕生成工具实战:快速处理会议录音,输出带时间戳字幕 1. 会议录音转字幕的痛点与解决方案 处理会议录音是许多职场人士的日常任务。传统方法需要先听录音,再手动记录内容,最后还要逐句对齐时间轴,整个过程耗时…...

Alt App Installer:打破微软商店限制的Windows应用自由安装方案

Alt App Installer:打破微软商店限制的Windows应用自由安装方案 【免费下载链接】alt-app-installer A Program To Download And Install Microsoft Store Apps Without Store 项目地址: https://gitcode.com/gh_mirrors/alt/alt-app-installer 你是否曾经因…...

太原理工大学Web开发历年真题解析:期末复习必备指南(附最新试卷)

太原理工大学Web开发核心考点深度剖析与高效复习方法论 Web开发课程期末备考的战略视角 又到了期末季,作为太原理工大学计算机相关专业的学生,面对Web开发这门实践性极强的课程,你是否还在为如何高效复习而焦虑?不同于传统理论课…...

OpenClaw自动化测试实践:GLM-4.7-Flash驱动脚本执行与结果分析

OpenClaw自动化测试实践:GLM-4.7-Flash驱动脚本执行与结果分析 1. 为什么选择OpenClaw做测试自动化? 上个月接手一个新项目时,我遇到了一个典型的技术矛盾:作为独立开发者,既需要保证代码质量,又没精力手…...

如何高效管理微信读书笔记:终极免费工具wereader完全指南

如何高效管理微信读书笔记:终极免费工具wereader完全指南 【免费下载链接】wereader 一个功能全面的微信读书笔记助手 wereader 项目地址: https://gitcode.com/gh_mirrors/we/wereader 微信读书助手wereader是一款专为微信读书用户设计的免费开源工具&#…...

Notepad4:轻量级编辑器的技术突破与实用指南

Notepad4:轻量级编辑器的技术突破与实用指南 【免费下载链接】notepad2 Notepad2-zufuliu is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming languages and…...

无线音频桥接实战指南:让传统音响实现跨设备兼容的完整方案

无线音频桥接实战指南:让传统音响实现跨设备兼容的完整方案 【免费下载链接】AirConnect Use AirPlay to stream to UPnP/Sonos & Chromecast devices 项目地址: https://gitcode.com/gh_mirrors/ai/AirConnect 🎶 从"音响孤岛"到&…...

Cat-Catch实战手册:5个场景快速掌握网页资源抓取技巧

Cat-Catch实战手册:5个场景快速掌握网页资源抓取技巧 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到这样的困境?在线课程视频无法下载、设计素材图片无法批量保…...

PingFangSC跨平台字体解决方案:企业级部署与性能优化指南

PingFangSC跨平台字体解决方案:企业级部署与性能优化指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在数字化转型浪潮中,企业…...

Umi-OCR无界面服务化启动指南:将OCR能力无缝集成到自动化工作流

Umi-OCR无界面服务化启动指南:将OCR能力无缝集成到自动化工作流 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode…...

消息队列的缓冲作用:不止于临时暂存

在分布式系统架构中,消息队列常被提及的一个核心价值是“解耦”。然而,除了降低系统间的直接依赖之外,消息队列还承担着另一个关键角色——缓冲。很多人直观地感受到“消息队列能起到缓冲效果”,但这种缓冲究竟意味着什么&#xf…...

163MusicLyrics:双平台歌词提取的终极解决方案

163MusicLyrics:双平台歌词提取的终极解决方案 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾为寻找一首心爱歌曲的完整歌词而辗转多个平台&#xf…...

PyArmor解包终极指南:3种高效逆向分析技巧快速掌握代码解密核心技术

PyArmor解包终极指南:3种高效逆向分析技巧快速掌握代码解密核心技术 【免费下载链接】PyArmor-Unpacker A deobfuscator for PyArmor. 项目地址: https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker PyArmor-Unpacker是一个专为Python开发者和安全研究人员…...

DASD-4B-Thinking效果对比:在HumanEval代码生成任务中超越Qwen2.5-7B

DASD-4B-Thinking效果对比:在HumanEval代码生成任务中超越Qwen2.5-7B 1. 为什么这个40亿参数模型值得关注? 你可能已经用过不少大模型,但有没有遇到过这种情况:写一段Python函数时,模型直接给出答案,却跳…...

【图灵完备(Turing Complete)】五、从逻辑门到LEG:指令集与条件跳转的构建

1. 从逻辑门到处理器:LEG架构的诞生之路 记得我第一次用面包板搭建简单逻辑电路时,连个LED灯闪烁都要折腾半天。而现在我们要做的,是把这些基础逻辑门像乐高积木一样拼接成真正的处理器核心。LEG架构的设计初衷就是要解决原始图灵机指令宽度受…...

建筑工地AI监控避坑指南:YOLOv11+PyQt5开发中的7个常见错误

建筑工地AI监控避坑指南:YOLOv11PyQt5开发中的7个常见错误 在建筑工地安全监控领域,AI技术的应用正从概念验证走向规模化落地。YOLOv11作为目标检测领域的新锐算法,配合PyQt5的灵活界面开发能力,确实能构建出高效的安全预警系统。…...