文章

智能体记忆管理组件调研

梳理 GitHub 高星 Agent 记忆组件:Mem0 一类抽事实再检索,Letta / OpenClaw 做梦境巩固,Graphiti 走时序图谱。跨 Agent 共享靠作用域、图库或 Git,而不是无锁共写一份 Markdown。文末对照选型与其余能力。

智能体记忆管理组件调研

智能体记忆管理组件调研

面向 Agent 记忆管理 的开源组件近年集中出现。本文按 GitHub 高星仓库与公开文档,归纳记忆检索、分时压缩 / 梦境、跨 Agent 共享,以及记忆层常见的其余能力。星数与接口以仓库当时说明为准,不是吞吐或召回评测。

参考与延伸阅读:


目录


一、高星仓库速览

下列星数来自调研当时的公开页,只作量级参考。

仓库约 Star形态记忆怎么存
mem0ai/mem06.6 万记忆 CRUD API,可托管可自建抽取事实;向量 + 可选图谱;按 user_id / agent_id / run_id 分作用域
getzep/graphiti3.1 万时序知识图谱框架,Zep 的开源核实体/关系带时间有效期与 superseded
topoteretes/cognee3.0 万自托管图谱 + 向量记忆平台ingest → 构图 → 检索;会话结束可写入永久图
supermemoryai/supermemory2.9 万记忆 / 上下文 API + 插件画像、连接器、混合检索;有 OpenClaw / Claude Code 插件
letta-ai/letta2.5 万有状态 Agent 运行时(原 MemGPT)核心 Memory Block 常驻上下文;档案库语义检索;MemFS + Git
MemTensor/MemOS1.1 万记忆操作系统分层(轨迹 / 记忆 / 世界模型)+ 技能结晶;宣称可降 token
zilliztech/GPTCache0.8 万语义缓存,不是长期记忆问句向量相似则直接返回旧回答
letta-ai/letta-code0.3 万Letta 现用 harness/sleeptime 梦境、MemFS、技能学习
LangMem约 0.16 万LangGraph 侧工具库语义 / 情景 / 程序记忆 + 后台 manager
OpenClaw产品级 Agent工作区 Markdown 为源日文件 + MEMORY.md + 可选向量检索 + Dreaming

另有 Honcho、OpenMemory(Mem0 的本地 MCP)、Basic Memory(Obsidian 风格 Markdown MCP) 等,星数低于上表头部,但代表「本地文件 / MCP 侧车」这条线。专门做 多 Agent 共用 Prompt 前缀 的 agentcache 星数不高,机制写得很直白,下文单独引用。


二、推理缓存、语义缓存与记忆检索

和「记住用户是谁」并列、但经常被放进同一张产品页的,还有两类缓存。它们不替代长期记忆,接口和失效策略也不同。

2.1 前缀缓存:Prompt / KV Cache

云厂商 Prompt Caching 与本地推理引擎的 Prefix / Radix KV Cache 都会复用提示开头已经算过的 KV。命中后跳过这段 prefill,输入按「读缓存」计价(折扣以厂商账单为准)。从提示开头起,连续 token 须与已缓存前缀一致;系统提示、工具 JSON、消息顺序任一处变化,都会从分叉点开始重算。

论文 Don’t Break the Cache 指出:长程 Agent 里,把每轮都变的内容放在提示前部、或每轮重排工具表,会降低命中率。常见做法是把系统提示、工具定义、稳定人设放在前部,本轮用户话和工具结果放在尾部。

agentcache 让子 Agent 从父会话的不可变前缀 fork,以便命中 Anthropic / Gemini / OpenAI 的 Prompt Cache。其给出的高命中率指的是 fork 之后对共享前缀。

本地 vLLM / SGLang 的 RadixAttention 同类:树节点按 token 前缀共享 KV。

2.2 语义缓存:相似问句直接返回旧答

GPTCache 在客户端把用户问题做成向量,阈值内视为同一问,直接返回上次 completion。这是 问答对缓存,不要求前缀相同,也不构成长期人格记忆。适合 FAQ、重复工具参数、评测回放;用户偏好已变更时需要 TTL 或显式失效。

2.3 记忆检索:抽事实,下轮只回灌相关条目

Mem0、Zep/Graphiti、Cognee、Supermemory、MemOS 的主流做法是:不要把整段聊天塞进窗口。用 LLM 抽事实 → 写入向量 / 图谱 → 下轮只召回 Top-K。Mem0 公开基准里把单次检索预算压到数千 token 量级。检索块每轮内容不同,应放在提示后部或作为工具结果,不宜写入系统提示前部。

下面用 Mem0 + 跨周助手 把这条链路走完。人物与项目均已脱敏。

