Disclaimer: Welkom bij onze TechBlog!
Dit is een artikel in ons TechBlog. Ons Techblog bevat artikelen, geschreven door onze developers, over dingen die ze zijn tegengekomen tijdens hun werkzaamheden. Deze artikelen gaan (meestal) over een technisch onderwerp, en zijn met name bedoeld om te vermaken en (soms) te informeren. S'il vous plaît, please do not take them te serieus, ありがとう.

vr. 25 apr. Auteur: Jeroen Mimpen

Vertalen met AI - Deel 1: Lost in Translation

Talen vertalen. Wij nerds wachten nog steeds vol hoop op de dag dat iedereen besluit om Esperanto te gaan praten. Maar tot die tijd zullen we toch echt iets moeten doen met al die verschillende bestaande talen.

De eerste stap (en dit was voorheen voor ons de meest relevante) is het inbouwen van ondersteuning voor meerdere talen in een applicatie. Hier komt vaak al meer bij kijken dan mensen zich realiseren. Zodra dat eenmaal gebeurd is, bestaat er vaak een hoop content die ingevoerd moet worden in de verschillende talen. En, zoals met alles bij Webenable, willen we dit het liefst zoveel mogelijk automatiseren.

LLM's en talen

Op het moment van schrijven raast de discussie nog door op de vele hoeken van het internet: kunnen LLM's echt denken? Vinden we ooit een oplossing voor de hallucinaties? Zijn LLM's het pad naar AGI? Wij weten het ook niet - maar wat ons betreft is het wel al duidelijk geworden dat LLM's een ongelooflijke stap vooruit zijn in het begrijpen van taal, en alleen om die reden al ongelooflijk krachtige tools zijn.

Om diezelfde reden zijn LLM's dus ook erg geschikt voor het maken van vertalingen. LLM's zijn namelijk in staat om niet alleen woorden, maar ook zinnen of zelfs gehele paragrafen te analyseren, waardoor genuanceerde betekenis en intentie van de oorspronkelijke vertaling overgezet kan worden naar de andere taal. In andere woorden: LLM's zijn heel goed in het begrijpen en vertalen van de context van een stuk tekst, en zijn daarmee dus ook heel goed in het behouden van deze context.

Maar waarom is context belangrijk?

Ik wil dat graag uitleggen aan de hand van een verhaal over een draak die met balken schiet.

Context is belangrijk: Een draak die met balken schiet

Toen ik jong was, was het internet nog behoorlijk beperkt beschikbaar. Dus ik deed wat ieder normaal kind zou doen: zoveel mogelijk op mijn NES spelen. En wanneer ik niet op mijn NES speelde, las ik graag over mijn NES. Dat deed ik natuurlijk in mijn favoriete magazine/tijdschrift 'Club Nintendo'.

Dit blad had hetzelfde probleem als wat wij nu hebben: er was 'content' die vertaald moest worden. In dit geval van Engels naar Nederlands. En hier liepen de vertalers tegen dit probleem aan: de context was niet altijd duidelijk, en dat resulteerde in een veelvoud van verkeerde vertalingen.

Een van mijn favoriete 'foute' vertalingen vond zijn oorsprong in dit stuk tekst, waar informatie wordt gegeven over de eindbaas van het eerste ondergrondse labyrint. Het gaat hier om de laatste zin: 'He shoots beams in three directions'.



Het resultaat: een draak die met balken schiet.
(En maar liefst in 3 richtingen!)
En daarom is context belangrijk.

Het is duidelijk wat hier gebeurd is: Het losse woord 'beam' kan vertaald worden naar 'balk'. Maar dit was natuurlijk niet wat er in de oorspronkelijke (Engelse) tekst bedoeld werd! Hier zien we dus dat je woorden niet zomaar los kunt vertalen, en wat het gevolg is als je vertaler niet de juiste (of volledige) context heeft (of begrijpt).

Mensen (in situaties met voldoende tijd) zijn over het algemeen vrij goed in staat om deze context te begrijpen; computers waren hier traditioneel altijd een stuk minder goed in. Maar wat LLM's dus bijzonder maakt, is dat zij hier wel erg goed in zijn.

Ik heb honger

LLM's zijn dus goed in het vertalen van teksten. Laten we dit eens gaan proberen!

