大多数“AI记忆”产品存的是事实和偏好。有人要的不是这个——他要知道自己当初为什么做某个决定、这个决定建立在什么之上、现在是否还成立。
![]()
这个项目叫 Ledger,作者把它比作“对准自己的 git blame”:不是查谁合并了代码,而是查某个决定底下压着哪次对话、哪个假设、哪个被否掉的选项。
Ledger 是一个本地项目,把聊天导出文件变成 FalkorDB 里的图。对话和消息先入库,再由大模型抽取实体、主张和决定,每一条都链回源消息。查询方式有两种:命令行,或者在 Cursor 里通过 stdio MCP 调用。
真正的成本是反复解释自己
很多人在 Cursor、Claude Code、Codex、Antigravity,以及 ChatGPT、Gemini、Claude 这些网页应用之间来回切换。工作是同一个项目,记忆却不是同一份。为了把同样的技术栈选择、约束条件、“这个我们试过了”塞进下一个工具,你得反复烧 token,也烧耐心。
Ledger 的思路是:一张图,放在 MCP 后面,让这些客户端共享决定,而不是共享整份聊天记录。目前它导入的是你已有的历史,还不能实时截取正在进行的对话。下一版计划加一个 MCP 工具,在你主动要求时捕获当前对话——由用户触发,不做静默抓取——这样图能保持最新,不用再导出一份压缩包。
实时摄入,是“周末写的小导入器”和“真正跟着你走的记忆”之间的分界线。导入依然重要:它是你停止为“重新教上个月的事”付费的方式。
图长什么样
导入并抽取之后,几张聊天会变成这样一张快照:
- 橙色节点是对话。
- 粉色节点是消息。一条长对话会变成星形:一个中心,多条 HAS_MESSAGE 辐条。这是预期行为,不是 bug。
- 蓝色节点是主张,包括事实、偏好、约束、假设。
- 决定以同样方式挂上去,通过 EXTRACTED_FROM 关联。
- 彼此分离的团块是不同话题。聊天只有在共享实体(同一个项目、工具、人)时才会连起来。向量搜索能检索相似文本,但说不出哪些决定已经过时;图遍历可以。
目前的流水线
- 导出——先支持 Claude 网页版导出(conversations.json)。ChatGPT、Gemini、Claude Code、Antigravity、Codex 等是适配器:同一份 JSONL 契约,不同的解析器。
- 脱敏——处理邮箱、电话、常见 API key 模式。这不是完整的 PII 系统,但 data/private/ 和 .env 仍然不要提交。
- 入库——对每条消息做嵌入(通过 OpenRouter 调用 text-embedding-3-small),写入 Conversation 和 Message 节点。
- 抽取——Haiku 以 8 条消息为窗口读聊天,然后批量嵌入,主张在落图之前先做裁定(相同/取代/矛盾)。
作者用 search、trace、check 三个命令查询,或者在 Cursor 里启用 ledger MCP 服务器,在新开的 Agent 对话里提问。Claude Desktop 也能挂同一个服务器。网页版 ChatGPT 在出现 HTTP 接口之前说不了这套本地 stdio MCP——目前那些聊天只能靠导入进图。
为什么用图
“这个过时了吗”“我当初为什么选这个”“忘掉这段对话”,在图里都是走一遍:DEPENDS_ON、SUPERSEDES、EXTRACTED_FROM。这就是 git blame 时刻:你拿到的是理由、你没选的那些选项,以及产生它们的原话。
代码是本地优先的:FalkorDB 用 Docker,嵌入和抽取走 OpenRouter,Cursor 侧用 MCP 1.x。个人数据转储留在 gitignore 里。
仓库地址:github.com/karthik-bommineni/decision-memory-graph。作者留了一句话:让你的 agent 永不遗忘,也给你那些本要再解释一遍的决定,留一条 blame 记录。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.