
这类方法的核心是判断哪些记忆值得保留,哪些可以直接扔掉。
不丢弃内容,而是把多条记忆合并成更紧凑的表述。
[系统提示] + [历史摘要] + [最近5轮对话]。这是目前工业界最主流的长期记忆方案。本质上不是“压缩”,而是“外部化+索引”,但能达到压缩上下文的目的。
cos_sim(向量) * exp(-λ * 时间差)。让旧记忆被检索到的概率降低,变相压缩长期稀疏信息。改动LLM本身或引入可训练的压缩模块。
<|mem|>)。训练模型学会:看到<|mem|>时,去一个外部内存矩阵中读取或写入。<|mem|>,表示“我已将这20个数字压缩为一个内部表征”。场景 | 推荐方法 | 理由 |
|---|---|---|
简单客服/闲聊Agent | 滑动窗口 + 重要事件白名单 | 成本低,够用 |
代码辅助Agent(会话短) | 向量检索(只存代码片段+报错信息) | 精确检索比摘要更重要 |
复杂游戏/机器人控制 | 滚动摘要 + 反思式压缩 | 需要抽象出策略层级 |
长时间陪伴/心理支持 | 遗忘曲线 + 分层次摘要树 | 既有长期记忆,又不像记仇一样全保留 |
预算无限、追求最佳 | MemGPT架构 + 向量检索 + 定期反思 | 最像人类记忆系统 |
绝大多数方法关注读取/检索时的压缩。但更高效的做法是在写入记忆时就先压缩:
{实体:狗,名称:旺财,属性:年龄=5,关联:用户}。总结:Agent记忆压缩没有万能解。实际系统常采用混合策略:短期用滑动窗口,中期用向量检索,长期用摘要树,并辅以写入时的结构化压缩。核心评价指标是:压缩后,Agent在关键任务上的决策质量下降不超过5%,而上下文长度减少80%以上。
第一,摘要式压缩。 这是最直观的。比如每隔N轮对话,让LLM自己把之前的对话总结成一段短文本,替换掉原始对话。缺点是可能丢失细节,而且摘要本身也会越来越长。改进版是分层摘要——每小时总结一次,每天再把小时的摘要再总结一次,像金字塔一样。
第二,滑动窗口 + 重要度评分。 比如只保留最近10轮完整对话,更早的就只保留关键词或实体。那怎么判断哪些信息重要?可以用注意力分数(Transformer自带的attention权重)或者专门训练一个小模型来打分,分数高的记忆留到下一个窗口。
第三,向量检索 + 压缩存储。 这个在RAG里很常见。不是存原始文本,而是把每条记忆embedding成向量,存到向量数据库里。需要回忆时,用当前问题去检索最相关的Top-K条记忆。这本身就是一种压缩——从海量对话变成几十个向量和对应的原始片段。
第四,使用专门的压缩模型。 像AutoCompressors或者ICAE(In-Context Autoencoder),它们会训练一个模型把长上下文压缩成几十个虚拟token(比如叫记忆token)。这些token再喂给主Agent。这个方法效果比较好,但需要额外训练。
第五,结构化记忆。 把对话抽成(实体, 关系, 时间)的三元组,存到图数据库里。比如‘用户喜欢喝美式,不喜欢加糖’。这种结构化表示比原始文本短得多,而且方便逻辑推理。
实际落地时,通常混合使用: 短期用滑动窗口保证响应快,中期用摘要保留脉络,长期用向量库或者图数据库存结构化事实。另外要定期重写记忆——因为用户偏好会变,比如以前喜欢猫,后来养狗了,旧记忆要降权甚至删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。