Maar, wij zijn bij Webenable vaak benieuwd naar het grotere plaatje. We beginnen daarom niet direct met de 'beste' vertalers, maar zijn benieuwd naar hoe de kleinere LLM's dit doen - en wat we hiervan kunnen leren. In onze eerdere artikelen schreven we over het gebruiken van LLM's voor het omzetten van de schrijfstijl van een diagram. Daar hebben we dezelfde aanpak toegepast, en zagen we (tot onze verrassing) dat zelfs de 'zwakste' LLM's toch best goede resultaten wisten op te leveren - met de juiste prompting. En dat betekent dus een veel efficiëntere inzet van AI-resources en dus energieverbruik. Wij geloven dat dit steeds belangrijker zal worden.

We beginnen met een simpele zin; eentje die je vaak te horen krijgt bij ons op kantoor:

Ik heb honger.

Ook deze zin, wanneer je ieder woord contextloos behandeld, zou al vertaald kunnen worden naar 'I have hunger'. Stiekem is zo'n soort vertaling natuurlijk ook wat ik verwacht uit de 'zwakkere' LLM's die ik wil gaan proberen.

Gemma2 9B

Gemma is een familie van modellen, gemaakt door Google. Ondanks dat inmiddels Gemma3 al uit is, vind ik het toch vaak nog interessant om te beginnen met Gemma2, de 9B variant. Dit model helpt mij bij het bepalen wat mijn verwachtingen moeten zijn omtrent hoe moeilijk een taak voor een LLM is.

Zoals gewoonlijk is de eerste stap het schrijven van een simpele prompt, die ik vervolgens via één van onze API-clients aan een LLM voer. Onze eerste conversatie zag er ongeveer zo uit:

Gemma 2, 9B
Jeroen
Vertaal de volgende zin van Nederlands naar Engels
Jeroen
Ik heb honger.
Gemma2 9B
I'm hungry.
De eerste vertaling is een succes!

Het formaliteitsniveau van een vertaling
Zelfs een simpele zin als 'Ik heb honger' laat al zien dat er meer complexiteit schuilt in dit probleem. Na meerdere verzoeken te hebben gedaan, zien we dat de vertalingen steeds wisselen tussen "I am hungry" en "I'm hungry". De tweede is iets informeler - maar dit stukje informatie is niet te achterhalen uit onze oorspronkelijke Nederlandse zin. Je moet dus deze informatie doorgeven aan de LLM, en dat doen we door onze prompt hiermee uit te breiden.

Maar de conclusie is wel al duidelijk: Gemma is hier prima toe in staat.

Tijd om de kleinere modellen te proberen.

Llama 3.2 1B: ik heb een moeheid tussen mijn mouwen

Llama 3.2 1B is het kleinste open-weights-model van Meta (het bedrijf achter Facebook, Whatsapp en Instagram). Over het algemeen is de regel: hoe groter het model, hoe slimmer. Dit specifieke Llama-model heeft 1B (één miljard) parameters, en is daarmee vrij klein. Het is niet ongebruikelijk voor modellen om tientallen of zelfs honderden keren zo groot te zijn.

Ons vorige model, Gemma2 9B, is bijna 10 keer zo groot, maar wordt zelf ook nog beschouwd als een klein model. Deepseek-V3 is waanzinnig grote 671B parameters; en van de grootste OpenAI modellen weten we het niet - want dit houden ze geheim - maar de schatting is dat bijvoorbeeld GPT-4.5 minimaal 1.8T was (dus 1800B).

Voor meer uitleg over open-weights, wat de 'grootte' van een model inhoudt en meer, raden we je aan om onze vorige artikelen hierover te lezen.

Onze eerste poging met Llama 3.2 1B zag er ongeveer zo uit:

Llama3 1B
Jeroen
Vertaal de volgende zin van Nederlands naar Engels
Jeroen
Ik heb honger.
Llama3 1B
Ik heb honger wat te eten.

Hmm... Ik begrijp het wel: als ik honger heb vraag ik me ook af wat er te eten is. Maar het was niet helemaal de vertaling waar ik op hoopte.

Ik deed nog enkele pogingen, en kreeg daarbij reacties zoals: 'Ik eet niet eerst' (het model is in ieder geval beleefd), 'Ik maal een honger' (kan ik me voorstellen), 'Ik heb gefruist' (mag dat wel in Nederland!?), en mijn persoonlijke favoriet: 'Ik heb een moeheid tussen mijn mouwen'.

Okee, tot dusver is dit model niet bepaald een taalvirtuoos. Ons advies zou dan ook zijn: als je nog vakantieplannen hebt en 1B mee zou nemen, laat dan je woordenboek nog niet thuis liggen.

Llama 3.2 3B

Ik besluit om dezelfde vraag ook bij Llama 3.2 3B neer te leggen. Dit model heeft 3 miljard parameters, en is dus 3 keer zo groot als ons vorige model.

