别再把向量库当垃圾桶:扒开 Supermemory 源码,看它怎么给 AI 装上真外脑

现在的大模型,上下文窗口动不动就吹到上百万。 有用吗?有,但不多。 先不说每一次全量带进去的 Token 账单...

现在的大模型,上下文窗口动不动就吹到上百万。

有用吗?有,但不多。

先不说每一次全量带进去的 Token 账单有多肉痛。聊得深了,哪怕是最强模型,也会在浩瀚的文本堆里“大海捞针”捞到走神。更恶心的是,每次只要点一下新建对话,AI 当场失忆。你又得像面对一个健忘症患者一样,把自己的项目背景、技术栈偏好、代码格式规矩,从头到尾再念叨一遍。

很多人以为,搭个向量数据库把历史对话全切成块塞进去,就叫给 AI 装上“长期记忆”了。

省省吧。那是垃圾桶,不是记忆。

没有版本回溯、没有时效淘汰、没有事实冲突解决,你的模型查出来的只会是半年前早就废弃掉的旧配置。

在本地代码库 supermemory 里,藏着一套斩获 LongMemEval、LoCoMo 和 ConvoMem 三大榜单冠军的技术实现。它不用你维护笨重的自建向量集群,而是把一套带有生物遗忘与进化特性的“记忆本体”,直接架在了 Cloudflare 边缘网络上。

今天我们把它的源码底牌翻开,看看工业级的 AI 记忆引擎到底长什么样。

1. 🧬 记忆不是文本块,它是有生命的“本体树”

打开它的核心数据校验层(packages/validation/schemas.ts),你会发现一件很有意思的事:它根本没把记忆当成普通的字符串。

普通 RAG 系统里,一条记录就是一个 Chunk。

而在 Supermemory 里,核心模型叫 MemoryEntry。它更像是一个在时间线里不断长出新枝丫的 Git 提交树:

graph TD A[“根记忆 (Root Memory v1): 用户正在学 Rust 基础语法”] –>|”随着时间延伸 (extends)”| B[“子记忆 (Child Memory v2): 用户开始啃 Tokio 异步运行时”] B –>|”偏好更迭覆盖 (updates)”| C[“新状态 (Latest Memory v3): 用户放弃 Tokio, 改用纯标准库通道”] B –>|”模型自动推测 (derives)”| D[“派生画像 (Inferred): 极端追求无锁性能与内存可控”]

> 记忆本体(Memory Ontology) > 一种定义知识如何演进、继承和老化的结构化契约。在真实的记忆系统里,信息会过时、会自相矛盾。系统必须依靠父子指针(parentMemoryId)、版本号(version)以及关联标记(updates / extends / derives),把零散的聊天记录组织成可随时追溯脉络的知识树。

来看这段从它源码里扒出来的核心定义:

