

Det er ingen tvil om at store språkmodeller (LLMs) representerer et kolossalt skritt fremover i kunstig intelligens og maskinlæring. Disse modellene, gjennom avansert databehandling og algoritmisk læring, har vist seg å ha et enormt potensial i å forstå og generere menneskelige språk på en måte som tidligere var utenkelig.
Til tross for dette imponerende fremskrittet, står vi fortsatt overfor en betydelig utfordring: modellenes evne til å tilegne seg og anvende spesifikk informasjon. Per dags dato er det fortsatt en begrensning at disse modellene ikke direkte kan lære eller lagre spesifikk informasjon som de ikke allerede har i sitt opplæringskorpus.
Drevet av denne erkjennelsen, startet jeg et lite prosjekt for å undersøke i hvilken grad man kan tilføre egen kontekstuell informasjon inn i spørsmålene (prompts) man stiller til modellen. Målet var å se om det er mulig å “mate” modellen med unik, kontekstspesifikk informasjon, og deretter se om denne informasjonen kan brukes av modellen til å generere relevante og informative svar.
Det er i seg selv ikke noe problem å legge til kontekst til hver prompt som stilles til en LLM (bare lim det inn det du trenger i ChatGPT for å teste det selv). Utfordringen ligger i å finne og legge til den “riktige” konteksten. Eller sagt på en annen måte: Hvordan kan jeg legge til den riktige konteksten basert på det spesifikke spørsmålet som blir stilt?
En tradisjonell løsning på dette vil være å benytte nøkkelordsøk. Ved å bruke spørsmålet som søkeord i en database, på samme måte som når vi søker på Google. Resultatet fra søket kan så mates inn som kontekst til modellen.
Problemet med en slik tilnærming er at svaret som returneres bare inkluderer informasjon som inneholder nøkkelordene. Det er ingen garanti for at det er en relevans til spørsmålet. Her kunne jeg ha brukt en ny instanse av en språkmodell til å filtrere kun relevant informasjon, men det har ikke vært effektivt, og har nok også skapt problemer med tanke på token-limit til modellen.
Løsningen jeg gikk for var vektorisering. Ved å generere matematiske vektorer for informasjonen kunne jeg enkelt sammenligne likheten mellom informasjonen. Dette lot meg finne informasjon som lå “nærmest” spørsmålet som ble stilt, og dermed returnere mer relevant informasjon som kontekst.
For å implementere denne løsningen, valgte jeg å bruke OpenAI’s embeddings-endepunkt for å generere vektorer. For lagring valgte jeg Pinecone sin vektordatabase. Pinecone er laget for effektivt å håndtere og søke i store mengder vektorer, og det ga meg muligheten til å raskt og nøyaktig hente ut de mest relevante tekstbitene.

Prosessen for å hente relevant kontekst til spørsmålet som ble stilt endte opp med å se slik ut:
Prosessen starter når en bruker stiller et spørsmål. Det første jeg gjør er å generere vektorer for det stillede spørsmålet ved hjelp av OpenAI’s embeddings-endepunkt. Her er det viktig at jeg bruker den samme metoden som ble brukt til å generere vektorer i vektordatabasen.
Jeg brukte så de genererte vektorene til å gjøre et simularity serach i Pinecone. Dette returnerer informasjon som ligner på det originale spørsmålet.
Jeg bruker så den relevante informasjonen fra Pinecone sammen med det originale spørsmålet i samme promt inn til språkmodellen. Ved å gjøre dette har modellen både konteksten og spørsmålet det trenger for å generere et svar.
Som filmen over viser fungerer dette ganske greit. Ved å anvende vektorisering og similarity search har jeg gitt modellen tilgang til kontekstspesifikk informasjon som er relevant for det stillede spørsmålet. Tilnærmingen åpnet også opp for at jeg kunne gi referanser til kildene som informasjonen er hentet fra. Viktigheten av dette kan ikke understrekes nok, spesielt i en tid der påliteligheten til disse modellene ikke bestandig er 100%.
Til slutt, det å integrere kontekstuell informasjon i språkmodeller åpner for en rekke nye muligheter og anvendelser. Dette prosjektet representerer bare begynnelsen av hva som er mulig, og det blir spennende å se hvordan denne teknologien blir brukt fremover.