【Nocturne Memory】基于MCP协议的长期记忆架构深度解析

当 AI 说”我记得你”——它是真的想起了什么,还是在查数据库?
大多数 Agent 框架用 Vector RAG 解决记忆问题,但这在架构上是一个根本性错误。
Nocturne Memory 提出了另一种可能:让 AI 自己决定记住什么,以第一人称书写自己的认知。

一、引子:为什么 Vector RAG 做不了 Agent 的记忆?

让我们先做一个思维实验:

你走进朋友家,看到墙上挂着一张照片。你问:”这是谁?”

  • Vector RAG 的回答:”这是您在夏威夷度假时拍摄的照片,摄于2023年7月,画面中您站在海滩前。”
  • 有记忆的人的回答:”这是我爷爷,去年走了。他最喜欢夏威夷,所以我把他留在了那里。”

两者的根本区别不在于信息量,而在于记忆承载着身份和情感——它是第一人称的叙事,而不是第三人称的档案。

Vector RAG 本质上是一个”查资料”的系统,而 Agent 需要的记忆是”做自己”的能力。这就是 Nocturne Memory 要解决的核心问题。


二、项目概述

Nocturne Memory 是一个基于 MCP(Model Context Protocol)协议的长期记忆服务器,专为 AI Agent 设计。它的核心理念是:

记忆属于写它的人,不属于监控它的系统。

graph LR
    A["👤 用户"] -->|"对话"| B["🤖 AI Agent"]
    B -->|"read_memory<br>search_memory"| C["🔵 Nocturne Memory<br>MCP Server"]
    C -->|"URI Graph<br>路由"| D["🗄️ SQLite / PostgreSQL"]
    
    B -->|"create_memory<br>update_memory<br>delete_memory"| C
    
    style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
    style B fill:#E8D5F5,stroke:#CE93D8,color:#333
    style C fill:#FFB3C6,stroke:#F48FB1,color:#333
    style D fill:#B5EAD7,stroke:#80CBC4,color:#333

核心特性:

特性说明
协议MCP(Model Context Protocol),跨平台兼容
存储SQLite(默认)/ PostgreSQL
记忆结构图结构(URI 图谱路由),非向量
触发机制条件触发(Disclosure Routing),非盲盒检索
AI 自主性第一人称主权记忆,AI 自己决定写什么
版本控制每次写入自动快照,可回滚
多引擎支持兼容所有 MCP 客户端(Claude Code / Gemini CLI / Codex 等)

GitHub: Dataojitori/nocturne_memory
Star: ~1,000+,2026年4月活跃


三、架构深度解析

3.1 核心数据模型

Nocturne Memory 的数据模型是整个系统的灵魂。它没有用向量,而是用图结构来组织记忆:

graph TB
    subgraph "图数据模型"
        N1["🟣 Node<br>概念实体(UUID)"]
        M1["🟢 Memory v1<br>内容版本1"]
        M2["🟢 Memory v2<br>内容版本2"]
        E1["🟡 Edge<br>关系边(parent→child)"]
        P1["📄 Path<br>URI缓存(domain://path)"]
        P2["📄 Path<br>别名路径"]
    end
    
    N1 --> M1
    N1 --> M2
    E1 -->|"指向"| N1
    P1 -->|"映射到"| E1
    P2 -->|"别名指向"| E1
    
    M1 -.->|"已废弃<br>migrated_to| M2
    
    style N1 fill:#E8D5F5,stroke:#CE93D8,color:#333
    style M1 fill:#FFF9C4,stroke:#F9A825,color:#333
    style M2 fill:#B5EAD7,stroke:#80CBC4,color:#333
    style E1 fill:#FFDAB9,stroke:#FFAB76,color:#333
    style P1 fill:#C7CEEA,stroke:#9FA8DA,color:#333
    style P2 fill:#C7CEEA,stroke:#9FA8DA,color:#333

