Å bruke Ollama til å forbedre grunnleggende informasjon fra en API

I min siste blogg ga jeg trinn for å kjøre Llama2 på din Raspberry Pi 5. For mitt nye prosjekt har jeg forsøkt å bruke en lokalt vert LLM for å forbedre grunnleggende informasjon fra en ekstern kilde. Dette betyr at jeg vil hente informasjon fra en API, og bruke en LLM til å utvide og oversette denne informasjonen til lesbar tekst.

Publisert:

26. jan. 2024

Trykk på taggene for å lese mer om hvor og hvordan vi benytter samme fag og teknologi

Vennligst gi meg beskjed om noen støter på problemer mens de følger denne veiledningen. Jeg har gjort noen løsninger i mine tidligere hobbyprosjekter, noe som betyr at disse kanskje ikke har kommet opp i denne.

For at dette skal fungere, trenger vi:

  • En Unix-basert PC, eller en Windows PC med WSL installert
    PCen burde være kraftig; modellen vi bruker trenger helst 48GB RAM.
    Min PC har 32GB og er veldig treg, men alt funker likevel.
    Hvis det blir en problem så kan man vurdere å "downgrade" til en enkler modell.
  • Grunnleggende kunnskaper i Python-programmering'

Installere Ollama på din PC

For de med en Unix-basert PC, kan de hoppe over til kodeutsnittet med installasjonskommandoen. For de med en Windows-PC, følg trinnene nedenfor for å installere og kjøre WSL.

Kjør PowerShell som administrator. Dette gjøres ved å høyreklikke på PowerShell og velge alternativet 'Kjør som administrator'. Du må kanskje fylle ut ditt Admin-passord for å gjøre dette, avhengig av hvordan sikkerheten på maskinen din er konfigurert.

I PowerShell-vinduet som åpner seg, kjør følgende kommando:

> wsl --install

Det anbefales sterkt å starte PC-en på nytt etter installasjon av WSL. Etter omstarten kan din Linux-distro finnes i startmenyen din.

Å åpne dette programmet vil åpne en kommandoprompt (CMD) hvor du kan kjøre kommandoer mot din Ubuntu-installasjon.

Installer avhengighetene

> sudo apt update && sudo apt upgrade
> sudo apt install python3
> sudo apt install python3-pip

Installer Ollama

> curl https://ollama.ai/install.sh | sh
dl ollama.png

Installer Mixtral

For denne veiledningen vil vi bruke mixtral-modellen for å gjøre tekstforbedringer.

> ollama run mixtral

Merk at første gang du bruker denne kommandoen, vil Ollama laste ned og kompilere mixtral. Etter det vil oppstart av mixtral med denne kommandoen skje mye raskere!

Nå som mixtral kjører, kan du stille den spørsmål og den vil svare tilsvarende. Vi ønsker imidlertid bare å bruke vår lokale kopi av mixtral til å gjøre noe annet. Vi kan avslutte ollama-grensesnittet ved å bruke denne kommandoen:

> /exit

Nå som vi har installert Ollama og Mixtral og er klare til å bruke dem, er det på tide å gjøre noe morsomt med dem. Jeg valgte å koble til PokeAPI, som er en API som returnerer informasjon om Pokémon på forespørsel. Informasjon om denne API-en kan finnes her.

Lag et Python-program

Jeg skrev et Python-program som bruker pokebase- og ollama-modulene for å koble seg til PokeAPI og Ollama-rammeverket.

La meg gå gjennom programkoden. Vi starter med å importere de nødvendige modulene. Merk at vi også må installere disse, som vi vil gjøre før vi kjører programmet vårt.

Installere Visual Studio Code på WSL

For programmering på WSL brukte jeg Visual Studio Code. Det kan installeres fra WSLs kommandolinje/terminalgrensesnitt med følgende kommando:

> sudo snap install --classic code

Etter at installasjonen er ferdig (skal ikke ta lang tid), kan du åpne den ved å skrive kommandoen

