关联记忆图服务

为LLM代理提供的N:M关联记忆图服务,通过键/值图实现多跳关联记忆检索。

  • by donggyun112
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 donggyun112/mcp-super-memory

使用说明

mcp超级存储器

N: LLM代理的M关联内存图——作为MCP服务器交付。

搜索 “牛顿” → reach “草莓” 通过共享密钥。 仅仅嵌入相似性并不能做到这一点。

mcp-super-memory 是一个用于LLM代理的关联存储系统,基于 键/值图 --不是矢量存储。记忆存在于 价值空间,通过单独的 密钥空间 --一个存储器可以通过多个键访问,一个键可以访问多个存储器。这使得像人类一样的联想跳跃(多跳图遍历)成为可能,而纯嵌入搜索根本无法复制。

适用于: 克劳德桌面·克劳德代码·任何兼容MCP的LLM代理


为什么不只是嵌入?

每个现有的内存系统(Mem0、A-MEM、MemGPT)都将内存存储为节点,并通过嵌入相似性来检索它们。这一直有效,直到它不起作用:

Query: "Newton"
Embedding search finds: "Newton discovered gravity" ✅
Embedding search misses: "user likes strawberries"   ❌

超级记忆找到了两者——因为“牛顿”→ 苹果存储器→ 水果钥匙→ 草莓记忆。这 路径存在于密钥图中,而不是嵌入空间。


运作原理

Key Space (concepts)         Value Space (memories)
─────────────────────        ──────────────────────────────
[Newton]  ──────────────────→ "Newton discovered gravity"
[apple]   ────────┬─────────→      ↑ same memory
[gravity] ────────┘
                  │
[apple]   ────────┼─────────→ "apples are red fruit"
[fruit]   ──────┬─┘
[red]     ──────┤
                │
[fruit]   ──────┼─────────→ "user likes strawberries"
[strawberry]────┘

搜索 "Newton" → 火柴 [Newton], [apple] 按键(1键)→ 跟随共享 [fruit] key → 达到草莓记忆(2跳,分数衰减0.3倍)。

结果包括 hop 领域 --你总是知道结果是直接的还是关联的。


主要特点

功能 超级内存 A-MEM Mem0 MemGPT
键/值分离 ✅ N: M ❌ ❌ ❌
关联多跳 ✅ 内置 ❌ ❌ ❌
深度系统 ✅ ❌ ❌ 部分
内存版本控制 ✅ 替代 覆盖 覆盖 ❌
时间衰减 ✅ 深度加权 ❌ ❌ ❌
密钥类型 ✅ 概念/名称/proper_noun ❌ ❌ ❌
密钥合并(IDF) ✅ ❌ ❌ ❌
双路径召回 ✅ 关键字+内容 ❌ ❌ ❌

深度系统

每个记忆都有一个深度分数 0.0 → 1.0:

阶段 深度 行为
浅 < 0.3 最近,未经证实。易于更新或遗忘。
中等 0.3–0.7 已多次确认。稳定。
深 > 0.7 公认的事实。抵制纠正。

深度增加 +0.05 每次召回。深层记忆会随着时间的推移而慢慢衰退。如果你试图纠正一个深层记忆,它会抵制——即使在取代之后,它的深度也会保持更高。

密钥类型

并非所有按键的行为都应该相同。名字在语义上不应该匹配——“hand건”不应该仅仅因为它们都是简短的韩语单词而与“纽约时报”匹配。

类型 匹配 用例
concept (默认) 嵌入相似度≥0.35 主题、类别、属性
name 仅完全匹配 人名
proper_noun 仅完全匹配 品牌、地点

Name/proper_noun密钥也会受到IDF惩罚(×0.5)当它们成为连接到许多内存的中心键时,可以防止它们污染无关的搜索。

版本控制(不覆盖)

"user lives in Seoul"   (depth: 0.4 → weakened to 0.12, preserved)
        ↑ superseded by
"user moved to Busan"   (depth: 0.0, new)

与A-MEM在进化过程中覆盖内存不同,Super memory保留了完整的历史。每一次修正都是可追溯的——信念是什么时候改变的,从什么时候开始?

密钥合并

Add key "파이썬"  → finds existing "Python" (similarity 0.87 > threshold 0.85)
                 → reuses existing key instead of creating duplicate

防止密钥空间碎片化。跨语言或措辞的相同概念保持统一。

双路径召回

Recall同时搜索两条路径:

  • 路径A(密钥匹配): 查询嵌入→ 匹配密钥→ 点击链接→ 回忆
  • 路径B(内容匹配): 查询嵌入→ 直接与内存内容嵌入进行比较

两条路径的得分相加。这确保了即使没有用正确的密钥标记记忆,也能找到它们。


建筑

