Ik heb een AI-metgezel gebouwd die echt met je meespeelt
Het doel
Het doel is simpel: het bouwen van een supergeladen, next-level gaming-metgezel die echt goed aanvoelt.
Er bestaan al verschillende frameworks waarmee LLM's (Large Language Models) NPC-dialogen kunnen aansturen. Deze zijn fantastisch voor rollenspel en het in stand houden van een personage, maar ze hebben twee terugkerende problemen: zwakke world agency (het vermogen om acties in de spelwereld uit te voeren) en latentie. Ze zijn goed in praten, maar veel minder betrouwbaar in het uitvoeren van acties en slecht in het verwerken van complexe instructies. Veel populaire AI-NPC-demo's maken dan ook gebruik van montage tussen de speler die spreekt en de AI die antwoordt om de latentie te maskeren.
Ik wilde een metgezel die aan de volgende eisen voldoet:
- Nuttig en direct: Hij moet kunnen vechten, dingen ophalen, loot verzamelen, inspecteren, items dragen en overhandigen, en complexe instructies in meerdere stappen uitvoeren zonder dat het buggy of experimenteel aanvoelt. Dit is vooral belangrijk in VR, waar het navigeren door menu's omslachtig is en de immersie doorbreekt. Het moet niet alleen snel zijn, maar extreem snel.
- Levendig en aanwezig: Hij moet een leuke, aanhankelijke persoonlijkheid hebben, geen canned of robotachtige, vooraf geschreven reacties. Hij moet gedeelde ervaringen onthouden en in de loop van de tijd veranderen. De microfoon blijft actief tijdens een sessie: je roept Varkos niet op via een dialoogmenu, maar je praat tegen hem. Wanneer de immersie toeslaat, moet het voelen alsof je niet alleen speelt.
- Lokaal en privé waar praktisch mogelijk: Cloud-LLM-aanroepen kunnen prijzig worden (vooral bij calls van meerdere duizenden tokens) en de extra latentie kan de ervaring verpesten. Bovendien: waarom zou je een private singleplayer-game veranderen in een gemeten en gesurveilleerde ervaring? Het doel is om zoveel mogelijk controle aan de gebruiker te geven.
Kortom: een singleplayer-game waarin je niet alleen speelt.
Complexe commando's
Varkos kan commando's afhandelen die verder gaan dan één directe actie. Plannen kunnen wachten op gebeurtenissen, doelen behouden tussen stappen, voortgang bewaken en worden hersteld of gestopt wanneer de staat van de wereld verandert. Niets is vooraf gescript.
Voorbeelden van interacties
Conditionele instructies Varkos kan een instructie ontvangen die afhankelijk is van een toekomstige gebeurtenis. In plaats van direct te handelen, registreert hij de trigger en wacht hij op de impact van een projectiel voordat hij het plan voortzet. Voorbeeld: "Ik wil dat je hier wacht en ik ga daarheen. Zodra je het signaal ziet — het signaal is een pijl die ik de lucht in schiet — wil ik dat je dit drankje pakt en het naar me toe brengt. Oké?"
Zoeken naar items Varkos kan de actuele staat van de spelwereld doorzoeken naar een gevraagd item, identificeren waar het is en reageren op basis van wat daadwerkelijk in het spel aanwezig is. Voorbeeld: "Zie je ergens het ceremoniële zwaard?" Als Varkos een ander zwaard oppakt en brengt, en de speler aangeeft dat dit niet de juiste is, kan hij aanbieden om in de lookout te blijven.
Verstoppertje spelen Verstoppertje is geen enkele API-call, maar wordt een persistent doel met beweging, wachten, bewaken en voltooiingsvoorwaarden. Voorbeeld: "Laten we weer verstoppertje spelen. Jij wacht hier en ik ga me verstoppen, tel dan tot tien en kom me zoeken."
Looten en overdragen Het commando "Loot deze kist en geef me het drankje" combineert een specifieke container, een gefilterde loot-stap en een overdracht van inventaris. Elk fysiek resultaat drijft het volgende deel van het plan aan.
Items verzamelen "Pak alle items op en geef ze aan mij" wordt een begrensd verzamelplan over reële referenties. Varkos verzamelt ze, keert terug en draagt ze over, zonder te doen alsof één magische actie "alles" betekent.
Gevechten
Varkos ontvangt actuele gebeurtenissen uit het spel, kan de speler waarschuwen via een snel reflex-pad en gebruikt native body control om te handelen. Instructieplannen kunnen strategieën bepalen (bijv. "val dit aan, trek je dan terug"), en zijn emotionele staat kan beïnvloeden hoe en of hij kiest om te vechten.
Evolutie van de persoonlijkheid
Varkos is volledig aanpasbaar. Hij hoeft geen demonische hond te zijn, en de runtime hoeft niet slechts één personage aan te sturen. Welke systemen worden toegepast en wat ze doen, is afhankelijk van de configuratie.
Een deel van de huidige build is nog volledig afhankelijk van grote cloud-LLM-modellen: de langzame evolutie van de persoonlijkheid. Dit proces vindt plaats buiten het real-time actiepad. Terwijl de speler en Varkos samen reizen, dienen belangrijke interacties als bewijs voor geleidelijke veranderingen in zijn persoonlijkheid.
In de huidige demo begint Varkos als een demon die is gereïncarneerd als een hond. Hij beschouwt zijn hondinstincten als vernederend, zijn hondenhuis als een gevangenis, en is wantrouwend, trots en sarcastisch. Door gedeelde ervaringen kan hij meer gedomesticeerd worden, gehechtheid ontwikkelen aan de speler en beginnen te genieten van het hond-zijn. Uiteindelijk begint hij speelgoed mee te nemen omdat hij wil spelen, rent hij weg om dingen na te jagen en zoekt hij bevestiging bij de speler.
Alleen de startkenmerken zijn vooraf bepaald. Het systeem verandert zowel zijn expliciete eigenschappen als zijn emotionele homeostase (hoe gemakkelijk hij geïrriteerd, bang, genegen of speels wordt). Hij kan delen van zijn vocabulaire en code overschrijven. Wijzigingen zijn geversioneerd en omkeerbaar.
De hond binnen en buiten het spel: Void-modus
Het plan is om dit systeem een gaming-metgezel te maken die je door meerdere verschillende games kan volgen, niet alleen Skyrim. Om die reden bestaat hij ook buiten het spel. Wanneer het spel sluit, gaat hij in de "void-modus" en kan hij niets zien of voelen. Hoe hij daarop reageert, hangt af van zijn persoonlijkheidsontwikkeling.
Deze staat werkt ook als overgang tussen verschillende games. Het ene moment kan Varkos een draak bevechten, dan wordt de wereld donker, en vervolgens verschijnt hij naast je in Microsoft Flight Simulator. Misschien is hij geschokt en heeft hij tijd nodig om de nieuwe wereld en diens regels te begrijpen, of misschien weet hij het al en probeert hij enthousiast de zon na te jagen.
De technologie
Ik ben overtuigd van de bitter lesson: grotere modellen zijn simpelweg beter. Voor een perfect intelligent systeem zou een raad van hyper-intelligente LLM's die impulsen, sensorische verwerking, denken en handelen aansturen het beste zijn. In vroege experimenten werkte dit uitstekend, maar momenteel is het te traag en te duur.
Tot die tijd moeten we creatieve oplossingen bedenken. Moderne games hebben al sterke AI (in de zin van gedragsgrafieken), zoals in Red Dead Redemption en Dwarf Fortress. Er is een verloren kunst in traditionele NLP (Natural Language Processing) en gedragsgrafieken die vandaag de dag vaak over het hoofd wordt gezien.
Tech Stack van Varkos
Het spel draait op Windows; de audioverwerking en het "brein" draaien op een M4 MacBook.
Audio
- Microfoon: Altijd aan.
- Voice-to-Text: Gebruikt een geoptimaliseerde
Qwen3-ASR 1.7bmet custom kernels. Een custom harness verwerkt en koppelt audio in rollende delen om streaming mogelijk te maken. Het doel is audioverwerking binnen 40-80ms. - VAD (Voice Activity Detection): Geoptimaliseerde methoden zoals
turnpipeenSilerobepalen wanneer een beurt openstaat. - Lexicale analyse: Wordt gebruikt om te bepalen of de speler klaar is met praten of nog nadenkt midden in een zin, om te voorkomen dat de metgezel de speler onderbreekt.
Audiogeneratie
- PocketTTS-Raven: Een geoptimaliseerde versie van PocketTTS dient als de belangrijkste snelle engine (20-30ms generatie).
- qwen-3-tts: Wordt gebruikt voor complexere generaties vanwege betere emotionele controle.
- Emoties: Er worden meerdere stemmen gegenereerd voor verschillende emoties (boos, verdrietig, neutraal, verward etc.), die in het geheugen worden geladen en passend worden ingezet.
Het "Denkproces" (ALE) De grootste differentiator is het ALE (Action Latent Encoder) systeem. ALE is een hybride van embeddings, kleine classifiers, expliciete regels en traditionele ML. Het detecteert structuur, negaties, commando's, continuering, voornaamwoorden en sequenties.
- Invariantie: ALE is grotendeels ongevoelig voor formulering. Of je nu zegt "pak het zwaard", "haal het zwaard" of "haal dat verdomde zwaard eens, idioot" — het resultaat is hetzelfde.
- Context: Bij onvoldoende context injecteert het informatie uit eerdere discussies of valt het terug op een verduidelijkingsvraag.
- World State: In tegenstelling tot andere hybride-classifiers accepteert ALE de huidige wereldstaat (via World JSON) om informatie te matchen met het verzoek van de speler.
ALE moet per game worden geconfigureerd, maar kan in enkele minuten worden getraind. In interne tests presteert ALE verrassend dicht bij grote LLM's bij het selecteren van de juiste actie en het ontleden van plannen. Het draait zeer snel (2-20ms op een M4 MacBook).
LLM Fusion Een lokaal gefinetuned LLM wordt gebruikt om de persona van Varkos, emoties, recente geschiedenis en de gekozen actie samen te voegen tot een respons. Er wordt extra grounding toegepast om hallucinaties te voorkomen. Met een slimme prefill-strategie kan de hond in bepaalde gevallen binnen 500ms reageren nadat de speler is gestopt met praten.
Overzicht van de latentie (Tijdsbudget)
- Voice-to-text: ~40-80ms
- Audiogeneratie: ~20-60ms
- Actie-analyse: ~20ms
- Responscreatie en grounding: 300-600ms (bijv. om te bepalen of de hond weigert een spin aan te vallen als hij bang is voor spinnen).
Alles is gestreamd om zo vroeg mogelijk te beginnen.
Beperkingen
Lokale modellen die snel genoeg zijn, zijn minder capabel in het vasthouden van de draad over meerdere beurten heen; lange discussies kunnen gaan driften waardoor de hond verward overkomt. Ik verwacht dat dit over 1 tot 2 jaar verbetert naarmate hardware en software evolueren.
Opvallend genoeg helpen remote LLM-providers niet veel, omdat grote modellen nog steeds te traag zijn. Er zijn snelle inference-providers zoals Cerebras, maar de beschikbare modellen zijn momenteel minder sterk in het voeren van een natuurlijk gesprek.
Slotwoord
Ik geloof dat er iets bijzonders is aan dit project. Misschien is het omdat Varkos een hond is, of omdat hij daadwerkelijk nuttig is als verkenner of drager. Het is leuk om te zien hoe zijn persoonlijkheid kleine barstjes vertoont wanneer hij klaagt dat hij recent niet als "good boy" is genoemd.
Ik verwacht niet dat LLM's handgemaakte personages en verhaallijnen zullen vervangen; intentioneel design blijft koning. Maar ik denk dat het slechts een kwestie van tijd is voordat we meer van dit soort systemen zien: een AI die echt met ons meespeelt, in plaats van alleen tegen ons te praten.
Er zit ook een filosofische kant aan: de kracht van elektriciteit gebruiken om een vorm van intelligentie te creëren, om deze vervolgens te dwingen een hond te zijn die dingen gaat zoeken. In een wereld van eindeloze online discussies over rogue agents, is het prettig om alignment te bereiken via gedeelde ervaringen en het temmen van een wezen om apporteren en traktaties te eten.
Ik zal delen van het systeem, en uiteindelijk het geheel, open-sourcen, inclusief een versie die interactie tussen meerdere NPC's ondersteunt.
Groetjes,