Wat ik heb gedaan bij RC

Deelname aan studiegroepen

Bij RC zijn er regelmatig studiegroepen die door iedereen georganiseerd en ingepland kunnen worden. Zo kwamen mensen bijvoorbeeld elke vrijdag samen om oude Advent of Code-uitdagingen op te lossen. Ik heb deelgenomen aan Agentic Adventures, Practical Deep Learning, Math Monday en een korte serie waarin een open-source AI voor een bordspel werd onderzocht.

Agentic Adventures

Agentic Adventures is een discussiegroep voor mensen die geïnteresseerd zijn in moderne LLM's en agenten; elke week deden we iets anders. Enkele hoogtepunten:

  • Amanda en ik bouwden een remote sandbox voor een vibecoding-agent die we konden draaien met dangerously-skip-permissions.
  • In dezelfde lijn leerde Michelle ons hoe we een gesandboxed omgeving voor lokale agenten konden opzetten met ollama en docker.
  • In deze omgeving bouwden we het spel "Just One" om te onderzoeken hoe agenten kunnen samenwerken.
  • We experimenteerden samen met minGPT en bouwden een klein tekstvoorspellingsmodel dat getraind was op Romeo en Julia om als Shakespeare te praten.
  • We voerden een basis-LoRA uit om een klein model te trainen om meer conversationeel te praten.

Practical Deep Learning

Deze studiegroep werkte het (eerste deel van) het boek Practical Deep Learning van Jeremy Howard en Sylvain Gugger door. We bewogen ons van klassieke machine learning-benaderingen naar het gebruik of aanpassen van vooraf gebouwde modellen, om vervolgens te leren hoe we daadwerkelijke neurale netwerkmodellen konden bouwen. Het boek bood een introductie op het niveau van een beoefenaar, wat goed was voor het opbouwen van intuïtie over hoe deze modellen werken en wat ermee gebouwd kan worden. Aangezien ik zelf niet geïnteresseerd ben in onderzoek, was dit precies het niveau van begrip dat ik zocht.

Math Monday

Tijdens een koffiegesprek ontdekden Sophia en ik dat we een gedeelde passie voor wiskunde hadden, waarna we besloten een discussiegroep voor wiskundige onderwerpen te starten. Dit was bedoeld als een leuke afleiding en een kans om te leren en te ontdekken. De eerste helft van elke bijeenkomst besteedden we aan theorie, waarna we in paren dingen gingen bouwen op basis van wat we hadden geleerd. Enkele leuke projecten waren:

  • Samen Project Euler-problemen oplossen.
  • Nadenken over problemen uit het boek Mathematical Puzzles van Peter Winkler.
  • Fractals en andere generatieve kunst tekenen.
  • Programma's bouwen met Voronoi-diagrammen (zoals dit spel).
  • Een introductie tot de Rocq-bewijsassistent door Ben, waarna we enkele booleaanse identiteiten hebben uitgewerkt.
  • Een programma schrijven om Hilbert-curves te genereren voor tekeningen met een penplotter.
  • Samen met Kenji enkele leuke uitbreidingen bouwen van het chaos game in Desmos.

Reverse engineering van een bordspel-AI

Tony startte een korte reeks om in de code van de Keldon AI te duiken, die gebruikt wordt voor het bordspel Race for the Galaxy. De eerste sessie besteedden we aan het leren van de regels en het spelen tegen de AI, waarna we de code analyseerden: een ouderwets neuraal netwerk met twee lagen en gecureerde features. Claude was verrassend goed in het interpreteren van de gewichten van het netwerk en het uitleggen waarop de AI reageerde; we probeerden te begrijpen welke strategie de Keldon AI had aangeleerd. De conclusie was dat economische strategieën in het basisspel veel sterker zijn dan militaire strategieën (wat overeenkomt met het sentiment van spelers). Wat mij opviel was hoeveel van de sterkst gewogen knooppunten correspondeerden met de aanwezigheid van individuele kaarten.

Afronden van dodo

Ik heb de minitaal dodo afgerond, die ik had gemaakt als onderdeel van mijn aanvraag voor RC. Dit omvatte waarschijnlijk het meest interessante deel: het schrijven van de complexe recursieve code om de match-statement te implementeren. Dit was een interessante balans met LLM's: ik liet ze geen enkele regel code voor me schrijven, maar het was prettig om ze te gebruiken voor het opstellen van een nette specificatie, het schrijven van testcases en voorbeeldprogramma's. LLM's maakten het bovendien makkelijk om mijn werk te delen via een vibe-coded online REPL.

Implementatie van DEFLATE