场景。 用户甲是某企业的实施顾问。周一在助手里闲聊、排期、改偏好,累计二十多轮。下周五只丢一句:「按我习惯写一份本周周报提纲。」若把周一到周五的原文全部拼进 prompt,模型要再读一遍寒暄、贴日志、改口。Mem0 的目标是:长期只存几条可复用事实,提问时只把相关的几条塞回去。

应用侧固定带 user_id="user-jia"(可再加 agent_id 区分不同 Bot)。Mem0 夹在「业务应用」和「对话模型」之间:应用决定何时 add、何时 search、检索结果怎么拼进提示。

周一:对话发生之后调用 add。 应用把本轮(或刚结束的一小段)消息交出去,不必也不该把几个月的全文每次重传。官方说明里,托管平台会按同一 user_id(以及可选的 run_id)自行拼近期上下文,用来消解「他 / 那个仓库」之类指代。

假设本段原文大意是:

1
2
3
用户甲:我负责客户 A 的实施,周报只要风险和阻塞,不要过程流水账。
助手:记下了,以后周报按风险和阻塞来。
用户甲:代码在 GitLab,合并前必须过流水线。群里不要直接 @ 分管领导。

Mem0 在 add 内部大致做四步(对应官方 How it works):

步做什么本例结果
1. 查已有记忆按同一 user_id 找出可能重复的旧事实,避免再存一条一模一样的库里还没有「周报格式」,通过
2. 抽取事实另一次(或单次)LLM 调用,从对话里抽出可复用的偏好、决策、计划,丢掉寒暄和助手套话「用户甲负责客户 A 实施」「周报只要风险与阻塞」「代码托管 GitLab,合并前过流水线」「群内不 @ 分管领导」
3. 去重并向量化冗余句删除;每条记忆做成 embedding,写入向量库四条短事实,而不是二十轮 transcript
4. 抽实体并挂图抽出人名、项目、产品等;平台版会链到 Graph Memory,检索时靠实体加分实体如「客户 A」「GitLab」;之后问「那个客户」也能打到同一簇

库里此时没有完整聊天记录,只有这些 短事实。infer=False 才会按原文存消息,官方默认走抽取,重复插入同一事实容易变成两条,生产上要选一种模式并保持一致。

下周五:模型调用之前先 search。 用户甲只说:「按我习惯写一份本周周报提纲。」应用 不要 把周一全文贴回去,而是:

  1. 用这句(或稍作扩写的检索问句,如「周报格式与沟通禁忌」)调用 search,filters={"user_id": "user-jia"},top_k 取 5~10。
  2. Mem0 把问句做成向量,融合语义相似、关键词(BM25)、实体重叠、时间信号后排序。问句里的「周报」「习惯」会打中「只要风险和阻塞」;不一定带回「GitLab 流水线」,因为本轮用不上。
  3. 应用把返回的 2~4 条记忆拼成一小段,追加在提示尾部(或作为工具结果),再请求对话模型。

拼进去的上下文接近:

1
2
3
4
5
相关记忆:
- 用户甲负责客户 A 的实施。
- 周报只要风险和阻塞,不要过程流水账。
- 群内不要直接 @ 分管领导。
用户:按我习惯写一份本周周报提纲。

对话模型只看见这几行,即可写出带风险/阻塞结构、且不 @ 领导的提纲。GitLab 那条仍躺在库里,等以后问「合并门禁」再被召回。

和整段历史相比。

 不接记忆层接 Mem0
发给对话模型的历史跨周全部轮次,随时间线性涨每轮 Top-K 事实,长度近似恒定
周一寒暄、改口、贴日志每次重读add 时已丢掉,不进周五的 prompt
换设备 / 新 run_id会话一断就忘仍按 user_id 搜到同一批事实

Mem0 公开基准把单次检索预算压在数千 token 量级,依据的就是这种「只回灌相关事实」。周五那句以前没出现过,仍然要调对话模型生成周报;Mem0 不替代生成,只缩短需要重读的历史。


三、梦境与日周月压缩

「像人睡觉时巩固记忆」来自 MemGPT / Letta 的 sleep-time compute(arXiv:2504.13171):主 Agent 继续对话,后台另开一个 sleeptime / dreaming 子 Agent,读近况、整理核心 Memory Block 与档案库,避免在用户等待时抢工具步。Letta Code 里用 /sleeptime 配置按步数或上下文压缩事件触发。

OpenClaw 把同一动机落成 工作区文件 + 定时巩固:

文件角色
USER.md稳定人设与偏好,会话开头加载
MEMORY.md精选长期事实与决策,不是流水账
memory/YYYY-MM-DD.md当日观察与过程;默认加载今天和昨天
DREAMS.md梦境扫掠的人工可读纪要

