Jeg har en notesamling, jeg bruger hver dag i mit arbejde med at rådgive virksomheder om AI. Den er ikke en app, jeg har købt. Den er et lille værktøj, jeg kører selv — en vidensgraf, der hedder iwe, hvor mine noter hænger sammen i links i stedet for at ligge i mapper.
I dag opdagede jeg noget ved den, der fik mig til at tænke på, hvor AI's værdi egentlig ligger.
Jeg søgte på ordet "kørende". Og min notesamling fandt en note, der hed "Hvorfor ikke bare køre det hele som root?". Den fandt den, selvom jeg aldrig har skrevet "kørende" i den note — kun "køre".
Det lyder som ingenting. Det er det præcise sted, hvor de fleste AI-værktøjer fejler.
Ord der bøjer sig
På dansk er "køre", "kører", "kørende" og "kørt" det samme ord i fire former. Det ved enhver, der taler dansk. Men en søgemaskine, der ikke er bygget til dansk, ser fire helt forskellige strenge — og finder kun det, der matcher bogstav for bogstav.
Løsningen hedder stemming: man reducerer hvert ord til dets stamme, så bøjningerne falder sammen. "Køre", "kører", "kørende" og "kørt" bliver alle til samme stamme, og så kan en søgning på den ene form finde dem alle.
Det er ikke ny teknologi. Det er den slags ubehagelig infrastruktur, ingen taler om på konferencer. Men det er det, der adskiller et værktøj, der føles dumt, fra et, der føles som om det forstår dig.
Før: den fandt kun det, der stod i titlen
Min notesamling havde indtil i dag kun én slags søgning: fuzzy-match på titler og filnavne. "Auth" fandt "Authentication", fordi bogstaverne optræder i rækkefølge. Tolerant over for stavefejl og halve ord — men blind for alt, hvad der står i selve teksten.
Det betød, at en note, der behandlede prompt injection fem gange i brødteksten men ikke havde det i overskriften, ikke blev fundet bedre end en note, der bare nævnte det én gang i en titel. Søgningen så overfladen, ikke indholdet.
Én linje konfiguration
I dag fik værktøjet en rigtig fuldtekstsøgning — BM25, den klassiske rangeringsalgoritme fra søgemaskiner — over både titel og brødtekst. Og man kan nu slå de to sammen, så en søgning både er tolerant over for stavefejl og ser, hvad der faktisk står i teksten.
Det eneste, jeg skulle gøre for at få det til at fungere på min danske base, var at tilføje én linje i en konfigurationsfil:
[search]
language = "danish"
Standarden var engelsk. Med engelsk stemming ville "kører", "kørende" og "kørt" forblive tre forskellige ord, der ikke fandt hinanden. Med dansk stemming falder de sammen — og pludselig forstår søgningen det, enhver dansker ved: at det er det samme ord.
Hvorfor jeg fortæller det her
Jeg rådgiver virksomheder om AI, og jeg gør det ud fra ting, jeg selv har bygget og sat i drift — ikke ud fra slides. Denne lille notesamling er en del af min egen maskine. Og det, der gjorde den bedre i dag, var ikke en nyere, dyrere model. Det var én linje konfiguration og en forståelse af, at værdien ligger i det ubehagelige arbejde omkring modellen — stemming, indexing, rangering — ikke i selve modellen.
Det er den indsigt, jeg forsøger at give videre. Når en virksomhed spørger, om de skal have den nyeste AI-model, er svaret ofte: I har sandsynligvis ikke brug for en ny model. I har brug for at få den model, I allerede har, til at forstå jeres data og jeres sprog. Og det er sjældent glamorøst. Det er stemming, datakvalitet og de regler, der binder det sammen.
Min notesamling blev klogere på dansk i dag. Ikke fordi jeg købte noget. Fordi jeg forstod, at det, der adskiller et godt AI-værktøj fra et dårligt, næsten aldrig ligger i det, alle taler om.