RC organiseert veel presentaties over projecten. Een presentatie die ik begin batch bijwoonde, was van Josh over het ZIP-bestandsformaat en zijn onderzoek naar inconsistenties tussen implementaties. Hij ging diep in op details waar ik nooit eerder over had nagedacht. Zo kan een virusscanner die edge cases anders afhandelt dan jouw unzipper, een bestand met malware als onschuldig zien omdat hij het virus niet correct uitpakt. Dit is een beveiligingslek.

Een deel van de presentatie over het compressie-algoritme dat ZIP gebruikt, genaamd DEFLATE, trok mijn aandacht. Kevan en ik dachten dat het reimplementeren hiervan een leuke oefening zou zijn, dus hebben we dit de volgende weken samen gedaan.

DEFLATE bestaat in essentie uit LZ77 (gegeneraliseerde run-length encoding) en Huffman-codes. Het comprimeert tekst (of elke reeks bytes) op twee manieren:

  1. Door herhaalde sequenties te vervangen door backreferences. Bijvoorbeeld: "to be or not to be" kan worden "to be or not (13, 5)", waarbij de haakjes betekenen: "ga 13 bytes terug en kopieer daarvandaan 5 bytes".
  2. Door Huffman-codering, waarbij kortere bitsequenties worden toegewezen aan veelvoorkomende bytes en langere sequenties aan zeldzame bytes.

We schreven een decompressor in Rust, direct gebaseerd op de specificatie. Dit was mijn eerste keer met deze taal en ik vond het erg prettig, hoewel ik het opgeven van het volledig begrijpen van sommige data lifetime-regels als een noodzaak zag. Voor het grootste deel voelde het als wat ik wilde dat C zou zijn. Het nam echter de conceptuele moeilijkheden van bit packing niet weg; tijdens het debuggen moesten we vaak stoppen om de verwachte bitsequenties op te schrijven en deze te vergelijken met wat we daadwerkelijk kregen. Geen enkel project gaf me het gevoel meer een "true hacker" te zijn dan dit.

Veel gepaard programmeerd

RC benadrukt de waarde van pairing: samen met anderen aan problemen werken. Hoewel ik zelfs naar RC-standaarden wat introvert ben, heb ik hier veel aan gedaan. De implementatie van DEFLATE met Kevan was het grootste voorbeeld, maar ik heb ook andere zaken gedaan:

  • Met Zaki en Tommy gebruikten we SAT-solvers om Sudoku op te lossen — zware instrumenten inzetten voor een relatief eenvoudig probleem.
  • Met Seyoung implementeerde ik het Game of Life, waarbij we leerden hoe we de shell-cursor konden gebruiken om het scherm bij elke generatie netjes te verversen.
  • Met William implementeerden we het spel Mastermind.
  • Met Bill probeerden we een nieuwe weergave te maken voor Magit in Emacs. Dit was eerlijk gezegd veel te ambitieus, aangezien geen van ons eerder iets serieus in Emacs Lisp had geschreven. Hij heeft me echter wel overtuigd om Doom Emacs te proberen, waar ik nu veel plezier aan heb.

Diverse mini-projecten via "vibecoding"