Llama3 3B
Jeroen
Vertaal de volgende zin van Nederlands naar Engels
Jeroen
Ik heb honger.
Llama3 3B
I am hungry

Bovenstaande verzoek heb ik nog 5 keer herhaald, steeds met hetzelfde resultaat: een correcte vertaling. Dit kleine model is al in staat om simpele zinnen te vertalen van Nederlands naar Engels.

Maar wanneer ik dan terugkijk naar zijn kleinere broertje (die weer vrolijk "🥳Ik heb gefruist" roept), vraag ik mij af of dit beter kan. Tijd om een kijkje te nemen naar onze prompt.

Prompt structuur

In de vorige voorbeelden toonde ik een geparafraseerd voorbeeld van onze prompt. Dit is onze volledige prompt:

System

Please translate the next message from Dutch to English. Your response should ONLY contain the full translation. Nothing else. Use more formal writing. For example use I am, not I'm.

Het volgende bericht is de tekst die we willen vertalen, dus bijvoorbeeld:

System

Ik heb honger.

Onze prompt is nu nog vrij simpel, maar afhankelijk van de context wil je die bijvoorbeeld uitbreiden - soms wil je bijvoorbeeld vermelden waar het over gaat (you are a professional translator translating webshop content), en soms krijg je ook met vakjargon te maken, en zo spelen er nog veel meer dingen. In latere artikelen komen we hier nog op terug, maar voor nu houden we de prompt zo simpel mogelijk.

Maar wat kunnen we nog meer doen om onze prompt te verbeteren?

Self-Refine prompting

Self-refine prompting (of de bredere term Self-Criticism prompting) is een techniek waarbij je de LLM vraagt om zijn eigen response te beoordelen en verfijnen. In praktijk en op technisch vlak is dat vaak heel simpel: je voegt de response van de LLM toe aan de lijst van berichten, en voegt daar ook een nieuw bericht aan toe met dit verzoek. Dit geheel aan berichten stuur je vervolgens weer naar de LLM.

Onze eerste self-refine prompt zag er bijvoorbeeld zo uit:

Please check your previous translation. Is there a way you could improve this translation? For example, by using more 
idiomatic phrases, or adjustments that improve the flow of the sentences? In your next response, please once again only 
respond with the actual full translation. Nothing else. No additional commentary. 

Dit komt er bijvoorbeeld zo uit te zien:

Llama3 1B
Jeroen
Vertaal de volgende zin van Nederlands naar Engels
Jeroen
Ik heb honger.
Llama3 1B
Ik heb honger wat te eten.
Jeroen
Beoordeel je vorige antwoord en geef me een betere vertaling.
Llama3 1B
Ik heb honger wat te drinken.

Een greep uit de antwoorden die we kregen:

  • Ik heb een vrolijke maal netjes op mijne kamer
  • Ich bin hungrig.
  • Bonjour, je vais prendre un précieux.
  • Waar is de wortel?
  • Ik heb pannenkoeken.

Waar de wortel is, weet ik ook niet, maar als hij pannenkoeken heeft is hij op de nationele pannenkoekdag 2025 natuurlijk meer dan welkom bij ons op kantoor. Toch is het duidelijk dat er wat miscommunicatie is tussen ons en de LLM. Alhoewel we later bij andere LLM's zullen zien dat deze techniek heel nuttig kan zijn, lijkt hij helaas voor ons 1B-model niet de oplossing te zijn.

Few shot prompt

Over deze techniek hebben we het al eerder gehad in onze vorige artikelen, waar deze techniek onverwacht goede resultaten opleverde. Een few-shot prompt is een prompt waarbij je een of meerdere voorbeelden van input en output aan de LLM geeft. Mijn manier om dit te doen, is door twee extra berichten toe te voegen aan de lijst met berichten die we sturen naar de LLM, waarvan dit tweede bericht 'zogenaamd' door de assistant is gegeven (maar in werkelijkheid bij ons vandaan komt).

Llama3 1B
Jeroen
Vertaal de volgende zin van Nederlands naar Engels
Jeroen
Ze leest boeken.
Llama3 1B (eigenlijk Jeroen)
She reads books.
Jeroen
Ik heb honger.
Llama3 1B
I am hungry.

Een succesvolle vertaling vanuit het 1B-model! Dit was een onverwacht resultaat voor mij. Dit laat wederom zien hoe belangrijk een goede prompt is. En wat een goede prompt is, verschilt dus per LLM.

Een theorie over wat hier gebeurt

Maar wat gebeurt hier nu eigenlijk, en waarom werkt deze aanpak wel? Want blijkbaar is het 1B-model toch wel in staat om (in iedere geval simpele) vertalingen te produceren.