export const MemoryEntrySchema = z.object({ id: z.string(), memory: z.string(), // 提炼后的原子事实 version: z.number().default(1), // 递增版本号 isLatest: z.boolean(), // 标记是不是最新状态 parentMemoryId: z.string().nullable(), // 上一版记忆的指针 memoryRelations: z.record(MemoryRelationEnum), // “updates” | “extends” | “derives” sourceCount: z.number().default(1), // 被不同信源验证过的次数 isInference: z.boolean(), // 是模型自己脑补推测的,还是用户亲口说的 isStatic: z.boolean(), // 静态铁律 (如姓名) 还是动态时效 (如本周排期) forgetAfter: z.coerce.date().nullable(), // 遗忘截止时间 matryokshaEmbedding: z.array(z.number()).nullable(), // 俄罗斯套娃向量 });

看出门道了吗? * 它不删历史:你上个月说喜欢 React,今天宣布倒戈 Svelte。系统不直接物理覆盖旧记录,而是生成版本 2,打上 updates 关系。过去的行为轨迹全在,审计和回滚毫无压力; * 它区分事实来源isInference 字段极精妙。如果 AI 从你的语气里偷偷推理出“这人性格急躁、喜欢精简回答”,它会先打上假说标签,扔进前端的审核队列(Review Queue)让你确认,不搞暗箱操作; * 信源越多,权重越硬sourceCount 字段在起作用。你在 Notion 笔记里提过一次,在聊天里又强调了一次,这个记忆的置信度就自动往上跳一档。

2. ⚡ 50 毫秒拼出你的画像:动静二元检索

很多团队抱怨 RAG 太慢,问个话要等两三秒才开始吐字。大部分时间全耗在向量检索的大海里捞针了。

Supermemory 的打法极其清爽:把记忆切成动静两半。

> 动静二元画像(Static vs. Dynamic Profiles) > 用户的知识面天生存在两层形态:一层是静态根基(Static),比如职业、母语、编码风格偏好,几个月都不会变;另一层是动态情境(Dynamic),比如正在修的 Bug、刚看过的文档。调用接口时,静态层直接秒级读缓存,动态层结合本次提问走混合检索,几十毫秒就能组装完毕。

它的底层检索综合打分,走的是这套混合方程:

    \[S(q, d) = alpha cdot frac{E(q) cdot E(d)}{|E(q)| |E(d)|} + (1 - alpha) cdot text{BM25}(q, d) + beta cdot log(1 + text{sourceCount}) - gamma cdot Delta t\]

* 既要向量语义相似度,又要 BM25 关键词精确匹配(防止特定函数名、人名被向量模糊吞掉); * 重复验证过多次的记忆(sourceCount)有对数加分; * 随着时间推移未被强化的临时记忆,乘上一个自然半衰期系数(gamma cdot Delta t)默默沉底。

套娃向量(Matryoshka Embedding)的降维加速

为了在边缘端压榨性能,它用上了 MRL(俄罗斯套娃表示学习)

> 套娃向量嵌入(Matryoshka Embedding) > 传统向量(比如 1536 维)必须全算完才能比对。套娃技术训练出来的向量,直接截取前 256 维或者 512 维,依然是一个高准确率的子空间。

海量数据初筛时,直接拿切碎的低维向量在毫秒级内框定前 50 个候选集;最后精排再用全维打分。算力开销省了数倍,精度却几乎一点没丢。

3. 🌐 架构不落俗套:没有笨重机器,全扔在边缘节点

看看它的工程目录结构(apps/packages/),你找不到那种满地都是 Docker Compose、Python 复杂环境配置的笨重后端。

它把后端全部用 Hono + TypeScript 撸穿,直接跑在 Cloudflare Workers 边缘网络上。

graph TD A[“任意宿主: Claude Desktop / Cursor / Web端”] –>|”标准 MCP 协议 / JSON-RPC 2.0″| B[“Cloudflare Workers (apps/mcp & api)”] B –> C[“Cloudflare KV (毫秒级存取静止画像)”] B –> D[“Vectorize / CF AI (边缘嵌入与混合检索)”] B –> E[“Hyperdrive -> PostgreSQL (版本树与本体持久化)”] B –> F[“多模态管道 (PDF / 网页 / Notion Webhook)”]

这样做的好处太直接了: 1. 冷启动约等于零:完全没有传统微服务容器拉起的迟钝感,离用户最近的边缘机房就近响应; 2. 多租户天然隔离:靠 Space(空间容器)和 containerTag 把不同项目、不同组织的数据彻底隔开; 3. 前端不是花架子packages/memory-graph 模块里用 D3.js(力导向算法)直接在浏览器 Canvas 上画出数十万个记忆节点。你能亲眼看着你的知识体系如何像神经突触一样聚类成团。

4. 🔌 为什么它能无缝插进各种 Agent?

一套记忆系统写得再精妙,如果别的工具接不进来,那也是孤芳自赏。

Supermemory 的高明之处,在于它极早就深度押注了 MCP(Model Context Protocol)

翻看 apps/mcp/src/server/tools/,它对外部暴露的工具刀法极其利落:

核心工具名称对应入参举例一句话看懂是干啥的
save-memory{ content: "用户讨厌用 tabs 缩进" }抛给后台异步流水线,自动提炼事实并建立关系
search-memory{ q: "代码规范", threshold: 0.85 }混合检索出相关记忆,自动区分是精准事实还是粗文档块
forget-memory{ content: "前任女朋友的生日" }智能软遗忘;先找完全匹配,找不到就走高置信度语义定位抹除
who-am-i无参调用极速捞出当前用户最核心的静动态画像上下文,直接塞进系统提示词
memory-graph{ spaceId: "work" }导出当前知识空间的图谱拓扑数据,供可视化或复杂推理使用

你在使用 Claude Desktop、Cursor 或者任意开源 Agent 时,只要在配置文件里配上这套 MCP 服务端,你的 AI 编程助手瞬间就有了跨项目、跨会话的持续记忆力。

5. 🚪 总结:AI 真正需要的外脑长什么样?

从狂热堆砌 Token,到冷静设计记忆架构,这是 Agent 从玩具走向成熟的必经之路。

Supermemory 给整个行业打了个样: * 别再把用户的每句话都机械化地向量化; * 别指望大模型能在无限拉长的上下文里保持理智; * 真正的外脑,必须懂得关系的演进、事实的提炼、适时的遗忘,以及毫秒级的交付

未来我们不需要 AI 每次都带着几百页聊天记录上阵。它只需要在开口的那一瞬间,知道你是谁,知道你想要什么,这就足够了。

📚 参考文献与基准凭据

1. Wu, C., et al. (2024). LongMemEval: Benchmarking Long-Term Memory of Large Language Models. arXiv preprint. (Supermemory 荣登榜首的长程记忆能力评测核心基准). 2. Snap Research Team (2024). LoCoMo: Long-Context Conversation Modeling and Continuous Memory Retrieval. (评估多轮会话持续记忆与抗遗忘性的基准体系). 3. Kusupati, A., et al. (2022). Matryoshka Representation Learning. In Advances in Neural Information Processing Systems (NeurIPS 2022). (俄罗斯套娃低维自适应向量截断算法原始论文). 4. Anthropic & Open Source Working Group (2024–2026). Model Context Protocol (MCP) Architectural Specification. https://modelcontextprotocol.io. (开源通用模型上下文协议标准规范).

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 🐾 智柴网 沪ICP备2024052574号-1