AI-modellen
Binnen dit project hebben we veel keuzes moeten maken voor het AI-gedeelte. In dit hoofdstuk lichten we de opties toe die we bekeken hebben, en leggen we uit hoe de keuzes tot stand zijn gekomen.
Waarom geen service (bijvoorbeeld OpenAI/ChatGPT)
Tijdens een van de eerste besprekingen met de opdrachtgever kwam ter sprake dat het systeem rekening moet houden met auteursrechten op lesmateriaal en privacy van studenten. Aangezien we reeds hadden gezien dat we bijvoorbeeld middels GPT4ALL1 LLM's kunnen draaien op onze eigen computer, besloten we onze focus te leggen op het lokaal draaien van LLM's.
Om te testen of het gebruiken van documenten daadwerkelijk mogelijk was, hebben we GPT4All opgestart, een model geinstalleerd, lesmateriaal van Brightspace toegevoegd en gevraagd of de LLM er enkele vragen over kon genereren. Hieruit kwam een resultaat was voldoende aanleiding gaf om vol op deze optie te gaan.
Dankzij deze keuze:
- Besparen we de HHS licentiekosten op (immers vrijwel altijd stevig betaalde) services zoals OpenAI/ChatGPT.
- Hoeven we geen onderzoek te doen naar mogelijke privacybewaren die volgen uit de voorwaarden van externe services.
- Blijft de HHS alle data in beheer houden, er gaat niets naar de cloud aangezien alle componenten lokaal draaien.
- Konden we ons onderzoek beperken tot lokale LLM's, waarmee er meer tijd vrij kwam om de kwaliteit te waarborgen.
LLM
Wanneer je uitzoekt hoe LLM's lokaal gedraaid kunnen worden, kom je al snel op het bekende LLaMA van Meta (het bedrijf achter Facebook). We hebben dan ook onder andere dit model vergeleken met enkele andere. De criteria waar we onze modellen langs hebben gelegd waren:
- Open, lokaal downloadbaar model.
- Hoge context grootte i.v.m. RAG (Retrieval Augmented Generation).
- Ondersteuning voor de Nederlandse taal.
- Kwalitatief hoogwaardige output.
Naast LLaMA 3.1 8B, hebben we ook Aya 8B, Aya Expanse en GEITje 7B meegenomen in de vergelijking.
Na verschillende tests in een prototype met RAG bleken de modellen van Aya (waarbij Aya Expanse nog iets beter) het best getrained te zijn op de Nederlandse taal (minste taalfouten), en het best onze systeem prompt (met o.a. de opdracht voor de LLM, het gewenste output dataformaat, etc.) te volgen. De keuze is dan ook hier op gevallen.
Embedding model
Iets minder bekend zijn modellen voor embedding2. Tijdens het testen van generatieve modellen is de vraag ontstaan of het generatieve model om zou kunnen gaan met langere teksten (cursusmaterialen) als input in de prompt, dus zonder enige filter. Of zou het model zelf alleen relevante stukken uit de materialen kunnen gebruiken, en de rest negeren?
Tijdens het testen van de modellen bleek dat de beste output mét een speciaal embedding model wordt gegenereerd.
De werking van een embedding model is, in het kort, als volgt:
- De cursusmaterialen én het onderwerp worden doorgegeven naar het embedding model.
- Het embedding model converteert de cursusmaterialen in vector embeddings en slaat deze op in de vector store (in dit geval, Redis).
- Het embedding model haalt vervolgens alleen die stukken uit de vector store, die bij het onderwerp passen.
- Deze stukken worden weer geconverteerd in tekst en doorgegeven aan het generatief model als context.
- Dit resulteert in een kortere, maar relevantere system prompt, een daarbij in betere output.
Omwille van de tijd die beschikbaar was voor het project, en het feit dat veel embedding modellen niet getrained zijn op de Nederlandse taal, hebben we slechts bge-m3 getest.