LLM's zijn statistische modellen die het volgende teken (of woord) voorspellen. Ze beschikken intern over een enorm multi-dimensionale vectorruimte waarin al deze tokens (woorden) op duizenden verschillende manieren aan elkaar verbonden zijn. Een LLM heeft dus de beschikking over een enorme hoeveelheid verbanden tussen al deze woorden, en hoe meer informatie ze krijgen, hoe ze beter ze de 'opties' kunnen beperken om de meest relevante verbanden te kunnen voorspellen.

Mijn theorie is dat het neurale netwerk van het 1B-model groot (of goed) genoeg is om vertalingen te maken, maar niet groot genoeg was om de initiële instructies te kunnen begrijpen. Maar dit model kon de instructies 'in de vorm van' een few-shot prompt wel begrijpen. Het 1B-model kon het dus wel - hij begreep alleen niet wat er van hem verwacht werd. Deze situatie is ons mensen natuurlijk ook niet vreemd - soms lijkt iets heel moeilijk, maar komt dat puur omdat we de vraag niet begrepen.

Moeilijkere zin

Inmiddels is onze honger wel gestild. Het wordt tijd voor een meer uitdagende zin.

De zon schijnt. Ik loop met de hond naar de winkel. Daar koop ik brood en melk.

Vanaf nu gaan we onze vertalingen presenteren via onze 'translation card'. Deze onderstaande kaart bevat alle vertalingen die gemaakt zijn door de verschillende LLM's die we hebben geprobeerd. Om andere vertalingen te bekijken kan je een keuze maken in de dropdown, of de pijl-knoppen gebruiken.

Originele tekst

De zon schijnt. Ik loop met de hond naar de winkel. Daar koop ik brood en melk.

Vertaling
Vertaling (na reflectie)

Ook hier zien we dat Llama3 3B een prima vertaling oplevert. De arme 1B daarentegen heeft het wat moeilijker. Maar met wat hulp van een few-shot prompt lukt het ook 1B om voldoende lichaamsbeweging, vitamine D en zuivel te bemachtigen.

Gemma2 9B wil niet reflecteren

Zoals we wel vaker vermelden: iedere LLM reageert weer anders op een prompt. In het geval van Gemma2 9B geeft dit model keer op keer weer een 'lege' reactie op de zelfreflectie-vraag. Een aantal van de andere modellen in de Gemma-familie geven in deze situatie wel weer een antwoord. Naarmate je meer met de verschillende modellen werkt, lijkt het steeds meer alsof ieder model zijn eigen persoonlijkheid en 'quirks' heeft, en je niet zomaar tussen modellen kunt wisselen, tenzij je ook bereid bent om de prompt goed bij te stellen.

Conclusie

Het lijkt een terugkerende conclusie te worden, maar kleine modellen, met de juiste prompts, zijn vaak al krachtiger dan we ons realiseren. Ik sta er persoonlijk nog steeds regelmatig van versteld wat we nu al kunnen bereiken met deze technologie.

Vergeet niet dat de besproken modellen vaak klein genoeg zijn om lokaal op een telefoon te draaien - dit betekent dat je telefoon offline kan zijn, zonder dat je toegang verliest tot de LLM. Mocht je dus op vakantie gaan en in een situatie komen zonder internet, zou je met name met Llama 3.1 8B en Gemma2 9B best een eind komen!

In het volgende artikel gaan we het de LLM's wat moeilijker maken, door ze moeilijkere zinnen te geven, waarbij ook idiomatische vertalingen een rol beginnen te spelen. Ook gaan we een kijkje nemen naar de prestaties van reasoning LLM's op het gebied van vertalingen.

Maar hoe zit het dan met die draak die balken schiet?

We begonnen dit artikel over een draak die dankzij een verkeerde vertaling met balken schoot. Maar hoe zouden LLM's deze tekst hebben vertaald?

Originele tekst

In order to obtain the Triforce, you’ll have to defeat Aquamentus, a very strong enemy. He shoots beams in three directions.

Vertaling
Vertaling (na reflectie)

Succes! De meeste LLM's weten een mooie vertaling te produceren, waarbij de draak niet meer met balken schiet, maar met stralen. Er zitten uiteraard ook een paar foute vertalingen tussen (waarin hij bijvoorbeeld bundels, bevingen of zelfs gebieden schiet in drie richtingen), maar dat laten we de pret niet drukken!

En nu is het duidelijk! Geen balken maar stralen!

En nu is het duidelijk! Geen balken maar stralen!