Skip to main content

N:M Associative Memory System for LLM Agents

Project description

Super Memory

Search "Newton" → reach "strawberry" through shared keys. Embedding similarity alone can't do this.

An N:M associative memory system for LLM agents. Memories live in a Value Space, accessed through a separate Key Space — one memory reachable via many keys, one key leading to many memories. This enables human-like associative leaps that vector search fundamentally cannot.


Why Not Just Embeddings?

Every existing memory system (Mem0, A-MEM, MemGPT) stores memories as nodes and retrieves them by embedding similarity. This works until it doesn't:

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

Super Memory finds both — because "Newton" → apple memory → fruit key → strawberry memory. The path exists in the key graph, not in embedding space.


How It Works

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]────┘

Search "Newton" → matches [Newton], [apple] keys (1-hop) → follows shared [fruit] key → reaches strawberry memory (2-hop, score decayed by 0.3×).

Results include hop field — you always know if a result is direct or associative.


Key Features

Feature Super Memory A-MEM Mem0 MemGPT
Key/Value separation ✅ N:M
Associative multi-hop ✅ built-in
Depth system partial
Memory versioning ✅ supersede overwrites overwrites
Time decay ✅ depth-weighted
Key types ✅ concept/name/proper_noun
Key merge (IDF)
Dual-path recall ✅ key + content

Depth System

Every memory has a depth score 0.0 → 1.0:

Stage Depth Behavior
Shallow < 0.3 Recent, unverified. Easy to update or forget.
Medium 0.3–0.7 Confirmed multiple times. Stable.
Deep > 0.7 Well-established fact. Resists correction.

Depth increases +0.05 each recall. Deep memories decay slower over time. If you try to correct a deep memory, it resists — its depth stays higher even after supersede.

Key Types

Not all keys should behave the same. Names shouldn't match semantically — "동건" shouldn't match "뉴턴" just because they're both short Korean words.

Type Matching Use Case
concept (default) Embedding similarity ≥ 0.35 Topics, categories, attributes
name Exact match only Person names
proper_noun Exact match only Brands, places

Name/proper_noun keys also get IDF penalty (×0.5) when they become hub keys connected to many memories, preventing them from polluting unrelated searches.

Versioning (not overwriting)

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

Unlike A-MEM which overwrites memory on evolution, Super Memory keeps the full history. Every correction is traceable — when did the belief change, and from what session?

Key Merging

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

Prevents key space fragmentation. Same concept across languages or phrasing stays unified.

Dual-Path Recall

Recall searches two paths simultaneously:

  • Path A (key matching): Query embedding → match keys → follow links → memories
  • Path B (content matching): Query embedding → directly compare against memory content embeddings

Scores from both paths are summed. This ensures memories are found even when they weren't tagged with the right keys.


Architecture

┌─────────────────────────────────────────────────────────┐
│                      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) │
└─────────────────────────────────────────────────────────┘

Recall algorithm (2-hop):

  1. Embed query → find matching keys (concept: similarity ≥ 0.35, name/proper_noun: exact match)
  2. Also compare query embedding directly against memory content embeddings (≥ 0.3)
  3. Follow links → collect memories, aggregate scores (multiple key matches sum up, IDF-weighted)
  4. For each 1-hop memory: follow its keys → find 2-hop memories (score × HOP_DECAY = 0.3)
  5. Apply depth factor (0.5 + depth × 0.5) and time decay (depth-weighted, 30-day half-life)
  6. Return ranked results with hop field

MCP Tools

The memory system exposes 8 tools via MCP:

Tool Description
recall(query, top_k) N:M search with 2-hop associative traversal + content matching
remember(content, keys, key_types?) Save memory with key concepts and optional type annotations
correct(memory_id, content, keys?) Versioned update — old memory preserved but weakened
related(memory_id) Find memories sharing keys (associative exploration)
forget(memory_id) Permanently delete
get_conversation(session_id, turn?) Load original conversation turns
list_memories() List all stored memories with keys, depth, access count
memory_stats() Get current key/memory/link counts

A system prompt template is also available via memory_system_prompt MCP prompt — include it to instruct the agent to recall silently, use diverse keys, and never mention the memory system to users.


Quick Start (MCP Server)

Claude Desktop

Add to claude_desktop_config.json:

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

Claude Code

claude mcp add mcp-super-memory -- uvx mcp-super-memory

Manual / Development

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

Create .env:

OPENAI_API_KEY=your-openai-api-key
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
uv sync
uv run mcp-super-memory

Requirements:

  • Python 3.12+
  • OpenAI API key (for embeddings)

Data Storage

All data is local. No external database required.

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

Limitations

  • Linear scan — suitable for personal use (~10k memories). FAISS/ChromaDB integration planned for larger scale.
  • 2-hop max — deeper associative chains require related() tool calls by the agent.
  • Agent quality matters — key selection on remember affects retrieval quality. System prompt tuning is important.

Comparison with A-MEM

A-MEM (NeurIPS 2025) focuses on memory evolution — when new memories arrive, existing memories' descriptions update. Super Memory focuses on memory access — how to reach the right memory through associative paths.

They solve different problems. A-MEM asks "how do we keep memories well-organized?" Super Memory asks "how do we find memories the way humans actually think?"

The versioning approach also differs: A-MEM overwrites on evolution (current state only), Super Memory preserves history (full timeline).


Roadmap

  • FAISS/ChromaDB for scale
  • Coding agent profile (different key strategies for code context)
  • Memory export/import
  • Multi-user support

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_super_memory-0.2.1.tar.gz (50.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_super_memory-0.2.1-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file mcp_super_memory-0.2.1.tar.gz.

File metadata

  • Download URL: mcp_super_memory-0.2.1.tar.gz
  • Upload date:
  • Size: 50.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcp_super_memory-0.2.1.tar.gz
Algorithm Hash digest
SHA256 9bff7f7a2b6d03f0a15c94ff8791e396f714dae3db4f57e9b2978990a1d25ed7
MD5 f896e85b41e83b89c31e5c53c868ce6e
BLAKE2b-256 2e8334bd0387669361dfc3d198508ee873ff16564a3dbc05d87c1d15a8b40ed4

See more details on using hashes here.

File details

Details for the file mcp_super_memory-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: mcp_super_memory-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 14.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcp_super_memory-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6846674c908ffd34f1d0c4e11d11a989c52ab525cead2716fa3fee280a107f1d
MD5 39146e5f7b469e209d95a740f3bd215a
BLAKE2b-256 e68ad3fcfe7b54274bd0e256b0bd2fb47d8f3ac657c8ce5b8280450c20c9211e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page