巩固过程 不是「每天用向量模型把对话压成更短向量当正文」。向量(及 BM25 混合检索)只给 memory_search 用。晋升路径是:

  1. 会话中把值得留下的内容写入日文件或直接写入 MEMORY.md。
  2. 压缩前可做 memory flush:静默提醒模型先落盘,再摘要窗口。
  3. Dreaming 默认定时(如凌晨 cron):从 SQLite 短时回忆信号打分,过门槛后用 无工具的补全 决定对 MEMORY.md 的新增 / 合并 / 取代;失败则退回只追加。
  4. 日文件可做 grounded backfill,复盘历史笔记,但不直接覆盖长期层。

社区 fractal-memory 再叠一层日历金字塔:

1
2
原始对话 → 日日记 → 周滚动 → 月滚动 → MEMORY.md
                 ↘ 不随时间失效的 sticky-notes

日 / 周 / 月末用脚本(常再调一次 LLM)做 rollup。加载顺序刻意做成 今天 → 本周 → 本月 → 核心索引,让注意力落在新信息上。这是 层级摘要,和 Generative Agents 的周期反思同一族。

Mem0 类 API 通常不按日历切文件:每条消息(或一批)抽取、去重、更新事实。时间能力靠时间戳与「当前 / 过去 / 计划」检索,而不是 2026-10-03.md。Graphiti 则给每条事实 valid_at / invalid_at,问「周二当时知道什么」走图,而不是读那天的 Markdown。

路线压缩谁做向量做什么适合
Letta sleeptime后台子 Agent 改 Memory Block / 档案档案库语义检索长期存活、要自学的单个 Agent
OpenClaw Dreamingcron + 门控 LLM 改 MEMORY.md给 Markdown 建混合索引本地工作区、人要能打开文件审查
日周月 Fractal日历脚本 + LLM 摘要可选检索日记会积成几百个文件时
Mem0 / 图谱抽取每轮或批量 LLM 抽事实主存储之一多应用、多用户、要 CRUD API

向量模型 不负责「把一天对话压成一段更便宜的记忆正文」。正文压缩仍是 LLM 摘要或结构化抽取;embedding 只解决「换一种问法还能找回」。


四、跨 Agent 记忆共享

共写一份 Markdown、不加锁、当总线,几乎只出现在演示里。高星实现用的是 带作用域的存储服务 或 显式共享对象。

4.1 同一条记忆总线,用 ID 切开

Mem0 文档给出四个作用域:user_id(用户长期)、agent_id(某个角色私有)、run_id / session(本轮)、app_id(应用默认)。客服 Bot 与经理 Agent 检索时带 同一个 user_id,就能共享用户偏好;各自的 agent_id 避免把内部草稿泄漏给对方。存储是向量库 + 可选图,不是文件锁。

CrewAI 统一 Memory:Crew(memory=True) 时全员默认共享;需要隔离时 memory.scope("/agent/researcher"),需要「私有 + 公共」并集时用 MemorySlice。默认存储可落到 LanceDB 一类嵌入库。

4.2 共享块、共享 Git、共享图

Letta 允许 多个 Agent 挂同一块 Memory Block:改一次,所有挂载者下一轮上下文都看见。较新的 MemFS 把记忆当 Git 仓库;云上可挂共享 repository,自托管可指到同一 remote。这是「共同读写同一套文件树」,但提交、推送、冲突走 Git,而不是两个进程 append 同一个 MEMORY.md。

Graphiti / Cognee 把多 Agent 观测写成 同一张(或按租户分片的)图:共享的是实体与边,查询时按时间与关系过滤。适合「库存、客户状态、谁在何时改过结论」。

4.3 工作区 Markdown 仍然可用,但不等于总线

OpenClaw 源的真相是磁盘上的 Markdown,检索索引在 SQLite。多 Agent 若 共用一个 workspace 目录,等于共享那一批文件;Dreaming 写 MEMORY.md 有插件状态与锁。多 Agent 各用各的 workspace 则默认不共享,除非做 import、wiki 编译层或外接 Honcho / LanceDB / MemOS 插件。MemOS 的 OpenClaw 插件明确把「多 Agent 协作记忆」做成云或本地 SQLite,而不是指望无协议共写。

MCP 侧车(OpenMemory、Basic Memory)把记忆进程化:各宿主通过同一 MCP 读写。一致性和权限在服务端,文件只是一种后端。

4.4 共享前缀不是共享记忆

agentcache 的 fork 让多个 Worker 复用同一段 Prompt 前缀。它们看到的公共上下文是冻结快照,后续工具结果各写各的尾巴。这解决的是推理缓存复用,不解决「A 刚学到的用户住址,B 也能查」。

