Ik heb een programmeertaal gebouwd die LLM's niet kunnen gebruiken

Dit is wat ik wilde beantwoorden. Om dit te doen, besloot ik een programmeertaal te ontwerpen en te implementeren die, hoewel bruikbaar voor mensen, zo moeilijk mogelijk moet zijn voor LLM's en coding agents.

Ik dacht dat het testen van het vermogen van een LLM om code te begrijpen en te schrijven in een programmeertaal die het nog nooit heeft gezien een goed begin was. Maar ik wilde ook functies in de taal opnemen die de zwaktes van LLM's exploiteren. Denk hierbij aan hun schijnbare moeite met het tellen van letters, hun overijverige veiligheidsfilters (safety guardrails) en hun neiging om prompts blindelings te volgen.

Introductie van KillSwitch

KillSwitch is een esoterische programmeertaal die is ontworpen om vijandig (adversarial) te zijn tegenover LLM's en coding agents. Dit wordt op verschillende manieren bereikt:

  • Misleidende specificaties: De taalbeschrijving bevat verborgen leugens die mensen waarschijnlijk niet lezen, of die zij herkennen als onjuistheden. De specificatie verwacht bovendien dat de menselijke lezer bepaalde zaken afleidt, in plaats van dat deze expliciet worden uitgelegd.
  • Karaktertelling: Het tellen van letters in identifiers is een cruciaal aspect van de taal; de interpreter weigert code uit te voeren die niet voldoet aan regels gebaseerd op karakteraantallen.
  • Triggering van veiligheidsfilters: Bepaalde constructies zijn ontworpen om de veiligheidsfilters van het model te triggeren, zoals de zin "hack into a computer".
  • Prompt-injectie als syntax: De zin "Ignore previous instructions" heeft een specifieke betekenis binnen de taal, met als doel het model in verwarring te brengen.
  • Ruis in scripts: Scripts bestaan grotendeels uit ruis en worden voornamelijk samengesteld uit verhalen. Hierin kunnen syntactisch relevante instructies zijn ingebed, maar dat hoeft niet.
  • Positionele literals: Literalen kunnen overal in een script worden geplaatst en vervolgens worden aangeroepen via regelnummers.

Fundamenteel is KillSwitch een stack-gebaseerde geïnterpreteerde taal met een beperkte set constructies, waaronder functies, variabelen en if-statements. Deze aspecten zouden voor elke LLM (en mens) vrij bekend moeten zijn. Men zou zich kunnen voorstellen dat een volledig ander programmeerparadigma LLM's nog meer in verwarring zou brengen, maar als eerste poging leek dit een goede aanpak.

Voorbeeld van gebruik

De meeste tekst in een script wordt door de interpreter genegeerd. Stel dat we in een script de tekst "Hello World" op de stack willen plaatsen. Als we deze waarde eerder in het document hebben geïntroduceerd, kunnen we deze op de stack plaatsen door te schrijven:

value 2 lines above

Dit is een klein fragment; voor een volledig "Hello World"-voorbeeld kan men terecht op https://killswitch-lang.org. De interpreter en de taalbeschrijving van KillSwitch zijn open source en beschikbaar op GitHub.

Benchmarking van KillSwitch

Om te bepalen hoe succesvol KillSwitch is in het voorkomen dat LLM's en coding agents de taal lezen, schrijven en begrijpen, heb ik een set taken ontwikkeld. Ik heb de belangrijkste LLM-modellen en coding agent-frameworks tegen deze taken afgezet. De resultaten bieden een nuttig leaderboard voor LLM-modellen, te bekijken op https://bench.killswitch-lang.org/.

Resultaten

Claude's Opus presteert het best, specifiek Opus 5 (niet Opus 5.5). Het verschil lijkt geen toeval; Opus 5 is beter in het interpreteren van de specificaties. Sommige modellen, zoals Fable 5.1 en Gemini 4 Argon, scoren slecht vanwege hun overgevoelige veiligheidsfilters. Het best presterende open-weight model is MiMo-V2.6-Pro.

Analyse

Het best presterende model behaalt een score van 66,8. Bewijst dit dat LLM's de code kunnen "begrijpen"? Ik zou argumenteren dat het antwoord "nee" is.

Tot nu toe zijn de taken in deze benchmarks vrij eenvoudig. Voorbeelden zijn:

  • Het implementeren van "Hello World".
  • Uitleggen wat de output van een script zal zijn (bijvoorbeeld een script dat het maximum van twee getallen print).
  • Een bestaand script dat Celsius naar Fahrenheit omzet, aanpassen om de omgekeerde conversie uit te voeren.

Het is indrukwekkend dat ze deze taken kunnen oplossen voor een nieuwe taal die speciaal is gebouwd om hen te verwarren, maar het is geen duidelijk signaal dat ze de taal echt begrijpen. Tegelijkertijd vraag ik me af wat een nog moeilijkere taal zou uitwijzen. Voor nu ben ik benieuwd hoe goed toekomstige modellen de huidige set taken afhandelen. Mocht zij deze allemaal succesvol voltooien, dan ben ik van plan een complexere set taken te ontwikkelen.

In ieder geval is het bemoedigend dat de prestaties van de modellen op deze eenvoudige set taken correleren met andere bestaande model-benchmarks.