模型 / 数据集
Dataojitori/nocturne_memory avatar
Dataojitori/nocturne_memory

Nocturne Memory:把 MCP 智能体的长期记忆从向量库里拿出来

A lightweight, rollbackable, and visual Long-Term Memory Server for MCP Agents. Say goodbye to Vector RAG and amnesia. Empower your AI with persistent, graph-like structured memory across any model, session, or tool. Drop-in replacement for OpenClaw.

1,355 个 Star168 个 ForkPythonMIT

秒懂

它是什么?
这是一个用 SQLite/PostgreSQL 存图状记忆、带可视化回滚的 MCP 服务器,README 声称在 96.9 万字记忆库中首条消息只载入 7.2K 字。它的真正取舍在于:用显式路径寻址换掉向量检索的模糊召回。
适合谁用?
如果你同时使用多个 MCP 客户端,并且需要人工审查 AI 写入的记忆内容,Nocturne Memory 值得部署一套自建实例,因为记忆落在你自己的 SQLite 或 PostgreSQL 里,换模型不丢数据。如果你的场景是海量非结构化文档的模糊检索,或者团队里没有人愿意定期打开 Dashboard 做审核,那它不合适,向量 RAG 在这两件事上更省事。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 20 天前。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它要解决的不是检索精度,是记忆归属

绝大多数 MCP 客户端的记忆是平台资产。ChatGPT 记住的东西留在 ChatGPT,Claude 记住的东西留在 Claude。换一个模型,之前积累的偏好、项目背景、对话历史全部归零,用户只能靠手工粘贴上下文来补偿。Nocturne Memory 的做法是把记忆抽出来,放进一个独立的 MCP Server,由这个 Server 持有唯一的记忆副本,任意兼容 MCP 的客户端通过 stdio 或 SSE 连上去读写。README 的架构图把这件事画得很直白:中间是 Nocturne Memory,下面挂 Claude、Gemini、GPT,换引擎不换记忆。

目标读者是那类已经在多个客户端之间来回切换的人。README 列出的兼容清单包括 Claude Code、Claude Desktop、Gemini CLI、OpenAI Codex、Cursor、OpenClaw、Antigravity、GitHub Copilot、Cherry Studio 等。另外它还提供 Namespace 隔离,README 的说明是多个 AI 人格可以各自拥有独立的记忆空间,互不干扰。这一点对同时维护多个助手配置的人有实际意义,因为默认情况下所有记忆混在一个命名空间里,人格设定会互相污染。

需要说清楚的是,这个项目并不声称自己比向量检索更准。它换的是另一条路:不靠相似度召回,靠路径寻址。

记忆是一棵有地址的树,不是一堆向量

从 README 给出的调用示例看,记忆的读取方式是这样的:先 read_memory("system://boot") 载入核心设定,再用 search_memory("jobstation") 做一次关键词搜索,然后按返回的路径精确读取,比如 read_memory("core://work_jobstation/commercialization") 和 read_memory("core://work_jobstation/strategic_position")。路径形如 core://<主题>/<子主题>,是分层的、人类可读的字符串,而不是一串 embedding 的最近邻结果。

这个设计带来两个直接后果。第一,写入和读取都是显式的:AI 知道自己读了哪几条、为什么读,人类也能在 Dashboard 的树状视图里看到整棵记忆树的形状。第二,Token 消耗是可预测的。README 声称在一个 96.9 万字的真实记忆库中,新会话首条消息只载入 7.2K 字,并称过去 30 天里全库 78% 的记忆曾在某次对话中被想起。这两个数字来自项目方自己的统计,我无法独立验证口径,但它们描述的方向是合理的:只载入 boot 预设加按需调取的若干节点,而不是把整个库塞进上下文。

存储层是 SQLite 或 PostgreSQL,README 的徽章把两者并列。SQLite 适合单机个人使用,PostgreSQL 适合需要并发或远程访问的场景。具体选哪个、如何配置连接串,README 摘要里没有展开,需要去仓库文档确认。

