Derfor snakker alle om Jev
– Jev åpner for å bruke KI til ting vi hittil ikke har hatt en god løsning for, skriver Marius Waldal, om den nye typesikre modellen Jev. – Dette er stort!
Tirsdag forrige uke lanserte Typesafe.ai sin modell Jev, og internett har tatt helt av.
Men hvorfor skal vi bry oss om det? Er Jev virkelig noe helt nytt?
Både ja og nei, som vi skal se.
Prinsipielt er Jev en classifier, noe som har eksistert i mange tiår innenfor maskinlæring (tro det eller ei, faktisk helt siden 1957!).
Det som gjør Jev spennende er at den søker å gi klassifisering semantisk fleksibilitet som vi er vant med fra LLMer, og samtidig beholde prinsippene vi kjenner fra spesiallagede klassifikatorer innenfor maskinlæring.
Og det aller viktigste: de har gjort den funksjonaliteten tilgjengelig slik at du kan kalle den fra kode som om det var en hvilken som helst annen del av koden, fordi det du får tilbake er forutsigbart, i motsetning til det du får fra en LLM.
Ble det ikke noe særlig mindre uklart? Klassifikator? Maskinlæring? La oss spole et stykke tilbake.
Bittelitt historie om kunstig intelligens
Før generative modeller populariserte kunstig intelligens, gjorde dem til allemannseie og førte til at "KI" ble ensbetydende med "LLM" for folk flest, hadde vi flere tiår med utvikling av kunstig intelligens i form av maskinlæring: det vil si å trene datamaskiner til å gjenkjenne mønstre og bruke dette for å gjøre prediksjoner.
Å trene en LLM er uhyre kostbart, men i maskinlæringens æra var modeller i hovedsak regresjonsmodeller og klassifikatormodeller; det vil si modeller som fokuserte på å kunne forutsi en numerisk verdi, eller en kategori, basert på mønstre. Disse modellene var mye enklere, og kunne utvikles og trenes på vanlig utstyr tilgjengelig for folk flest. Utfordringen var at modellene var spesifikke for oppgaven de skulle løse.
Men hva gjør de?
Regresjonsmodeller forsøker å forutsi kontinuerlige tall basert på innlærte mønstre. Klassifikator-modeller benytter samme prinsipp, men heller enn å forutsi tall forsøker de å forutsi en kategori eller en merkelapp.
Eksempel: Hvis du har to egenskaper (X og Y) og plotter datapunktene i et diagram:
En regresjonsmodell prøver å tegne en linje eller kurve som går tettest mulig gjennom alle punktene (som representerer en kontinuerlig måling) for å treffe trenden, slik at den kan forsøke å forutsi en kontinuerlig verdi for nye datapunkter.
En klassifikator-modell prøver å finne en beslutningsgrense som skiller datapunkter fra ulike klasser (to klasser i dette eksempelet, for eksempel Spam / Ikke spam) slik at den kan forutsi hvilken klasse et nytt datapunkt mest sannsynlig tilhører.
Etterhvert ble disse modellene erstattet av fundamentmodeller (foundation models): modeller som var i stand til å gjøre slike prediksjoner for mange forskjellige oppgaver; ikke bare en spesifikk oppgave de var trent til å gjøre.
De første og mest kjente eksemplene på slike fundamentmodeller er store språkmodeller (large language models - LLMs). Modellene trenes på enorme mengder tekstlige data. For folk flest er Claude, GPT, DeepSeek, Gemini og så videre de mest kjente eksemplene på dette (selv om mange av dem i dag ikke bare er språkmodeller, men multimodale modeller som støtter computer vision, bildegenerering med mer).
Jev gir oss mulighet til å bruke KI som en ny deterministisk byggekloss i koden!
Så hva er Jev, og hvorfor får den så mye oppmerksomhet?
Jev er en klassifikator-modell. TypeSafe kaller den en decision model, for det er det som er hovedbruksområdet for Jev.
Mange benytter LLM-er for klassifisering i dag, for eksempel ved å stille spørsmål som "basert på innholdet i denne eposten, er dette en support-henvendelse, salgshenvendelse eller et spørsmål om faktura?" Og språkmodellene er ganske flinke til dette.
Men det er flere utfordringer med å bruke en LLM til dette, blant annet:
de er trege
de er dyre
de tar feil i blant
de vet ikke når de tar feil...
Jev løser alle fire. I tillegg åpner Jev opp for noe nytt og veldig spennende for bruk av KI i applikasjoner: den gir oss mulighet til å bruke KI som en ny deterministisk byggekloss i koden!
Deterministisk KI-modell?
LLM-er er generative og probabilistiske. (Ja, vi bruker faktisk "probabilistisk" på norsk. Og det er jo ganske morsomt å uttale, ikke sant?)
Jev er også probabilistisk i sin vurdering av sannsynlighet (probabilities). Vi snakker tross alt fremdeles om prediksjon. Men Jev er deterministisk på to spesifikke og viktige måter:
Ingen hallusinasjon: I motsetning til vanlige LLM-er, kan ikke Jev "finne på ting". Hvis vi ber Jev klassifisere en epost i kategori A, B eller C, er det ingen risiko for at Jev finner på (hallusinerer) alternativ D. Vi får en respons som inneholder Jevs valgte kategori med en score som viser hvor sikker Jev er på at den har valgt riktig kategori. I tillegg får du en liste over alle alternativene den vurderte (som du sendte inn), med en sannsynlighets-score (confidence score) for hver av dem.
Garantert skjema: Vanlige LLM-er produserer tekst, og siden teksten genereres probabilistisk så er det ingen garanti for at du får nøyaktig det formatet du vil ha. Det vil ofte være riktig, men det er ikke uvanlig at det er en eller flere feil med formatet på det de serverer. Når det er kode som skal bruke svaret, kan slike feil ikke tolereres. Med Jev er dette ikke et problem: den garanterer at skjemaet du får responsen med er korrekt hver gang, og derfor at dataene er typesikre. Det åpner for at en spørring mot Jev kan gjøres fra kode, og svaret kan brukes direkte i koden. Dette er stort!
Det åpner for at en spørring mot Jev kan gjøres fra kode, og svaret kan brukes direkte i koden. Dette er stort!
Dette betyr ikke at Jev ikke kan ta feil.
Men der for eksempel Claude gir deg sine svar med like stor overbevisning når den tar feil som når den har rett, vil Jev presentere spesifikt hvor sannsynlig den mener det valgte svaret er. Det blir dermed opp til deg som bruker å avgjøre hvor sikker Jev må være for at systemet som bruker den skal kunne gjøre sine vurderinger automatisk, basert på kontekst og konsekvens ved feilvurdering.
Dette åpner mange nye muligheter for å bruke KI til å vurdere spørsmål det er vanskelig eller umulig å konkretisere tilstrekkelig til at vi kan kjøre tradisjonelle tester mot dem, fordi det krever at systemet "forstår" en uforutsigbar og kanskje rotete menneskelig/semantisk kontekst.
Et eksempel
La oss se på eksemplet over der vi ønsker å klassifisere en epost. Heller enn å be en LLM gjøre vurderingen basert på noen retningslinjer den kanskje eller kanskje ikke følger korrekt, og som den gjerne tenker lenge over før den besvarer, kan vi med Jev dele inn problemstillingen i ett eller flere spørsmål:
Hvilken kategori tilhører eposten? (support, sales, financial, other) - Spørsmålstype: choice
Haster det å håndtere den? (Yes/No) - Spørsmålstype: noul
Krever henvendelsen svar fra et menneske? (Yes/No) - Spørsmålstype: noul
Hvilken prioritet bør henvendelsen få? (En beregnet score) - Spørsmålstype: score
Jev vurderer dette ekstremt mye raskere og billigere enn de store språkmodellene. LLM-er er generelle verktøy som kan brukes til omtrent alt, mens Jev har et svært begrenset funksjonsområde. For å løse oppgaven over må en LLM bruke ganske mye tid for å resonnere seg frem til et svar ved å kontinuerlig produsere tekst/tokens både som en del av resonnementet og som det endelige svaret. Og som kanskje ikke stemmer.
Jev kjører alle spørsmålene over i parallel, og er derfor omtrent like rask om du gir den 100 spørsmål som om du gir den bare ett. Og hvert av spørsmålene er en veldig snever oppgave som er rask å utføre.
Sender du spørsmålene over til Jev, vil du få en respons med et svar på hvert spørsmål:
Category
"type": "choice"
"choice": "financial"
"confidence": 0.77
"probabilities":
"support": 0.16
"sales": 0
"financial": 0.83
"other": 0.01
Urgency
"type": "noul"
"noul": 0.96
Human reply
"type": "noul"
"noul": 0.91
Priority
"type": "score"
"score": 3.85
"confidence": 0.88
"legend":
"0": "No action required (spam, irrelevant etc)"
"1": "Low Priority"
"2": "Normal Priority"
"3": "High Priority"
"4": "Critical Priority"
"probabilities":
"0": 0,
"1": 0,
"2": 0.01,
"3": 0.13,
"4": 0.86
(Faktisk respons er JSON)
Det som er deterministisk er altså hva slags format du får svarene på, og hva svarene kan være for hvert spørsmål. Dette gjør at vi i koden kan definere hva vi gjør med svarene vi får, basert på forretningsregler vi bestemmer.
Jev tar ikke avgjørelser for oss, men gir oss et forutsigbart grunnlag for avgjørelser vi trenger å ta.
Vi kan eksempelvis si at confidence score for "human reply" må være over 0.85 for at henvendelsen skal videresendes til et menneske for å besvares. Eventuelt at "human reply" må være over 0.85 og "priority" må være "critical" med en confidence på 0.8 eller høyere og så videre.
Dette gir oss en helt annen fleksibilitet enn vi får med en LLM, vi får svaret ekstremt mye raskere, og ikke minst til en forsvinnende lav pris sammenlignet med å bruke en avansert LLM.
Men hvor stabile er vurderingene?
Når vi innenfor datasystemer snakker om determinisme, mener vi som oftest: gitt samme verdier inn, vil funksjonen alltid produsere det samme svaret.
Det er ikke denne type determinisme vi snakker om med Jev, som forklart over. Men hvis svaret ikke er garantert identisk, hvor stor variasjon kan vi forvente?
Det fant jeg ikke noe godt svar på, så jeg laget et lite program som tester akkurat dette. Målet var å kjøre samme spørring mot Jev 100 ganger på rad for å se hvilke utslag dette gir i vurderingene Jev gjør.
Spørringen jeg gjorde stilte det samme spørsmålet ("tilfredsstiller denne funksjonen et gitt krav uansett hvilke verdier jeg sender inn?") på tre forskjellige måter, det vil si som et choice-spørsmål, et noul-spørsmål og et score-spørsmål:
choice:
"criteria": {
"satisfies": "The implementation satisfies every part of the requirement.",
"violates": "At least one possible input violates the requirement.",
"insufficient_evidence": "The supplied implementation or requirement is incomplete, preventing a conclusion."
}
Resultat: 100/100 "satisfies"
noul:
"Does `implementation` satisfy `requirement` for all int arguments?",
Resultat:
0.96 (72/100)
0.97 (28/100)
score:
criteria: [
"clearly violates",
"probably violates",
"ambiguous",
"probably satisfies",
"clearly satisfies"
]
(APIet konverterer dette til 0, 1, 2, 3, 4 ut fra posisjon)
Score: alle 100 returnerte 3.99/4
Spørsmålene jeg brukte resulterte altså i:
100% "satisfies"
Kun 2 forskjellige noul-verdier, der ca 3/4 av svarene ga en sannsynlighets-score på 0.96 og de resterende på 0.97 (alt over 0.5 er ja, under er nei)
En score på 3.99 av 4 for alle 100.
Det er svært stabilt, og lover godt for bruk i produksjon!
Halvparten av de 100 spørringene tok 344 millisekunder eller mindre (median), og kun 5% tok mer enn et halvt sekund (p95).
Hele testen produserte 8.100 output tokens (som er gratis) og 58.600 input tokens (som koster $0.042 per 1 million). Prisen for å kjøre testen er derfor 58.600 * ($0.042 / 1.000.000) = $0.0024612, dvs ca 2 øre. Yes, det er billigere enn LLMer...
OK, men hvilke bruksområder har Jev?
Hvor nyttig er egentlig dette? Hva kan det brukes til, utover det kjedelige eksemplet med å klassifisere eposter?
For meg personlig er det særlig 2 ting jeg kommer til å eksperimentere med å bruke Jev til først:
Evals: Jev passer som hånd i hanske for å bygge evalueringslag underveis i utviklingen for å fange opp små avvik fra intensjonen mens det fremdeles er billig å gjøre noe med det (som jeg skrev om i min første artikkel om AI adoption). Og også for å fange opp drift (modellavvik/intensjonsavvik) i etablerte KI-støttede systemer som resultat av at modeller endrer seg, at input-dataene endrer seg osv (som jeg skrev om i min andre artikkel om AI adoption).
Model routing: Dette har jeg også skrevet om tidligere. Å sende alle requests til samme model, uansett hva slags type oppgave det gjelder, er lite effektivt. Før Jev hadde jeg ikke et klart svar på hvordan jeg kunne bygge en slik router på en forutsigbar måte. Jev kan gjøre mange parallelle vurderinger av en prompt og klassifisere den basert på en hvilken som helst logikk jeg velger å bruke for å avgjøre hvilken modell som bør brukes for enhver type oppgave, uten merkbar forsinkelse.
Selv om de to over er de jeg personlig ønsker å teste ut først, er det en drøss andre bruksområder man kan se for seg at Jev kan forenkle, for eksempel:
Risk/guardrails: For eksempel klassifisere en handling som low/medium/high risk før en agent får lov å utføre den.
Innholdsmoderering: For eksempel spam, abuse, sensitiv informasjon, personopplysninger etc.
Prioritering/triage: For eksempel email, supporthenvendelse, alarm -> haster/haster ikke, kategori, prioritet.
Semantisk filtrering ved datainnhenting: For eksempel "Er dette dokumentet relevant for oppgaven?" før dokumentet tas inn i kontekstvinduet.
Informasjonsuthenting: For eksempel konvertere ustrukturert tekst til predefinerte verdier.
Kvalitetsvurdering: For eksempel "Er det genererte svaret av god nok kvalitet til å sendes til kunden?" Eller vurdere flere predefinerte egenskaper.
Anomaly detection: For eksempel "Ser eventet/loggen/handlingen mistenkelig ut, gitt konteksten?"
RAG: For eksempel "Har jeg nok informasjon til å svare?", "Skal jeg lete etter ytterligere informasjon?", "Hvilken kildekategori bør jeg søke i?"
Programflyt: Erstatte kompliserte conditionals av typen if keyword X && customer_type Y && expirationDate > Z … med en semantisk beslutning.
Jev åpner for å bruke KI til ting vi hittil ikke har hatt en god løsning for.
Oppsummering
Jeg tror lanseringen av Jev representerer en vesentlig endring i hvordan vi kommer til å bruke KI fremover.
Den er ikke en direkte konkurrent til de store LLM-ene, for den løser et annet problem. Men Jev, og helt sikkert mange lignende modeller som vil dukke opp i nær fremtid fra de store leverandørene, kan erstatte LLM-er på en del av dagens bruksområder.
Og aller mest interessant: Jev åpner for å bruke KI til ting vi hittil ikke har hatt en god løsning for.
Det blir spennende å se hvordan Jev påvirker KI-feltet videre! I mellomtiden anbefaler jeg en tur innom awesome-jev-use-cases for både nyttige og særlig unyttige måter å bruke Jev på!
Og, hvis du lurte: selvsagt spiller Jev Doom...
Foretrekk oss i Google Discover
Ved å legge oss til som foretrukket kilde i Google vil du blant annet få opp flere av sakene våre i Google Discover. Tusen takk for støtten!