Lokal LLM med Ollama

Ved hjelp av Ollama kan en kjøre LLM-er lokalt.

Eivind Hageberg https://suppe-og-analyse.netlify.app
2024-07-04

For en tid tilbake skrev jeg om språkmodeller, noen mulige bruksområder (fra mitt perspektiv), og konkluderte med at muligheten til å kjøre modellene lokalt, uten å måtte bruke OpenAI, Google eller Microsoft sine APIer, ville vært flott.

Etter litt undersøkelser har jeg nå funnet ut av to måter en kan gjøre dette på:

Ollama virker så langt som det mest lovende for meg, med Windows-oppsett. Det er et enkelt program som en starter, og som da gir en mulighet til å kjøre ollama-kommandoer i CLI, f.eks. PowerShell. Her får en da mulighet til å laste ned og kjøre et bredt utvalg av kommandoer. Ollama lover bl.a. å gjøre intelligente valg for statusflagg og ressursallokering, noe som er helt avgjørende for å kunne kjøre noe så ressurskrevende som en språkmodell med flere milliarder parametre på en PC som ellers brukes til å skrive og spille Age of Empires 2.

En annen fordel med Ollama er at de setter opp et standardisert API-grensesnitt til modellene, slik at du kan bruke lik syntaks, men bytte og teste ulike modeller. Prosjektets Github-side lenker til en rekke ulike applikasjoner som benytter seg av dette API-et, og ett av dem er Hause Lins ollamar. Dette er en innpakning av en rekke ulike httr2-kall mot API-et. Ettersom et kjerne-elemenet i å kjøre en LLM lokalt er å ha kontroll over koden, tar jeg meg den frihet det er å reimplementere noe av Ollamar-koden selv.

#standard lokalt endepunkt er  http://localhost:11434

url =  "http://localhost:11434"
req = request(url)
resp = req_perform(req)

#er status OK? Kjører serveren lokalt?
resp_status_desc(resp)
[1] "OK"
#hvilken form er det på innholdet?
resp_content_type(resp)
[1] "text/plain"
#hva er innholdet?
resp_body_string(resp)
[1] "Ollama is running"

Det finnes en god del funksjonalitet i APIet her, som dokumentert i dokumentasjonen. Kan jeg få den til å generere en tekstrespons som beskrevet her?

Dette vil antakelig ta en god stund å kjøre, ettersom Ollama må starte opp modellen. Modellen forblir som standard lasta inn i minnet i fem minutter etter fullført forespørsel. En kan endre på det, og en rekke andre egenskaper, med ulike settings.

req = request("http://localhost:11434/api/generate")
req = req_method(req, "POST")

#selve requesten
body_json = list(model = "llama3",
                  stream = FALSE,
                  prompt = "Bak skyene er himmelen alltid ..."
                  )

req = req_body_json(req, body_json)

resp = req_perform(req)

Hvordan ser så svaret ut? Dette api/generate-endepunktet er “strømmende”, dvs. at den printer ut ord-for-ord i fullføringa. Det er en god påminnelse av at modellen kun er en måte å estimere det neste ordet på, men i mange sammenhenger er det overflødig å få alt.

json_body = resp_body_json(resp)

json_body$response

[1] “I think I can finish that phrase for you!"Bak skyene er himmelen alltid blå" - which is a Norwegian proverb that translates to "Behind the clouds, the sky is always blue".”

Dette ser faktisk ut til å funke. Ikke verst. Noen ting å tenke på: