LLM's zijn het bewijs dat Unix heeft gewonnen

Tot mijn verbazing zat ik voor het eerst voor een opdrachtregel (command-line prompt). De knipperende cursor daagde me uit om iets in te voeren, maar in eerste instantie was er geen duidelijke manier om de dingen te doen waarvan ik wist dat een computer ze kon uitvoeren. Het was een formidabele puzzel — en ik was verslaafd! Dankzij een verrassend goed gevulde bibliotheek in het naburige dorp leerde ik dat er verschillende smaken of evolutionaire neven van Unix bestaan, en dat een deel van hun gedrag is gecodificeerd door standaarden zoals POSIX.

Ik leerde ook over GNU en de heroïsche inspanningen van de eerste golven hackers die al deze software beschikbaar maakten voor een wereld die meer geïnteresseerd leek in het vergrendelen van alles en het voorkomen van elk soort knutselen. O, dappere nieuwe wereld!

Maar ik hield vol. Ik staarde me blind op de altijd knipperende prompt en voedde hem. Vele manen later, na een omweg via FreeBSD, ben ik een fervent Linux-gebruiker gebleven omdat het past bij mijn manier van werken: ik houd ervan om gevaarlijk te leven, waarbij ik kernel-updates vaak uitstel vlak voor belangrijke deadlines — wat een spanning — en over het algemeen vrij optimistisch ben over mijn vermogen om mezelf uit elke benarde situatie te redden. Wat ik waardeer is dat Linux me in staat stelt mijn zelfeffectiviteit uit te oefenen. In essentie is vrijwel alle pijn die ik ervaar bij het gebruik ervan, tot op zekere hoogte, zelf toegebracht. Dat voelt veel beter dan moeten bidden dat de volgende iOS-update mijn apparaten niet vernielt of andere onzin.

Deze houding wordt vaak beantwoord met een glazige blik of het gebruikelijke "Hoe dan ook, ..." door mensen die het simpelweg niet begrijpen; oftewel, bijna iedereen die geen enorme nerd is, geen fan is van Neal Stephenson, of niet gezegend is met een overvloed aan vrije tijd. Naast het prettige, tintelende gevoel van gevaar, is hetgeen wat mij het meeste aantrekt aan Linux de mogelijkheid om het als digitale klei naar mijn hand te zetten. Veel van de command-line tools die ik gebruik bestaan al een hele tijd[^1], maar ze werken nog steeds bewonderenswaardig en stellen me in staat om dingen te doen als dit:[^2]

rg -t py "^\s*url ="                               \
| grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" \
| awk -F/ '{print $3}'                           \
| sort                                           \
| uniq -c                                        \
| sort -rn

In natuurlijke taal is het doel van dit commando om domeinnamen zoals github.com te extraheren en te tellen uit URL's die zijn toegewezen aan variabelen met de naam url in alle Python-bestanden in de huidige map en submappen. Als dit voor jou klinkt als wartaal, dan zou mijn jongere, heethoofdige zelf, vol (neo)vim en vigor, je hebben getroffen met de oude uitspraak: "Linux is zeer gebruiksvriendelijk; het is alleen ook super kieskeurig over zijn vrienden." Ja, mijn jongere ik was bedreven in het maken van vijanden als een vakman.[^3]

Met de wijsheid en de verzachting van de jaren zou ik nu diplomatiek zijn, maar het strike me nog steeds als vreemd dat deze manier van werken met een computer voor velen zo vreemd is. Mijn oude workflow uitleggen aan iemand die alleen moderne GUI's gewend is, is een beetje als het uitleggen van hogere dimensies aan iemand die in Flatland woont:

Op zijn best luisteren ze beleefd voordat ze wat je zei terzijde schuiven als mild vreemd en terugkeren naar hun oude gewoonten. Maar opnieuw: ik hield vol en bleef bij mijn overtuiging dat een computer je een general-purpose interface moet bieden waarmee je dingen kunt bouwen die je leuk vindt. GUI's kunnen die behoefte slechts gedeeltelijk stillen, omdat ze moeten gissen welk pad je waarschijnlijk zult nemen. In tegenstelling daartoe beseften de Unix-grijsbarden van weleer dat het zinloos is om gebruikersgedrag te raden of te dwingen — in plaats daarvan kozen ze ervoor om iedereen uit te rusten met een paar relatief kleine tools die voldoen aan een bepaalde filosofie:

  • Schrijf programma's die één ding doen, en dat goed doen.
  • Schrijf programma's om samen te werken.
  • Schrijf programma's die tekststromen verwerken, want dat is een universele interface.

