Med dagens hype rundt store språkmodeller (LLMer) er det fort gjort å bli bitt av basillen og tenke at akkurat DIN applikasjon trenger en eller annen form for AI-integrasjon for å kunne levere enda mer verdi til sluttbrukerne.
Din egenutviklede Kanban-app hadde vel blitt fem ganger så bra om man bare kunne chatte litt med oppgavene som er spesifisert? Nei?
Nei. Den hadde kanskje ikke det.
Men det er ikke så viktig, så vi druser på med en liten chatteboble nede i høyre hjørne og en AI-assistent som egentlig er et glorifisert API-kall til ChatGPT som man har omdøpt til KanGPT, fordi akkurat din app er så unik at den trenger egne navn på andres teknologier.
«Hva om du kunne kjørt AI-modellene dine… lokalt?»
Lekker den hemmeligheter?
Men så tikker den første eposten inn fra den nyeste kunden, kundennummer 8:
“Hallaisen, jeg jobber i et topp hemmelig firma som sitter på nasjonale sikkerhetshemmeligheter som ikke kan lekke ut. Disse hemmelighetene putter jeg i Kanbanbrettet mitt. Er det sånn at alle som jobber i OpenAI nå kjenner alle mine innerste hemmeligheter?”
Du har vært såpass på ballen at du har huket av på at OpenAI ikke får bruke dataene du sender gjennom APIet deres til treningsformål, men etter litt frem og tilbake med kunde 8 må du innrømme at du ikke 100% kan garantere for at disse dataene lagres på måter som er godt nok for nasjonale sikkerhetshemmeligheter, eller at dataene er beskyttet mot statlig innblanding i fiberkablene gjennom Sverige.
Kanskje det ikke var en så god idé med chat-integrasjon i Kanban-brettet likevel? Joda. Frykt ikke, det finnes andre måter å lage chatbotter på enn å sende dataene dine til utenlandske selskaper!
Hva om du kunne kjørt AI-modellene dine… lokalt?
AI tok jobben, nå legger de ned selskapet med 10 ansatte
Moderne webteknologi
Fordi det er faktisk mulig! Og ikke bare lokalt på egen maskin, men som en del av nettsiden du serverer til sluttbrukerne dine når de går inn på https://my-first-kanban.tech.
Hvordan? Ved å ta i bruk litt nymotens teknologi som `WebAssembly` og `Worker`-API-et i nettleseren din.
WebAssembly (WASM) har vært en anbefalt webstandard helt siden slutten av 2019, og har sett økende grad av støtte og bruk de siste årene. Flere og flere kompilerte språk og prosjekter får nå støtte for å lage WASM-binærfiler, så mulighetsrommet for hva man kan kjøre i selve nettleseren din vokser for hver dag.
Å ta i bruk WebAssembly i seg selv krever at man koder i et av språkene som kan kompileres til WASM, men her igjen øker høyden på dørterskelen så fort det kreves noe annet enn Javascript eller Typescript.
Heldigvis finnes det en mengde Flinke Folk™ der ute i verden, som har gjort dette lekende lett for oss!
Et populært bibliotek i maskinlæringsverdenen er “🤗 Transformers”, laget av selskapet HuggingFace. Dette biblioteket lar deg enkelt ta ferdiglagde modeller som er publisert på en eller annen modell-hub, som f.eks. HuggingFace sin egen https://huggingface.co/models. Her finner du tusenvis av offentlige modeller med varierende grad av brukbarhet, alt fra en liten modell som kan detektere om en tekst inneholder humor til Meta sine egne LLaMa-modeller med 405 milliarder parametre. Flere av dem er publisert i et standardformat som kan kjøres uavhengig av underliggende hardware, kalt ONNX (Open Neural Network Exchange).
Men, `transformers` er jo et Python-bibliotek, tenker du kanskje - det fungerer ikke i nettleseren! Ingen fare, det finnes selvfølgelig et tilsvarende `transformers.js`, som en kan bruke til å kjøre modeller i nettleseren også. Cruxet her er at biblioteket bruker ONNX Runtime som er skrevet i WebAssembly, som gjør det raskt nok til at vi kan kjøre litt større modeller enn en hadde klart i en ren JS-implementasjon.
Støtten blant modeller som benytter ONNX Runtime i Javascript er noe mindre enn hva som er tilgjengelig i Python, men det finnes fortsatt en mengde brukbare modeller å teste ut. HuggingFace har egne filtre for dette, blant annet innenfor bruksområdet for tekstgenerering. APIet er såpass enkelt at å laste ned en modell og å generere innhold kan gjøres med et par enkle linjer kode.
– At du er så bundet til Python er en arv fra fortida
Flere arbeidere
Den siste hindringen som gjenstår dukker opp så fort en prøver å kjøre disse modellene i praksis.
Den enkleste implementasjonen av prosedyren beskrevet over er å kjøre denne generingen som en del av den vanlige kodeflyten i en React-komponent eller i en ren ``-tag.
Da blir en fort klar over at språkmodeller krever mye regnekraft for å generere innhold, og den regnekraften tar den blant annet fra hovedtråden i Javascript-motoren. Ettersom Javascript i utgangspunktet kjører på en enkelt tråd vil dette føre til at all annen interaktivitet på nettsiden fryser mens genereringen foregår.
Her kommer `Worker`-APIet inn i spill. En Worker fungerer som en bakgrunnsjobb som kjører på en annen tråd, og kan løse problemet med langvarige oppgaver som blokkerer interaktivitet på hovedtråden. Ved å flytte koden som utfører genereringen til en `Worker` får AI-hjernen vår jobbe i fred, mens brukeren kan trykke på andre ting og en kan for eksempel vise en spinner til brukeren. Workere kommuniserer ved å sende meldinger frem og tilbake med hovedprogrammet, så flyttingen av koden blir en smal sak ved å abstrahere det bort bak en meldingsbasert flyt.
«Ved å flytte koden som utfører genereringen til en `Worker` får AI-hjernen vår jobbe i fred.»
Med AI-modellen trygt plassert i en Worker som tar seg av parallelliseringen for oss, har vi en løsning som kjører helt lokalt, uten å sende våre nasjonale sikkerhetshemmeligheter gjennom det enorme virrvaret vi kjenner som Internett.
Utvalget er ikke det beste, og regnekraften i nettleseren din kan ikke sammenliknes med serverparken til OpenAI, men modellene er gode nok til å utføre enkelte oppgaver.
Om sikkerhetskravene dine er såpass strenge at deling utenfor din lokale maskin ikke er mulig, må man ta til takke med det man har.
Utviklingen på dette området går i et forrykende tempo, og med arbeidet som foregår innen standarder som WebGPU, kommer vi nok til å se flere use-caser innen maskinlæring som kan løses lokalt i din egen nettleser i fremtiden.
Da var det bare å begynne implementeringen. Om du ønsker en pekepin og litt hjelp på veien kan du sjekke ut en workshop jeg har vært med på å skrive om språkmodeller på Github: https://github.com/capraconsulting/caprakurs-ai-chatbot
Lykke til!