┌─────────────────────────────────────────────────────────┐
│                      Key Space                          │
│   [name] [동건] [programming] [python] [fruit] [red]   │
│      ↓      ↓         ↓           ↓       ↓      ↓     │
│   [vec]  [exact]    [vec]       [vec]   [vec]  [vec]   │
└────────────────────────┬────────────────────────────────┘
                         │ N:M links
                         ↓
┌─────────────────────────────────────────────────────────┐
│                     Value Space                         │
│   "user's name is Donggeon"     depth: 0.85  (deep)    │
│   "user likes Python"           depth: 0.30  (medium)  │
│   "user likes strawberries"     depth: 0.05  (shallow) │
└─────────────────────────────────────────────────────────┘

召回算法(2跳):

  1. 嵌入查询→ 查找匹配的关键字(概念:相似度≥0.35,name/proper_noun:完全匹配)
  2. 还可以将查询嵌入直接与内存内容嵌入进行比较(≥0.3)
  3. 点击链接→ 收集记忆,汇总分数(多个关键匹配相加,IDF加权)
  4. 对于每个1小时内存:请按照以下步骤操作 它的 keys → 找到2跳记忆(分数× HOP_DECAY = 0.3)
  5. 应用深度系数(0.5 + depth × 0.5)时间衰减(深度加权,30天半衰期)
  6. 返回排名结果 hop 领域

MCP工具

存储系统通过MCP公开8个工具:

工具 说明
recall(query, top_k) N:M搜索,2跳关联遍历+内容匹配
remember(content, keys, key_types?) 使用关键概念和可选类型注释节省内存
correct(memory_id, content, keys?) 版本更新——旧内存保留但减弱
related(memory_id) 查找记忆共享密钥(关联探索)
forget(memory_id) 永久删除
get_conversation(session_id, turn?) 加载原始对话回合
list_memories() 列出所有存储的内存,包括按键、深度、访问次数
memory_stats() 获取当前密钥/内存/链接计数

系统提示模板也可通过以下方式获得 memory_system_prompt MCP提示——包括它来指示代理安静地回忆,使用不同的密钥,并且永远不要向用户提及内存系统。


快速入门(MCP服务器)

克劳德桌面

添加 claude_desktop_config.json:

OpenAI嵌入:

{
  "mcpServers": {
    "mcp-super-memory": {
      "command": "uvx",
      "args": ["mcp-super-memory"],
      "env": {
        "OPENAI_API_KEY": "your-openai-api-key"
      }
    }
  }
}

本地嵌入(不需要API密钥):

{
  "mcpServers": {
    "mcp-super-memory": {
      "command": "uvx",
      "args": ["mcp-super-memory[local]"],
      "env": {
        "EMBEDDING_BACKEND": "local"
      }
    }
  }
}

克劳德代码

# OpenAI embeddings
claude mcp add mcp-super-memory -e OPENAI_API_KEY=your-openai-api-key -- uvx mcp-super-memory

# Local embeddings (no API key required)
claude mcp add mcp-super-memory -e EMBEDDING_BACKEND=local -- uvx "mcp-super-memory[local]"

手册/开发

git clone https://github.com/donggyun112/mcp-super-memory
cd super-memory

创建 .env:

OPENAI_API_KEY=your-openai-api-key
OPENAI_EMBEDDING_MODEL=text-embedding-3-small

或者使用本地嵌入(不需要API密钥):

EMBEDDING_BACKEND=local
LOCAL_EMBEDDING_MODEL=paraphrase-multilingual-MiniLM-L12-v2  # optional, this is the default

注: 在现有数据上混合后端会破坏召回。如果切换后端,请清除 ~/.super-memory/graph.json 第一。

uv sync
uv run mcp-super-memory

要求:

  • Python 3.12+
  • OpenAI API密钥(用于嵌入)-或 sentence-transformers 用于本地嵌入

数据存储

所有数据都是本地的。不需要外部数据库。

data/
├── graph.json          # keys, memories, links
└── conversations/
    └── {session_id}.jsonl   # original conversation turns

局限性

  • 线性扫描 --适合个人使用(约10k内存)。计划大规模集成FAISS/ChromaDB。
  • 最多2跳 --更深的关联链需要 related() 代理调用工具。
  • 代理商质量问题 --按键选择打开 remember 影响检索质量。系统提示调优很重要。

与A-MEM的比较

A-MEM(NeurIPS 2025)专注于 记忆进化 --当新的记忆到来时,现有记忆的描述会更新。Super Memory专注于 存储器存取 --如何通过关联路径到达正确的内存。

他们解决不同的问题。A-MEM问“我们如何保持记忆井井有条?”超级记忆问“我们是如何以人类实际思考的方式找到记忆的?”

版本控制方法也不同:A-MEM覆盖进化(仅当前状态),超级内存保留历史(完整时间线)。


路线图

  • []FAISS/ChromaDB用于标尺
  • []编码代理配置文件(代码上下文的不同关键策略)
  • []内存导出/导入
  • []多用户支持

许可证

麻省理工学院