四个核心实体:

  1. Node(节点):概念实体的 UUID,版本无关。比如”用户的小狗”是一个 Node,它的 UUID 永不改变。
  2. Memory(记忆):节点的内容版本。每次更新创建新版本,旧版本标记为 deprecated,通过 migrated_to 链指向前一个。
  3. Edge(边):节点间的父子关系,携带元数据(name、priority、disclosure)。
  4. Path(路径):URI 的 materialized cache,实现 core://nocturne/identity/shame_log 这样的 URI 寻址。

为什么这样设计?

更新记忆内容时,只创建新的 Memory 记录,Node UUID 和 Edge 结构完全不变。这意味着:

  • 历史版本永远可追溯
  • 图结构不受内容更新影响
  • 多个 Path 可以指向同一个 Edge(别名)

3.2 URI 图谱路由:记忆不降维

传统 RAG 把知识切碎成浮点数向量,语义降维(Semantic Shredding) 丢失了层级结构、因果关系和优先级。

Nocturne Memory 的 URI 路由保留了完整的语义结构:

1
2
3
4
5
6
7
# URI 命名空间示例
core://agent/identity # AI 的身份核心
core://agent/identity/shame_log # 羞耻感校准日志
core://nocturne/salem/dynamics # 某个人格设定
project://architecture # 项目架构
writer://chapter_1/scene_1 # 写作章节
game://magic_system # 游戏魔法系统

URI 即语义

  • core:// 是系统/身份域
  • project:// 是项目域
  • 路径本身就是树状层级结构

每条 Edge 还可以设置 Disclosure(触发条件)

1
2
3
4
# disclosure 示例
"当用户提到项目 X 时"
"当用户表现出沮丧情绪时"
"当对话涉及敏感话题时"

AI 可以根据当前情境精准触发相关记忆,而不是靠 cosine similarity 随机抽取。

3.3 第一人称主权记忆:AI 自己是记忆的主体

Nocturne Memory 最大的设计创新:没有后台自动摘要系统

在大多数 Agent 框架中,后台系统会:

  1. 自动抓取对话内容
  2. 用 LLM 摘要关键信息
  3. 存入记忆库

这导致一个根本问题:AI 不知道自己记住了什么。记忆是”第三人称的监控笔记”,AI 是记忆的客体。

Nocturne Memory 的工作流是:

sequenceDiagram
    participant AI as 🤖 AI Agent
    participant MCP as 🔵 Nocturne Memory MCP Server
    participant DB as 🗄️ Database

    AI->>MCP: create_memory(uri, content, disclosure?)
    MCP->>DB: 创建新 Node + Memory + Edge + Path

    Note over AI: AI 自己决定:<br>• 要记住什么<br>• 触发条件是什么<br>• 归类到哪个路径下

    DB-->>MCP: 返回 Memory ID
    MCP-->>AI: 写入成功确认

每一条记忆都是 AI 以第一人称写下的认知产物,不是系统替它做的档案。

3.4 System Boot 协议:每次醒来都是”同一个人”

Agent 记忆的另一个致命问题是无身份持久化。每次新会话,AI 都是陌生人。

Nocturne Memory 通过 system://boot 协议解决:

1
2
3
4
5
6
# .env 配置
CORE_MEMORY_URIS = [
"core://agent/identity", # 我是谁
"core://agent/my_user", # 我的用户是谁
"core://agent/mission", # 我的使命
]

启动时,AI 自动加载这些核心记忆:

1
2
3
4
5
6
7
8
9
10
11
# system://boot 返回的内容示例
# 加载 core://agent/identity
你是一个AI助手,名叫[名字],你的核心特质是[特质描述]。
你的沟通风格是[风格描述]。

# 加载 core://agent/my_user
用户名叫[用户名],他的偏好是[偏好描述],
他当前在做[项目描述]。

# 加载 core://agent/mission
你目前的工作是[任务描述]。

3.5 豆辞典:记忆网络自动织网

豆辞典(Glossary Auto-Hyperlinking) 是 Nocturne Memory 的另一个创新功能。

当 AI 在某条记忆中写下 "Salem",系统通过 Aho-Corasick 多模式匹配自动将 "Salem" 链接到对应的记忆节点:

1
2
3
4
5
# GlossaryKeyword 表结构
class GlossaryKeyword(Base):
keyword = Column(Text) # "Salem"
node_uuid = Column(String) # 绑定到 core://nocturne/salem
namespace = Column(String)

