Files
Hermes-Memory-Next-Level/docs/research/agent-memory-solutions-2026.md
Florian Hartmann 33fb180855 Initial commit: Project structure, README, AGENTS.md, .env.example, docs
- README.md with project overview, status, architecture
- AGENTS.md with agent context and conventions
- .env.example with environment variables
- docs/research/agent-memory-solutions-2026.md (full research)
- docs/architecture/memory-tiers.md (4-tier architecture)
- docs/decisions/ADR-001-structured-memory-blocks.md
- Directory structure for src/, tests/, scripts/, logs/, data/
2026-06-03 22:25:43 +00:00

338 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Deep Research: Agent Memory & Context Rot Solutions (2026)
## Executive Summary
LLM-basierte Agenten verlieren ihren Zustand bei Context-Compression, weil Token-Limits durch verlustbehaftete Summarization oder naive Truncation "gelöst" werden. Die Lösung ist kein größeres Kontextfenster, sondern **hierarchisches, strukturiertes Memory-Management** über mehrere Tiers — von Working Memory (aktiver Prompt) bis Long-Term Memory (Vektor-Store + Knowledge Graph). Projekte wie **Letta** (OS-ähnliches Memory), **Mem0** (Multi-Level Personal Memory), und **Zep** (asynchrone Long-Term Context) adressieren das Problem aktiv. Für Hermes Agent bedeutet das: Memory muss von flachem Key-Value zu strukturierten, gelabelten Blöcken mit Entity-Linking und temporaler Abfrage werden.
---
## 1. Context Rot: Warum Agenten ihren Zustand verlieren
### Technische Ursachen
| Mechanismus | Beschreibung | Auswirkung |
|------------|-------------|------------|
| **Token-Limits** | Jedes LLM hat festes Kontextfenster (4K2M Tokens) | Ältere Nachrichten müssen entfernt werden |
| **Naive Truncation** | Einfaches Abschneiden alter Nachrichten | Kompletter Verlust aller Informationen vor dem Cutoff |
| **Summarization** | KI-generierte Zusammenfassung bei ~90% Auslastung | Verlust von Details, Nuancen, implizitem Zustand |
| **Sliding Window** | FIFO-Buffer, alte Nachrichten fallen raus | Keine Persistenz, keine Rückwärtsnavigation |
| **Session Reset** | Neue Session = leerer Kontext | Totaler Zustandsverlust ohne Memory-Injection |
### Warum Summarization zerstört
Die meisten Frameworks (LangChain, etc.) ersetzen bei Erreichen eines Schwellenwerts (typisch 90% des Kontextfensters) die ältesten Nachrichten durch eine einzelne Zusammenfassung. Das Problem:
- **Verlust von Tool-Konfigurationen**: "Wir haben gerade Docker-Compose auf Port 8080 konfiguriert" → "Docker wurde erwähnt"
- **Verlust von Präferenzen**: "Nutzer hasst Bullet-Points, mag Tabellen mit │" → "Nutzer hat Formatierungspräferenzen"
- **Verlust von Projekt-Zustand**: "Wir arbeiten an Zeile 47 in auth.service.ts" → "Es wurde an Authentifizierung gearbeitet"
- **Halluzinationen**: Der Agent "ratet", was vorher passiert ist, anstatt es zu wissen
### Der Hermes-spezifische Schmerz
Hermes nutzt `session_search` für vergangene Sessions, aber:
- **Keine automatische Memory-Extraktion**: Wichtige Fakten werden nicht automatisch aus Sessions gezogen
- **Kein Entity-Linking**: "Projekt X" in Session A und "Projekt X" in Session B sind nicht verknüpft
- **Keine Temporalität**: "Was war der letzte Stand?" kann nicht beantwortet werden
- **Memory-Tool ist manuell**: Der Nutzer muss aktiv `memory` aufrufen, um etwas zu speichern
- **Keine hierarchische Struktur**: Alles ist flaches Key-Value, keine gelabelten Blöcke
---
## 2. Memory-Architekturen für Agenten
### Memory-Typen (kognitive Psychologie)
| Typ | Beschreibung | Beispiel für Agent |
|-----|-------------|-------------------|
| **Episodic** | Konkrete Ereignisse/Episoden | "Session vom 3.6.2026: Wir haben den Kundenprozess für Waldseilgarten modelliert" |
| **Semantic** | Fakten, Konzepte, Beziehungen | "Nutzer bevorzugt Tabellen mit │-Trennern, kein SAP B1" |
| **Procedural** | Wie man Dinge tut | "Für ECC-Integration: erst CODING.md lesen, dann planen" |
| **Working** | Aktiver, kurzfristiger Kontext | "Wir sind gerade bei Zeile 47 in auth.service.ts" |
### Speicher-Mechanismen
| Mechanismus | Stärke | Schwäche | Beste für |
|------------|--------|----------|-----------|
| **Vector Stores** | Semantische Ähnlichkeitssuche | Keine strukturierten Beziehungen | Fakten, Dokumente, große Mengen |
| **Knowledge Graphs** | Strukturierte Beziehungen, Reasoning | Aufbau-Komplexität | Entitäten, Beziehungen, Projekte |
| **Structured Memory** | Typisierte Blöcke, Labels | Weniger flexibel als Vektor-Store | User-Prefs, Projekt-State, Skills |
| **Key-Value (current)** | Einfach, schnell | Keine Semantik, keine Verknüpfung | Einfache Fakten, kurze Notizen |
---
## 3. Projekte & Frameworks im Detail
### Letta (ehemals MemGPT) — OS-ähnliches Memory
| Aspekt | Details |
|--------|---------|
| **GitHub** | `letta-ai/letta` |
| **Kernidee** | Virtuelles Kontextfenster: Agent "denkt", er hat unendlichen Kontext, aber nur ein Subset ist im Prompt |
| **Memory Blocks** | Strukturierte, gelabelte Blöcke: `human`, `persona`, `project`, `preferences` |
| **Summarization** | Automatisch bei 90% Auslastung (`SUMMARIZATION_TRIGGER_MULTIPLIER = 0.9`) |
| **Passage Manager** | Alle Nachrichten persistent gespeichert, auch nach Summarization |
| **In-Context Messages** | Nur aktives Subset im Prompt, Rest aus DB geladen |
| **Self-Management** | Eigene Memory-Tools: `core_memory_append`, `core_memory_replace`, `core_memory_delete` |
| **Tool-Integration** | Agent kann selbst entscheiden, was wichtig ist und speichern |
**Relevanz für Hermes**: Letta zeigt, dass Memory nicht passiv sein darf. Der Agent muss aktiv sein eigenes Memory verwalten können — nicht nur der Nutzer.
### Mem0 — The Memory Layer for Personalized AI
| Aspekt | Details |
|--------|---------|
| **GitHub** | `mem0ai/mem0` |
| **Kernidee** | Multi-Level Memory für User, Session und Agent-State |
| **Neuer Algorithmus (Apr 2026)** | Single-pass ADD-only Extraction, Entity Linking, Multi-Signal Retrieval |
| **Retrieval** | Semantisch + BM25 + Entity Matching + Temporal Reasoning |
| **Benchmarks** | 91.6 auf LoCoMo, 94.8 auf LongMemEval |
| **Hybrid Search** | Kombination aus semantischer und Keyword-Suche |
| **API** | Einfache REST-API für Integration in bestehende Agenten |
**Relevanz für Hermes**: Mem0's Multi-Level-Approach passt perfekt zu Hermes' Profile-System. User-Memory + Session-Memory + Agent-State als separate Ebenen.
### Zep AI — Long-Term Context for AI Assistants
| Aspekt | Details |
|--------|---------|
| **GitHub** | `getzep/zep-python` |
| **Kernidee** | Asynchrone Memory-Verarbeitung, die den Chat nicht blockiert |
| **Auto-Summaries** | Generiert Zusammenfassungen aus Chat-Historie im Hintergrund |
| **Fact Extraction** | Extrahiert Fakten ohne vordefiniertes Schema |
| **Document Collections** | Vektor-Suche über Dokumente |
| **Prompt-Strukturierung** | Automatisches Hinzufügen von Recent Messages + Summary + Relevant Context |
**Relevanz für Hermes**: Zep's asynchrone Verarbeitung wäre ideal für Hermes' Cronjob-System — Memory-Extraktion im Hintergrund, nicht in der aktiven Session.
### LangChain Memory — Modularer Ansatz
| Memory-Typ | Funktion |
|------------|----------|
| `ConversationBufferMemory` | Speichert alle Nachrichten roh |
| `ConversationSummaryMemory` | Summarisiert bei Overflow |
| `VectorStoreRetrieverMemory` | RAG-basiertes Retrieval aus Vektor-Store |
| `CombinedMemory` | Kombiniert mehrere Memory-Typen |
**Relevanz für Hermes**: LangChain's modulares Design zeigt, dass Memory nicht entweder/oder sein muss. Mehrere Tiers gleichzeitig sind sinnvoll.
### AutoGPT — Historischer Pioneer
| Aspekt | Details |
|--------|---------|
| **GitHub** | `Significant-Gravitas/AutoGPT` |
| **Historisch** | Einer der ersten Agenten mit Memory-Ansatz (2023) |
| **Memory-Backends** | Lokale JSON, Redis, Pinecone, Weaviate |
| **Aktueller Fokus** | Platform/Forge statt klassisches Memory |
---
## 4. Praktische Ansätze & Patterns
### Memory-Tiers
```
┌─────────────────────────────────────────────────────────────┐
│ TIER 1: WORKING MEMORY (Aktiver Prompt) │
│ • Aktuelle Nachrichten + relevante Kontext │
│ • 4K128K Tokens (je nach Modell) │
│ • Schnellster Zugriff, höchste Relevanz │
├─────────────────────────────────────────────────────────────┤
│ TIER 2: SHORT-TERM MEMORY (Letzte N Sessions) │
│ • Vollständige Nachrichten der letzten 510 Sessions │
│ • SQLite/JSON, schneller Zugriff │
│ • Für Rückfragen zu kürzlich abgeschlossenen Tasks │
├─────────────────────────────────────────────────────────────┤
│ TIER 3: LONG-TERM MEMORY (Vektor-Store + Graph) │
│ • Embeddings für semantische Suche │
│ • Knowledge Graph für Beziehungen │
│ • Fakten, Präferenzen, Projekt-Zustände │
├─────────────────────────────────────────────────────────────┤
│ TIER 4: ARCHIVE (Vollständige Historie) │
│ • Alle Sessions, alle Nachrichten │
│ • Nur bei Bedarf durchsucht (langsame Suche) │
│ • Compliance, Audit, vollständige Rekonstruktion │
└─────────────────────────────────────────────────────────────┘
```
### Hierarchical Memory
- **Session-Ebene**: Volle Nachrichten, aktueller Zustand
- **Tages-Ebene**: Zusammenfassung der Sessions eines Tages
- **Wochen-Ebene**: Zusammenfassung der Projekte einer Woche
- **Monats-Ebene**: Langfristige Trends, gelernte Präferenzen
### Checkpoint/Restore
- Agent-State wird nach jedem signifikanten Schritt persistiert
- Bei Context-Overflow oder Fehler: Restore auf letzten Checkpoint
- Hermes-Analogon: `session_search` + Memory-Tool, aber automatisch
### Session Bridging
- Beim Start neuer Session: Relevante Memories aus vorherigen Sessions laden
- "Memory Injection": System-Prompt wird mit relevantem Kontext angereichert
- Hermes-Analogon: Aktuell manuell über `memory` tool, nicht automatisch
### Memory Injection Patterns
| Pattern | Beschreibung | Wann nutzen |
|---------|-------------|-------------|
| **RAG-Style** | Retrieve relevante Memories → Inject in Prompt | Große Memory-Mengen, semantische Suche |
| **Structured Blocks** | Typisierte Memory-Blöcke mit festen Labels | User-Prefs, Projekt-State, wiederkehrende Daten |
| **Self-Management** | Agent entscheidet selbst, was gespeichert/gelesen wird | Komplexe, langlebige Agenten |
| **Hybrid** | Kombination aus RAG + Structured + Self-Management | Produktions-Agenten (Letta, Mem0) |
---
## 5. Hermes-spezifische Analyse & Empfehlungen
### Was Hermes bereits hat
| Feature | Status | Bewertung |
|---------|--------|-----------|
| `memory` Tool | ✅ Manuell | Nutzer muss aktiv speichern |
| `session_search` | ✅ FTS5-basiert | Gut für Discovery, schlecht für State |
| `skills` System | ✅ Wiederverwendbar | Prozedurales Memory, aber statisch |
| `profile` System | ✅ Isoliert | Keine Cross-Profile Memory-Sync |
| `cronjob` | ✅ Scheduler | Könnte Memory-Extraktion im Hintergrund machen |
| `MEMORY.md` | ✅ Manuell | Nutzer muss selbst kuratieren |
### Was Hermes braucht
| Priorität | Feature | Beschreibung | Umsetzung |
|-----------|---------|------------|-----------|
| **P0** | **Auto-Extraction** | Automatisches Extrahieren von Fakten aus Sessions | Cronjob nach jeder Session |
| **P0** | **Structured Blocks** | Gelabelte Memory-Blöcke statt flaches Key-Value | `memory` Tool erweitern |
| **P1** | **Entity Linking** | Verknüpfung von Memories über Entitäten | Projekt-Namen, Personen, Konzepte |
| **P1** | **Temporal Memory** | Zeitbewusstes Retrieval | "Was war der letzte Stand von X?" |
| **P1** | **Multi-Tier** | Unterschiedliche Speicher-Ebenen | Working → Short-Term → Long-Term |
| **P2** | **Self-Management** | Agent kann selbst Memory verwalten | Memory-Tools für Agenten |
| **P2** | **Summarization-Persistenz** | Zusammenfassungen bei Compression speichern | Nicht verwerfen, sondern archivieren |
### Konkrete Umsetzungsvorschläge für Hermes
#### 1. Memory-Block-Schema (erweitertes `memory` Tool)
```yaml
# Statt:
memory: "User prefers tables with │ separators"
# Besser:
memory_block:
type: "user_preference"
category: "formatting"
key: "table_style"
value: "compact with │ separators"
source: "session_2026-06-03"
confidence: 0.95
entities: ["Flo"]
```
#### 2. Auto-Extraction Cronjob
```yaml
# Nach jeder Session:
cronjob:
schedule: "after_session_end"
action: "extract_memories"
# Extrahiert automatisch:
# - User preferences (Formatierung, Workflow)
# - Project state (aktuelle Dateien, offene Tasks)
# - Learned patterns (was hat funktioniert, was nicht)
# - Entity relationships (Projekt X → Datei Y → Config Z)
```
#### 3. Entity-Linking Graph
```
[User: Flo] --prefers--> [Format: Tables with │]
[User: Flo] --works_on--> [Project: waldseilgarten-crm]
[Project: waldseilgarten-crm] --has_file--> [File: docker-compose.yml]
[Project: waldseilgarten-crm] --uses--> [Tech: NestJS + React]
[Session: 2026-06-03] --discussed--> [Topic: Kundenprozess]
```
#### 4. Session-Start Memory-Injection
```
# Bevor die Session startet:
1. Suche relevante Memories für aktuellen Kontext
2. Lade Project-State (letzter Stand)
3. Lade User-Preferences (Formatierung, Workflow)
4. Lade offene Tasks / TODOs
5. Injected in System-Prompt
```
---
## 6. Vergleich: Bestehende Lösungen
| Projekt | Memory-Typ | Self-Mgmt | Multi-Tier | Entity-Linking | Temporal | Integration | Open Source |
|---------|-----------|-----------|------------|----------------|----------|-------------|-------------|
| **Letta** | Structured Blocks | ✅ | ✅ | ✅ | ✅ | Python SDK | ✅ |
| **Mem0** | Multi-Level | ❌ | ✅ | ✅ | ✅ | REST API | ✅ |
| **Zep** | Async + Facts | ❌ | ✅ | ✅ | ✅ | Python/JS SDK | ✅ |
| **LangChain** | Modular | ❌ | ✅ | ❌ | ❌ | Python/JS | ✅ |
| **AutoGPT** | Configurable | ❌ | ❌ | ❌ | ❌ | Python | ✅ |
| **Hermes (current)** | Key-Value | ❌ | ❌ | ❌ | ❌ | Built-in | ✅ |
---
## 7. Empfehlungen für Hermes
### Kurzfristig (12 Wochen)
1. **Memory-Blocks erweitern**: `memory` Tool um `type`, `category`, `entities` erweitern
2. **Auto-Extraction-Prototype**: Cronjob, der nach Sessions automatisch Fakten extrahiert (basierend auf `session_search` + LLM-Summarization)
3. **Project-State-Memory**: Automatisches Speichern von aktuellem Projekt, offenen Dateien, letzten Änderungen
### Mittelfristig (12 Monate)
1. **Entity-Linking**: Einfacher Graph, der Projekte, Dateien, Personen, Konzepte verknüpft
2. **Multi-Tier Memory**: SQLite für Short-Term, Vektor-Store (Chroma/Qdrant) für Long-Term
3. **Session-Start Injection**: Automatisches Laden relevanter Memories beim Session-Start
### Langfristig (36 Monate)
1. **Self-Management**: Agent kann selbst entscheiden, was wichtig ist
2. **Hierarchical Summarization**: Tages-/Wochen-/Monats-Zusammenfassungen
3. **Cross-Profile Memory**: Geteilte Fakten über Profile hinweg (User-Prefs bleiben gleich)
---
## 8. Quellen & Referenzen
### Primärquellen (GitHub)
| Projekt | URL | Analysierte Dateien |
|---------|-----|---------------------|
| **Letta** | `https://github.com/letta-ai/letta` | `letta/agent.py`, `letta/memory.py`, `letta/system.py`, `letta/persistence_manager.py` |
| **Mem0** | `https://github.com/mem0ai/mem0` | `mem0/memory/main.py`, `mem0/configs/base.py`, `mem0/utils/main.py` |
| **Zep** | `https://github.com/getzep/zep-python` | `zep_python/client.py`, `zep_python/memory.py` |
| **AutoGPT** | `https://github.com/Significant-Gravitas/AutoGPT` | `autogpt/memory/` |
| **LangChain** | `https://github.com/langchain-ai/langchain` | `langchain/memory/` |
### Dokumentation
- Letta Docs: `https://docs.letta.com/` — Memory Blocks, System Prompts, Tool Integration
- Mem0 Docs: `https://docs.mem0.ai/` — Memory Layer, Multi-Level Architecture, API Reference
- Zep Docs: `https://docs.getzep.com/` — Long-Term Memory, Fact Extraction, Async Processing
- LangChain Memory: `https://python.langchain.com/docs/modules/memory/` — Buffer, Summary, Vector Store
### Papers & Benchmarks
- LoCoMo Benchmark: Long-Context Memory Evaluation
- LongMemEval: Long-term Memory Evaluation for Conversational Agents
- Mem0 Benchmarks (Apr 2026): 91.6 LoCoMo, 94.8 LongMemEval
### Hermes-Intern
- `memory` Tool: `~/.hermes/memory/` (user + memory stores)
- `session_search`: SQLite FTS5 in `~/.hermes/sessions.db`
- `skills`: `~/.hermes/skills/` (prozedurales Memory)
- `cronjob`: `~/.hermes/cron/` (Scheduler für Background-Tasks)
---
*Recherche durchgeführt: Juni 2026*
*SearXNG war für API-Anfragen nicht verfügbar (403 Forbidden), daher primär über direkte GitHub-Source-Analyse*