AI Agent 记忆系统
·
一、核心思想
记忆层要解决两件事:
- 当前对话内:关键事实不丢失。
- 跨会话:新会话能恢复用户偏好、背景和历史决策。
核心公式:记忆系统 = 短期记忆(Session级)+ 长期记忆(跨Session持久化)
下面是记忆系统的整体架构图:
二、记忆的分类与存储
1. 按存储形式分类
| 存储形式 | 说明 | 典型实现 |
|---|---|---|
| Token级记忆 | 自然语言或结构化文本 | 向量库中的文本块、JSON |
| 参数化记忆 | 编码进模型参数 | 预训练知识、LoRA适配器、SFT微调 |
| 潜在记忆 | 模型内部表示 | KV Cache、激活值、Hidden States |
下面是记忆生命周期的完整流程图:
2. 按功能分类
| 功能类型 | 核心问题 | 存储内容 | 典型场景 |
|---|---|---|---|
| 事实记忆 | 智能体知道什么 | 用户偏好、环境状态、显式事实 | 记住用户的技术栈偏好 |
| 经验记忆 | 智能体如何改进 | 过往轨迹、成败教训、策略知识 | 从失败的代码审查中学习 |
| 工作记忆 | 智能体当前思考什么 | 当前推理上下文、任务进展 | 多步推理中的中间状态 |
3. 按内容性质细分
- 情景记忆:记录特定时间、场景的具体事件(回答“发生了什么”)。
- 语义记忆:从多个情景提炼的通用知识或规律(回答“意味着什么”)。
- 程序记忆:存储技能、规则和习得行为(自动执行任务序列)。
下面是长期记忆的写入与检索双链路图:
三、记忆的生命周期
一条记忆从进入到淘汰,经历六个环节:
编码 → 存储 → 提取 → 巩固 → 反思 → 遗忘
| 操作 | 说明 | 工程实现 |
|---|---|---|
| 编码 | 将原始交互转为可存储信息 | LLM提取事实三元组、生成摘要 |
| 存储 | 持久化编码后的信息 | 写入向量库/图数据库/参数 |
| 提取 | 根据上下文检索相关记忆 | 向量检索 + BM25 + 图遍历 |
| 巩固 | 短期记忆转长期记忆 | 异步任务:对话摘要 → 实体库 |
| 反思 | 主动回顾评估记忆内容 | 任务完成后提取Meta-Knowledge |
| 遗忘 | 淘汰低价值或过时记忆 | 权重衰减 + 冲突标记废弃 |
四、短期记忆(Short-Term Memory)
- 定义:当前单次会话中的暂存信息(用户提问、模型回复、工具调用结果)。
- 载体:LLM的上下文窗口。
- 管理难点:窗口再大也有限,且存在位置偏差(中间信息利用率低)。
- 三种控制策略:
- 上下文缩减:滑动窗口丢弃旧消息,或压缩为摘要。
- 上下文卸载:重型结果放外部存储,Prompt中只保留引用。
- 上下文隔离:多Agent间只传递精简指令,不广播完整历史。
五、长期记忆(Long-Term Memory)
- 定义:活在Session之外的持久化知识库。
- 核心机制:写入(Record) 与 检索(Retrieve) 两条链路。
写入链路
- 时机:对话结束后,异步触发。
- 过程:LLM对短期记忆做语义提纯(过滤噪声、抽取结构化事实)。
- 工程要点:
- 写入操作需幂等Key(基于源消息ID+批次ID,非结果文本哈希)。
- 多端并发时用乐观锁或MVCC处理冲突。
检索链路
- 时机:新Session开始时。
- 过程:将用户Query向量化,与记忆库做语义相似性检索。
- 性能要点:首包路径上的向量检索P99延迟会直接影响TTFT,需用Redis预热或异步精排优化。
下面是记忆演化机制的完整流程图:
六、长期记忆 vs RAG
| 维度 | 长期记忆 | RAG |
|---|---|---|
| 数据性质 | 个性化经验(用户偏好、习惯) | 共享知识(公司规章、产品文档) |
| 关联对象 | 与特定用户强绑定 | 与“谁在使用”无关 |
| 关系 | 非替代:RAG提供世界知识,长期记忆提供用户画像,可融合排序或相互增强 |
七、主流记忆技术产品对比
| 产品 | 核心思想 | 技术亮点 | 适用场景 |
|---|---|---|---|
| Mem0 | 单次抽取+多信号融合检索 | 语义+BM25+实体链接并行打分 | 通用对话记忆 |
| LETTA(原MemGPT) | 操作系统虚拟内存分页 | 主上下文与外部上下文动态交换 | 长对话上下文管理 |
| ZEP | 时间感知知识图谱 | 情景/语义/社区三层子图;边失效机制 | 企业级多租户 |
| A-MEM | Zettelkasten知识管理 | 卡片笔记法,记忆间自动建立语义连接 | 知识密集型任务 |
| MemOS | 三种记忆类型动态转换 | 纯文本 ↔ KV Cache ↔ LoRA | 全栈记忆管理 |
| MIRIX | 六模块分工协作 | 元记忆管理器路由不同存储结构 | 复杂决策支持 |
LETTA、ZEP、MemOS关键差异
- LETTA:有损压缩(递归摘要会丢失细节)。
- ZEP:可借鉴的边失效机制(新事实覆盖旧事实时标记失效,保留审计)。
- MemOS:LoRA写入后难删除,适合变化极慢的偏好;多租户需动态挂载/卸载adapter。
下面是 Agent 记忆三层对齐架构图:
八、记忆的演化机制(反思、聚类、遗忘)
1. 反思与合成
- 自我反思:任务完成后提取Meta-Knowledge(如“用户更在意性能而非规范”)。
- 精细化反思闭环:每个子任务后触发,进行真实性、交付物、数据保真性三重验证。
- 记忆聚类与合并:自动合并碎片化重复记录,整理成“实体百科”。
2. 遗忘与清理
- 权重衰减:
score = relevance × importance × decay(t),指数衰减过时记忆。 - 冲突解决:新事实与旧事实矛盾时,标记旧记忆为废弃。
- 注意:主流向量库的软删除可能破坏HNSW图结构,需定期执行Vacuum清理。
九、检索效果优化
混合检索策略
- RRF(倒数排名融合):几乎不用调参,适合冷启动。
- 线性加权:需标注数据校准权重。
- Cross-encoder Reranker:召回后统一精排,对长尾查询更友好。
元数据硬过滤
- 目的:多租户场景下强制数据隔离(如按UserID过滤)。
- 工程取舍:强过滤可能破坏HNSW图连通性,导致召回率下降;高活跃租户建议分配独立Collection做物理隔离。
优化优先级
检索链路优化的ROI通常高于写入链路。体感“记忆没用”时,十有八九是Recall跑偏,或精排未将真正相关内容顶上来。先查Trace,再考虑加写入预算。
十、Markdown作为轻量级记忆方案
适用场景
偏好、约定、踩坑记录等信息量可控、对可读性要求高的场景。
优势
- 透明可审计:直接读写文件,无黑盒。
- 持久化与版本控制:文件存磁盘,可提交Git。
- 零迁移成本:无供应商锁定,复制即可。
- 成本极低:免去向量数据库运维成本。
局限
海量非结构化文本检索时,人工组织的Markdown成为瓶颈,此时向量检索不可替代。
十一、Claude Code的CLAUDE.md机制
层级结构
| 层级 | 位置 | 作用范围 | 适用场景 |
|---|---|---|---|
| 组织级 | /etc/claude-code/CLAUDE.md |
所有用户 | 公司编码规范、安全策略 |
| 用户级 | ~/.claude/CLAUDE.md |
个人所有项目 | 代码风格偏好 |
| 项目级 | ./CLAUDE.md 或 ./.claude/CLAUDE.md |
团队共享 | 项目架构、编码标准 |
| 本地级 | ./CLAUDE.local.md |
个人当前项目 | 沙箱URL、测试数据偏好(加入.gitignore) |
写作原则
- 规则要具体可验证:“注意可读性” → “函数名动词开头,不超过40行”。
- 禁令配替代方案:“不要做X,遇到这种情况做Y”。
- 错误驱动添加:只有Claude确实犯了某个错误,且规则能防止再犯时,才写入。
- 控制长度:每条
CLAUDE.md建议200行以内,过长会稀释重点。
AGENTS.md 与 CLAUDE.md
AGENTS.md是跨工具开放标准(OpenAI Codex、Cursor等采用)。- 可通过
@AGENTS.md导入,让两个工具复用同一份基础指令。
Auto Memory
- Claude根据对话自动写入的笔记(偏好、习惯)。
- 限制:仅加载前200行或25KB;20-30个会话后质量可能下降。
- 禁用:环境变量
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
十二、总结与关键判断
- 短期与长期记忆物理隔离:一个活在当前任务,一个持久化存储。
- 遗忘比写入更重要:舍不得删会导致过时噪音充斥检索结果,体验极差。
- Markdown与向量库互补:偏好/约定用Markdown,海量文本检索用向量库。
- CLAUDE.md不是越多越好:每条规则应对应一次真实错误。
- 检索优化先于写入优化:先查Trace确认召回精度,再优化写入。
- 最终目标:让Agent知道什么事实,从过往任务学到了什么,此刻正在处理什么,三层对齐,记忆才不空转。
更多推荐

所有评论(0)