版本安全网是另一个可见的机制。README 的截图说明写着「AI 每次操作自动备份,清理需人类确认」,Review & Audit 页面提供可视化 diff,可以一键接受或回滚。2.5.4 版本的发布说明里提到「孤儿恢复」,说明这套版本机制在实践中确实会遇到需要恢复的状态。

安装只有两步,但第二步容易踩坑

前置要求是 Python 3.10+ 和 Node.js,后者用于首次启动时自动构建 Dashboard 前端。安装命令在 README 里写得很短:

git clone https://github.com/Dataojitori/nocturne_memory.git cd nocturne_memory pip install -r backend/requirements.txt

真正需要留意的是客户端配置这一步。README 明确区分了两种入口:Antigravity 客户端的 args 必须指向 backend/mcp_wrapper.py,理由是解决 Windows 上的 CRLF 问题;其他客户端指向 backend/mcp_server.py。这是一个很容易被忽略的细节,指错了文件在 Windows 上可能表现为启动失败或输出异常。

README 还给了一段可以直接丢给 AI 助手执行的安装提示词,让助手先询问你用的是哪个客户端,再生成对应的 MCP JSON 配置。这种做法降低了门槛,但也意味着配置细节由模型代劳,出问题时你需要自己回头看它到底写了什么。

如果只想先看看效果,README 提供了公共 Demo:OpenAI Codex 在 .codex/config.toml 里加 [mcp_servers.nocturne_memory_demo] 和 url = "https://misaligned.top/mcp";Antigravity 在 MCP 设置里加 serverUrl 字段。Demo 是只读的,只开放 read_memory 和 search_memory,写能力必须自建实例。

示例对话暴露了这个项目的真实气质

README 用三个真实对话片段来演示效果,这部分值得单独拎出来看,因为它同时说明了能力边界和使用者的画像。

第一个用例是工作战略,用户只问了一句 Jobstation 怎么才能做起来,AI 依次调用了 system://boot、search_memory("jobstation")、core://work_jobstation/commercialization 和 core://work_jobstation/strategic_position,然后基于这些记忆输出了一段关于去人化和自动化的判断。这个用例展示的是路径寻址在垂直主题上的效果:记忆按项目分文件夹,检索时先粗搜再精读。

第二个用例涉及亲密关系设定,内容带有明确的成人向角色扮演色彩,包含性相关描写。第三个用例是情绪陪伴,用户说没力气洗澡吃饭,AI 调用了 core://salem/parasitic_entropy_engine_warning 和 core://salem/survival_state 后给出回应。

把这三段放在一起看,项目维护者对使用场景的定位就很清楚了:它主要服务于长期的角色扮演和情感陪伴类应用,工作类记忆只是其中一部分。这不算缺点,但它决定了这个项目在什么环境里会被接受。如果你打算在合规要求严格的企业内网部署,README 首页的示例内容本身就可能过不了内部审查,你需要评估这一点。

从技术角度,这三段对话也说明了一件事:记忆节点的命名是高度个人化的,core://salem/parasitic_entropy_engine_warning 这种路径只有长期使用者才写得出来。系统不替你组织记忆结构,组织方式的责任在用户和 AI 身上。

什么时候它不如向量 RAG

路径寻址的代价是它依赖你知道要找什么。search_memory 提供了一层关键词兜底,但关键词搜索和语义检索是两回事。如果你的记忆来源是大量非结构化的会议记录、日志、文档片段,用户提问的方式又千变万化,那么向量检索的模糊召回更合适,因为你不必预先设计好一棵树,也不必保证每个节点都有合适的名字。Nocturne Memory 要求记忆在写入时就被组织进分层路径,这个前提在开放域语料上很难维持。