> code

 

i terminalen din. Hvis du vil at den skal åpne en spesifikk mappe, bare naviger til den spesifikke mappen og skriv kommandoen

> code .

Lag et Python-program

Jeg skrev et Python-program som bruker pokebase- og ollama-modulene for å koble seg til PokeAPI og Ollama-rammeverket.

La meg gå gjennom programkoden. Vi starter med å importere de nødvendige modulene. Merk at vi også må installere disse, som vi vil gjøre før vi kjører programmet vårt.

Hvis du vil lagre en fil til ditt WSL-miljø, men VS Code standard lagringsmappe er en Windows-mappe, kan du finne ditt Ubuntu-miljø på

> \\wsl$\Ubuntu

Erstatt Ubuntu med for eksempel Ubuntu22.04 hvis det er WSL-versjonen du har installert. Nå over til koden!

Python-programmet

Jeg begynte med å opprette en fil kalt main.py. Dette er ikke det mest kreative navnet på en fil, og du kan gi den hvilket navn du ønsker, så lenge det ender med .py

Enten opprett filen gjennom Visual Studio Code, eller åpne filen i redigeringsprogrammet. Legg deretter til kodestykkene jeg beskriver nedenfor. Til slutt finner du hele programkoden, så hvis du ikke er interessert i hva stykkene gjør, eller hvis du er en erfaren utvikler som bare vil komme i gang og jobbe derfra, kan du bla litt ned.

import pokebase as pb
import ollama

Dette tillater oss å bruke disse modulene i koden vår.

Videre ønsker vi å hente detaljer om Pokémon basert på Pokémon-navnet, ved å bruke pokebase-modulen. Denne modulen kobler oss til PokeAPI og returnerer informasjonen vi ønsker basert på Pokémon-navnet.

def get_pokemon_details(pokemon_name):
# Function from pokebase.py
pokemon = pb.pokemon(pokemon_name)
details = format_pokemon_data(pokemon)
print(details)
return details

Her nevner vi at vi kaller på en annen funksjon kalt `format_pokemon_data`. Vi bruker denne for å formatere svaret vi får fra PokeAPI til noe som Mixtral-modellen kan forstå. I vår formatteringsfunksjon inkluderer vi kun Pokémonens navn og evner.

def format_pokemon_data(pokemon):
# Convert the pokemon object to a JSON structure
return {
“name”: pokemon.name,
“abilities”: [ability.ability.name for ability in pokemon.abilities],
}

Vi ønsker å kjøre disse formaterte dataene gjennom Mixtral for å få et leselig svar. For dette bruker vi 'ollama.chat'-funksjonen.

def process_with_ollama(pokemon_details):
# Using Ollama to process and enhance the Pokémon details
print(‘Starting to process with ollama, note that this can take several minutes…’)
response = ollama.chat(model=’mixtral’, messages=[ {‘role’: ‘user’, ‘content’: str(pokemon_details)}, ])
return response[‘message’][‘content’]

Her merker vi at vi angir ollama.chat å bruke modellen 'mixtral'. Hvis du ønsker å bruke en annen modell som du har installert lokalt, kan du endre denne parameteren deretter.

Nå som alle nødvendige funksjoner er satt opp, definerer vi vår hovedfunksjon og kaller den:

def main():
pokemon_name = input(“Enter a Pokémon name: “)
pokemon_details = get_pokemon_details(pokemon_name)
# Enhance the details using Ollama
enhanced_details = process_with_ollama(pokemon_details)
print(enhanced_details) if __name__ == “__main__”: main()

Hele koden av main.py ser ut som dette:

import pokebase as pb
import ollama

def get_pokemon_details(pokemon_name):
# Function from pokebase.py
pokemon = pb.pokemon(pokemon_name)
details = format_pokemon_data(pokemon) # Format data for Mixtral
print(details)
return details

def format_pokemon_data(pokemon):
# Convert the pokemon object to a JSON structure
# Example:
return {
“name”: pokemon.name,
“abilities”: [ability.ability.name for ability in pokemon.abilities],
}

