SpringAI聊天记忆持久化:MySQL+向量存储RedisStack与RAG实践
几个核心判断先行:这个基于 Spring AI 框架开发的智能聊天系统,远不止一个 Demo,而是将 RAG(检索增强生成)、向量数据库、聊天记忆持久化、流式输出以及工具调用等生产级关键模块完整串联起来。整个项目的技术栈选型逻辑清晰,底层以 Spring Boot 3.x 和 Java 17 为骨架,上层 AI 交互统一由 Spring AI 框架治理。
接下来,从后端核心技术栈切入,逐层拆解整个系统的设计逻辑。
后端核心技术
1. 框架与基础设施
- Spring Boot 3.x:无可争议的主框架,充当项目的基础设施。
- Spring AI:核心角色,负责将AI能力无缝融入Spring生态。
- Java 17:开发语言的基础版本,兼具稳定性与现代化特性。
- Maven:项目管理和构建工具,标准配置。
2. AI 相关技术
- Spring AI ChatClient:AI聊天的核心客户端。
- OpenAI 兼容 API:意味着不绑定单一模型,通义千问、DeepSeek 等均可灵活接入。
- RAG (检索增强生成):确保模型回答时能“翻阅知识库查证”,而非依赖幻觉。
- Vector Store (Redis):知识库存储方案,利用 Redis 的向量能力。
- MCP (模型上下文协议):标准化模型与外部工具的交互方式。
3. 数据存储
- MySQL 8.0:关系型数据库,存储结构化数据,如聊天记录与用户信息。
- Redis Stack:同时扮演向量数据库和缓存角色。
- MyBatis Plus:ORM 框架,简化数据库操作。
- Druid:数据库连接池,兼顾性能与监控。
4. 工具集成
- 百度地图 API:提供地理位置和天气查询能力。
- Hutool:Java 通用工具库,大幅提升编码效率。
- Lombok:减少样板代码,使代码更简洁。
系统架构
核心组件
1. 聊天控制器(RagController)
这是系统的入口,一个标准的 REST 控制器。它协调流式响应、RAG 知识库检索、聊天记忆管理和工具调用。简单理解,它就是 AI 功能的中央调度室。
2. 聊天记忆存储(MySQLChatMemory)
实现思路非常务实:继承 ChatMemory 接口,将对话历史持久化到 MySQL。核心好处是用户离线后历史记录不丢失,下次回来可继续对话。同时支持多会话隔离,不同用户的对话相互独立存储。
3. LLM 配置(LLMConfig)
配置类,目的是让系统能同时接入并切换不同 AI 模型,例如 DeepSeek V3 和通义千问的 Plus/Max 版本。这种“模型工厂”设计为后续模型升级与切换提供了极大灵活性。
核心实现原理
1. RAG 实现流程
用户提问后,流程如下:将问题向量化,到 Redis 向量数据库中检索最相关的知识片段;将这些片段拼接进提示词,形成“查过资料”的问题;大语言模型基于增强后的信息生成回答,并通过流式方式返回。核心代码紧凑,几行代码便串联起记忆、RAG 检索和工具调用。
2. 聊天记忆机制
记忆存储在 chat_message 表中,核心字段包括 conversation_id(会话 ID)、role(用户或 AI)和 context(聊天内容)。每个会话独立存储,系统自动限制每条会话的历史记录上限(20条),避免上下文过长造成模型偏
3. 向量数据库集成
Redis Stack 配置相对简洁,核心是开启 schema 自动初始化并指定索引名称。它自动将文档转为向量,并在检索时进行相似度匹配。得益于 Redis 的高性能,向量检索速度有保障。
4. 工具调用系统
采用 MCP 协议集成百度地图。通过配置 mcp-server.json,系统能调用本地 Node.js 命令执行百度地图 API。当前支持的工具有天气查询、位置服务和路线规划。该架构设计意味着可按相同方式接入任何其他外部工具。
API 接口设计
主要接口
1. RAG 聊天接口
GET /exam/rag4aiops/{question}/{sessionID}
该接口接收用户问题(需 URL 编码)和会话 ID。返回方式使用 Server-Sent Events 流式响应,用户无需等待完整回答生成,模型每“思考”一步,答案即实时推送至前端,体验极佳。
2. 简单聊天接口
GET /exam/mcp?msg={message}
轻量级接口,不携带记忆,适用于“问完即忘”的单次查询场景。
部署配置
环境要求
基础环境:Java 17+、Maven 3.6+、MySQL 8.0+ 和 Redis Stack 7.0+。AI 服务需要通义千问的 API Key,以及可选的百度地图 API Key。
启动步骤
分三步:首先,在 MySQL 中创建数据库并建好 chat_message 表;其次,通过 Docker 启动 Redis Stack 服务,映射端口 6381;最后,执行 mvn spring-boot:run 一键启动应用。
性能优化
流式响应方面,利用 Reactor 响应式编程能力支持背压处理,有效降低内存占用。向量检索方面,通过优化 Redis 索引和批量检索策略提升速度。聊天记忆方面,除限制历史记录数量外,还采用异步写入和定期清理过期数据策略,防止数据库过度膨胀。