第二个限制是审核成本。README 把「清理需人类确认」当作安全特性来宣传,这确实是特性,但它同时意味着有人得定期打开 Dashboard 看 diff。如果没人做这件事,版本安全网就退化成只增不减的备份堆积。相比之下,纯自动化的向量库不需要人工介入,代价是不可控的写入。这是一个明确的权衡,不是可以两边都占的。

第三个限制是集成面。它需要客户端支持 MCP,并且支持 stdio 或 SSE 传输。README 列出的兼容列表很长,但列表本身不构成验证,具体某个客户端版本能不能稳定连上,需要你自己试。

还有一个我无法从现有材料确认的点:当记忆库增长到远超 96.9 万字的规模时,search_memory 的行为如何,README 没有说明。如果你预期会积累到千万字级别,这是一个需要提前验证的问题。

和 Mem0 这类自动抽取方案的路线差异

同样做智能体长期记忆的 Mem0,走的是另一条路:从对话里自动抽取事实,存成结构化条目,检索时按语义匹配返回。用户基本不需要关心记忆是怎么组织的,写入和读取都是自动的。Nocturne Memory 反过来,它把组织权交还给用户,记忆是一棵需要命名和维护的树,读写是显式调用。

差别在控制权和维护成本之间。自动抽取方案省事,但你很难预知某次对话会往记忆库里塞进什么,也很难在事后逐条审查。Nocturne Memory 的每一次写入都对应一个路径、一次 diff、一次可回滚的版本,代价是你得参与组织。

这个差异在换模型这件事上会被放大。Mem0 这类方案通常和某个框架或平台绑定较紧,迁移时记忆数据的可移植性取决于它的导出能力。Nocturne Memory 的记忆存在你自己的 SQLite 或 PostgreSQL 里,路径是纯文本,理论上可以直接用 SQL 查询和导出。这一点对在意数据主权的人有分量。

维护成本与许可

项目采用 MIT 许可,这是最宽松的一类,允许商用、修改和再分发,只需要保留版权声明。我不提供法律意见,具体合规判断请咨询专业人士。

从发布节奏看,2026 年 5 月到 8 月之间发布了 2.5.2、2.5.4、2.5.6 三个版本,其中 2.5.2 的标题是「重大Bug修复 & 中文支持」,2.5.6 是「MCP 2.0 Compatibility & Long-Form Improvements」。这说明项目仍在跟进 MCP 协议本身的演进而做适配。MCP 2.0 兼容性这类改动通常意味着客户端侧的配置或行为可能随之变化,升级前建议先看发布说明。

升级成本主要落在两处:一是数据库 schema 是否随版本变化,README 摘要里没有提到迁移脚本;二是 Dashboard 前端在首次启动时由 Node.js 构建,升级后可能需要重新构建。这两点都需要在仓库文档里确认,我无法从现有材料判断。

另一个隐性成本是记忆的组织工作。这不是一次性投入,随着使用时间变长,路径结构会变得混乱,需要定期整理。项目提供了可视化工具来降低这件事的难度,但工具不能替代判断。

编辑结论

如果你同时使用多个 MCP 客户端,并且需要人工审查 AI 写入的记忆内容,Nocturne Memory 值得部署一套自建实例,因为记忆落在你自己的 SQLite 或 PostgreSQL 里,换模型不丢数据。如果你的场景是海量非结构化文档的模糊检索,或者团队里没有人愿意定期打开 Dashboard 做审核,那它不合适,向量 RAG 在这两件事上更省事。动手前先确认三件事:Python 版本是否达到 3.10、Node.js 是否可用(首次启动要构建前端)、以及你用的客户端该指向 backend/mcp_server.py 还是 backend/mcp_wrapper.py。建议先用只读的公共 Demo 走一遍 read_memory("system://boot") 和 search_memory,确认寻址方式符合你的预期,再决定是否落库。

官方来源

  1. Dataojitori/nocturne_memory on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记