I denne workshopen skal vi se nærmere på ulike metoder og oppsett av AI-verktøy som finnes på markedet i dag. Helt konkret skal vi innom:
- AWS sitt AI-studio, Amazon Bedrock, hvor vi ser på hva som er tilgjengelig og hva som er mulig med et par tastetrykk.
- Kjøre flere LLMer lokalt på din egen maskin - ingen behov for noen backend-tjeneste!
- Være innom HuggingFace for å se hvordan man deler og jobber med open source AI-modeller.
- Sette opp en backend-tjeneste som bruker større modeller som kjører lokalt på din maskin
- Om tid: Se på teknikken RAG (Retrieval Augmented Prompting)
- Integrere backend-tjenesten med Amazon Bedrock sine APIer
For å kunne fullføre kurset trenger du:
- En AWS-konto
- Enkle programmeringsferdigheter innen JavaScript/TypeScript og Python
- En maskin med minst 8GB RAM
Hva er Amazon Bedrock?
Amazon Bedrock er en fullt administrert tjeneste som gir utviklere og organisasjoner tilgang til en rekke store språkmodeller (LLMs) og generative AI-modeller via et enkelt API-grensesnitt. Tjenesten inkluderer modeller fra ledende AI-selskaper som Anthropic, AI21 Labs og Stability AI, samt Amazon's egne modeller.
Teknisk sett fungerer Bedrock som et abstraksjonslag over kompleks AI-infrastruktur. Det håndterer oppskalering, nedskaling og ressursallokering automatisk, noe som eliminerer behovet for manuell administrasjon av underliggende maskinvare og programvare.
En viktig funksjonalitet i Bedrock er muligheten for modell-tilpasning. Dette lar brukere finjustere forhåndstrente modeller på egne datasett, noe som kan forbedre modellens ytelse for spesifikke bruksområder. Prosessen foregår innenfor kundens AWS-miljø, noe som ivaretar datasikkerhet og personvern.
Bedrock integreres sømløst med andre AWS-tjenester, noe som muliggjør utvikling av ende-til-ende AI-løsninger. For eksempel kan man kombinere Bedrock med Amazon S3 for datalagring, Amazon SageMaker for ytterligere maskinlæringsoppgaver, eller AWS Lambda for serverløs behandling av AI-generert innhold.
API-et til Bedrock støtter både synkrone og asynkrone forespørsler, noe som gir fleksibilitet for ulike bruksscenarier. For lange eller ressurskrevende oppgaver kan asynkrone kall være særlig nyttige.
Tjenesten kan brukes til en rekke oppgaver innen naturlig språkbehandling og generativ AI, inkludert tekstgenerering, semantisk søk, sentiment-analyse, og oversettelse. Den støtter også multimodale modeller som kan generere eller analysere både tekst og bilder.
I denne delen skal vi aktivere og bruke noen av modellene som er tilgjengelig gjennom Amazon Bedrock.
- Logg inn i AWS-konsollen med din Capra- eller personlige bruker. Det vi skal gjøre koster ikke store summer, så her er det bare å slå seg løs.
- I listen over services, velg: Machine Learning -> Amazon Bedrock
- Du er nå inne i Amazon Bedrock sitt Studio. Klikk deg rundt og bli bedre kjent med løsningen.
- Vi skal se nærmere på funksjonen
Chat/Text
. Dette er et verktøy for å enkelt interagere med LLMer i form av en chat. Klikk deg inn påChat/Text
i venstre side-meny. - For å kunne benytte seg av tjenesten trenger vi å aktivere tilgang til et par AI-modeller. Trykk på knappen "Select model" og se gjennom hvilke modeller man har tilgjengelig. Trykk "Request access" for å komme til modell-bestilleren. Trykk "Modify model access".
- Modellene fra Anthrophic er for øyeblikket kjent som de beste på markedet - bedre enn ChatGPT 4o på flere områder. Om Claude 3.5 Sonnet, Claude 3 Haiku og Claude 3 Sonnet er tilgjengelig, huk av for å få tilgang. Velg også
Titan Image Generator G1 v2
fra Amazon ogSDXL 1.0
fra Stability AI. Ta gjerne med flere også. Det koster ingenting.
Hva er alle disse modellene?
Amazon utvikler noen modeller selv, men deres største styrke er at de tilgjengeliggjør modeller fra andre tilbydere under et enhetlig API.
Modellene som er tilgjengelige innen tekstgenerering er noen av de beste som finnes, og utvalget er stort. For bildegenerering er utvalget mindre, og state-of-the-art er ikke tilgjengelig. For øyeblikket er bildegenerering begrenset til Amazons egne Titan-modeller og en modell fra Stability AI (SDXL v1.0).
Om du er interessert i å lese mer om de beste bildegeneratorene der ute, sjekk ut:
- Dall-E 3 fra OpenAI
- Midjourney 6.1 fra Midjourney
- Stable Diffusion 3.5 Large fra Stability AI
Det finnes også andre kategorier av modeller:
Lyd
- Synthesia
- Assembly.ai <- Veldig god til podcasts!
- Whisper fra OpenAI
Video
- Sora fra OpenAI (Ikke tilgjengelig for allmennheten)
- Synthesia Video Eksempel: video generert gjennom Synthia Studio
- Klikk "Next" nederst på siden og "Submit". Du burde ha tilgang til modellene innen 2 - 5 minutter.
- Test ut Chat/Text med noen av modellene. Se om du finner forskjeller mellom modellene og gjør deg opp en mening om hvilke som fungerer best
Hva skal du spørre om?
De fleste språkmodeller er gode nok til å gi deg oppskrifter eller forslag på middagsretter, selv på norsk. Spør heller om litt mer avanserte ting, for å teste at modellen forstår sammenheng og opplysninger i teksten du gir den.
For noen gode eksempler på prompts, sjekk ut denne bloggen om teamet.
- Test ut Image-funksjonen med SDXL-modellen. Prøv å generere noen bilder og evaluer om kvaliteten er på et tilfredsstillende nivå.
Hva betyr parametrene p
, k
og temperature
? For en god forklaring, sjekk ut Amazons forklaring på parametrene.
Vi skal nå dykke ned i frontend
-koden i dette repoet.
For å spinne det opp, gjør følgende:
cd frontend/
npm install
npm start
- Gjør deg kjent med koden. Dette er en helt standard React-app med TailwindCSS og en Web Worker som skal gjøre jobben for oss. Om du ikke har jobbet med en Web Worker før kan du bruke Web Worker tutorial som referanse på hvordan en sender meldinger frem og tilbake mellom workeren og hovedkoden din. De viktigste filene er
src/App.tsx
ogpublic/worker.js
. - Vi skal nå laste inn en modell i
worker.js
som skal være vår chat-modell. Biblioteket vi skal bruke er allerede definert som en import i toppen avworker.js
. Sjekk ut dokumentasjonen til Transformers biblioteket for detaljer på hvordan det skal brukes. Inne i dokumentasjonen finner du en referanse til "hosted pretrained models", dette er en liste over kompatible biblioteker. Finn en modell med et kult navn og legg inn navnet somMODEL_NAME
iApp.tsx
.
Hva er ONNX modeller?
ONNX (Open Neural Network Exchange) modeller er et åpent, plattformuavhengig format for representasjon av maskinlæringsmodeller.
Den definerer en beregningsgraf bestående av noder (operasjoner) og kanter (dataflyt), og støtter et standardisert sett med operatører og datatyper. ONNX muliggjør interoperabilitet mellom ulike ML-rammeverk, forenkler modelloptimalisering og deployment, og støttes av et bredt økosystem av verktøy.
Formatet inkluderer metadata og er utvidbart for spesifikke anvendelser. Dette gjør ONNX til en nøkkelteknologi for å standardisere utveksling og distribusjon av AI-modeller på tvers av plattformer og miljøer.
MODEL_NAME
blir sendt til Web Workeren når man trykker på "Download model"-knappen i UIet. Fyll utdownloadModel
-funksjonen iworker.js
så du ender opp med en modell som er lastet inn gjennomtransformers.js
. Sjekk ut dokumentasjonen til biblioteket for hvordan man gjør dette. Tips: Det kan være en grei løsning å lagre den opprettede modellen på "globalt" scope iworker.js
.- Hurra! Du har nå en modell lokalt på din egen maskin! Nå trenger vi bare å bruke den til å generere tekst. De fleste modellene som kan brukes med
transformers.js
har en README med eksempler på bruk. Implementer funksjonengenerateResponse
iworker.js
til å ta i mot en melding fra brukeren og sende tilbake et svar fra modellen. - Du har nå en fungerende chatbot! Prøv deg frem med ulike prompts og tester slik du gjorde gjennom grensesnittet til Amazon Bedrock. Er din lokale modell like god som AWS sone modeller?
- Bonusoppgave: Det er lagt opp til at AI-modellen kun mottar en enkelt melding og svarer på den. Kan du endre APIet så du sender med hele chat-historikken, så den får med seg mer kontekst?
I denne delen skal du laste ned og kjøre litt større modeller lokalt. Det finnes mange ulike verktøy til dette, hvor noen er avhengige av operativsystem og maskinarkitektur. Vi skal benytte verktøyet Ollama, som i (teorien) skal fungere på både Windows, Mac og Linux.
- Følg instruksjonene for å laste ned og installere Ollama.
- Last ned og test ut LLaMa 3.2, Metas nyeste modell som er optimalisert til å kjøre på maskiner med begrensede ressurser (Ja, din 64GB M3 Mac er en begrenset ressurs).
- Test ut et par andre modeller fra listen over støttede modeller.
- Bonusoppgave: Prøv deg ut med en annen engine, llama.cpp. Denne motoren kan brukes til mer enn Ollama, som for eksempel modeller som ikke er trent opp til selvsensurering. Til gjengjeld er det mye mer mas å faktisk få det opp og kjøre med en modell som fungerer greit.
På tide å erstatte den lokale LLMen i nettleseren din med en litt kraftigere og mer effektiv backend som hoster modellen din. I denne delen skal vi dykke ned i backend
-koden i dette repoet.
For å spinne det opp, gjør følgende:
cd backend/
python3 -m venv .venv
source .venv/bin/activate # NOTE for Windows: source .venv/Scripts/activate
pip install -r requirements.txt
fastapi dev main.py
- Gjør deg kjent med koden. Dette er en helt standard FastAPI-app som bruker Pydantic til å definere datatyper.
- Vi skal nå bruke Python-biblioteket ollama. Bruk Generate- eller Chat-APIene. Hele APIet til Ollama er definert her, bruk det gjerne som referanse. Et godt tips er å holde deg unna streaming responses, denne workshoppen er ikke lagt opp til å ta det i bruk.
- Endre koden i endepunktet
/chat
til å ta i mot meldingen fra brukeren, genererer et svar gjennomollama
og send en respons i retur. - Endre koden i
frontend
til å sende meldinger tilbackend
sitt/chat
endepunkt i stedet forworker.js
. Sjekk utsrc/api-service.ts
for en enkel klient til dette formålet. Får du bedre eller dårligere svar fra modellen du bruker i backend? Hvorfor? Er det noen forskjell i hastighet? - Bonusoppgave: Kan du endre APIet så du sender med hele chat-historikken, så modellen i backend får med seg mer av konteksten i samtalen, og gir et bedre svar?
Dette er en oppgave hvor følgende bilde blir relevant:
TL;DR: Bruk testcontainers
til å spinne opp en pgvector
-container og bruk denne til å søke i en innholdsdatabase over data for å svare på spørsmål.
- Spinn opp en
pgvector
-container med Docker ellertestcontainers
. - Les denne guiden om hvordan du kan lage
embeddings
av tekst, hva det er og hvordan det fungerer. - Opprett en tabell i
pgvector
-databasen din og sett inn litt tekst og dets tilhørende embeddings - Skriv SQL for å finne de semantisk likeste tekstene og sett dem inn i promptet du sender videre til
ollama
. - Om du rekker dette er du rask nok og har mest sannsynlig god nok kontroll til å hjelpe de andre på kurset. Reis deg opp og bidra som medhjelper.
Maskinvaren på din laptop er god, men ikke god nok til å kjøre virkelig store modeller som LLaMa 3.1 405B. Dette trenger vi en serverpark med GPUer til å kjøre for oss. På tide å bruke denne berømte #skyen for det den er verdt.
- Tilbake i
backend
-repoet er det allerede lagt inn biblioteketboto3
. På tross av hva navnet skulle tilsi er dette AWS sin offisielle SDK i Python-økosystemet. For å koble til AWS må du opprette en Session. For å starte en Session trenger duaws_access_key_id
,aws_secret_access_key
ogregion_name
. For å opprette en access key kan du følge denne guiden.region_name
setter du til den regionen du bruker i nettportalen. Default her erus-east-1
.
Hvorfor navnet boto3?
Boto (Uttalt boh-toh) er en type ferskvanns-delfin som bor i Amazonas-elven.
- For å kommunisere med modellene du aktiverte i Del 1 av denne workshoppen kan du følge denne guiden. Modellnavn og parametere avhenger av modellvalget du gjorde tidligere. Endre koden i
/bedrock
til å bruke modeller gjennom Amazon Bedrock. - Endre
frontend
-koden til å bruke endepunktet/bedrock
i stedet for/chat
. Endepunktene bruker i utgangspunktet samme datamodell, så endringene burde være minimale. Får du raskere svar fra Bedrock ennollama
? - Bonusoppgave: Om du ikke allerede har gjort det, endre APIet så du sender med hele chat-historikken.
Amazon Bedrock har også mulighet til å generere bilder gjennom APIet sitt. Bruk boto3
til å generere bilder og send dem tilbake til klienten. Du kan for eksempel implementere at meldinger som begynner med image:
skal sendes til SDXL i Bedrock i stedet for en tekst-modell.