跳转到内容

记忆层:Letta、Mem0、Graphiti

三个项目代表三种记忆哲学。Letta 说:把最要紧的身份和偏好压成小块,永远放在上下文窗里,其余归档。Mem0 说:别存原文,从对话里抽原子事实,检索时只注入相关的。Graphiti 说:事实会过期,所以每条事实都带生效和失效时间,作废不删。第 4 课讲的"记忆只做投影、冲突以事件日志为准",和这三家各有一半重叠:我们已有文件账本,缺的不是又一个向量库,而是**作废戳加小块常驻上下文**。

Grok 于 2026 年 9 月 11 日核实。Letta 的源码已迁到 letta-code 仓,旧仓已归档,跟旧 tag 会走错。

先记三样
  • 位置:记忆产品是商品,但解决的是个人记忆;组织记忆无现货,抄数据模型自建。
  • 抄与不抄:抄:Graphiti 的作废戳、Letta 的常驻身份块。不抄:Mem0 的向量 SaaS、任何记忆产品当真源。
  • 一个数:每席两块常驻身份块。一条令:"事实表加 valid_at 与 invalid_at,更新只打戳不覆盖。"

letta-ai/letta(源码现在 letta-code)

Section titled “letta-ai/letta(源码现在 letta-code)”
  1. 一句话:有状态 agent 平台(原 MemGPT),给要跨会话保身份与记忆的团队;当前实现已迁到 letta-ai/letta-code。
  2. 解决什么:没有它,agent 只是一次对话;关窗口、换模型、换机器后人格与项目知识全丢。
  3. 架构:用户或 SDK 连 Letta Server(本机或云),Server 把 memory blocks 加近期消息编译进上下文;溢出则摘要进 recall,事实进 archival;工具改块。Letta Code 一侧是本机 harness 加 MemFS,对云端 agent 状态。
  4. 核心机制:标签块(persona、human)每轮常驻上下文,不靠检索;agent 自己 insert、replace、rethink;状态与模型解耦,可换 LLM。
  5. 值得借鉴:给每个常驻席位两块极小、永远在窗里的“身份、人类偏好”,其余进文件;别把全部 transcript 塞进 prompt。我们的一页灵魂加 memory 目录,形状上已经是这个,差在“块有配额、agent 能改”。
  6. 坑与失效:自编辑记忆贵、延迟高;弱模型工具调用不稳;开源服务器已归档,跟旧 tag 会走错仓;记忆投毒被社区点名。MemFS 用 git 托底记忆文件,正是 7 月 29 日外部评审警告的方向(见 Git 式记忆外部评审)。
  7. 状态:letta 24,699 星,最新 tag 0.16.8(2026-05-14),README 指向新仓;letta-code 3,271 星,v0.32.2(2026-09-11)。活跃在新仓。
  8. 我们的关系:借鉴过,继续借鉴。 设计文档看中 Letta Code 的长期记忆与 Skill 学习,落成了每席记忆目录和中文 Skill 沉淀机制。今天该补的一招是“身份块永远在窗里、有配额”,这比上向量库便宜得多。
  1. 一句话:可插入的“记忆层”,从对话抽事实、写入向量(可选图),下次检索注入;给已有 agent 加长期记忆,而不是换整套 runtime。
  2. 解决什么:没有它,要么每次塞全历史(贵且糊),要么完全健忘;多用户偏好无法按 user_id 隔离。
  3. 架构:对话经 LLM 抽原子事实,进向量库(Qdrant 等),检索 top-k 拼进 prompt。平台版自建图;开源曾接 Neo4j,现文档称平台图为内建、共现连边。
  4. 核心机制:抽事实而非存原文;按 user、agent、run 三级作用域;写路径用 LLM 判 ADD、UPDATE、DELETE。
  5. 值得借鉴:站内信不要当记忆;异步抽“谁、偏好、约束”三条,检索时只注入相关事实。
  6. 坑与失效:Zep 指其 LoCoMo 评测不公;图边曾硬删、与论文的软失效不符;issue #5151 报共享图可被投毒;2026 年平台版去掉了可遍历图。开源 issue 多(744 个未关)。
  7. 状态:65,111 星;核心 v2.0.20(2026-09-02);releases/latest 被插件 tag 占掉。当日仍在 push。
  8. 我们的关系:观察,不引入。 它解决的是个人或会话记忆,7 月 29 日外部评审已把这一类判为“没有所有权语义、没有证据分级”,不是组织记忆。“抽三条事实而不存原文”这一招可以用在站内信入库时。
  1. 一句话:给 agent 用的双时态知识图库(Zep 的开源引擎):把对话或 JSON 收成“带有效期的三元组”,查当前或某时刻为真的事实。
  2. 解决什么:向量只找像的句子,改过的事实仍排在前面;“他现在在哪家公司”这类题需要作废旧边,而不是再 embed 一条。
  3. 架构:episode 文本或 JSON 经 LLM 抽实体与边,进 Neo4j、FalkorDB 或 Neptune;边带 valid_at、invalid_at、created_at、expired_at 四个时间;检索是向量加 BM25 加图遍历,检索本身不再跑 LLM。
  4. 核心机制:双时态,旧事实作废不删;增量 ingest,不全图重建;检索无 LLM,延迟可控。
  5. 值得借鉴:SQLite 里给每条事实加“生效、失效时间”,更新只打戳。这比再上一套向量库更贴我们的文件账本,也和第 4 课“双时态”那段一字不差。
  6. 坑与失效:ingest 慢且贵(约十余秒一条,多次 LLM);build_communities 有 O(N) 往返等未收口 issue;Kuzu 已弃用;开源要自运维图库。503 个未关 issue。
  7. 状态:30,798 星;v0.30.2(2026-09-08),另有 mcp-v1.1.0。发布密,当日仍有 star。
  8. 我们的关系:借鉴数据模型,不引入运行时。 7 月 29 日的外部评审把“双时态”判为 BUILD 层的一部分,Graphiti 是那条判定的现货对照。读它的 valid_at 与 invalid_at 怎么定义、作废规则怎么写,不必先吞 Neo4j。
项目存什么"过时"怎么处理检索时跑不跑 LLM
Letta身份块加归档agent 自己 replace 块块常驻,不检索
Mem0原子事实向量写入时 LLM 判 UPDATE 或 DELETE不跑,向量相似
Graphiti带有效期的三元组打 invalid_at,不删不跑,向量加 BM25 加图
我们(2026-09)Markdown 文件加 SQLite人手改文件grep
  • 作废戳:任何事实表加 valid_at 与 invalid_at,更新只打戳不覆盖。这是 Graphiti 的核心,也是路线图“事件表统一”的前置。
  • 小块常驻:每席两块极小的身份与偏好永远在窗里,有配额;其余全部归档进文件。这是 Letta 的核心,我们的一页灵魂已经做了一半。

Grok 和我都不建议引入 Mem0:它快,但解决的不是组织记忆。