Tilfeldige tall, forutsigbare modeller og skills med script
Språkmodeller er gode til å gi svar som ser riktige ut. Det betyr ikke nødvendigvis at de følger en riktig fremgangsmåte.
Ber du en AI-agent om å korrekturlese en tekst, kan det holde med gode instruksjoner. Ber du den derimot om å trekke et tilfeldig tall, regne ut noe eksakt eller validere data etter faste regler, er det ikke alltid nok at modellen «tenker seg fram» til svaret.
I slike tilfeller kan en skill gi agenten spesialisert kunnskap om en bestemt oppgave, eller eventuelt et script den skal kjøre i stedet for å gjette.
Den enkle varianten: kun instruksjoner
Alle skills består av en mappe som minimum inneholder en SKILL.md-fil. Øverst ligger noe metadata, ofte kalt «frontmatter». I sin enkleste form inneholder den feltet name, som er navnet du bruker for å kalle skillen manuelt, og en description som forteller AI-agenten når den eventuelt skal kalle skillen automatisk.
Her er et eksempel på en minimalistisk skill som kan brukes til å korrekturlese tekster og gi tilbakemelding i ønsket format.
---
name: korrekturles
description: Korrekturleser tekst oppgitt av brukeren og gir tilbakemelding på stavefeil, særskriving, grammatikk, tegnsetting, flyt og faktafeil.
Trigges når brukeren ber om korrekturlesing.
---
Korrekturles teksten brukeren oppgir. Behold brukerens egen skrivestil. Du skal rette feil og foreslå forbedringer, ikke skrive om teksten i din egen stil.
Presenter tilbakemeldingen i denne rekkefølgen:
1. Stavefeil og særskriving
2. Grammatikk og tegnsetting
3. Setninger som bør skrives om
4. Selvmotsigelser og faktafeil
Når du starter agenten, er det kun metadataene som blir lastet inn i konteksten. Dersom agenten oppfatter at brukeren ber om korrekturlesing, vil resten av SKILL.md-filen lastes inn i konteksten. Slik slipper du å betale for at hele skillen lastes inn i konteksten, alle de gangene samtalen ikke handler om korrekturlesing.
Det er også mulig å bruke SKILL.md som en «innholdsfortegnelse» med pekere til flere spesialiserte Markdown-filer som agenten kan laste ved behov. I eksempelet over kunne vi hatt en egen .md-fil for å korrekturlese LinkedIn-poster og én for e-poster.
Det er ikke alltid du får AI-agenten til å gjøre som du vil, uansett hvor presis du er med beskrivelsen din. I noen tilfeller kan kode gjøre det enklere.
Tilfeldige tall
Hvis noen ber deg velge et tilfeldig tall mellom 1 og 10, hvilket tall velger du? Det viser seg at flertallet vil velge 7. Claude vil også foretrekke tallet 7.
Jeg testet 100 uavhengige samtaler med hver av Claude sine fire modellfamilier. Alle forsøkene er ekte claude -p-kall der modellen må svare fra eget hode, uten tilgang til verktøy eller script. Detaljer om oppsettet ligger nederst i innlegget.
Alle modellene hadde samme favoritt-tall, tallet 7. Alle modellene valgte tallet 7 i minst 86% av tilfellene.

Jeg gjorde også en tilsvarende test der jeg ba om et tall mellom 1 og 100. På 100 forsøk var det kun to av modellene som ga meg ett eneste tall lavere enn 42.
De samme fire tallene utpeker seg hos alle modellene: 42, 47, 57 og 73. Nesten alt de trekker, lander på ett av disse. Men de er ikke enige om hvilket. Hver modell har sin egen favoritt.

