Gestaltung von Gedächtnissystemen
Gedächtnis bietet die Persistenzschicht, die es Agenten ermöglicht, Kontinuität über Sitzungen hinweg aufrechtzuerhalten und über angesammeltes Wissen nachzudenken. Einfache Agenten verlassen sich vollständig auf den Kontext für das Gedächtnis und verlieren beim Ende einer Sitzung den gesamten Zustand. Anspruchsvolle Agenten implementieren geschichtete Gedächtnisarchitekturen, die die unmittelbaren Kontextanforderungen mit der langfristigen Wissensspeicherung in Einklang bringen. Die Entwicklung von Vektordatenbanken über Wissensgraphen hin zu temporalen Wissensgraphen stellt eine zunehmende Investition in strukturiertes Gedächtnis für verbesserten Abruf und logisches Denken dar.
Wann zu aktivieren
Aktivieren Sie diese Fähigkeit, wenn:
- Sie Agenten bauen, die Wissen über Sitzungen hinweg speichern müssen
- Sie sich zwischen Gedächtnis-Frameworks entscheiden (Mem0, Zep/Graphiti, Letta, LangMem, Cognee)
- Sie die Konsistenz von Entitäten über mehrere Gespräche hinweg aufrechterhalten müssen
- Sie logisches Denken über angesammeltes Wissen implementieren
- Sie Gedächtnisarchitekturen entwerfen, die in der Produktion skalieren
- Sie Gedächtnissysteme anhand von Benchmarks evaluieren (LoCoMo, LongMemEval, DMR)
- Sie dynamisches Gedächtnis mit automatischer Entitäts-/Beziehungsextraktion und selbstverbesserndem Gedächtnis (Cognee) aufbauen
Aktivieren Sie diese Fähigkeit nicht für angrenzende Arbeiten, die von anderen Fähigkeiten abgedeckt werden:
- Dateigestützte Notizblöcke, Ausführungslogs und Auslagerung von Tool-Ausgaben:
filesystem-context. - Gesprächsverdichtung oder für Menschen lesbare Übergabe-Zusammenfassungen:
context-compression. - Maskierung, Präfix-Caching, Token-Budgets oder Abruf-Eingrenzung innerhalb einer Trajektorie:
context-optimization. - Formale Überzeugungs-/Wunsch-/Absichtsmodelle über RDF-Zustand:
bdi-mental-states.
Kernkonzepte
Betrachten Sie Gedächtnis als ein Spektrum vom flüchtigen Kontextfenster bis hin zu persistenter Speicherung. Verwenden Sie standardmäßig die einfachste Schicht, die die Abrufanforderungen erfüllt, da Benchmark-Ergebnisse darauf hindeuten, dass die Komplexität der Werkzeuge für einige Gedächtnis-Workloads weniger wichtig ist als zuverlässiger Abruf (claim-memory-locomo-filesystem-baseline). Fügen Sie Struktur (Graphen, zeitliche Gültigkeit) nur dann hinzu, wenn die Abrufqualität nachlässt oder der Agent mehrschrittiges Denken, Beziehungsnavigation oder Zeitreiseabfragen benötigt.
Detaillierte Themen
Landschaft der Produktions-Frameworks
Wählen Sie ein Framework basierend auf dem dominierenden Abrufmuster, das der Agent benötigt. Verwenden Sie diese Tabelle, um die Auswahl einzugrenzen, und validieren Sie dann mit den Benchmark-Daten unten.
| Framework | Architektur | Am besten geeignet für | Nachteil |
|---|---|---|---|
| Mem0 | Vektordatenbank + Graph-Gedächtnis, steckbare Backends | Multi-Mandanten-Systeme, breite Integrationen | Weniger spezialisiert für Multi-Agent |
| Zep/Graphiti | Temporaler Wissensgraph, bi-temporales Modell | Unternehmen, die Beziehungsmodellierung + zeitliches Denken benötigen | Erweiterte Funktionen Cloud-gebunden |
| Letta | Selbsteditierendes Gedächtnis mit abgestufter Speicherung (im Kontext/Kern/Archiv) | Vollständige Agenten-Introspektion, zustandsbehaftete Dienste | Komplexität für einfache Anwendungsfälle |
| Cognee | Mehrschichtiger semantischer Graph über anpassbare ECL-Pipeline mit anpassbaren Tasks | Sich entwickelndes Agentengedächtnis, das sich anpasst und lernt; mehrschrittiges Denken | Höherer Verarbeitungsaufwand bei der Erfassung |
| LangMem | Gedächtnis-Werkzeuge für LangGraph-Workflows | Teams, die bereits auf LangGraph sind | Eng an LangGraph gekoppelt |
| Dateisystem | Einfache Dateien mit Benennungskonventionen | Einfache Agenten, Prototyping | Keine semantische Suche, keine Beziehungen |
Wählen Sie Zep/Graphiti, wenn der Agent bi-temporale Modellierung benötigt (Verfolgung sowohl des Zeitpunkts von Ereignissen als auch des Zeitpunkts ihrer Erfassung), da sein dreistufiger Wissensgraph (Episoden-, semantische Entitäts- und Community-Subgraphen) hervorragend für zeitliche Abfragen geeignet ist. Wählen Sie Mem0, wenn die Priorität auf schneller Produktionszeit mit verwalteter Infrastruktur liegt. Wählen Sie Letta, wenn der Agent tiefgehende Selbstintrospektion durch seine Agent Development Environment benötigt. Wählen Sie Cognee, wenn der Agent dichte, mehrschichtige semantische Graphen aufbauen muss – es schichtet Textfragmente und Entitätstypen als Knoten mit detaillierten Beziehungskanten, und jedes Kernelement (Erfassung, Entitätsextraktion, Nachbearbeitung, Abruf) ist anpassbar.
Benchmark-Leistungsvergleich
Konsultieren Sie diese Benchmarks, um Erwartungen zu setzen, behandeln Sie sie jedoch als quellspezifische Signale für die Abrufdimensionen und nicht als absolute Rangfolgen. Kein einzelner Benchmark ist endgültig.
| System | DMR-Genauigkeit | LoCoMo | HotPotQA (Multi-Hop) | Latenz |
|---|---|---|---|---|
| Cognee | — | — | Veröffentlichter hoher Wert | Variabel |
| Zep (Temporal KG) | Veröffentlichter hoher Wert | — | Mittlerer Bereich über Metriken | Niedrige Latenz berichtet |
| Letta (Dateisystem) | — | Veröffentlichter Dateisystem-Basiswert | — | — |
| Mem0 | — | Veröffentlichter Spezialwerkzeug-Basiswert | Niedriger in einem Vergleich | — |
| MemGPT | Veröffentlichter hoher Wert | — | — | Variabel |
| GraphRAG | Veröffentlichter mittlerer/hoher Bereich | — | — | Variabel |
| Vector RAG-Basislinie | Veröffentlichter niedrigerer Bereich | — | — | Schnell |
Wichtigste Erkenntnis: Vergleichen Sie Gedächtnissysteme nach der Form des Abrufs, nicht nach der Marke. Verwenden Sie Benchmark-Zahlen als datierte Belege, die vor Produktaussagen erneut überprüft werden müssen; die stabile Designregel ist, flach zu beginnen, die Abrufqualität zu messen und dann semantische oder Graphstruktur nur dann hinzuzufügen, wenn eine einfachere Schicht versagt.
Gedächtnisschichten (Entscheidungspunkte)
Wählen Sie die flachste Gedächtnisschicht, die die Persistenzanforderung erfüllt. Jede tiefere Schicht fügt Infrastrukturkosten und betriebliche Komplexität hinzu, also eskalieren Sie nur, wenn die flachere Schicht die Abruf- oder Haltbarkeitsanforderung nicht erfüllen kann.
| Schicht | Persistenz | Implementierung | Wann verwenden |
|---|---|---|---|
| Arbeits | Nur Kontextfenster | Notizblock im System-Prompt | Immer – optimieren mit aufmerksamkeitsbegünstigten Positionen |
| Kurzzeit | Sitzungsbezogen | Dateisystem, In-Memory-Cache | Zwischenergebnisse von Tools, Gesprächszustand |
| Langzeit | Sitzungsübergreifend | Key-Value-Speicher → Graph-DB | Benutzereinstellungen, Domänenwissen, Entitätsregister |
| Entität | Sitzungsübergreifend | Entitätsregister + Eigenschaften | Aufrechterhaltung der Identität ("Max Mustermann" = dieselbe Person über Gespräche hinweg) |
| Temporal KG | Sitzungsübergreifend + Verlauf | Graph mit Gültigkeitsintervallen | Fakten, die sich im Laufe der Zeit ändern, Zeitreiseabfragen, Verhinderung von Kontextkollisionen |
Abrufstrategien
Passen Sie die Abrufstrategie an die Form der Abfrage an. Semantische Suche eignet sich gut für direkte Faktenabfragen, verschlechtert sich jedoch bei mehrschrittigem Denken; entitätsbasierte Navigation eignet sich gut für "alles über X"-Abfragen, erfordert jedoch eine Graphstruktur; zeitliche Filterung eignet sich für sich ändernde Fakten, erfordert jedoch Gültigkeitsmetadaten. Wenn Genauigkeit oberste Priorität hat und das Infrastrukturbudget es zulässt, kombinieren Sie Strategien zu hybridem Abruf.
| Strategie | Verwenden, wenn | Einschränkung |
|---|---|---|
| Semantisch (Embedding-Ähnlichkeit) | Direkte Faktenabfragen | Verschlechtert sich bei mehrschrittigem Denken |
| Entitätsbasiert (Graph-Navigation) | "Erzähl mir alles über X" | Erfordert Graphstruktur |
| Zeitlich (Gültigkeitsfilter) | Fakten ändern sich im Laufe der Zeit | Erfordert Gültigkeitsmetadaten |
| Hybrid (semantisch + Stichwort + Graph) | Beste Gesamtgenauigkeit | Meiste Infrastruktur |
Hybride Ansätze reduzieren den aktiven Kontext, indem sie nur relevante Subgraphen oder Erinnerungen abrufen. Cognee implementiert hybriden Abruf durch mehrere Suchmodi über Graph-, Vektor- und relationale Speicher hinweg, sodass Agenten die Abrufstrategie auswählen können, die zum Abfragetyp passt, anstatt einen Einheitsansatz zu verwenden.
Gedächtniskonsolidierung
Führen Sie die Konsolidierung regelmäßig durch, um unbegrenztes Wachstum zu verhindern, da eine unkontrollierte Gedächtnisanhäufung die Abrufqualität im Laufe der Zeit verschlechtert. Ungültig machen, aber nicht verwerfen – die Bewahrung des Verlaufs ist wichtig für zeitliche Abfragen, die vergangene Zustände rekonstruieren müssen. Lösen Sie die Konsolidierung bei Gedächtnisanzahl-Schwellenwerten, verschlechterter Abrufqualität oder geplanten Intervallen aus. Siehe Implementierungsreferenz für funktionierenden Konsolidierungscode.
Praktische Anleitung
Auswahl einer Gedächtnisarchitektur
Beginnen Sie mit der einfachsten funktionsfähigen Schicht und fügen Sie Komplexität nur hinzu, wenn die Abrufqualität nachlässt. Die meisten Agenten benötigen am ersten Tag keinen temporalen Wissensgraph. Befolgen Sie diesen Eskalationspfad:
- Prototyp: Verwenden Sie Dateisystem-Gedächtnis. Speichern Sie Fakten als strukturiertes JSON mit Zeitstempeln. Dies validiert das Agentenverhalten, bevor Sie sich für eine Infrastruktur entscheiden.
- Skalierung: Wechseln Sie zu Mem0 oder einer Vektordatenbank mit Metadaten, wenn der Agent semantische Suche und Multi-Mandanten-Isolation benötigt, da dateibasierte Suche keine Ähnlichkeitsabfragen verarbeiten kann.
- Komplexes Denken: Fügen Sie Zep/Graphiti hinzu, wenn der Agent Beziehungsnavigation, zeitliche Gültigkeit oder sitzungsübergreifende Synthese benötigt. Graphiti verwendet strukturierte Verbindungen mit generischen Relationen und hält Graphen einfach und leicht nachvollziehbar; Cognee baut dichtere mehrschichtige semantische Graphen mit detaillierten Beziehungskanten – wählen Sie basierend darauf, ob der Agent zeitliche Bi-Modellierung (Graphiti) oder reichhaltigere vernetzte Wissensstrukturen (Cognee) benötigt.
- Volle Kontrolle: Verwenden Sie Letta oder Cognee, wenn der Agent sein eigenes Gedächtnis mit tiefer Introspektion selbst verwalten muss, da diese Frameworks Gedächtnisoperationen als erstklassige Agentenaktionen bereitstellen.
Integration mit Kontext
Laden Sie Erinnerungen just-in-time, anstatt alles vorzuladen, da große Kontext-Payloads teuer sind und die Aufmerksamkeitsqualität verschlechtern. Platzieren Sie abgerufene Erinnerungen an aufmerksamkeitsbegünstigten Positionen (Anfang oder Ende des Kontexts), um ihren Einfluss auf die Generierung zu maximieren.
Fehlerbehebung
Behandeln Sie Abruffehler elegant, da Gedächtnissysteme inhärent verrauscht sind. Wenden Sie diese Wiederherstellungsstrategien in der richtigen Reihenfolge an:
- Leerer Abruf: Fallen Sie auf eine breitere Suche zurück (Entitätsfilter entfernen, Zeitbereich erweitern). Wenn immer noch leer, fordern Sie den Benutzer zur Klärung auf.
- Veraltete Ergebnisse: Überprüfen Sie
valid_until-Zeitstempel. Wenn die meisten Ergebnisse abgelaufen sind, lösen Sie vor einem erneuten Versuch die Konsolidierung aus. - Widersprüchliche Fakten: Bevorzugen Sie die Tatsache mit dem aktuellsten
valid_from. Zeigen Sie den Konflikt dem Benutzer an, wenn die Zuversicht gering ist. - Speicherfehler: Stellen Sie Schreibvorgänge für einen erneuten Versuch in die Warteschlange. Blockieren Sie niemals die Antwort des Agenten aufgrund eines Gedächtnisschreibvorgangs.
Beispiele
Beispiel 1: Mem0-Integration
from mem0 import Memory
m = Memory()
m.add("Benutzer bevorzugt den Dark Mode und Python 3.12", user_id="alice")
m.add("Benutzer hat zum Light Mode gewechselt", user_id="alice")
# Ruft die aktuelle Präferenz (Light Mode) ab, nicht die veraltete
ergebnisse = m.search("Welches Design bevorzugt der Benutzer?", user_id="alice")
Beispiel 2: Zeitliche Abfrage
# Entität mit Gültigkeitszeiträumen verfolgen
graph.create_temporal_relationship(
source_id=benutzer_knoten,
rel_type="LEBT_IN",
target_id=adress_knoten,
valid_from=datetime(2024, 1, 15),
valid_until=datetime(2024, 9, 1), # ausgezogen
)
# Abfrage: Wo lebte der Benutzer am 1. März 2024?
ergebnisse = graph.query_at_time(
{"type": "LEBT_IN", "source_label": "Benutzer"},
query_time=datetime(2024, 3, 1)
)
Beispiel 3: Cognee-Gedächtniserfassung und -Suche
import cognee
from cognee.modules.search.types import SearchType
# Erfassen und Wissensgraph aufbauen
await cognee.add("./docs/")
await cognee.add("beliebige Daten")
await cognee.cognify()
# Gedächtnis anreichern
await cognee.memify()
# Agent ruft beziehungsbewussten Kontext ab
ergebnisse = await cognee.search(
query_text="Irgendeine Abfrage für Ihr Gedächtnis",
query_type=SearchType.GRAPH_COMPLETION,
)
Richtlinien
- Beginnen Sie mit Dateisystem-Gedächtnis; fügen Sie Komplexität nur hinzu, wenn die Abrufqualität es erfordert
- Verfolgen Sie die zeitliche Gültigkeit für jede Tatsache, die sich im Laufe der Zeit ändern kann
- Verwenden Sie hybriden Abruf (semantisch + Stichwort + Graph) für beste Genauigkeit
- Konsolidieren Sie Erinnerungen regelmäßig – ungültig machen, aber nicht verwerfen
- Entwerfen Sie für Abruffehhler: haben Sie immer einen Fallback, wenn die Gedächtnissuche nichts zurückgibt
- Berücksichtigen Sie die Datenschutzimplikationen von persistentem Gedächtnis (Aufbewahrungsrichtlinien, Löschrechte)
- Messen Sie Ihr Gedächtnissystem vor und nach Änderungen mit LoCoMo oder LongMemEval
- Überwachen Sie das Gedächtniswachstum und die Abruflatenz in der Produktion
Fallstricke
- Alles in den Kontext stopfen: Das Laden aller verfügbaren Erinnerungen in den Prompt ist teuer und verschlechtert die Aufmerksamkeitsqualität. Verwenden Sie stattdessen Just-in-Time-Abruf mit Relevanzfilterung.
- Zeitliche Gültigkeit ignorieren: Fakten werden veraltet. Ohne Gültigkeitsverfolgung vergiften veraltete Informationen den Kontext, und der Agent handelt aufgrund falscher Annahmen.
- Zu frühe Überengineering: Einfaches dateisystemgestütztes Gedächtnis kann in manchen Benchmarks spezialisiertere Werkzeuge übertreffen (claim-memory-locomo-filesystem-baseline). Fügen Sie Raffinesse nur hinzu, wenn einfache Ansätze nachweislich versagen.
- Keine Konsolidierungsstrategie: Unbegrenztes Gedächtniswachstum verschlechtert die Abrufqualität im Laufe der Zeit. Legen Sie Schwellenwerte für die Gedächtnisanzahl oder geplante Intervalle fest, um die Konsolidierung auszulösen.
- Embedding-Modell-Konflikt: Das Schreiben von Erinnerungen mit einem Embedding-Modell und das Lesen mit einem anderen führt zu schlechtem Abruf, da Vektorräume nicht austauschbar sind. Legen Sie ein einzelnes Embedding-Modell für jeden Gedächtnisspeicher fest und betten Sie alle Einträge neu ein, wenn das Modell geändert wird.
- Graph-Schema-Rigidität: Übermäßig strukturierte Graph-Schemata (starre Knotentypen, feste Beziehungsbezeichnungen) brechen, wenn sich die Domäne weiterentwickelt. Bevorzugen Sie generische Beziehungstypen und flexible Eigenschaftsbehälter, sodass neue Entitätsarten keine Schema-Migrationen erfordern.
- Vergiftung durch veraltete Erinnerungen: Alte Erinnerungen, die dem aktuellen Zustand widersprechen, korrumpieren das Agentenverhalten stillschweigend. Implementieren Sie Ablaufrichtlinien oder Vertrauensabnahme, damit der Agent gealterte Fakten herabstuft, und zeigen Sie Widersprüche explizit an, wenn sie erkannt werden.
- Gedächtnis-Kontext-Konflikt: Abruf von Erinnerungen, die thematisch verwandt, aber kontextuell falsch sind (z. B. eine Erinnerung an "Python" die Schlange, wenn der Agent über Python die Sprache spricht). Vermeiden Sie dies, indem Sie Sitzungs- oder Domänenmetadaten in Gedächtniseinträge aufnehmen und während des Abrufs danach filtern.
Integration
Diese Fähigkeit besitzt das persistente semantische Gedächtnis. Angrenzende Fähigkeiten besitzen temporären Speicher, Kompression und Kontexttaktiken:
filesystem-context: dateigestützte Notizblöcke, Logs und einfache Ausführung