news 2026/3/2 11:24:25

Spring AI Alibaba 对话记忆丢失问题:Redis 缓存过期后如何恢复 AI 上下文

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI Alibaba 对话记忆丢失问题:Redis 缓存过期后如何恢复 AI 上下文

Spring AI Alibaba 对话记忆丢失问题:Redis 缓存过期后如何恢复 AI 上下文

🤔 问题背景

在开发基于 Spring AI Alibaba 的聊天应用时,遇到了一个令人困惑的问题:

当 Redis 缓存过期后,虽然能从数据库重新加载历史对话记录,但 AI 却"失忆"了——它完全不记得之前的对话内容!

用户访问历史对话时能看到完整的聊天记录,但当继续提问时,AI 的回答就像第一次见面一样,完全没有上下文。这是怎么回事呢?

🔍 问题分析

经过代码审查,我发现了问题的根源:系统中存在两套独立的存储机制,它们之间没有同步!

第一套:消息缓存系统

// 在 AiChatMessageServiceImpl 中privatestaticfinalStringCHAT_HISTORY_KEY="chat:history:";publicList<AiChatMessage>getMessagesFromRedis(LongsessionId){Stringkey=CHAT_HISTORY_KEY+sessionId;Stringjson=stringRedisTemplate.opsForValue().get(key);// ... 用于前端展示的聊天记录}

作用:缓存聊天记录,供前端页面展示历史消息。

第二套:AI 记忆系统

// Spring AI 框架内部使用RedisChatMemoryRepositorychatMemoryRepository;ChatMemorychatMemory;

作用:为 ChatClient 提供对话上下文,让 AI 能记住之前的对话。

问题本质

这两套系统完全独立

┌─────────────────────────┐ ┌──────────────────────────┐ │ 消息缓存系统 │ │ AI 记忆系统 │ │ │ │ │ │ chat:history:{id} │ ✗ │ Spring AI Memory Store │ │ (供前端展示) │ │ (供 AI 推理使用) │ └─────────────────────────┘ └──────────────────────────┘ ↑ ↑ │ │ 从数据库恢复 未恢复!

当 Redis 过期后,我们只恢复了消息缓存系统,但AI 记忆系统仍然是空的,所以 AI 失去了记忆!

💡 解决方案

核心思路:在从数据库加载历史消息时,同时恢复两套系统的数据

方案架构

数据库历史消息 │ ├──> 恢复到消息缓存系统 (chat:history:{id}) │ └──> 恢复到 AI 记忆系统 (ChatMemory)

🛠️ 完整实现

步骤 1:配置 ChatMemory Bean

首先需要将ChatMemory暴露为 Spring Bean,以便其他服务可以注入使用。

@ConfigurationpublicclassAiConfig{/** * 配置 ChatMemory Bean,供其他服务注入 */@BeanpublicChatMemorychatMemory(RedisChatMemoryRepositorychatMemoryRepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).build();}@BeanpublicChatClientchatClient(ChatClient.Builderbuilder,ChatMemorychatMemory){returnbuilder.defaultSystem(AiPrompts.GENERAL_ASSISTANT).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}}

步骤 2:修改消息服务,添加记忆恢复逻辑

