跨模型记忆层实战
架构实现细节
这个系统的链路是:捕获 → 提取 → 存储 → 检索。
1. 自动化捕获
我写了一个 Chrome MV3 扩展,直接监听 Claude、ChatGPT、Gemini 等页面的 DOM 变化,被动读取对话内容。这样就省去了手动复制或点击“保存”的步骤。
2. 原子化提取
原始对话记录噪音太大,直接存入向量数据库会导致检索精度下降。我使用了 Redis + Arq 作为后台异步任务队列,调用 LLM 将长对话蒸馏成“原子记忆”(Atomic Memories)——即单一的事实、决策或偏好。
3. 存储与索引
底层选用 Postgres + pgvector。每一条原子记忆都会生成一个 Embedding,语义相关的记忆会通过图结构连接,而不是简单的扁平列表。
4. 基于 MCP 的检索
这是最关键的一步。我开发了一个 MCP 服务器(mind-silo-mcp),通过 MCP 协议向 Claude Desktop、Claude Code 和 Cursor 暴露三个工具接口。这样 AI 就可以直接查询记忆图谱,或者在对话中实时写入新记忆。
5. 加密机制
采用了每用户独立的 AES-256 加密,密钥派生后存储。这意味着删除数据可以通过“加密粉碎(Crypto-shred)”实现:直接销毁密钥,数据在物理层面不可恢复。
技术栈清单
- 后端: FastAPI (Python 3.12, uv)
- 前端: Next.js 14 + Three.js (用于 3D 记忆可视化)
- 数据库: Postgres + pgvector
- 队列: Redis/Arq
- 部署: Render + Vercel
- 包管理: pnpm monorepo
避坑指南:语义冲突问题
在实操过程中我发现,单纯靠向量检索(Vector Search)有个巨大的坑:时序正确性(Temporal Correctness)。
举个具体场景:我在 3 月份告诉 AI 我在用 Postgres,6 月份我迁移到了 SQLite。此时向量数据库里同时存在这两条冲突的记忆。由于语义高度相关,AI 在检索时可能会随机抽到其中一条,甚至把两者混在一起回答。
目前的临时解法是引入“带有效期窗口的有向边(Typed Edges with Validity Windows)”。即给记忆增加时间戳和覆盖关系,当新记忆出现时,标记旧记忆为“已失效”。
3D 可视化的实际意义
起初我用 Three.js 做那个 3D 大脑可视化只是为了好玩,但实测发现这极大降低了认知成本。传统的记忆库都是文本列表,面对 400 条以上的记忆碎片,人类根本无法快速概览。而将记忆点作为节点,语义连接作为边,通过颜色区分主题,这种空间分布能让人一眼看出自己的知识簇在哪里。
如果你在做类似的大模型工作流,可以参考这个 MCP 的部署逻辑:
# 假设你已经安装了 MCP 客户端,在配置中添加:
{
"mcpServers": {
"mind-silo": {
"command": "npx",
"args": ["-y", "@mind-silo/mcp-server"],
"env": {
"MIND_SILO_API_KEY": "your_api_key_here"
}
}
}
}这个方案把 AI 从“单次会话”变成了“持续进化”,真正实现了跨工具的上下文同步。