In der letzten Sitzung habe ich vier Memory-Engines für Whale, unser Agent Harness, verglichen und am Ende cognee gewählt. Dann las ich ein Paper und implementierte etwas völlig anderes.
Das Paper ist Procedural Graphs: Self-Evolving Execution Structures for LLM Agents von Yuxing Lu, Yicheng Chen, Shanchan Wu und Sercan Ö. Arık bei Google, Georgia Tech und der Universität Peking (arXiv:2609.09153, 8. September 2026). Es schlägt keine bessere Datenbank vor. Es gibt eine andere Antwort auf die Frage, wozu das Gedächtnis eines Agenten überhaupt da ist — und nachdem ich das Abstract zweimal gelesen hatte, war der Vergleich der Vorwoche keine Shortlist mehr, sondern ein Satz Kriterien, in denen das Paper einfach besser abschnitt.
Fakten gegen Prozeduren
Das meiste Gedächtnis für Sprachmodelle speichert Fakten. Die klassische Form ist ein Tripel: Entität, Relation, Entität. Zürich — liegt in — Schweiz. Man stellt eine Frage über die Welt und bekommt eine Antwort. Es ist eine Was-ist-Struktur.
Ein prozeduraler Graph speichert die andere Art von Wissen, in derselben Form: Prozedur, Relation, Prozedur. Es ist eine Was-zu-tun-Struktur. Die Knoten sind keine Dinge, die der Agent weiss, sondern Schritte, die er gegangen ist, und die Kanten sind, wie diese Schritte aufeinander folgen.
Diese Unterscheidung klingt akademisch, bis man einem Agenten zusieht, der zweimal an derselben Aufgabe scheitert. Die Fakten waren nie das Problem. Er wusste, was eine Liquiditätsplanung ist. Was ihm fehlte, war das Wissen, dass dieser eine Schritt erfahrungsgemäss auf diese eine Weise schiefgeht — und genau das hält ein prozeduraler Graph fest.
Orientierung, die lenkt, ohne vorzuschreiben
Der Mechanismus, der mir am besten gefällt, sitzt mitten im Loop. Bei jedem Entscheidungsschritt bestimmt das Framework den aktiven Knoten des Agenten im Graphen, und ein Guidance-Modell übersetzt den umliegenden Teilgraphen in eine situative Orientierung auf Schrittebene: ein kurzer Kontext dazu, wo der Agent steht und was von hier aus erfahrungsgemäss funktioniert.
Diese Orientierung wird an den Prompt des Solvers angehängt. Entschieden wird weiterhin vom Solver. Das Paper formuliert es so, dass die Orientierung die nächste Aktion beeinflusst, ohne sie vorzuschreiben, und diese Formulierung leistet echte Arbeit — sie ist der Unterschied zwischen Gedächtnis als Ratschlag und Gedächtnis als Schiene. Ein Agent auf einer Schiene kann den Fall nicht mehr behandeln, den man nicht vorhergesehen hat. Und der war der ganze Grund, einen Agenten zu bauen statt ein Skript.
Der Teil, der sich selbst weiterentwickelt
Hier verdient das Verfahren seinen Namen. Ein Refiner — selbst ein Sprachmodell — vergleicht gescheiterte Verläufe mit gelungenen und schlägt Änderungen am Graphen vor: Topologie ändern, Attribute an einem Knoten ändern, beschneiden. Verworfene Varianten bleiben erhalten statt gelöscht zu werden, damit der Graph sich merkt, was nicht noch einmal zu versuchen ist. Man startet mit einem minimalen Skelett, und der Loop lässt es wachsen.
Das Gedächtnis des Agenten ist damit kein Protokoll, das länger wird. Es ist eine Struktur, die besser wird — oder mindestens anders, in eine Richtung, die man prüfen kann.
Drei Entscheidungen, die die Sitzung gefüllt haben
Das Paper zu lesen dauerte zwanzig Minuten. Der Rest der Sitzung ging in Entscheidungen, die es einem nicht abnimmt.
Wie der Graph gespeichert wird. Ich habe ein paar Optionen abgewogen — eine JSON-Graph-Spezifikation, die Graphviz-JSON-Variante, GraphML, einfaches YAML — und bin beim Node-Link-JSON von NetworkX gelandet, geschrieben und direkt wieder eingelesen über json_graph.node_link_data und node_link_graph. Die Begründung war langweilig, und ich würde sie wieder so treffen: Es ist für Menschen lesbar, es diffst in Git, es braucht keine Abhängigkeit, die wir nicht schon haben, und es liefert die Graph-Validierung gratis mit, statt handgeschrieben.
Was passiert, wenn der Graph ungültig ist. Die verlockende Antwort ist, hart abzubrechen — kaputtes Gedächtnis, alles anhalten. Das ist falsch. Wenn die Gedächtnis-Validierung den Agenten anhalten kann, dann ist das Gedächtnis ein neuer Weg, auf dem der Lauf stirbt, und man hat das System verschlechtert, indem man ihm Wissen hinzugefügt hat. Der Validator warnt also, gebunden an das Log-Level, und der Agent arbeitet mit der Orientierung weiter, die er sicher ableiten konnte. Ein Gedächtnis ist eine Verbesserung, keine Abhängigkeit.
Wann der Refiner läuft. Nicht nach jedem Schritt — das ist eine Steuer auf jeden einzelnen Zug, bezahlt in Tokens und Latenz. Er läuft an der Sitzungsgrenze, wenn der Loop durch ist und ein vollständiger Verlauf zum Vergleich vorliegt. Die Entscheidung, die ich in der Aufnahme als offen notiert habe, ist weiter offen: Wir brauchen Zahlen dazu, was eine Iteration des Loops in Tokens kostet, bevor wir hier weiter justieren.
Test-first gebaut, von einem Agenten
Die Implementierung selbst entstand mit Claude Code und dem Superpowers-Plugin, testgetrieben, mit mir als Aufsicht statt als Tipper. Es lief gut genug, um leicht beunruhigend zu sein: Specs, Tests, Implementierung, grün.
Die ehrliche Fassung dieses Satzes ist aber diese: Wenn ein Agent den Code schreibt, ist das, was man prüfen muss, nicht mehr der Code — es ist der Plan. Jeder Fehler, den ich beim Selbsttippen bemerkt hätte, muss nun beim Lesen auffallen, was der Agent zu tun beabsichtigt, bevor er es tut. Was zufällig genau das Thema der nächsten Sitzung ist: Wie stellt man einen Kritiker und einen Menschen vor einen Plan?
Am Ende dieser Sitzung hatten wir einen Agent-Loop, der mehrere Iterationen läuft, ein refine-Kommando, ein Gedächtnis, das den Verlauf aufzeichnet und sich daran verbessert, und Tests über das Ganze.
Die Session ansehen
- Die bisherigen Folgen: https://www.youtube.com/playlist?list=PLPbgiIdJb7gE
- Der Memory-Engine-Vergleich davor: https://nowtec.solutions/de/blog/memory-engine-fuer-agent-loop/
- Code: https://github.com/nowtec/whale
Dieser Artikel wurde unter Zuhilfenahme von KI-Tools verfasst und vor der Veröffentlichung von unserem Team geprüft (EU-KI-Verordnung, Art. 50).