@Service@Slf4jpublicclassAiChatMessageServiceImplextendsServiceImpl<AiChatMessageMapper,AiChatMessage>implementsIAiChatMessageService{@ResourceprivateStringRedisTemplatestringRedisTemplate;@ResourceprivateObjectMapperobjectMapper;// ✅ 注入 ChatMemory@ResourceprivateChatMemorychatMemory;/** * 获取会话消息(核心方法) */publicList<AiChatMessage>getSessionMessages(LongsessionId){// 1. 先尝试从 Redis 获取List<AiChatMessage>messages=getMessagesFromRedis(sessionId);// 2. 如果 Redis 没有,从数据库加载if(messages==null){messages=getMessagesFromDB(sessionId);if(!messages.isEmpty()){// 3. 同时恢复两套系统cacheToRedis(sessionId,messages);// 恢复消息缓存restoreAiMemory(sessionId,messages);// 恢复 AI 记忆}}returnmessages!=null?messages:newArrayList<>();}/** * 恢复 AI 记忆系统 */privatevoidrestoreAiMemory(LongsessionId,List<AiChatMessage>messages){try{StringconversationId=String.valueOf(sessionId);// 将数据库消息转换为 Spring AI 的 Message 格式List<Message>aiMessages=messages.stream().map(msg->{if(msg.getMessageType()==1){returnnewUserMessage(msg.getContent());}else{returnnewAssistantMessage(msg.getContent());}}).collect(Collectors.toList());// 清空旧记忆chatMemory.clear(conversationId);// 添加历史消息到 AI 记忆chatMemory.add(conversationId,aiMessages);log.info("✅ 恢复会话 {} 的AI记忆,共 {} 条消息",sessionId,aiMessages.size());}catch(Exceptione){log.error("❌ 恢复AI记忆失败 - 会话ID: {}",sessionId,e);}}/** * 删除会话时,同时清理两套系统 */publicbooleandeleteSessionMessages(LongsessionId,LonguserId){booleanremoved=remove(/* 数据库删除逻辑 */);if(removed){// 删除消息缓存stringRedisTemplate.delete(CHAT_HISTORY_KEY+sessionId);// 清空 AI 记忆clearAiMemory(sessionId);}returnremoved;}privatevoidclearAiMemory(LongsessionId){try{chatMemory.clear(String.valueOf(sessionId));log.info("✅ 清空会话 {} 的AI记忆",sessionId);}catch(Exceptione){log.error("❌ 清空AI记忆失败",e);}}}

🎯 关键要点

1. 消息格式转换

数据库的消息需要正确转换为 Spring AI 的格式:

// 用户消息newUserMessage(content)// AI 助手消息newAssistantMessage(content)

2. 会话 ID 一致性

确保两套系统使用相同的会话标识:

StringconversationId=String.valueOf(sessionId);

3. 异常处理

AI 记忆恢复失败不应影响主流程:

try{restoreAiMemory(sessionId,messages);}catch(Exceptione){log.error("恢复失败,但不影响消息加载",e);}

🧪 测试验证

测试场景 1:正常对话流程

# 发起对话curl"http://localhost:8080/ai/chatStream?message=我叫张三&sessionId=123"# AI: 你好张三,很高兴认识你!# 继续对话curl"http://localhost:8080/ai/chatStream?message=我叫什么名字&sessionId=123"# AI: 你叫张三

测试场景 2:Redis 过期后恢复

# 1. 模拟 Redis 过期redis-cli DEL"chat:history:123"# 2. 获取历史消息(触发恢复)curl"http://localhost:8080/ai/messages/123"# 3. 继续对话,AI 应该记得之前的内容curl"http://localhost:8080/ai/chatStream?message=我叫什么名字&sessionId=123"# AI: 你叫张三(记忆恢复成功!)

📊 效果对比

修复前

用户: 我叫张三 AI: 你好张三! [Redis 过期] 用户: 我叫什么名字? AI: 抱歉,我不知道你的名字 ❌

修复后

用户: 我叫张三 AI: 你好张三! [Redis 过期 + 自动恢复] 用户: 我叫什么名字? AI: 你叫张三 ✅

🎓 经验总结

1. 理解框架的存储机制

Spring AI 有自己的记忆管理系统,不能简单地认为"消息在数据库就够了"。

2. 统一数据同步点

在数据恢复的关键节点(如从数据库加载),同时处理所有相关系统的状态恢复。

3. 保持状态一致性

// 保存时saveToDatabase();syncToRedis();syncToAiMemory();// 删除时deleteFromDatabase();deleteFromRedis();deleteFromAiMemory();

4. 优雅降级

即使 AI 记忆恢复失败,也不影响用户查看历史消息的基本功能。


如果觉得有帮助,欢迎点赞收藏!有问题欢迎评论区交流~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 15:46:42

CompTIA CV0-004 Cloud+ 認證考試完整介紹

CompTIA Cloud&#xff08;CV0-004&#xff09; 是一項全球認可的中階雲端技術認證&#xff0c;專為負責雲端基礎架構部署、管理與維運的 IT 專業人員所設計。此認證聚焦於多雲與混合雲環境&#xff0c;強調實務導向能力&#xff0c;不同於只偏重理論的雲端證照&#xff0c;Clo…

作者头像 李华
网站建设 2026/3/1 12:09:15

PyTorch安装避坑指南 + vLLM性能调优技巧

PyTorch安装避坑指南 vLLM性能调优技巧 在大模型落地加速的今天&#xff0c;很多团队都面临着一个尴尬的局面&#xff1a;模型能力足够强&#xff0c;API 一上线就崩。不是显存爆了&#xff0c;就是吞吐上不去——明明用的是 A100 集群&#xff0c;QPS 还不如一台老款 T4。问…

作者头像 李华
网站建设 2026/3/1 22:31:35

AutoGPT与Metabase Plus集成:增强版报表自动化

AutoGPT与Metabase Plus集成&#xff1a;增强版报表自动化 在企业数据爆炸式增长的今天&#xff0c;传统的“人查系统”模式正面临前所未有的挑战。分析师每天被淹没在重复性的日报、周报和临时查询中&#xff0c;而业务决策却常常滞后于市场变化。一个典型的场景是&#xff1a…

作者头像 李华
网站建设 2026/2/27 11:04:08

PyTorch安装后如何加载Qwen3-VL-8B进行多模态推理

PyTorch安装后如何加载Qwen3-VL-8B进行多模态推理 在智能应用日益依赖“看图说话”能力的今天&#xff0c;多模态大模型正成为连接视觉与语言的核心桥梁。无论是电商平台自动识别商品属性&#xff0c;还是客服系统理解用户上传的截图问题&#xff0c;背后都离不开像 Qwen3-VL-8…

作者头像 李华
网站建设 2026/3/2 9:36:23

【收藏必看】2025大模型技术岗位全景图:15大方向详解,助你成为AI人才

本文详细介绍了15个大模型相关技术岗位的招聘信息&#xff0c;涵盖推理优化、框架研发、训练加速、多模态研究等多个方向。各岗位明确了职责要求和技能门槛&#xff0c;包括编程语言、框架经验、并行计算等核心技术能力&#xff0c;为有志于进入大模型领域的开发者提供全面的职…

作者头像 李华
网站建设 2026/2/26 22:55:37

LobeChat支持GraphQL接口吗?API扩展能力分析

LobeChat 的 API 扩展之路&#xff1a;GraphQL 是否可行&#xff1f; 在构建现代 AI 聊天应用时&#xff0c;开发者越来越关注系统的可扩展性与前后端协作效率。LobeChat 作为一款基于 Next.js 的开源大语言模型&#xff08;LLM&#xff09;交互门户&#xff0c;凭借其优雅的 U…

作者头像 李华