Agent记忆机制思考
1.Agent记忆机制
常见框架:Mem0 、Letta(MemGPT)、 Zep(及其开源组件 Graphiti)
Agent三层记忆:
- 短期
- 长期( Episodic Memory(事件记忆)+ Semantic Memory(事实/实体记忆))
- 用户偏好记忆。(结构化+非结构化混合)
存什么、什么时候存、怎么存;
取什么、什么时候取、怎么取;
记忆整理
会话初始化阶段,基于用户query生成memory retrieval query,对长期记忆采用BM25+Vector Hybrid Retrieval,并通过reranker筛选;用户偏好通常根据user_id:固定核心偏好直接读取+结构化过滤 + 语义检索。
在Agent执行过程中,不会每个节点都检索Memory,而是通过Memory Trigger在规划阶段、信息不足或任务切换时按需召回。
任务结束后,通过Memory Extractor从conversation中提取候选记忆,再经过去重、冲突检测和重要性评估后决定新增、更新或者丢弃,而不是每次都直接写入。
1、什么时候进行存储?
1、每轮对话结束异步写入
2、重要事件立即写入
3、每天固定时间总结后写入
避免记忆只进不出,定时清理记忆。如何清理?
2、什么时候进行检索?
1、「主动检索」:在任务开始前,用当前任务的描述去检索相关记+固定核心画像记忆直接取,把结果注入 system prompt 作为背景知识。这样 Agent 一开始就带着「历史记忆」进入任务,不需要用户每次重新交代背景。
2、「被动触发」:Agent 在推理过程中,判断当前步骤需要某类特定知识时,主动发起检索。具体做法是把「查记忆」封装成一个 Tool,让 Agent 自己决定什么时候调。这种方式更灵活,但依赖模型判断什么时候该去查。
实践:
1、在对话开始之前,对长期、用户偏好记忆进行一次主动检索。把这两个记忆放进System Prompt。
2、在执行过程中,Agent自主决定需不需要检索。
3、根据什么进行检索?
1、 用户开始会话:重写Query,对长期记忆向量检索 + 用户偏好结构化+向量检索一次,使用:Memory Query Rewriter
4、记忆有更新怎处理?
先检索与新记忆具有相同 subject、attribute 和 scope 的旧记忆,再判断两者关系。
只有满足以下条件时,才将旧记忆标记为 superseded:
- 新旧记忆描述同一个属性;
- 适用范围 scope 相同;
- 该属性为单值属性;
- 用户明确表达改变或替换;
- 新信息的来源和置信度足够可靠。
被替代的记忆不直接删除,而是设置:
- status: superseded
- valid_to: 新记忆生效时间
- superseded_by: 新记忆 ID5、记忆会不会被重复加入知识库?去重怎么做?
1、TAG标签检索后过滤
2、入库时检索TOP5后,llm-as-judge去评估是否重复
6、记忆整理
记忆不能无限膨胀加入:
模式1:增量Consolidation,每产生一个新Memory时进行新Memory + TopK相关旧Memory处理。
模式2:周期性整理(后台任务),定时处理低价值记忆
模式3:用户画像级总结,定时总结部分记忆。