Ved hjelp av Ollama kan en kjøre LLM-er lokalt.
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å: