Pocket Tank: Een klein AI-visakvarium

Ik heb een visakvarium gebouwd dat in je broekzak past. Je kunt de vissen voeren, het glas schoonmaken, de planten trimmen en toekijken hoe de vissen groeien. Achter het scherm bepaalt een klein taalmodel (LLM) of elke vis moet eten, verkennen, rusten, spelen of een vriend moet volgen.

Pocket Tank brengt twee dingen samen die ik al jaren opnieuw wilde aanpakken: de kleine virtuele huisdieren die we vroeger bij ons droegen en de digitale aquaria waar ik urenlang naar kon kijken. Deze keer draait er een model lokaal op het apparaat dat de behoeften van de vissen leest en kiest wat de volgende actie is.

Een klein aquarium met kleine visjes

Een nieuw aquarium begint met twee jonge visjes (fry). Door ze te voeren en het aquarium actief te gebruiken, groeien ze gedurende meerdere dagen door de stadia van juveniel, volwassen en oud. Hun uiterlijk verandert naarmate ze ouder worden, en hun persoonlijkheden zorgen ervoor dat je ze echt leert kennen.

Sommige vissen zijn brutaler, anderen socialer. Hun eigenschappen kunnen verschuiven afhankelijk van hoe je voor ze zorgt, en deze kenmerken maken deel uit van de informatie die het model gebruikt. Tik op een vis om zijn kaart te openen; details worden onthuld naarmate de vis die kant van zichzelf aan je laat zien. Tik opnieuw op de kaart om de mijlpalen te bekijken.

Ook vertrouwen speelt een rol in de relatie. Houd ongeveer drie seconden je vinger op het glas, en vissen die je vertrouwen komen naar je toe. Tik drie keer op het glas en de vissen in de buurt schrikken weg. Rustige interacties bouwen vertrouwen op; het laten schrikken van de vissen kost vertrouwen.

Het aquarium vereist ook enig onderhoud. Zeegras blijft groeien; een zijwaartse veeg door een grasveld trimt het gras op de hoogte van je vinger. Algen vormen geleidelijk een film op het glas; sleep eroverheen om het schoon te vegen. Laat wat gras staan: dit biedt de vissen beschutting en dient als plek voor hofmakerij en nieuwe bewoners.

Bij voldoende zorg verdient het aquarium extra vissen, één voor één, tot een maximum van vijf. Let op volwassen vissen die laag in het gras cirkelen. Zodra aan de voorwaarden is voldaan, verschijnt er bij de volgende keer dat het licht aangaat een nieuw visje.

De eerste maaltijd

Een van mijn favoriete momenten is wanneer het aquarium "wakker" wordt. Na uren slaap verzamelen de vissen zich aan het oppervlak, waar je ze gewoonlijk voert. Zodra je voedsel toevoegt, wordt het stille aquarium plotseling erg druk.

Een korte druk op de BOOT-knop zet het apparaat in de sluimerstand. Het scherm wordt donker, het metabolisme van de vissen vertraagt en het model stopt met het nemen van beslissingen. Druk opnieuw om te hervatten. Het ingedrukt houden van BOOT zet het apparaat volledig uit, waarbij de voortgang wordt opgeslagen en behouden blijft na het herstarten.

Wanneer het aquarium wakker is, laat een automatische voeder een korrel vallen wanneer een vis echt honger krijgt. Na een lange slaap houdt de voeder echter in terwijl de vissen bedelen, waardoor de eerste maaltijd voor jouw rekening is. Het resultaat is een huisdier waarmee je kunt communiceren zonder dat je elke minuut voor zorg hoeft te zorgen.

Wat de AI precies doet

De bewegingen van de vissen en de beslissingen van het model draaien op verschillende snelheden. Reguliere code regelt het zwemmen, sturen, interacties bij het voeren en de animaties. Het taalmodel leest periodiek een compacte beschrijving van de situatie van één vis en geeft een doel en een urgentie terug.

Die beschrijving bevat informatie over:

  • Honger
  • Energie
  • Stress
  • Nieuwsgierigheid
  • Persoonlijkheid
  • Levensfase
  • Vertrouwen
  • Nabijgelegen objecten (zoals voedsel, vrienden, bellen en het rif)

Een antwoord van het model kan er als volgt uitzien: seek_food urgency 8

Terwijl de bewegingscode dit doel uitvoert, werkt het model aan een volgende beslissing. Op de eigenlijke hardware duurt een beslissing van het model ongeveer 3,6 seconden, terwijl het aquarium blijft renderen met ongeveer 25–30 frames per seconde. De vissen delen één model; er worden nieuwe beslissingen aangevraagd zodra hun situatie verandert.

Er zijn acht mogelijke doelen:

  1. Zoeken naar voedsel (seek food)
  2. Vluchten voor een schaduw (flee a shadow)
  3. Een vriend volgen (follow a friend)
  4. Het rif inspecteren (inspect the reef)
  5. Bellen bezoeken (visit bubbles)
  6. Verkennen (explore)
  7. Rusten (rest)
  8. Ronddartelen in spel (dart around in play)

Groei, aanraakgebaren en presentaties (zoals hofmakerij) worden afgehandeld door de omringende simulatie. Het getrainde model kiest het hoogwaardige gedrag van de vis binnen die wereld.

Wanneer het model twee keuzes met vergelijkbare waarschijnlijkheid geeft, toont de animatie een korte aarzeling voordat de vis een keuze maakt. Die kleine pauze maakt de onzekerheid van het model zichtbaar.

Hoe een taalmodel achter het scherm past

De truc was om de wereld van het model klein genoeg te maken. Het hoeft alleen de statusbeschrijvingen van het aquarium te begrijpen en een kleine set nuttige reacties te produceren.

Ik heb een groter "teacher"-model van 26 miljard parameters gebruikt om vissituaties te labelen, en vervolgens een veel kleiner "student"-model getraind op basis van die voorbeelden. De meegeleverde trainingsset bevat 51.162 situatie-antwoordparen. De student heeft 14,3 miljoen parameters, en het 4-bit modelbestand is 7,56 MB groot.

De gewichten worden gelezen vanuit de flash-geheugen in plaats van volledig in het RAM-geheugen te worden gekopieerd. Eenmaal geïnstalleerd, draait het aquarium het model op de ESP32-S3 zelf. Het heeft geen wifi, clouddienst of computer nodig om beslissingen te nemen.

In een kleine evaluatie van 60 nieuwe situaties koos de student in 75% van de gevallen hetzelfde doel als de teacher. Een aparte controle waarbij de teacher dezelfde 40 situaties twee keer kreeg voorgelegd, leverde ongeveer 82% overeenstemming met zichzelf op. Dit zijn nuttige controles voor deze specifieke taak, in plaats van een algemene maatstaf voor intelligentie.

Een belangrijke les uit de training was hoeveel de formulering van de teacher uitmaakt. Het veranderen van een zin over sociaal gedrag zorgde ervoor dat "een vriend volgen" verschoof van 45% in de ene batch labels naar 14% in een andere. De student leert de voorbeelden die je geeft, inclusief hun gewoonten.

Wat je nodig hebt

Het hardwaredoel is de Waveshare ESP32-S3-Touch-AMOLED-1.8. Het project maakt gebruik van:

  • Het 1,8-inch, 368 × 448 AMOLED-touchscreen.
  • 16 MB flashgeheugen.
  • 8 MB PSRAM.

De printplaat levert ook de bewegingssensor, real-time klok en het stroombeheer dat door het aquarium wordt gebruikt. Gebruik exact deze printplaat bij het volgen van de hardware-instructies. De firmware ondersteunt beide revisies en detecteert deze automatisch. Voor de draagbare setup zoals in de video, moet je controleren of de kit die je bestelt de batterij en behuizing bevat.

De publieke repository bevat het getrainde model, de firmware, een desktop-simulator en de trainingspijplijn. Je kunt het meegeleverde model gebruiken zonder er zelf een te trainen.

Installatie

Browser-gebaseerde installer

Er is een one-click installer beschikbaar via de browser: Pocket Tank Easy Installer.

Bouwen en flashen vanuit broncode

Voor de gevorderde gebruiker: gebruik de hardware-instructies in de README en de bring-up checklist. De source-workflow bouwt de ESP-IDF firmware en flasht het model in een eigen partitie. Volg beide delen van dit proces.

De desktop-simulator proberen

Je kunt het aquarium ook op een computer proberen voordat je hardware aanschaft. De simulator gebruikt dezelfde simulatiecode en hetzelfde model als het apparaat, waarbij de muis de vinger vervangt. Het is een lokale applicatie gebouwd met SDL2 en LVGL. Volg de simulator-setup instructies voor de afhankelijkheden en build-commando's. Dit is ook een nuttige plek om te experimenteren met visgedrag, progressie en wijzigingen in de training.

Je eerste minuten met het aquarium

  • Voeren: Tik op het wateroppervlak of sleep naar beneden vanaf de bovenrand.
  • Een vis ontmoeten: Tik op een vis om zijn kaart te openen, en tik vervolgens op de kaart om mijlpalen te zien.
  • Vertrouwen opbouwen: Houd je vinger ongeveer drie seconden stil op het glas.
  • Planten verzorgen: Veeg zijwaarts door het gras op de hoogte waarop je wilt trimmen.
  • Glas schoonmaken: Sleep over de algen om ze weg te vegen.
  • Ruststand: Druk kort op BOOT om te sluimeren, en druk opnieuw om te wekken.

Geef het tijd. Groei en nieuwe bewoners maken deel uit van het langetermijnspel, en de kaart van een nieuwe vis vult zich naarmate je hem observeert. Het interessante is om op te merken hoe elke vis reageert wanneer het aquarium verandert.

Toekomstige plannen

Ik wil meer redenen creëren om terug te komen en het aquarium te controleren: meer manieren om het aan te passen, meer variatie in wat vissen kiezen om te doen, en mijlpalen die uiteindelijk iets nuttigs ontgrendelen.

Decoraties en kleine helpers, zoals een slak die algen eet of een zee-egel die gras trimt, zijn ideeën voor toekomstige versies. Ook wil ik het display, de batterij-ervaring en de trainingsworkflow blijven verbeteren.

Voor wie zelf met het gedrag van de vissen wil experimenteren: de gids voor de trainingspijplijn legt uit hoe je voorbeelden genereert, de student traint en een model exporteert voor de printplaat.

Slotbeschouwingen

Wat mijn interesse in Pocket Tank vasthoudt, is de combinatie van een zeer kleine wereld en genoeg variatie om het de moeite waard te maken om naar te kijken. Een vis pauzeert voordat hij een keuze maakt. Een andere komt naar me toe als ik mijn vinger op het glas houd. Het paar waarmee ik begon groeit op, en uiteindelijk is er iemand nieuw in het gras.

Dat is de ervaring die ik wilde: een klein aquarium waarin iets gebeurt, volledig draaiend op hardware die ik in één hand kan houden.