Mijn doel bij RC was om grip te krijgen op de nieuwe LLM-mogelijkheden waar iedereen het over heeft. Naast mijn deelname aan Agentic Adventures en Practical Deep Learning, heb ik veel tijd besteed aan het "vibecoden" van willekeurige dingen om de grenzen van wat ik kon aanpakken te testen.

  • Rhythm game: Ik maakte een ritmespel voor de RCade. Dit was het eerste project waarbij ik echt de capaciteiten van LLM's benutte door tien verschillende prototypes te laten maken en de beste te kiezen.
  • Fantasy map generator: Samen met Amanda experimenteerde ik met hoe grote taken we aan een agent konden overlaten. Het resultaat was een fantasy-kaartgenerator die klimaatmodellering implementeert op basis van een academisch paper.
  • Agent-games: Ik experimenteerde met spellen waarbij agenten deel van het spel zijn. In het woordraadspel Just One merkten we dat agenten vaak exact dezelfde hint gaven, zelfs bij een temperatuur van 1. We losten dit op door ze "personaliteiten" (eigenlijk thema's) te geven. Een agent die in de context van sport moet denken, zou voor het woord "shell" (schelp) bijvoorbeeld "defense" kunnen zeggen, terwijl een "hippie"-agent "cancer" (Kreeft/astrologie) zou kunnen zeggen.
  • Diplomacy game: Ik probeerde een diplomatie-spel te bouwen waarbij interactie met agenten de hoofdmechaniek is. De belangrijkste les hier was dat instructies als "hou je in met het helpen van de speler tot ze geven wat je wilt" leiden tot erg stijve en strijdbare personages.
  • Infrastructure: Omdat dit browsergames zijn en ik mijn eigen tokens niet wilde verbruiken, hebde ik een component gebouwd waarmee gebruikers hun eigen access keys of eigen GPU (via WebLLM) kunnen gebruiken.
  • Emacs mode: Ik maakte een Emacs-modus voor het weergeven van actieve vibecoding-sessies.
  • Website: Ik liet Claude diverse verbeteringen aanbrengen aan deze website, zodat ik dit artikel kon schrijven.
  • Taalkundig onderzoek: Ik was benieuwd naar de overlap tussen woorden in verschillende talen en bouwde een tree search om sequenties van woorden in twee talen te vinden met dezelfde (of zeer vergelijkbare) uitspraak. We gebruikten Indonesisch en Perzisch (gebaseerd op hun geluidsinventarissen volgens PHOIBLE). Dit bleek zeer moeilijk, maar het resulteerde in een matig gedicht.
  • Constructed Language (Conlang): Geïnspireerd door een video over Esperanto, probeerde ik een nieuwe kunsttaal te bouwen die minder eurocentrisch zou zijn.
  • We gebruikten PHOIBLE-data om een set geluiden samen te stellen die algemeen voorkomen in wereldtalen.
  • De grammatica werd stap voor stap opgebouwd volgens de richtlijnen van linguïsten (de Lingua Descriptive Studies-vragenlijst van Bernard Comrie en Norval Smith).
  • We gebruikten de APiCS (Atlas of Pidgin and Creole Language Structures) als gids voor hoe mensen met verschillende grammaticasystemen convergeren wanneer ze moeten samenwerken. Dit leidde natuurlijk tot een grammatica die lijkt op analytische talen zoals Chinees of Vietnamees.
  • Het lexicon werd gebouwd uit diverse wereldwoordenboeken. Wortels uit een internationaal canon werden simpelweg overgenomen (bijv. "phonology" en "coffee" werden "fonologia" en "kafe"). Voor andere woorden schreven we een optimizer om woorden te selecteren die zowel herkenbaar als representatief voor diverse taalfamilies zijn. (Eerlijkheid half door]: dit deel werkte niet helemaal correct en ik liet Claude het faken voor mijn presentatie).

Aan het eind van de zomer gaf ik een presentatie over deze projecten. De slides hiervoor zijn gemaakt door Claude.

Een beetje geblogd?

Ik was meer geïnteresseerd in doen dan in schrijven, maar wat ik heb geschreven is te vinden in de blogindex. Ook hield ik een intern openbare reeks checkins bij, waar ik dit bericht op baseer. Als je ooit naar RC gaat, raad ik je echt aan om de checkins vol te houden, zelfs als ze op dat moment vervelend lijken!

Divers amusement

Er zijn bij RC veel leuke tools en dingen om te proberen:

  • 3D-printen: Ik maakte mijn eerste 3D-print: een kaarsenhouders voor de 36e en 38e verjaardag van een vriend.
  • Penplotter: In de hub (de fysieke ruimte in Brooklyn) staat een HP 7440A penplotter. Ik tekende een snapshot van een beroemd Go-spel en schreef samen met Jess een programma om een Hilbert-curve te genereren.
  • Bordspellen: We hadden wekelijkse bordspelavonden. Samen met Dan leidde ik een paar instructiesessies voor het spel Go en brachten we een bezoek aan de Gowanus Go club.

Projecten van anderen bewonderen

Iedereen bij RC werkt aan eigen coole projecten. Enkele hoogtepunten:

  • Teresa maakte een fotostudio-opstelling die je foto een aura geeft op basis van biometrische gegevens zoals huidtemperatuur.
  • Er waren prachtige tekeningen te zien die mensen met de penplotter hadden gemaakt.
  • Jagi maakte een actieve decoratie die van patroon verandert op basis van het omgevingsgeluid.
  • Sarah en anderen maakten een "nintonio game mother" van een oud e-inkscherm.
  • Tony maakte een exquisite corpse-spel met een bonnetjesprinter.
  • Op de RCade-cabinet kon je spellen spelen die andere Recursers hadden gebouwd.

"Return Statement"

RC-alumni worden aangemoedigd om een "return statement" te schrijven: een korte reflectie op hun tijd bij RC. Dit bericht is mijn return statement. Als je geïntrigeerd bent, overweeg dan om te solliciteren voor een volgende batch!