记忆管理三板斧:窗口、摘要与混合策略
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇咱们从一个多轮对话失败的场景切入,讲清楚了 Agent 为什么需要记忆——大模型没有持久记忆,它的记忆完全取决于你在 messages 数组里放了什么。然后用 ChatMemory 接口和 InMemoryChatMemory 给 TinyAgent 装上了最基础的短期记忆,让它在同一个会话里能记住之前聊过的内容。
但上一篇的结尾也埋了一个问题:InMemoryChatMemory 只追加、不删减。用户聊 5 轮没事,聊 20 轮历史消息就开始膨胀,Token 预算被大量无关的历史信息占据,Agent 能做有用工作的空间越来越小。
这一篇,咱们正式动手解决这个问题——实现三种记忆管理策略:滑动窗口、摘要压缩、混合策略,让记忆可控、可配、不爆预算。
本项目中具体代码已上传 GitHub TinyAgent,大家 Clone 项目后,将代码分支切换到 1.6.x,默认主分支是最新代码。运行前复制
.env.example为.env,把自己的 API Key 填进去,默认阿里云百炼平台;.env已加入.gitignore,切分支时不会丢。
记忆膨胀到底有多严重
先用比特严选的实际场景算一笔账。
假设一个用户打开客服窗口,连续咨询了几个问题:
第 1 轮:帮我查一下订单 88231 的物流
第 2 轮:那我要退款呢,这个扫地机不回充了
第 3 轮:退款多久到账?
第 4 轮:你们有没有新款扫地机推荐一下
第 5 轮:S20 Pro 和 S20 Max 有什么区别
第 6 轮:S20 Pro 现在有活动吗
第 7 轮:帮我下个单吧
每轮对话产生的消息包括用户输入和 Agent 回复。保守估计,每轮平均 400-600 个 Token(用户输入约 50 Token,Agent 回复约 200-400 Token,工具调用结果如果也存到记忆里还要更多)。
| 轮次 | 单轮 Token(估) | 累计历史 Token | 占 8000 预算比例 |
|---|---|---|---|
| 第 1 轮 | 500 | 500 | 6% |
| 第 3 轮 | 500 | 1,500 | 19% |
| 第 5 轮 | 500 | 2,500 | 31% |
| 第 7 轮 | 500 | 3,500 | 44% |
| 第 10 轮 | 500 | 5,000 | 63% |
| 第 15 轮 | 500 | 7,500 | 94% |
到第 15 轮,光历史消息就吃掉了 94% 的 Token 预算。再加上系统提示词(约 200 Token)和当前轮次的工具调用,Token 预算直接爆掉——TokenBudget 检测到超限,Agent 还没开始干活就被迫终止了。
更关键的是,用户到第 7 轮问的是“帮我下个单”,跟前 2 轮的物流和退款已经没什么关系了。但那 1000 多 Token 的物流和退款历史还挂在记忆里,白白占着预算,还会分散大脑的注意力。
记忆不是越多越好,而是越精准越好。 接下来实现的三种策略,核心目标都是一个:在有限的 Token 预算内,尽可能保留对当前任务有用的信息。