做AI应用开发快两年,踩过最大的坑之一就是长对话上下文管理——刚做第一个智能客服项目时,直接用Spring AI默认的InMemoryChatMemory,前几轮聊得好好的,超过10轮之后,AI开始答非所问,token价格直接翻了三倍,服务器内存还一路涨,差点OOM。
后来翻了不少生产级方案,终于折腾出一套稳定能用的「智能记忆摘要 + 自动遗忘机制」,现在跑了快半年,支撑日均几万条对话,稳得一批。今天把整个实现过程拆解出来,代码都贴出来,你拿去就能用。
为什么默认的Spring AI记忆不行?
Spring AI官方提供的默认记忆方案,本质就是:把所有对话全存下来,每次全塞给大模型。
这种方案在测试环境跑个三五轮没问题,生产环境一用就暴雷:
Token爆炸:15轮对话token轻松破3000,OpenAI API成本直接翻倍,国内大模型按token收费也扛不住
AI跑偏:旧的无关内容、闲聊、错误回答都留在上下文里,大模型很容易被带偏,回答准确率直线下降
内存泄漏风险:默认存在JVM内存里,不手动清理的话,服务跑一个月,内存一路涨,早晚出问题
我们需要的记忆方案,核心要解决三个问题:
✅ 关键信息不丢
✅ 上下文长度可控
✅ 不重要内容自动删掉
方案设计思路
核心思路其实很简单,就是「分层处理+动态淘汰」:
最新N轮对话保留完整内容:保证当前对话流畅性
更早的对话自动压缩成摘要:用大模型把三五轮对话压缩成一两百字核心信息,保留关键,砍掉废话
权重打分+自动遗忘:给每一条记忆打重要性权重,总长度超阈值就把权重最低、时间最久的内容删掉
持久化存储:存在Redis里,重启不丢,多实例共享,还不占JVM内存
完整代码实现
第一步:pom依赖引入
第二步:定义记忆节点数据结构
我们给每一段记忆加上类型、权重、创建时间,方便后续筛选遗忘:
第三步:核心组件 - 智能记忆管理器
实现自动摘要、自动遗忘的核心逻辑:
第四步:封装对话服务,整合智能记忆
生产环境调优经验
我在生产环境跑了大半年,总结了几个调优关键点:
1. 权重怎么设比较合理?
用户问题默认权重:6分(比AI回答高,用户需求更重要)
AI回答默认权重:5分
如果识别到内容包含用户个人信息、过敏史、偏好、手机号、地址,手动把权重提到8-10分,这类内容永远不会被遗忘
如果是闲聊、测试内容,权重降到2分,很快就会被自动删掉
示例代码,识别关键信息自动提权重:
2. 阈值怎么调?

3. 一定要加定时清理
加上定时任务,每天凌晨自动清理超过7天不活跃的会话,节省Redis空间:
4. Token计算更精准
上面我们用字符数估算token,想要更精准可以用Spring AI自带的token估算器:
优化效果对比
我拿30轮连续对话做了测试,对比下来提升非常明显:

token直接砍了一半多,准确率还提升了20个点,省钱效果立竿见影。
总结
很多朋友做AI应用,总想着把所有信息都给AI,觉得信息越多越好,其实不对——没用的信息越多,AI越容易出错,成本还越高。
给AI加上记忆管理,就像人一样,该记住的记住,该忘的就忘,才会越用越顺。这套方案是我在生产环境打磨出来的,没有复杂依赖,基于Spring AI原生改造,改改参数就能直接用在你的项目里。
本文代码已验证基于Spring AI 1.0.0-M2版本,不同版本API略有差异,调整一下就能用。
下期预告:Spring AI整合Milvus向量数据库,实现千万级向量存储实战。