WIBTM: Geef een agent toegang tot herinneringen gecreëerd met AI-dromen

Philip Dick schreef een kort verhaal met de titel ‘Do androids dream of electric sheep?’. Ik heb deze titel iets aangepast voor mijn presentatie: ‘Do agents dream of binary sheep?’.

Wat is agent-geheugen?

Er zijn verschillende soorten geheugen die een agent creëert of waar een agent toegang toe heeft. Deze omvatten het kortetermijn- of werkgeheugen (denk aan het opslaan van zaken binnen een sessie) en het langetermijngeheugen (zaken die de agent in de loop van de tijd leert over een taak of een gebruiker). Beiden zijn belangrijk, maar ze vereisen verschillende beheermethoden.

(Ik behandel het beheren van het kortetermijngeheugen in een aparte blog die ik later deze week zal publiceren.)

Voor het langetermijngeheugen is, net als bij mensen, het vermogen om te reflecteren op een sessie en de relevante informatie op te slaan een cruciaal onderdeel. Bij mensen gebeurt dit vaak in 'dromen', waarbij onze geheugensystemen reorganiseren en compacteren. 'Agent-dromen' zijn een vergelijkbaar proces van reflectie om herinneringen te creëren over sessies en de gebeurtenissen die hebben plaatsgevonden.

Waarom maakt het creëren en gebruiken van geheugen een agent beter?

Agents zonder geheugen zijn slechts zo goed als het model en de instructies die we hen hebben gegeven. In veel gevallen komen agents meerdere keren voor hetzelfde probleem te staan, met name bij codevoorbeelden. Zonder inzicht in eerdere sessies zal een agent telkens een nieuwe aanpak hanteren om het probleem op te lossen. Dit vergroot het non-determinisme en maximaliseert het aantal tokens dat nodig is om tot een oplossing te komen.

Geheugen helpt door agents context te bieden over specifieke problemen of gebruikers, wat beïnvloedt hoe een agent besluit welke volgende actie hij onderneemt. Als een agent bijvoorbeeld een specifiek probleem meerdere keren tegenkomt en heeft 'gedroomd' (en opgeslagen) dat er een specifieke manier is om dit op te lossen, kan dit de tijd om het probleem op te lossen en het tokenverbruik drastisch verminderen. Daarnaast helpt dit om de variabiliteit over tijd te verkleinen.

Het eenvoudigste voorbeeld hiervan is het leren van iets als optellen. In herinneringen leer je zowel methodes als routineuze manieren om werk te verrichten. We hebben tijdens ons opgroeien zoveel optables geoefend dat je 2+2 kunt oplossen zonder na te denken over het proces van optellen. Maar je weet ook hoe je moet optellen wanneer de routineuze methoden niet werken. Met 'dromen' kunnen we LLM-prompts gebruiken om agents toegang te geven tot beide kanten van het leerproces.

Hoe geheugen en RAG goed samenwerken met agents

In veel gevallen richten huidige scenario's voor dromen of analyse zich op het verbeteren van de code van de agent: dat wil zeggen de instructies, vaardigheden en tools waar de agent toegang toe heeft. Dit is zeer waardevol voor veel bedrijven; ik zeg vaak dat als je niet elk token dat je bedrijf uitgeeft 'oogst', je geld weggooit. Dat is extreem, maar er is geen manier om agent-flows te verbeteren als je geen toegang hebt tot de sessiegegevens.

Een andere methode voor toegang tot dromen maakt gebruik van RAG (retrieval augmented generation). We kunnen informatie over een intentie, een gebruiker of een taak in een database opslaan. Wanneer een agent vervolgens een intentie krijgt, kan hij via RAG zoeken om te kijken of hij het probleem eerder heeft ontdekt en on-demand hints ophalen.

Het eenvoudigste voorbeeld is de compactering van gebruikersinformatie. Stel dat een gebruiker altijd vragen stelt over Python. We kunnen de informatie over de gebruiker opzoeken, de voorkeur voor Python injecteren en zo een beter zoekresultaat krijgen. We kunnen dromen ook gebruiken om veelvoorkomende intenties te begrijpen en zelfs code voor te laden die relevant zou kunnen zijn, of vaardigheidsinformatie voor een specifieke functie.

Een simpel scenario

Ik heb een demonstratie gebouwd met 'dromen' die gebruikmaakt van Google ADK als agent-framework, Gemini (hoewel elk model gekozen kan worden) voor inferentie, en BigQuery en Cloud Spanner voor het geheugensysteem. Cloud Run wordt gebruikt voor de implementaties van de agents; er zijn er twee: één met geheugenacces en één zonder.

Ik heb gemerkt dat 'vibe coding' het veel gemakkelijker maakt om demo's op de frontend te tonen. Als je de code implementeert, kun je de UI-stappen volgen en elke fase veel eenvoudiger zien dan wanneer je tussen verschillende panelen moet klikken.

Het geheugensysteem werkt als volgt:

  1. Het agent-framework logt alle telemetrie over de agentsessies naar BigQuery. We noemen dit ook wel een trajectory (traject).
  2. We gebruiken AI-functies (LLM's) om informatie in een sessie of over meerdere sessies in BigQuery samen te vatten als een offline proces om herinneringen te creëren.
  3. Herinneringen worden in Spanner opgeslagen als vectoren. We kunnen dezelfde herinnering met meerdere vectoren opslaan, afhankelijk van de manieren waarop de agent er toegang toe moet hebben.

In het codevoorbeeld zal de agent je vragen naar je voorkeuren voor coderen en andere zaken die je doorgaans prefereert. Het 'dromen' neemt deze informatie over en slaat deze op in een schema dat toegankelijk is voor Spanner.

Dit patroon is duurzaam. Door de prompt die gebruikt wordt voor het dromen en de SQL aan te passen, kunnen we over sessies heen zoeken naar andere attributen of voorkeuren en deze opslaan voor retrieval, of zelfs de output gebruiken om onze agent-code bij te werken.

Aan de slag

Hier is de code die ik heb gemaakt. Je kunt dit vandaag nog implementeren. Als je wilt leren maar de kosten laag wilt houden, kun je ook een eenvoudigere service dan Spanner gebruiken. Ik heb stap-voor-stap instructies opgenomen in de UI, die als container naar Cloud Run is geïmplementeerd.

Laat me weten wat je ervan vindt! Ik hoop dat dit nuttig is bij het bouwen van een droom- en geheugensysteem voor je eigen agents.

***

Hoe ik AI heb gebruikt: Alleen voor de code in dit project; de tekst is 100% door mensen geschreven (inclusief fouten). Over het algemeen ben ik bij een codevoorbeeld als dit zeer betrokken bij het proces en geef ik strakke richting in de flow voor een 0 $\to$ 1 project.