哪一个军事网站做的比较好上海小学网站建设招标
2026/1/2 7:35:12 网站建设 项目流程
哪一个军事网站做的比较好,上海小学网站建设招标,网站的可用性,网站文章排版的重要性Spring AI Alibaba 对话记忆丢失问题#xff1a;Redis 缓存过期后如何恢复 AI 上下文 #x1f914; 问题背景在开发基于 Spring AI Alibaba 的聊天应用时#xff0c;遇到了一个令人困惑的问题#xff1a; 当 Redis 缓存过期后#xff0c;虽然能从数据库重新加载历史对话记…Spring AI Alibaba 对话记忆丢失问题Redis 缓存过期后如何恢复 AI 上下文 问题背景在开发基于 Spring AI Alibaba 的聊天应用时遇到了一个令人困惑的问题当 Redis 缓存过期后虽然能从数据库重新加载历史对话记录但 AI 却失忆了——它完全不记得之前的对话内容用户访问历史对话时能看到完整的聊天记录但当继续提问时AI 的回答就像第一次见面一样完全没有上下文。这是怎么回事呢 问题分析经过代码审查我发现了问题的根源系统中存在两套独立的存储机制它们之间没有同步第一套消息缓存系统// 在 AiChatMessageServiceImpl 中privatestaticfinalStringCHAT_HISTORY_KEYchat:history:;publicListAiChatMessagegetMessagesFromRedis(LongsessionId){StringkeyCHAT_HISTORY_KEYsessionId;StringjsonstringRedisTemplate.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修改消息服务添加记忆恢复逻辑ServiceSlf4jpublicclassAiChatMessageServiceImplextendsServiceImplAiChatMessageMapper,AiChatMessageimplementsIAiChatMessageService{ResourceprivateStringRedisTemplatestringRedisTemplate;ResourceprivateObjectMapperobjectMapper;// ✅ 注入 ChatMemoryResourceprivateChatMemorychatMemory;/** * 获取会话消息核心方法 */publicListAiChatMessagegetSessionMessages(LongsessionId){// 1. 先尝试从 Redis 获取ListAiChatMessagemessagesgetMessagesFromRedis(sessionId);// 2. 如果 Redis 没有从数据库加载if(messagesnull){messagesgetMessagesFromDB(sessionId);if(!messages.isEmpty()){// 3. 同时恢复两套系统cacheToRedis(sessionId,messages);// 恢复消息缓存restoreAiMemory(sessionId,messages);// 恢复 AI 记忆}}returnmessages!null?messages:newArrayList();}/** * 恢复 AI 记忆系统 */privatevoidrestoreAiMemory(LongsessionId,ListAiChatMessagemessages){try{StringconversationIdString.valueOf(sessionId);// 将数据库消息转换为 Spring AI 的 Message 格式ListMessageaiMessagesmessages.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){booleanremovedremove(/* 数据库删除逻辑 */);if(removed){// 删除消息缓存stringRedisTemplate.delete(CHAT_HISTORY_KEYsessionId);// 清空 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 一致性确保两套系统使用相同的会话标识StringconversationIdString.valueOf(sessionId);3. 异常处理AI 记忆恢复失败不应影响主流程try{restoreAiMemory(sessionId,messages);}catch(Exceptione){log.error(恢复失败但不影响消息加载,e);} 测试验证测试场景 1正常对话流程# 发起对话curlhttp://localhost:8080/ai/chatStream?message我叫张三sessionId123# AI: 你好张三很高兴认识你# 继续对话curlhttp://localhost:8080/ai/chatStream?message我叫什么名字sessionId123# AI: 你叫张三测试场景 2Redis 过期后恢复# 1. 模拟 Redis 过期redis-cli DELchat:history:123# 2. 获取历史消息触发恢复curlhttp://localhost:8080/ai/messages/123# 3. 继续对话AI 应该记得之前的内容curlhttp://localhost:8080/ai/chatStream?message我叫什么名字sessionId123# AI: 你叫张三记忆恢复成功 效果对比修复前用户: 我叫张三 AI: 你好张三 [Redis 过期] 用户: 我叫什么名字 AI: 抱歉我不知道你的名字 ❌修复后用户: 我叫张三 AI: 你好张三 [Redis 过期 自动恢复] 用户: 我叫什么名字 AI: 你叫张三 ✅ 经验总结1. 理解框架的存储机制Spring AI 有自己的记忆管理系统不能简单地认为消息在数据库就够了。2. 统一数据同步点在数据恢复的关键节点如从数据库加载同时处理所有相关系统的状态恢复。3. 保持状态一致性// 保存时saveToDatabase();syncToRedis();syncToAiMemory();// 删除时deleteFromDatabase();deleteFromRedis();deleteFromAiMemory();4. 优雅降级即使 AI 记忆恢复失败也不影响用户查看历史消息的基本功能。如果觉得有帮助欢迎点赞收藏有问题欢迎评论区交流~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询