Decennia later werkt dit nog steeds. Programma's zijn groter en complexer geworden, maar ook handiger voor zeer specifieke gevallen zoals videobewerking — maar in de kern van veel machines ligt deze prachtige interface die bijna grenzeloos plezier biedt.[^4] In plaats van de kloof tussen de CLI-dwergen en de GUI-elfen echter te vergroten, gebeurde er iets onverwachts: de ontwikkeling van grote taalmodellen (LLM's).

Door in eerste instantie niets anders dan een invoerveld aan de gebruiker te presenteren, vormden ze een bewuste breuk in de gewoonten voor velen. Hier was geen GUI die op je wachtte om te specificeren wat voor soort afbeelding je wilde maken. De prompt daagde je uit om groot te dromen. Ik stel me voor dat dit voor sommigen zelfs een beetje schokkend moet zijn geweest — een programma dat je niet vertelt wat je ermee moet doen, was ongekend.[^5]

En de vooruitgang trok verder, waarbij de prompts van de beginperiode[^6] plaatsmaakten voor steeds verder verfijnde queries in natuurlijke taal. Nu hoeft men niet meer te weten wat awk, grep en vrienden zijn, maar kan men gewoon aan hun favoriete LLM vragen:

"Ik wil domeinnamen zoals github.com extraheren en tellen uit URL's die zijn toegewezen aan variabelen met de naam url in alle Python-bestanden in de huidige map en submappen. Hoe doe ik dit met een set shell-commando's?"

De output is vrij competent:

grep -rhoP "url\w*\s*=\s*['\"]\Khttps?://[^'\"]+" --include="*.py" . \
| sed -E 's#https?://##; s#/.*##'                                \
| sort                                                           \
| uniq -c                                                        \
| sort -rn

De commando's doen min of meer hetzelfde. Mijn handgemaakte versie met rg negeert echter automatisch verborgen mappen, wat doorgaans is wat je wilt doen bij het doorzoeken van code, maar ik heb die context niet aan de LLM meegegeven. Bovendien zal -P falen op besturingssystemen die de BSD-variant van grep gebruiken. Ook hier ontbreekt de context bij de LLM, maar dit commando zal werken wanneer ik het kopieer en in mijn terminal plak. Ik zou zelfs een van de CLI-tools zelf kunnen gebruiken om het commando direct voor mij uit te voeren, waarbij de LLM dient als vertaler tussen natuurlijke taalcommando's en oude Unix-bezweringen.

In die zin belichamen LLM's de Unix-filosofie. Natuurlijk heeft deze analogie gaten waar je gemakkelijk een paard doorheen kunt rijden. LLM's zijn niet klein en ze doen niet één ding — je zou zelfs kunnen beweren dat sommige van de dingen die ze doen, ze zeker niet goed doen. Ondanks deze problemen begrijpen LLM's dat tekst de universele interface is. In plaats van dat gebruikers moeten leren hoe ze met de computer moeten praten, praat de computer nu tegen jou. Een paar jaar geleden zou dit idee volkomen optimistisch hebben geklonken. Niemand had verwacht dat "tekst en tokenisatie" het recept zouden zijn voor het bouwen van general-purpose AI-modellen. Maar hier zijn we dan, waarbij we steeds minder vertrouwen op GUI's en in plaats daarvan terugkeren naar onze geliefde Unix-achtige interface.

Ondanks alle problematische aspecten rondom AI,[^7] kunnen we er ten minste troost in vinden dat we na zoveel decennia gelijk hebben gekregen: tekst is superieur en Unix heeft gewonnen.

***

[^1]: De meeste, zo niet alle, zijn ouder dan mijn studenten. Sommige zijn zelfs ouder dan ik. Tempus fugit. [^2]: Er zijn waarschijnlijk manieren om dit efficiënter te doen. Laat het me weten — ik claim niet dat mijn CLI-kennis de beste is. [^3]: Ik zou mijn neurodivergentie kunnen beschuldigen, maar ik denk dat ik, zelfs met deze verzachtende omstandigheden, onverdraaglijker was toen ik jonger was. Sorry! [^4]: Althans, dat is mijn definitie van plezier. [^5]: Ik vermoed dat dit aanhoudende gevoel nog steeds de reden is voor de vele voorbeeldprompts/afbeeldingen van de eerste generatie van deze modellen. [^6]: Met absolute pareltjes als deze: "Een toovenaar die op een met mos bedekt stenen pad in een eeuwenoud bos staat, een gloeiende spreuk werpt vanuit zijn houten staf. Dynamische cinematografische belichting, concept art door Alphonse Mucha, Octane Render, Unreal Engine 5, hyperrealistische details, 8K, scherp, meesterwerk." Herinner je je nog wanneer 'prompt engineer' de populairste AI-baan was? [^7]: Ik heb ze hier bewust niet opgenomen, omdat dit artikel niet de juiste plek is om ze te bespreken.