def process_with_ollama(pokemon_details):
# Using Ollama to process and enhance the Pokémon details
print(‘Starting to process with ollama, note that this can take several minutes…’)
response = ollama.chat(model=’mixtral’, messages=[
{‘role’: ‘user’, ‘content’: str(pokemon_details)},
])
return response[‘message’][‘content’]

def main():
pokemon_name = input(“Enter a Pokémon name: “)
pokemon_details = get_pokemon_details(pokemon_name)

# Enhance the details using Ollama
enhanced_details = process_with_ollama(pokemon_details)
print(enhanced_details)

if __name__ == “__main__”:
main()

Etter å ha satt opp programmet, må vi installere de to avhengighetene (pokebase og ollama) for å kunne bruke dem i programmet vårt.

> pip install ollama
> pip install pokebase

Når avhengighetene er installert, er vi klare til å kjøre programmet vårt! Vi starter det ved å bruke følgende kommando i terminalen:

> python3 main.py

Hvis du har gitt programmet et annet navn enn main.py, må du justere kommandoen deretter.

Du vil bli presentert med spørsmålet som er inkludert i koden:

> Enter a Pokémon name:

Skriv inn et Pokémon-navn, f.eks. blastoise, trykk ENTER, og vent på at magien skal skje!

For å være ærlig kan det ta omtrent 10 minutter for magien å skje, men tro meg, det vil skje! Vær tålmodig, ta en kopp kaffe, og sjekk terminalen din av og til.

Forklaring på magien:

Vi har mottatt en respons!

Jeg la til en linje i koden vår for å skrive ut hva vi faktisk fikk fra pokebase. På denne måten kan vi se hvor lite informasjon vi får, og hvordan mixtral bruker dette som inndata før den utvider informasjonen. Jeg la også til en linje for å minne om at hele prosessen kan ta flere minutter, siden man har en tendens til å glemme at en prosess fortsatt kan kjøre når et terminalvindu virker inaktivt i flere minutter.

Så her ser vi at informasjonen vi fikk fra pokebase var ganske minimal, som forventet;

{‘name’: ‘blastoise’, ‘abilities’: [‘torrent’, ‘rain-dish’]}

Og vi ser at mixtral klarte å generere følgende utvidede tekst basert på denne minimale mengden informasjon:

Enhanced details:
It looks like you have provided an object in JSON format that represents
a Blastoise Pokémon and its abilities.

Blastoise is a popular character from the Pokémon franchise, known for
being the final evolution of the Water-type starter Pokémon, Squirtle.
The two abilities associated with Blastoise are Torrent and Rain Dish.

Torrent is a hidden ability that boosts the power of Water-type moves by
1.5 times when Blastoise has less than one-third of its maximum HP
remaining. This can be very useful in battle, as it allows Blastoise to
deal more damage with its Water-type attacks when it is low on health.

Rain Dish is an ability that restores a small amount of HP to Blastoise
at the end of each turn if it is raining. This can help Blastoise stay
in the fight for longer, as it will gradually recover some health over
time.

Overall, both abilities provide useful benefits to Blastoise, and
players may choose to use one or the other depending on their preferred
playstyle.

Konklusjon

Det har vært en veldig morsom reise igjen, med eksperimentering til ting fungerte (til slutt). Jeg lærer mer og mer om disse systemene og lærer litt programmering ved siden av. Jeg håper at i den nærmeste fremtid kan jeg bruke dette til en mer praktisk bruk enn å hente informasjon om Pokémon. Jeg må også undersøke om jeg kan få mixtral eller en lignende LLM til å kjøre raskere på min egen PC. Men for nå synes jeg dette er en virkelig morsom prestasjon, og jeg håper denne veiledningen kan være til nytte for de som er interessert i å oppnå lignende ting!

Artikkel av:

Wessel Braakman
IT-konsulent
Test og Kvalitetssikring