Cross-Session-Memory für KI-Agenten: Mem0, SQLite oder ein eigener ONNX-Server?
Neben einem MCP-Server für Zotero nutze ich für KI-Coding-Agenten wie Kimi Code noch einen zweiten, thematisch eigenständigen MCP-Server: ein sitzungsübergreifendes Gedächtnis. Beide Bausteine ergänzen sich, sind aber unabhängig voneinander einsetzbar. Dieser Beitrag dokumentiert, welche Alternativen ich geprüft habe, wofür ich mich entschieden habe und warum.
📋 Inhalt dieser Seite
- Ausgangslage – welche Memory-Dateien es schon gibt
- Was war das Problem?
- Geprüfte Alternativen – von reinem Markdown bis Hindsight
- Die gewählte Lösung im Detail – ONNX statt PyTorch
- Warum ONNX?
- Erwartungen und Grenzen
- Fazit
- Download – Setup-Paket und Knowledge-Export für KI-Agenten
Ausgangslage: welche Memory-Dateien gibt es schon?
Kimi Code liest bei jedem Start drei Arten von Memory-Dateien:
| Tool | Zweck |
|---|---|
memory_store | Notiz mit Tags und Quelle speichern |
memory_update | Bestehende Notiz ändern (Content/Tags/Source; Re-Embedding nur bei Inhaltsänderung) |
memory_search | Hybrid-Suche (Vektor + FTS5, RRF-Fusion) |
memory_get | Einzelne Notiz per ID abrufen |
memory_recent | Zuletzt gespeicherte Notizen anzeigen (Standard max. 20) |
memory_delete | Notiz inkl. Vektor- und FTS-Eintrag löschen |
memory_status | Status der Datenbank anzeigen (Notizen / Vektoren / FTS-Einträge) |
Diese Dateien funktionieren gut für explizite, langfristige Regeln. Sie sind aber schwach bei zwei Dingen:
- Unstrukturierte oder halbstrukturierte Informationen – zum Beispiel: „Vor drei Wochen hat der Nutzer erwähnt, dass er X bevorzugt.” Solche Fakten müssen manuell in die richtige Markdown-Datei eingepflegt werden.
- Wiederfinden über viele Sitzungen hinweg – Wenn Informationen in
MEMORY.mdverstreut sind, müssen sie beim Start alle gelesen oder gezielt durchsucht werden. Bei wachsendem Umfang wird das ineffizient.
Was war das Problem?
Trotz der Memory-Dateien blieb das sitzungsübergreifende Gedächtnis begrenzt, weil:
- nicht jede Information manuell in eine Markdown-Datei eingetragen wird,
- die Suche in statischen Dateien nicht semantisch ist,
- der Kontext einer laufenden Sitzung komprimiert wird – dabei können Details verloren gehen, die nicht in den Memory-Dateien stehen.
Geprüfte Alternativen
1. Nur Markdown-Dateien weiter ausbauen
Das Einfachste: mehr Dateien, bessere Struktur, längere MEMORY.md.
- Vorteil: keine Installation, vollständig transparent, versionskontrollierbar.
- Nachteil: manuelle Pflege, keine semantische Suche, schlechte Skalierbarkeit.
2. Mem0 / OpenMemory MCP-Server
Mem0 ist ein bekannter Memory-Dienst für KI-Agenten.
- Problem: Der offizielle
mem0-mcpist archiviert und cloud-lastig. Ein lokaler OpenMemory-Branch war nicht mehr auffindbar – nur Weiterleitungen in der Dokumentation. - Fazit: nicht für einen rein lokalen, offline-fähigen Betrieb geeignet.
3. Eigener SQLite-Server ohne Embeddings
Eine einfache Datenbank mit Volltextsuche.
- Vorteil: schlank, offline, schnell.
- Nachteil: keine semantische Suche; man müsste exakte Schlüsselwörter kennen.
4. Memory-MCP-Server mit PyTorch / Transformers
Ein eigener Python-Server mit fastmcp + sentence-transformers + sqlite-vec.
- Vorteil: lokale Embeddings, semantische Suche, vollständig offline.
- Nachteil: Die Python-Umgebung allein benötigte ca. 1,4 GB. Nach temporären Dateien blieben nur noch ca. 900 MB freier Speicher – der Versuch wurde deshalb abgebrochen.
5. Hindsight (Vectorize)
Hindsight ist vermutlich die funktional mächtigste geprüfte Alternative: Statt nur Text-Embeddings zu speichern, extrahiert es strukturierte Fakten, löst Entitäten auf, baut daraus einen Wissensgraphen auf und aktualisiert daraus automatisch „mentale Modelle". Die drei Kernoperationen heißen passend retain (speichern), recall (suchen) und reflect (schlussfolgern), ergänzt um Cross-Encoder-Reranking der Suchergebnisse.
- Vorteil: deutlich mehr als reine Ähnlichkeitssuche – strukturierte Wissensrepräsentation, die auch Zusammenhänge zwischen Fakten abbildet.
- Nachteil (Einrichtungsaufwand): Hindsight ist kein einzelnes Skript, sondern ein kleiner Dienste-Verbund (u. a. Backend-Service, Dashboard, MCP-Server), der eine PostgreSQL-Datenbank mit Vektor-Erweiterung (pgvector oder vergleichbar) voraussetzt und typischerweise per Docker Compose betrieben wird – Installation und Konfiguration (.env, Datenbankanbindung, ggf. mehrere Container) sind ungleich aufwendiger als ein einzelnes Python-Venv.
- Nachteil (Ressourcenbedarf): Für die Wissensgraph-Extraktion braucht Hindsight zusätzlich ein LLM – entweder eine bezahlte Cloud-API pro Speichervorgang oder ein lokales Modell über Ollama. Für lokale Verarbeitung in überzeugender Qualität nennt der Hersteller selbst deutlich größere Modelle (bis hin zu Varianten, die rund 80 GB RAM oder eine dedizierte GPU benötigen); kleinere lokale Modelle laufen zwar auch, mit Abstrichen bei der Extraktionsqualität. Gegenüber der gewählten Lösung (ein rund 275 MB großes Venv plus 112,8 MB Embedding-Modell (
multilingual-e5-small), ganz ohne zusätzlichen LLM-Aufruf pro Notiz) ist das ein deutlich größerer Fußabdruck.
Für die Linux-VM ohne GPU und mit begrenztem Speicherplatz kam Hindsight damit nicht infrage – nicht weil es technisch schwächer wäre, im Gegenteil, sondern weil Aufwand und Ressourcenbedarf für den angestrebten Zweck (ein schlankes, schnell wiederfindbares Sitzungsgedächtnis) deutlich über dem lagen, was nötig ist.
6. Memory-MCP-Server mit ONNX (die gewählte Lösung)
Statt PyTorch verwendet der Server onnxruntime mit einem quantisierten, multilingualen Embedding-Modell.
- Venv nur ca. 275 MB statt 1,4 GB.
- Modell 112,8 MB (
multilingual-e5-small, 12 Layer, multilingual). - Läuft auf der CPU – die Linux-VM hat keine GPU.
- Vollständig offline, mit Hybrid-Suche (Vektor + FTS5).
Die gewählte Lösung im Detail
| Komponente | Wert |
|---|---|
| Venv | ~/.venv-memory (ca. 275 MB) |
| Modell | Xenova/multilingual-e5-small, quantisiertes ONNX (112,8 MB, 384 Dimensionen, 12 Layer) |
| Datenbank | SQLite + sqlite-vec + FTS5 (Hybrid-Suche) |
| MCP-Anbindung | eigener memory-Server, in der MCP-Konfiguration des Clients eingetragen |
| Embeddings | Mean-Pooling, L2-normalisiert, E5-Prefix (query:/passage:) |
Verfügbare Tools
| Tool | Zweck |
|---|---|
memory_store | Notiz mit Tags und Quelle speichern |
memory_search | Hybrid-Suche (Vektor + FTS5, RRF-Fusion) |
memory_get | Einzelne Notiz per ID abrufen |
memory_recent | Zuletzt gespeicherte Notizen anzeigen |
memory_delete | Notiz und Vektor löschen |
memory_status | Status der Datenbank anzeigen |
Warum ONNX statt PyTorch?
- Speicherplatz: Nach dem gescheiterten PyTorch-Versuch war klar, dass nur eine schlanke Lösung infrage kommt.
- Offline-Betrieb: Der Server sollte keine Cloud-Verbindung benötigen.
- Semantische Suche: Im Gegensatz zu reinen Markdown-Dateien oder SQLite-Volltext ermöglicht sie das Wiederfinden von Informationen über Begriffsähnlichkeit statt exakter Schlüsselwörter.
- CPU-only: Die Linux-VM hat keine GPU-Unterstützung.
- Integration in den KI-Client: Als MCP-Server steht das Gedächtnis automatisch nach dem Start zur Verfügung.
Erwartungen und Grenzen
Kurzfristig
- Standard-Ablage für sitzungsübergreifend relevante Informationen.
- Schnelles Wiederfinden von Notizen über
memory_searchanhand von Stichworten oder Konzepten. - Ergänzung zu
AGENTS.md/MEMORY.md/WORKLOG.md, nicht deren Ersatz: Dauerhafte Regeln und technische Details bleiben in den Markdown-Dateien, situationsübergreifende Notizen landen primär im Memory-MCP.
Mittelfristig
- Bessere Kontinuität bei wiederkehrenden Themen, etwa Zotero-Workflows, Prompt-Versionen oder Fehlerbehebungen.
- Weniger manuelles Kopieren von Informationen in Markdown-Dateien.
- Möglichkeit, bei neuen Aufgaben gezielt auf frühere Notizen zu verweisen.
Grenzen
- Die Qualität der semantischen Suche wurde durch den Wechsel auf
multilingual-e5-small(12 Layer, multilingual) und die Hybrid-Suche (FTS5 + RRF) deutlich verbessert. Deutschsprachige Texte werden jetzt semantisch präziser erfasst, exakte Begriffe über die Volltextsuche gefunden. - Der Server speichert, was man ihm gibt. Er ersetzt keine aktive Zusammenfassung oder Planung.
- Tags helfen bei der Filterung, erfordern aber disziplinierte Pflege.
🔄 Update August 2026: Drei Optimierungen + eine wichtige Änderung
Nach dem ursprünglichen Artikel habe ich drei Optimierungen implementiert, die die Qualität der Suche deutlich verbessern:
- Multilinguales Embedding-Modell:
all-MiniLM-L6-v2wurde durchmultilingual-e5-small(12 Layer, 112,8 MB) ersetzt. Die semantische Präzision für deutsche Texte ist damit erheblich gestiegen. - Hybrid-Suche (FTS5 + Vector + RRF): Neben der Vektor-Ähnlichkeit durchsucht der Server jetzt auch per SQLite FTS5-Volltextindex (BM25). Beide Ergebnisse werden über Reciprocal Rank Fusion (RRF) kombiniert. Exakte Begriffe, Eigennamen und Versionsnummern werden so auch ohne semantische Nähe gefunden.
- Temporal Decay deaktiviert (25.8.2026): Die zeitliche Gewichtung (Exponential Decay, λ=0,005) wurde abgeschaltet. Grund: Zeitstabiles Wissen (z. B. Berechnungsregeln, Workflows) wurde durch den Decay benachteiligt. Die Hybrid-Suche (BM25 + Vector + RRF) liefert bereits gute Relevanz-Rankings, überholtes Wissen wird nun manuell gekennzeichnet. Ein Decay kann sinnvoll sein, wenn sich Wissen schnell ändert (z. B. API-Versionen, aktuelle Preise, Nachrichten) – dann lässt er sich jederzeit reaktivieren.
Fazit
Die Markdown-Dateien bleiben das Fundament für Regeln und technische Dokumentation. Der Memory-MCP-Server ergänzt sie um eine schlanke, offline-fähige, semantische Notizdatenbank mit Hybrid-Suche. Nach dem Upgrade auf multilingual-e5-small und FTS5-Volltextsuche ist die Trefferqualität für deutschsprachige Notizen und exakte Suchbegriffe deutlich gestiegen – bei nur moderat höherem Speicherbedarf (112,8 MB statt 22 MB für das Modell).
Changelog
- 3.9.2026 – Chunked Embedding (kein 512-Token-Abschnitt mehr): Notizen mit mehr als ~450 Tokens werden an Markdown-Grenzen in Chunks von maximal 450 Tokens zerlegt (mit 50 Tokens Überlappung, falls ein einzelner Absatz das Limit sprengt) und vollständig embedded. Vorher war eine lange Notiz im Vektor nur am Anfang vertreten (max. 512 Tokens) — semantische Treffer, die tief in einer langen Notiz liegen, blieben so unsichtbar. Die Suche aggregiert Chunk-Treffer pro Notiz (kleinste Distanz) und fusioniert sie wie bisher mit der Volltextsuche;
memory_statusmeldet jetzt zusätzlichchunk_entries. Das Download-Paket wurde auf diesen Stand gebracht. - 3.9.2026 – Knowledge-Dateien aktualisiert: Zotero-MCP-Knowledge auf Zoteus-v1.12.0-Stand (semantische Suche jetzt vollständig über Zoteus: 0,33–0,84 s/Query statt 93–105 s; 429-Drossel-Dials 256/8000; neue Gotchas
create_items-Quoting und Seitenverifikation), Timeline der Nutzungsregeln ergänzt (31.8.–3.9.2026). - 31.8.2026 – Automatische Backups:
setup.shrichtet jetzt automatisch einen stündlichen Backup-Job ein — Snapshot der Memory-Datenbank nur bei Änderung, 8 Tage Aufbewahrung, Wiederherstellung mit einem einzigencp-Befehl. Kein Zutun nötig; Voraussetzung istsqlite3, das das Skript ggf. selbst installiert. Dazu kommt jetzt eine Prüfroutine (verify.sh): Sie prüft venv, Python-Pakete, Modell-Dateien, Datenbank, Backup-Job und Speicherplatz und schreibt einen Markdown-Bericht nach~/.qwen/memory-install-report.md, den die KI direkt auswerten kann. (Damit behoben: Der bisherige Modell-Download überhuggingface-cliwar mit huggingface_hub ≥ 1.x still kaputt und läuft jetzt über die Python-API.) - 30.8.2026 – Server-Überarbeitung (jetzt 7 Tools): Neues Tool
memory_update(Notizen in place ändern; Re-Embedding und Index-Sync nur bei Inhaltsänderung). Selbstheilung beim Serverstart: Der FTS-Index wird aus der Content-Tabelle neu aufgebaut und fehlende Vektoren werden nachbetet — beides wird jetzt explizit committed (der alte Backfill ging beim Schließen der Verbindung verloren, weil nie committed wurde). FTS-Sync beim Löschen/Aktualisieren repariert: Bei External-Content-FTS5 erhält der Index den alten Inhalt per‘delete’-Command, bevor die Zeile verschwindet — die alte Reihenfolge hinterließ verwaiste Indexeinträge (empirisch bestätigt).memory_searchquotet Suchbegriffe einzeln und verknüpft sie per OR statt die ganze Query als Phrase zu suchen (besserer Recall bei Mehrwortfragen); Tokenizer-Truncation auf 512 Tokens (E5-Limit, verhindert ONNX-Absturz bei langen Notizen); neuer DB-Pfad-OverrideMEMORY_DB_PATHfür Tests/portable Nutzung; SQLite-Timeout 30 s gegen „database is locked“. Das Download-Paket wurde auf diesen Stand gebracht. - 28.8.2026 – Bugfix
memory_search: Treffer, die nur über die Volltextsuche (FTS5) und nicht auch über die Vektorsuche gefunden werden, ließen die gesamte Suche mit einemNoneType-Fehler abbrechen. Solche Treffer liefern jetztvector_distance: null, statt die Suche zu beenden. Das Download-Paket wurde auf diesen Stand gebracht (inkl. portabler Server-Version mit aktuellen Pfaden). - 25.8.2026 – Hybrid-Suche v2: Wechsel auf
multilingual-e5-small, Volltextsuche per FTS5, Fusion per RRF, Temporal Decay deaktiviert.
Download: Memory-MCP-Server als Setup-Paket
Das gesamte Setup (Server-Script, Installationsskript, Konfigurationsvorlage, Anleitung) gibt es als ZIP-Paket zum Selber-Installieren auf einem eigenen Linux-System:
📦 memory-mcp-setup.zip (24 KB, Stand 5.9.2026)
Neu: Das Paket richtet jetzt automatische stündliche Backups der Memory-Datenbank ein (nur bei Änderung, 8 Tage Aufbewahrung) — dein Assistent sichert sein eigenes Gedächtnis selbst. Mein Assistent pflegt sein Umfeld darüber hinaus vollautomatisch: Er aktualisiert täglich den semantischen Zotero-Index (Zoteus, text-embedding-3-small, inkrementell mit Volltext) und prüft wöchentlich auf Updates für Zoteus, Zotero und die Plugins — siehe die Automatismen-Absätze auf der Studienarbeitsplatz-Seite (§6.3, §12). Seit 4.9.2026 enthält das Paket zudem die Nutzungshinweise für Einsteiger: Die Installationsroutine kopiert nutzungshinweise.md (bzw. usage-notes.md) nach ~/.qwen/, und der §3.2-Auftrag der Studienarbeitsplatz-Anleitung lässt deinen Agenten sie als Memory-Notiz ablegen und bei jedem Start anzeigen.
⚠️ Hinweise zum Download
- Für Linux geschrieben, nicht darauf beschränkt – das Setup-Skript (
setup.sh) setzt Python 3.11+ undvenvvoraus (getestet unter Linux). Da der gesamte Server aus einem einzigen Python-Script besteht, kann jede KI das Skript lesen und die Installation auch für Windows oder macOS adaptieren. - MCP-Client erforderlich – der Server allein nützt nichts. Er wird als MCP-Server in den Client eingebunden (z. B. Qwen Code, Claude Code, Kimi Code). Die Konfiguration ist in der
README.mdbeschrieben. - Embedding-Modell wird separat geladen – das Paket enthält kein 130 MB-Modell. Der Installationsvorgang lädt es automatisch über HuggingFace herunter. Dafür ist eine Internetverbindung nötig, danach läuft der Server offline.
- Getestet auf: Linux Mint (Ubuntu 24.04 LTS), Python 3.12, Qwen Code 0.22.2 sowie Debian 13 (ChromeOS-Crostini), Python 3.13, Qwen Code 0.22.2. Andere Umgebungen können abweichen.
📄 Zotero-MCP-Knowledge für KI-Agenten (39 KB, Stand 3.9.2026) – Komprimierte Erfahrungen, Workflow-Regeln, Tool-Vergleiche und Benchmark-Ergebnisse aus der Praxis. Als Markdown-Datei, die jeder KI-Agent direkt in sein Memory-System importieren kann.
📜 Memory-MCP-Nutzungsregeln & Lernprotokoll (13 KB) – Alle Regeln für den Umgang mit dem Memory-MCP-Server: Memory-first-Pflicht, Speicher- und Pflegeregeln, Tag-Disziplin und die Lern-Timeline mit allen Zeitpunkten. Als Markdown-Datei zum direkten Import in jedes Memory-System. (Die englische Fassung steht auf der englischen Seite.)
Wer diesen Ansatz mit einem MCP-Server für Zotero kombinieren will, findet die technische Einrichtung dafür auf der Seite Zotero-MCP-Server vs. Beaver. Erfahrungen mit Kimi Code als KI-Client stehen unter Von Claude Code Sonnet zu Kimi Code K2.7-code. Einen schnellen Einstieg in Qwen Code samt Memory-MCP-Einrichtung – ein bis zwei Stunden – bietet die Seite KI-Agent in ein bis zwei Stunden.
