�� Spring AI 商用Agent 系列专栏(续篇)
在上一篇文章中,我们基于 JdbcChatMemory 实现了对话记忆持久化,解决了服务重启、会话刷新导致的AI失忆问题,完成了Spring AI Agent记忆能力的基础商用落地。
但在长会话、高频交互的生产场景下,单纯的持久化记忆存在致命缺陷:对话轮次无限累积,上下文持续膨胀,引发Token成本飙升、接口响应超时、大模型推理精度下降。
Spring AI 原生提供的 MessageWindowChatMemory 仅支持固定条数滑动窗口,超出阈值直接物理删除历史消息,极易丢失用户核心需求、业务配置、个性化偏好等关键数据,无法满足长周期智能对话需求。
本文将基于 Spring AI 1.0 官方原生能力,完整落地 智能记忆摘要 + 自动遗忘机制,通过「短期窗口留存+LLM智能压缩+过期数据自动清理」的分层记忆架构,在保证对话连贯性与核心信息不丢失的前提下,根治上下文爆炸问题,实现生产级低成本、高可用AI记忆能力。
一、原生滑动窗口记忆核心缺陷
Spring AI 内置滑动窗口记忆机制逻辑简单粗暴:设置固定最大消息条数,超出阈值后直接淘汰最早的对话消息。该机制仅适用于测试场景,生产落地存在两大硬伤:
- 关键信息不可逆丢失:用户长期业务设定、个人参数、核心需求会被新对话逐步挤出上下文,出现阶段性失忆
- 无效资源持续浪费:闲聊、重复提问、无效交互占用大量上下文窗口,有效信息占比极低,导致Token资源严重冗余
- 服务稳定性不可控:上下文越长,大模型推理耗时越高,极易触发接口超时、线程阻塞等线上问题
因此,企业级AI Agent必须摒弃"硬删除"逻辑,实现智能取舍记忆:冗余对话智能压缩、核心信息永久留存、无效数据自动淘汰。
二、分层智能记忆架构设计
本次落地拟人化双层记忆架构,兼顾实时交互体验与长期记忆完整性,完全适配商用长会话场景:
2.1 短期鲜活记忆层
保留最近5轮原始对话消息,完整还原实时交互上下文,避免过度压缩导致对话断层、回答生硬,保障用户即时聊天体验。
2.2 LLM智能摘要层
当对话轮次达到阈值后,自动触发LLM摘要,提炼历史对话核心信息(用户偏好、业务需求、关键数据),替换冗余原始对话,实现"瘦身不丢重点"。
2.3 全自动遗忘层
结合数据库TTL过期策略+定时清理任务,自动标记、物理删除过期会话数据,杜绝数据库数据堆积,降低运维压力。
三、项目依赖与基础配置
3.1 Maven核心依赖
复用持久化记忆核心依赖,新增定时任务依赖用于自动遗忘清理,无第三方冗余组件:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| xml <!-- Spring AI JDBC 对话持久化核心依赖 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-chat-memory-jdbc</artifactId> <version>1.0.0</version> </dependency> <!-- MySQL数据库驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- 定时任务框架(过期记忆自动清理必备) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> |
3.2 全局YAML配置
配置数据库连接与记忆TTL过期策略,从源头控制无效数据生命周期:
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| yaml spring: datasource: url: jdbc:mysql://127.0.0.1:3306/spring_ai_memory?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 你的数据库密码 ai: chat: memory: jdbc: # 项目启动自动初始化记忆数据表 initialize-schema: true # 自定义数据表前缀,区分业务表 table-prefix: ai_chat_ # 会话记忆TTL:登录用户7天有效期,超时自动标记失效 time-to-live: 7d |
四、核心功能实战开发
4.1 智能记忆摘要核心配置类
基于MessageWindowChatMemory 原生扩展,重写消息淘汰逻辑,将传统"硬删除"优化为"LLM智能压缩",平衡上下文长度与记忆完整性:
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| java import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.memory.JdbcChatMemoryRepository; import org.springframework.ai.chat.memory.MessageWindowChatMemory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.Message; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; import java.util.stream.Collectors; /** * 智能记忆摘要配置类 * 核心能力:滑动窗口留存 + LLM智能摘要 + 冗余信息过滤 * 解决:上下文爆炸、关键信息丢失、Token资源浪费问题 * * @author CSDN-技术博主 * @date 2026 */ @Configuration public class SmartMemorySummaryConfig { private final ChatClient chatClient; public SmartMemorySummaryConfig(ChatClient.Builder builder) { this.chatClient = builder.build(); } /** * 构建生产级智能记忆Bean * maxMessages:保留最近5轮原始对话,保障实时对话连贯性 * onMessagesEvicted:消息淘汰后置钩子,触发智能摘要压缩 */ @Bean public ChatMemory smartChatMemory(JdbcChatMemoryRepository repository) { return MessageWindowChatMemory.builder() .chatMemoryRepository(repository) .maxMessages(5) .onMessagesEvicted(this::autoSummaryConversation) .build(); } /** * 超长对话智能摘要生成 * 仅提炼核心业务信息,过滤无效闲聊、重复内容 */ private void autoSummaryConversation(List<Message> messages) { // 阈值控制:15轮对话触发压缩,平衡LLM调用成本与记忆完整性 if (messages.size() < 15) { return; } // 拼接历史对话文本 String conversationContent = messages.stream() .map(Message::getContent) .collect(Collectors.joining("\n")); // LLM智能提炼核心记忆 String summary = chatClient.prompt() .user("精简以下对话内容,仅保留用户核心需求、个人数据、业务配置、技术偏好,删除无意义闲聊,摘要控制在200字以内:\n" + conversationContent) .call() .getContent(); // 生产优化:可将摘要独立入库,与原始对话物理隔离 System.out.println("智能记忆更新 对话核心摘要:" + summary); } } |
4.2 自动遗忘定时任务
TTL策略仅标记数据过期,不会物理删除,长期运行会导致数据表数据堆积。通过定时任务每日清理过期数据,彻底释放存储资源:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| java import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.ai.chat.memory.JdbcChatMemoryRepository; import org.springframework.stereotype.Component; /** * 过期记忆自动清理任务 * 实现AI记忆全自动遗忘,保障数据库长期稳定运行 */ @Slf4j @Component @EnableScheduling public class MemoryAutoCleanTask { private final JdbcChatMemoryRepository repository; public MemoryAutoCleanTask(JdbcChatMemoryRepository repository) { this.repository = repository; } /** * 每日凌晨2点执行,业务低峰期清理过期数据 * 物理删除所有TTL过期的会话记忆 */ @Scheduled(cron = "0 0 2 * * ?") public void cleanExpiredChatMemory() { try { repository.deleteAllExpired(); log.info("【AI记忆运维】过期会话记忆清理完成,数据库资源已优化"); } catch (Exception e) { log.error("【AI记忆运维】过期记忆清理异常", e); } } } |
4.3 智能记忆Agent接口整合
零侵入整合原有对话业务,自动挂载智能记忆能力,无需修改原有业务逻辑,无缝迭代升级:
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| java 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.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * 智能记忆Agent对话接口 * 融合:持久化记忆 + 智能摘要 + 自动遗忘能力 */ @RestController public class SmartMemoryAgentController { private final ChatClient chatClient; private final ChatMemory smartChatMemory; public SmartMemoryAgentController(ChatClient.Builder builder, ChatMemory smartChatMemory) { this.chatClient = builder.build(); this.smartChatMemory = smartChatMemory; } /** * 智能记忆Agent系统提示词 * 适配摘要记忆逻辑,优先采信核心记忆,忽略无效闲聊 */ private final String systemPrompt = """ 你是具备智能记忆能力的企业级AI助手,可自动留存用户核心信息、压缩冗余对话、遗忘无效内容。 回答问题时结合历史核心摘要记忆与当前实时对话,逻辑连贯、重点突出,忽略无意义闲聊信息。 """; /** * 多会话隔离对话接口 * @param sessionId 会话唯一标识,实现多用户数据隔离 * @param question 用户提问 * @return AI推理结果 */ @GetMapping("/agent/smart/chat") public String smartChat(@RequestParam String sessionId, @RequestParam String question) { return chatClient.prompt() .system(systemPrompt) .user(question) // 绑定会话ID,严格隔离不同用户记忆数据 .advisors(advisorSpec -> advisorSpec .param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID, sessionId)) .call() .getContent(); } } |
五、功能验证与效果分析
5.1 测试流程
- 连续发起20轮混合对话,包含用户核心数据、业务需求、日常闲聊、重复提问
- 观察日志,系统自动触发LLM摘要,提炼有效信息、过滤冗余内容
- 重启服务,复用同一sessionId接续提问,验证核心记忆留存效果
- 等待TTL过期,验证定时任务数据清理能力
5.2 效果对比
- 原生滑动窗口:超出阈值直接删除历史,核心用户信息丢失,上下文资源浪费严重
- 智能摘要记忆:自动压缩冗余对话,核心信息永久留存,Token消耗降低70%以上,对话连贯无断层
六、生产环境核心避坑指南
结合线上落地经验,总结4条生产规范,规避线上稳定性与成本问题:
- 合理设置摘要触发阈值:建议15轮对话触发压缩,阈值过低会频繁调用LLM增加成本,过高无法解决上下文膨胀问题
- 保留适量实时对话:固定留存5轮最新原始对话,避免过度压缩导致实时对话逻辑断层、回答生硬
- 精细化TTL时效配置:登录业务用户配置7-30天长时效记忆,游客临时会话配置1小时短时记忆,平衡用户体验与存储成本
- 摘要独立持久化存储:建议新建独立摘要数据表,与原始聊天记录物理隔离,方便问题溯源、数据统计与运维清理
七、架构迭代总结
至此,Spring AI Agent记忆体系完成第二次核心升级:从单纯的内存/数据库持久化记忆 ,升级为分层智能记忆架构。彻底解决了传统记忆机制上下文爆炸、成本失控、关键信息丢失、运维繁琐等生产痛点,实现了性能、成本、用户体验的三重平衡。
本方案基于Spring AI官方原生API实现,无侵入、无第三方冗余依赖,兼容性强,可直接落地企业生产环境。
八、下期预告
专栏终极收官篇:Spring AI 向量长期记忆与对话记忆融合实战,突破窗口记忆限制,实现AI超长期语义记忆,精准召回数月前的历史对话与业务数据,打造完全拟人化商用智能Agent。