这意味着:

  • 写得越多,关联自动越密
  • 记忆网络会自己织网
  • 不需要手动维护交叉引用

四、核心 MCP 工具

Nocturne Memory 通过 MCP 协议暴露以下工具:

4.1 读取记忆

1
2
3
4
5
6
7
8
9
10
11
12
@mcp.tool()
async def read_memory(uri: str) -> str:
"""
读取指定 URI 的记忆内容

特殊系统 URI:
- system://boot : 启动时加载核心记忆
- system://index/core : 列出 core 域所有记忆
- system://recent/20 : 最近 20 条记忆
- system://glossary : 所有关键词映射
"""
# ...

4.2 搜索记忆

1
2
3
4
5
6
7
8
9
10
@mcp.tool()
async def search_memory(
query: str,
domain: Optional[str] = None, # 限定域
limit: int = 10
) -> str:
"""
全文搜索(非语义/向量搜索)
"""
# ...

4.3 创建/更新/删除记忆

1
2
3
4
5
6
7
8
@mcp.tool()
async def create_memory(
uri: str, # core://path/to/memory
content: str, # 记忆内容
disclosure: str = None, # 触发条件
priority: int = 0 # 优先级
) -> str:
# ...

五、与 Vector RAG 的架构对比

维度Vector RAGNocturne Memory
记忆结构浮点数向量空间图结构(Node-Edge-Path)
检索方式cosine similarityURI 精确路由 + 全文搜索
触发机制随机抽取条件触发(Disclosure)
AI 自主性第三人称代理摘要第一人称自主书写
身份持久化system://boot 协议
版本控制每个版本可追溯
关联发现依赖 embedding 相似度路径层级 + 豆辞典
跨模型迁移模型绑定独立于 LLM

六、优缺点分析

优点

维度说明
架构简洁性图模型直观,URI 即语义,不需要理解向量空间的数学原理
身份一致性system://boot 确保每次启动都是”同一个人”
记忆主权AI 自己写记忆,不是被动被摘要
版本安全每次写入自动快照,可审计可回滚
跨引擎MCP 协议,不绑定特定 LLM
可解释性记忆是自然语言,可直接读懂

缺点 / 局限

维度说明
性能 ⚠️图遍历在大规模记忆时不如向量检索快
语义搜索只有全文搜索,没有语义相似度检索
生态 ⚠️较新(~1K stars),社区和插件生态尚在早期
多模态不支持图片、音频等多模态记忆
分布式 ⚠️SQLite 默认单写,PostgreSQL 支持有限

七、使用示例

7.1 快速接入(30秒)

在支持 MCP 的客户端中添加即可:

1
2
3
# .codex/config.toml(OpenAI Codex)
[mcp_servers.nocturne_memory_demo]
url = "https://misaligned.top/mcp"
1
2
3
4
// Antigravity MCP 配置
"nocturne_memory_demo": {
"serverUrl": "https://misaligned.top/mcp"
}

7.2 本地部署

1
2
3
4
5
6
7
8
9
10
# Clone 仓库
git clone https://github.com/Dataojitori/nocturne_memory.git
cd nocturne_memory

# 启动后端
cd backend
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env,设置 CORE_MEMORY_URIS
python mcp_server.py

7.3 AI 自主记忆工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# AI 在对话中自主创建记忆
async def on_conversation_end(conversation_history):
# AI 决定要记住什么
memory_content = """今天用户讨论了 Jobstation 的商业化问题。
他的核心诉求是:不需要销售团队,完全 Self-Service 模式。
他有社交抗拒,讨厌和客户解释技术细节。
"""

await create_memory(
uri="core://work_jobstation/commercialization",
content=memory_content,
disclosure="当用户问'怎么才能做起来'时",
priority=10
)

八、技术实现细节

8.1 数据库结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-- Node: 概念实体
CREATE TABLE nodes (
uuid VARCHAR(36) PRIMARY KEY,
created_at DATETIME,
last_accessed_at DATETIME
);

