Week 40: Een controle is zo goed als wat hij meet
Deze week testte ik keurmeesters voor AI-teksten en zag ik dat een controle vooral iets zegt over de vraag die je stelt.
Eén vraag kwam deze week steeds terug: hoe weet ik dat dit klopt? Ik bouw aan een systeem dat teksten rond onze podcast door AI laat schrijven, en ik schrijf aan een boek over het beheersen van AI-kosten. In beide draait het om vertrouwen in een uitkomst zonder dat ik alles zelf nalees. Een controle die je niet kunt vertrouwen is dan erger dan geen controle, want hij geeft je een gerust gevoel dat nergens op rust.
Een klein model dat er niets van begreep
Ik testte een klein taalmodel dat lokaal op mijn eigen machine draait. Het is snel en kost bijna niets, dus ik wilde weten of het afleveringen in thema’s kon indelen. Op zeven afleveringen haalde het hooguit twee goed. Claude Haiku kwam op zes. Bijna elke aflevering kreeg het label “technologie en innovatie”, welke tekst ik het model ook voorlegde.
De verklaring lag in het ontwerp. Het model is gebouwd om de bedoeling van een klantenservicemail te herkennen, niet om inhoudelijke onderwerpen uit elkaar te houden. Snelheid maakt dan niets uit, want een snel antwoord dat niet klopt levert alleen sneller ruis op.
Een tweede model dat wél voor beoordelen is gemaakt, deed het opvallend goed. Van de 68 beoordelingen waren er 67 correct, en het herkende bijna alle opzettelijk verslechterde varianten. Het kost bovendien ongeveer een achttiende van de keurmeester die ik nu gebruik. Ik heb het daarom vastgelegd als eerste beoordelaar, met Haiku als tweede stem zodra de score twijfelachtig is.
Hetzelfde getal, een andere bewering
Het moeilijkste probleem van de week ging over één zin. In een bron stond “70% van de gestrande pilots”. Mijn tekstgenerator maakte daar “70% van de pilots strandde” van. Het getal is gelijk, de bewering is een andere. Geen enkele keurmeester die ik probeerde zag dat, omdat de cijfers letterlijk in de brontekst voorkomen.
Ik heb er een aparte controlevraag voor geformuleerd en die eerst gemeten op een reeks teksten met bekende fouten: alle twaalf herkend, met één onterechte melding op acht goede teksten. Van dertig nieuwe teksten keurde de controle er negen af. Geen algoritme kan bepalen hoeveel daarvan terecht waren. Dat moest ik zelf beoordelen, tekst voor tekst.
Bij dat uitzoeken viel ook iets anders op. Ik had de referentie voor ‘goed’ bevroren op één enkele uitkomst van het model. Een model schrijft nooit twee keer precies hetzelfde, dus de controle sloeg regelmatig alarm bij normale variatie. Sinds ik de referentie bepaal op het gemiddelde van vijf uitkomsten, is het aantal valse alarmen gedaald van ongeveer een op de drie testrondes naar ongeveer één op vijfentachtig. Dat is de simpelste verbetering van de week, en misschien wel de nuttigste.
Waar je meting niet kijkt
Een ander soort controle voerde ik uit op de kostenregistratie. Vier agents doorzochten tegelijk elk een deel van het systeem. Drie delen bleken in orde. In het vierde ontbrak één post: de foto-analyse voor onze audiogrammen registreerde nooit wat het kostte. De reden zat in een commentaarregel die de veiligheidscontrole voor die aanroep uitzette. Het enige echte lek zat dus precies waar de controle bewust niet keek.
Daartegenover staat een raadsel dat ik niet heb opgelost. Eén API-sleutel had op één dag meer dan tachtig dollar gekost, bijna volledig aan tussentijds opgeslagen context die telkens opnieuw werd gelezen. Dat patroon past bij een lange agentsessie, maar mijn eigen registratie zag er maar een fractie van. De rest kon ik niet herleiden. Een meting die alleen ziet wat je eerder hebt aangesloten, maakt je blind voor de plek waar het geld naartoe gaat.
Wat het met mij deed
Bij het terugkijken zie ik dat mijn beste beslissingen van de week besluiten waren om iets niet te bouwen. Ik stopte het onderzoek naar herkenning van sprekers in onze opnames na één vraag: is wat we al hebben niet betrouwbaarder? Dat was zo, dus het idee ging dicht. Ook een automatische koppeling met een batch-dienst en een registratie van abonnementsagents sloot ik af, omdat de bouwkosten niet opwogen tegen wat ze opleverden.
Ik draaide ook een besluit terug. Ik had bewust bepaald dat het kostendashboard niet openbaar hoorde te zijn. Na het zien van een schermafbeelding besloot ik het toch achter een inlog te publiceren, en ik heb de eerdere afweging aangepast in plaats van haar te laten staan.
Het lastigste besluit was een ander. De nieuwe kwaliteitscontrole voor teksten haalde mijn eigen toets net niet: 33 van de 34 verslechteringen herkend, maar drie valse alarmen tegenover twee eerder. Ik heb die controle toch in gebruik genomen en de reden vastgelegd. Ik koos bewust voor een onvolmaakte controle boven een controle die niet bestond. Blijkbaar accepteer ik een gedocumenteerd tekort, zolang ik weet welk tekort het is.
Het patroon
Elk onderdeel van deze week gaat over dezelfde spanning. Een controle levert je een antwoord, maar het antwoord gaat alleen over de vraag die je stelde, en alleen over de plekken waar je hem liet kijken. Het kleine model beantwoordde een vraag waarvoor het niet was gebouwd. De keurmeesters zagen een verschoven betekenis niet omdat de cijfers klopten. De kostenregistratie zag alleen wat ik had aangesloten.
Hieruit neem ik mee dat je een controle pas kunt vertrouwen nadat je hem zelf hebt getest op fouten waarvan je weet dat ze er zijn. En dat een besluit om niet te bouwen, mits je het opschrijft, evenveel waard kan zijn als een besluit om wel te bouwen.
Deze blog is geschreven met behulp van AI, op basis van mijn chats uit deze week in combinatie met mijn journal.