Agent 记忆压缩通常有哪些方法
1️⃣ 考察意图
面试官想考察你对 Agent 记忆系统的工程化理解,而非单纯背诵概念。核心是:在有限上下文窗口和推理成本下,如何让 Agent 记住“该记的”,忘掉“该忘的”。刁钻点在于,你能否区分“压缩”与“丢弃”的边界,以及能否针对不同记忆类型(短期/长期、语义/情节)给出差异化方案。答好了能展示系统设计能力、对 LLM 成本与性能的权衡把控,以及实战中踩过的坑。
2️⃣ 标准答
记忆压缩的核心目标是:在保持关键信息可召回的前提下,最小化 token 占用。我将其分为四大类方法,按工程落地优先级排序:
1. 重要性评分 + 选择性丢弃
- 做法:为每条记忆计算一个分数,基于时效性(最近访问时间)、相关性(与当前 query 的语义相似度)、使用频率(被检索次数)。分数低于阈值则丢弃。
- 具体实现:用 BM25 或轻量 embedding 模型(如 all-MiniLM-L6-v2)计算相关性,结合指数衰减函数(如
score = freq * e^(-λ * time_elapsed))。阈值通过验证集调参,例如在 ConvAI2 上,阈值设为 0.3 时压缩率 40% 且召回率下降 <5%。 - 坑:直接丢弃可能导致“遗忘关键事件”。解法:对“高重要性但低频率”的记忆(如用户首次提到的偏好)做加权保护,例如初始分 +0.5。
2. 摘要压缩(LLM-based)
- 做法:用 LLM 将多条相关记忆合并为一条摘要。例如,将“用户喜欢猫”、“用户养了一只橘猫”、“用户昨天给猫买了新玩具”压缩为“用户是猫主人,有一只橘猫,近期有购物行为”。
- 工程取舍:摘要质量 vs 成本。用 GPT-4 摘要效果好但贵,用 Llama-3-8B 成本低但可能丢失细节。实践中采用“分层摘要”:短期记忆保留原始细节,长期记忆用摘要。例如,每 10 轮对话触发一次摘要,摘要长度控制在原始 token 的 20%。
- 坑:摘要可能引入幻觉。解法:保留摘要的“来源索引”(如原始记忆 ID),当 Agent 需要细节时,回溯到原始记忆。
3. 结构化存储(知识图谱)
- 做法:将记忆转为实体-关系-属性三元组。例如,“用户(实体)- 拥有(关系)- 橘猫(实体,属性:年龄 3 岁)”。只保留关键节点,删除冗余关系。
- 具体工具:用 Neo4j 或轻量级 in-memory 图存储,配合 LLM 做实体抽取(如用 GLiNER 或 spaCy 做 NER)。压缩率可达 70% 以上,因为去掉了大量修饰性文本。
- 坑:图结构对时序信息不敏感。解法:为每个三元组添加时间戳,并在检索时按时间衰减排序。
4. 时间衰减 + TTL
- 做法:为每条记忆设置 TTL(如 24 小时),过期自动删除。短期记忆 TTL 短(如 1 小时),长期记忆 TTL 长(如 7 天)。
- 工程取舍:固定 TTL 过于粗暴。解法:动态 TTL,基于记忆的“活跃度”调整。例如,每次被检索到,TTL 延长 30 分钟;连续 3 次未被检索,TTL 减半。
5. 分层存储(短期 vs 长期)
- 做法:短期记忆(如当前对话上下文)保留完整细节,长期记忆只存摘要或结构化数据。检索时,先查短期,再查长期。
- 具体实现:短期用滑动窗口(如最后 10 轮),长期用向量数据库(如 Chroma)存储摘要 embedding。检索时,短期记忆直接拼接,长期记忆通过相似度召回 top-k(如 k=5)。
- 坑:短期和长期记忆的边界模糊。解法:定义“记忆迁移”策略——当短期记忆超过窗口大小,触发压缩并写入长期。
总结:实际落地时,组合使用。例如,先按重要性评分过滤低分记忆,再对剩余记忆做摘要压缩,最后按 TTL 淘汰过期记忆。在对话 Agent 中,压缩率通常控制在 50%-70%,同时保持召回率 >90%。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从四个层面回答:第一,重要性评分加选择性丢弃,用 BM25 和频率衰减打分,阈值调参控制压缩率;第二,LLM 摘要压缩,分层处理短期和长期记忆,注意幻觉问题;第三,结构化存储,转成知识图谱三元组,压缩率高但需处理时序;第四,时间衰减加 TTL,动态调整过期时间。总结一句:没有银弹,必须组合使用,核心是平衡压缩率、召回率和成本。”
4️⃣ 高频追问 & 应对
追问 1:你提到用 BM25 做重要性评分,但 BM25 是词袋模型,对语义理解不够,怎么改进?
改进方向有两个:一是用轻量 embedding 模型(如 sentence-transformers)计算语义相似度,但成本高;二是混合 BM25 + 语义分数,例如 BM25 占 0.6 权重,语义占 0.4。实践中,如果 Agent 处理的是短文本(如对话片段),BM25 足够,因为高频词(如“猫”)能有效反映相关性。如果处理长文档,必须引入语义。另外,可以加一个“冷启动”保护:新记忆初始分设为 0.5,避免被过早丢弃。
追问 2:LLM 摘要压缩时,如何保证不丢失关键信息?
关键信息丢失是常见问题。解法有三:第一,保留摘要的“来源索引”,当 Agent 需要细节时,回溯到原始记忆;第二,用“关键信息抽取”替代“摘要”,即只提取实体、关系、时间、事件类型,不生成自然语言;第三,做多轮摘要验证——用 LLM 对比摘要和原始记忆,如果召回率低于 90%,则拒绝压缩。成本可控,因为验证只在压缩触发时执行。
追问 3:你的分层存储中,短期和长期记忆的检索优先级怎么定?
检索优先级是:先查短期记忆(因为最近信息最相关),再查长期记忆。如果短期记忆命中(如当前对话上下文),直接返回;如果未命中,则从长期记忆检索 top-k。但有一个坑:长期记忆的摘要可能过时。解法:在长期记忆检索结果中,加入时间衰减权重,例如最近 1 天的记忆权重为 1.0,1-7 天的为 0.5,超过 7 天的为 0.2。这样能避免 Agent 引用过时信息。
5️⃣ 避坑 · 常见错误答法
- ❌ 只提“用 LLM 做摘要压缩”作为唯一方法,忽略其他技术 → ✅ 必须说明组合使用,例如“先重要性评分过滤,再对剩余记忆做摘要,最后按 TTL 淘汰”,并给出具体 trade-off(如成本 vs 召回率)。
- ❌ 说“所有记忆都保留,用长上下文模型解决” → ✅ 指出长上下文模型(如 GPT-4-128k)成本高、推理慢,且记忆冗余会导致注意力分散,必须压缩。给出具体数字:128k 上下文每次推理成本约 $0.06,压缩后降到 $0.01。
- ❌ 只谈理论,不提具体工具或参数(如“用某个算法打分”) → ✅ 给出具体方法名和参数,如“BM25 默认 k1=1.5, b=0.75,阈值设为 0.3”,体现工程经验。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“向量检索 + 记忆压缩”角度切入,说明如何将 RAG 中的 chunking 策略迁移到 Agent 记忆压缩,例如用滑动窗口分块,再对每个块做摘要。
- 如果你只做过传统 NLP:用“信息检索中的倒排索引”类比,说明 BM25 打分如何用于记忆重要性评分,并强调“TF-IDF 的变体”在 Agent 中的适用性。
- 如果你是校招无项目:聚焦论文复现,例如提到“MemGPT 的分层记忆架构”或“Generative Agents 的反思机制”,说明你理解理论并能在 demo 中实现简单版本(如用 Python 模拟重要性评分)。
- MemGPT: Towards LLMs as Operating Systems(论文)
- Generative Agents: Interactive Simulacra of Human Behavior(论文)
- LangChain 官方文档:Memory 模块(工具)
- “A Survey on Memory Compression for LLMs”(博客)
- Chroma 向量数据库:轻量级记忆存储实践(工具)