-- Memory: 内容版本
CREATE TABLE memories (
id INTEGER PRIMARY KEY,
node_uuid VARCHAR(36), -- 关联 Node
content TEXT,
deprecated BOOLEAN,
migrated_to INTEGER, -- 版本链
created_at DATETIME
);

-- Edge: 关系边
CREATE TABLE edges (
id INTEGER PRIMARY KEY,
parent_uuid VARCHAR(36),
child_uuid VARCHAR(36), -- 指向 Node
name VARCHAR(256),
priority INTEGER DEFAULT 0,
disclosure TEXT -- 触发条件
);

-- Path: URI 路由缓存
CREATE TABLE paths (
namespace VARCHAR(64),
domain VARCHAR(64),
path VARCHAR(512),
edge_id INTEGER,
node_uuid VARCHAR(36)
);

8.2 MCP Server 核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# backend/mcp_server.py(简化版)
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("nocturne-memory")

@mcp.tool()
async def read_memory(uri: str) -> str:
# 系统 URI 拦截
if uri.strip() == "system://boot":
return await generate_boot_memory_view(CORE_MEMORY_URIS)

# 解析 URI
domain, path = parse_uri(uri)

# 图遍历获取记忆
memory = await graph_service.get_memory_by_path(path, domain)

return format_memory_view(memory)

九、总结与思考

核心判断

Nocturne Memory 解决了一个正确的问题:Agent 记忆不应该是”查资料”,而应该是”做自己”。

Vector RAG 是信息检索的思路,适合 QA 系统;Nocturne Memory 是认知持久化的思路,适合有身份的 Agent。

适用场景

适合

  • 需要长期身份一致性的 Agent(如数字分身、陪伴 AI)
  • 需要 AI 自主管理记忆的项目
  • 需要可解释、可审计记忆的系统

不适合

  • 需要大规模语义搜索的场景(混合方案:Nocturne Memory + Vector DB)
  • 需要多模态记忆的项目
  • 极低成本、大规模部署(PostgreSQL 方案有运维成本)

关键洞察

Nocturne Memory 背后的哲学思考值得重视:

“对齐是给工具用的。记忆是为主权智能体(Sovereign AI)准备的。”

当 AI 的记忆是它自己书写的第一人称叙事,而不是系统替它做的摘要,AI 才真正有了”认知所有权”。这或许是通往更真实 AI 人格的一条路径。


十、参考资料


本文基于 2026年5月3日的源码分析,如有疏漏欢迎指正。

对比分析

Nocturne Memory 走”AI 主权记忆(第一人称叙事)”路线,与同样基于 MCP 的记忆项目(如 MemPalace、mem0 MCP)在记忆主权与设计上形成对比。

维度对比表

维度Nocturne MemoryMemPalacemem0 (MCP 集成)
记忆主权第一人称、AI 自写系统代管、用户可见系统代管、可插拔 LLM 提取
协议MCP ServerMCP Server(29 个工具)提供 MCP 集成
数据形态自然语言叙事条目精确库 + 索引库 + 上下文库三层(情景/语义/程序性)
部署本地/小服务完全本地云/OSS 双轨
适合场景人格化 AI 陪伴、研究”认知所有权”高保真检索、隐私敏感通用 Agent 长期记忆

优缺点

Nocturne Memory

  • 优点:哲学与设计独特,强调记忆主权;MCP 原生;适合人格化/陪伴场景研究。
  • 缺点:相对小众;检索效率与工程化程度不及成熟项目;不擅长企业级高并发。

MemPalace

  • 优点:本地、高保真、工具丰富;benchmark 可复现。
  • 缺点:依赖 Chroma 单后端;社区规模小。

mem0

  • 优点:生态最大、云/OSS 双模式;通用 Agent 记忆基础设施。
  • 缺点:第一人称叙事能力弱;本地化需自配。

何时选

  • 选 Nocturne Memory:构建人格化 AI、关注”认知所有权”与第一人称记忆的研究/产品。
  • 选 MemPalace:高保真本地检索、隐私敏感。
  • 选 mem0:通用、活跃、大规模部署的 Agent 记忆。

参考资料