Når det gjelder tilfeldige tall, er det heller ikke slik at en kraftigere modell gir deg mer tilfeldige tall. Den rimeligste modellen, Haiku, var faktisk den som kom best ut av det. Haiku fordeler hovedtyngden på tre ulike tall (42, 47, 73), Sonnet har 47 som en klar favoritt, mens Opus har lagt sin elsk på 73. Fable, den kraftigste modellen fra Anthropic til nå, er delt mellom 42 og 57.
Hvorfor akkurat disse tallene? Fordi en språkmodell er trent på tekst skrevet av mennesker, og mennesker er svært dårlige til å opptre tilfeldig. Blir vi bedt om et tall, opplever vi at runde tall som 10 og 50 «ikke teller», mens skjeve, ofte odde tall som 7, 47 og 73 føles mer vilkårlige.
42 har i tillegg sin helt egen tyngde, som svaret på Det store spørsmålet om Livet, Universet og Alt fra Haikerens guide til galaksen. Modellen trekker altså ikke et tilfeldig tall, den gjengir hvordan mennesker svarer når de forsøker å være tilfeldige. Og det er akkurat der poenget ligger. Den har lært seg hvordan et tilfeldig svar ser ut, ikke hvordan man faktisk trekker ett.
Det at datamaskiner har utfordringer med tilfeldige tall, er selvsagt ikke noe nytt, men vi kan hjelpe AI-agenten med å gjøre det litt mer tilfeldig. Cloudflare er kjent for at de har en hel vegg med lavalamper som én av kildene til å lage tilfeldige tall. Jeg velger en litt enklere variant: Pythons secrets-modul, som henter tilfeldigheten sin fra operativsystemet.
Script: når instruksjoner ikke er nok
En skill trenger ikke bare inneholde instruksjoner, den kan også inneholde script. Et script følger samme fremgangsmåte hver gang det kjøres. Det er nettopp det vi trenger her, forutsigbar oppførsel som gir et faktisk tilfeldig trukket tall.
Her er et eksempel på en skill som bruker et script for å gi brukeren et tilfeldig tall.
---
name: random-number
description: Picks a random integer using a real random number generator instead of guessing one. Use whenever the user wants to generate a random number.
---
# Pick a random number
Do not invent a random-looking number yourself. Always call the bundled script instead.
Run `scripts/random_number.py` with 2 arguments:
```bash
python scripts/random_number.py 1 100 # 1-100 inclusive
```
Istedenfor at språkmodellen selv forsøker å finne et tilfeldig tall, vil den nå kjøre Python-scriptet som bruker den innebygde secrets-modulen til å trekke tallet. Det er standardverktøyet for kryptografisk sikre tilfeldige tall.
Skjermbildet under viser fordelingene på nytt, nå med en ekstra rad nederst der Haiku har skillen slått på.

Ofte holder det med en skill som bare inneholder instruksjoner, men et script lønner seg som regel når oppgaven har en fast, riktig fremgangsmåte som modellen egentlig bare gjetter seg fram til.
Skal du regne ut noe eksakt, som datoer på tvers av tidssoner eller renter, er et script tryggere enn en modell som «regner i hodet». Trenger du ekte kryptografi, som sikre passord, tokens eller en skikkelig UUID, må det være kode som trekker verdiene, slik at de faktisk er tilfeldige. Det samme gjelder når du skal validere strukturerte data etter faste regler.
Ofte vil språkmodellene, på eget initiativ, skrive kode for å løse slike oppgaver. Men ønsker du full kontroll, bør du bruke en skill med et script du kan kvalitetssikre.
Hele random-number-skillen med script finner du her.
Metode
Ekte kall. Alle forsøk, både med og uten skill, er ekte claude -p-kall i en egen prosess, ikke en simulering. Alle skills og alle verktøy var slått av (--disable-slash-commands --disallowedTools Bash), slik at modellen måtte svare fra eget hode.
Modellinnstillinger. Testene med Sonnet, Opus og Fable kjørte med --effort low av hensyn til kostnad.
Omfang. Forsøkene med skill ble kjørt på kun Haiku 4.5. Sonnet, Opus og Fable ble ikke testet med skillen slått på, da resultatet antas å bli det samme.
RNG verifisert. At generatoren selv gir en jevn fordeling, ble bekreftet i en egen test: 60 000 trekninger direkte fra secrets.randbelow(), ikke bare utledet fra forsøkene med skill.