共享方式技术并发典型产品
作用域记录向量 / KV / 图 + user_id 等数据库事务或服务端合并Mem0、Supermemory
共享对象同一 Memory Block / Crew Memory运行时写入,块级覆盖Letta、CrewAI
版本化文件树Git / MemFS提交级冲突Letta MemFS
工作区笔记Markdown + SQLite 索引需要锁或单写者巩固OpenClaw
时序图节点边 + 有效期图库Graphiti、Cognee
共享 Prompt 前缀云 Prompt Cache只读前缀agentcache

五、其他功能与应用场景

上面三条没有覆盖、但高星仓库反复出现的能力:

遗忘、取代与合规。 长期记忆必须能改口。Graphiti 用边失效;OpenClaw 在 USER.md 里 superseded 旧指令,并提供 memory forget;Mem0 走 update/delete(新算法也曾强调 ADD-only 再靠检索融合,以产品线为准)。这对应 GDPR 删除、用户更正偏好、过期任务。

时间推理。 「现在的地址」和「去年的地址」同时存在时,只靠相似度会召回错的。Graphiti 的 valid window、Mem0 较新年份的 temporal ranking、日记文件名上的日期衰减(OpenClaw 可配 half-life)都是在打这个问题。

程序记忆与技能结晶。 MemOS、Letta Skills、OpenClaw Skills 把「怎么干活」从对话里拆成可复用技能。这不是用户事实,而是 流程记忆,跨任务复用比复述聊天更稳。

证据与来源。 OpenClaw Dreaming 强调 taint(不信任来源不晋升)、wiki 层保留 claim/evidence;Graphiti 保留 provenance。客服与调研 Agent 需要「这句话从哪次会话来的」。

窗口压缩与记忆冲刷。 上下文满时做 compaction 会丢掉未落盘事实。OpenClaw 默认在摘要前 silent flush;Letta 可在 compaction-event 上触发 dreaming。这是记忆系统与上下文管理的接缝。

用户模型。 Honcho、OpenClaw USER.md、Mem0 用户级记忆把「这个人是谁」从「这个 Agent 是谁」里拆出来,同一用户换 Bot 仍在。

多模态与连接器。 Cognee / Supermemory 强调任意格式 ingest、网盘与聊天连接器。记忆对象从纯文本扩到文件与外部系统快照。

可观测与体检。 Letta /doctor 看记忆是否膨胀、是否重复;OpenClaw /context list 看注入截断。没有这层,MEMORY.md 会在几个月后撑爆 bootstrap 预算。

本地优先与 MCP。 编码 Agent(Claude Code、OpenClaw、Hermes)流行把记忆做成本机插件或 MCP,数据不出机器;云 API 则服务多端同步。同一套抽取算法可以有两种分发。

常见场景对照:

场景更贴哪条能力
客服跨渠道记住用户user_id 级事实 + 遗忘纠正
调研多 Agent 分头搜共享图或 Crew 共享记忆
个人助理 / 本地管家Markdown 日文件 + 梦境巩固 + 人可读审查
企业知识随时间变化时序图谱,而不是只存向量片段
重复 FAQ 挡掉重复调用GPTCache 类语义缓存
长任务工具循环系统提示与工具表保持稳定,便于 Prompt Cache 命中

六、选型对照

目标更合适的方向需要警惕
提高 Prompt Cache 命中稳定系统提示与工具表,动态内容放尾部;多 Worker 时可 fork 前缀把每轮都变的检索块塞进提示前部
跨周仍认识用户Mem0 / Supermemory / Cognee 一类抽取检索把整段聊天当唯一记忆
人要打开文件审计记忆OpenClaw Markdown + Dreaming多进程无锁共写同一文件
Agent 自己改自己的人设Letta Memory Block + sleeptime核心块无限膨胀
事实会过期、要问历史状态Graphiti / Zep只用向量相似度
多 Agent 既隔离又共享用户四维作用域或 scope/slice全局一个 namespace
重复问题直接返回GPTCache当长期记忆用

落地时可以叠,但 推理缓存、长期记忆、梦境巩固 应分开配置、分开看指标:Prompt Cache 命中、检索条数、晋升条数,不要用一个数字混报。


七、小结

要点结论
记忆检索抽事实入库,下轮只回灌 Top-K;不存、也不重放整段聊天
推理缓存Prompt / KV Cache 复用稳定前缀;与长期记忆是两套机制
语义缓存相似问句返回旧答,适合 FAQ,不是人格记忆
梦境后台 LLM 巩固 + 门控晋升;向量只做检索。日周月是日历金字塔,不是把对话 embed 变短
跨 Agent作用域数据库、共享块、Git、图谱是主流;共写一份 md 只适合单写者工作区
其余遗忘、时间有效期、技能记忆、来源、压缩前 flush、MCP 本地化,决定能不能上生产

先按「要跨会话的事实、要稳定前缀、还是要挡重复 FAQ」选层,再挑仓库。

本文由作者按照 CC BY 4.0 进行授权