Hoe je lange documenten vertaalt met een lokaal LLM: chunks en controles
We vertaalden 3.179 woorden met een lokaal LLM in LM Studio op drie manieren, en elk verborg een stille fout. De chunkgrootte, instellingen en controles die ze aan het licht brengen.

Mensen vertalen documenten met een lokaal LLM om één reden: het bestand mag hun machine niet verlaten. Een lokaal model kan de klus klaren, maar het levert platte tekst op, geen vertaald bestand, en de ergste fouten zijn stille fouten. In onze test kwam een enkel verzoek voor een fragment van 3.179 woorden terug met het juiste aantal alinea's en een schoon voltooiingssignaal, maar één alinea was meer dan een derde van zijn inhoud kwijt en had zinnen gekregen die niet in de bron staan.
Kort antwoord: splits de tekst op alineagrenzen in chunks van ongeveer 600 woorden, zet een woordenlijst van namen en terugkerende termen in de systeeminstructie, schakel de denkmodus van het model uit, en vergelijk elke chunk alinea voor alinea met de bron voordat je erop vertrouwt. Elk van de drie manieren waarop we de test uitvoerden, faalde ergens, en geen enkele fout produceerde een foutmelding. Reken erop dat een middelgroot model op een laptop uren nodig heeft voor een heel boek, en plan om de opmaak zelf opnieuw op te bouwen.
Alles hieronder komt uit één run op 23 oktober 2026: Qwen 3.6 27B (Q4_K_M GGUF) in LM Studio 0.4.8 op een Apple M4 Max met 64 GB geheugen, waarbij het begin van Kafka's Die Verwandlung van het Duits naar het Engels werd vertaald. Het testscript, de resultaten en ruwe voorbeelden van fouten zijn gratis te downloaden, zodat je het met je eigen model kunt herhalen.
Wanneer een lokaal LLM het juiste hulpmiddel is
Voer de vertaling lokaal uit wanneer de regels van het document, niet het gemak, de beslissing nemen:
- een klantcontract, onderzoeksovereenkomst of werkgeversbeleid verbiedt het uploaden van het bestand naar een externe dienst;
- de tekst is persoonlijk of vertrouwelijk en je kunt de gevoelige delen niet eerst verwijderen; of
- je moet veel bestanden verwerken zonder kosten per document en je hebt al geschikte hardware.
Als geen van deze van toepassing is, is een lokaal model meestal de langzamere weg naar een slechter resultaat. Je levert drie dingen in die een documentvertaaldienst biedt: een vertaald bestand in het oorspronkelijke formaat, een model dat groter is dan je machine aankan, en een workflow die is gebouwd op consistentie over een heel boek. Voordat je een van beide routes kiest, doorloop je de checklist voor privacy bij documentvertaling. Die behandelt de bevoegdheid om het bestand te verwerken, minimale werkkopieën en wat een dienst met uploads doet.
"Lokaal" heeft ook een precieze betekenis nodig. Het model draait op je computer, en in onze test gingen de verzoeken alleen naar localhost. Dat vertelt je niet wat de app rond het model logt, bijwerkt of rapporteert. Als je regels bewijs vereisen dat er niets het apparaat verlaat, controleer dan de eigen instellingen en het beleid van de runtime, of voer het uit op een machine zonder netwerktoegang.
Wat we hebben getest
We vertaalden de eerste 19 alinea's van Die Verwandlung (3.179 Duitse woorden) uit de publieke Project Gutenberg-editie. Literair Duits is een eerlijke stresstest: de alinea's zijn lang, de zinnen nestelen zich, en dezelfde personages en functietitels komen terug.
Alle drie de runs gebruikten hetzelfde model en dezelfde instellingen: temperatuur 0,2, maximaal 12.000 uitvoertokens en een contextvenster van 16.384 tokens. De instructie vroeg om één Engelse alinea per Duitse alinea en niets anders.
| Run | Wat we stuurden | Alinea's eruit (bron: 19) | Woorden eruit | Tijd |
|---|---|---|---|---|
| A. Gechunkt | 6 chunks van ongeveer 600 woorden, alleen instructie | 19 | 3,319 | 10,4 min |
| B. Gechunkt + woordenlijst + context | Dezelfde chunks, een woordenlijst van 7 termen en de vorige bronparagraaf gemarkeerd met "NIET VERTALEN" | 20 | 3,446 | 10,5 min |
| C. Eén verzoek | Alle 19 paragrafen in één keer | 19 | 3,309 | 9,5 min |
Elke run eindigde met een normaal stopsignaal, en elke run bevatte een andere stille fout. Run C liet tekst weg en verzon tekst. Run B vertaalde tekst die het moest overslaan. Run A, de schoonste, gaf één personage de verkeerde rol in de laatste chunk.
Fout 1: één groot verzoek liet een deel van een paragraaf weg
Run C eindigde normaal en gaf precies 19 paragrafen terug. Een controle op het aantal paragrafen zou zijn geslaagd. Paragraaf 6 kwam echter terug met 214 woorden voor een bron van 260 woorden.
In de bron kijkt Gregor naar de klok, beseft dat hij zijn trein heeft gemist en overweegt dan zich ziek te melden: zijn baas zou langskomen met de arts van de ziektekostenverzekering, die iedereen als gezond maar werkschuw beschouwt, en Gregor geeft toe dat hij zich eigenlijk prima voelt, afgezien van slaperigheid en een ongewoon grote eetlust. Run C vertaalde het eerste deel en liet vervolgens de hele ziekmeldingspassage weg, 98 van de 260 Duitse woorden van de paragraaf. In plaats daarvan schreef het dat Gregor "ter plekke ontslagen zou zijn", dat de kantoorbediende de neiging heeft "alles wat hem wordt gemeld als een kans te zien om zichzelf te laten gelden", en dat die gedachte "een glimlach op zijn lippen bracht". Niets daarvan staat in het Duits.
De run met chunks vertaalde dezelfde paragraaf volledig, met 267 woorden.
Eén voorbeeld bewijst niet dat lange verzoeken altijd mislukken. Het laat wel zien wat je moet controleren: een lang enkel verzoek kan stilletjes tekst comprimeren of verzinnen terwijl het er structureel nog compleet uitziet. Een lezer zonder Duits zou geen reden hebben om het op te merken.
Fout 2: het model vertaalde de "context" die het moest overslaan
Een veelvoorkomende tip is om de vorige paragraaf met elke chunk mee te sturen, zodat het model de draad vasthoudt. In run B voegden we die toe aan het bericht onder het label "Context (al vertaald, NIET vertalen)."
In chunk 4 vertaalde het model die toch. De chunk gaf vier paragrafen terug voor drie bronparagrafen, en de eerste was een tweede vertaling van de laatste paragraaf van chunk 3. Samengevoegd zou het boek die paragraaf twee keer bevatten, telkens anders verwoord.
De praktische regel: als je context meestuurt, houd die dan buiten de tekst die het model moet vertalen, houd hem kort en controleer het aantal paragrafen van elke chunk. Als je dat niet kunt controleren, laat hem dan weg.
Fout 3: een chunk die alleen werd verstuurd gaf een personage de verkeerde rol
Run A verstuurde elke chunk zonder woordenlijst en zonder context. Voor de eerste vijf chunks werkte dat goed: Prokurist werd "kantoorchef" op alle 16 plaatsen waar het voorkwam. De zesde chunk was één paragraaf waarin de kantoorchef Gregor door de deur de les leest. Los gezien vertaalde het model der Prokurist als "de handelsreiziger", wat Gregors eigen beroep is. Het aantal paragrafen klopte en de lengteverhouding was 1,00, dus geen van beide structurele controles merkte iets op.
In run B, met de woordenlijst in de systeeminstructie en de vorige paragraaf als context, gebruikte dezelfde paragraaf correct "kantoorchef". Deze test kan niet zeggen welke van de twee dat oploste. Omdat de context ook fout 2 veroorzaakte, is de woordenlijst de veiligere plek om namen en rollen van chunk naar chunk mee te dragen: hij is kort, staat in de instructie en je kunt hem mechanisch controleren.
De workflow die standhield
1. Haal eerst platte tekst uit het bestand
Een lokale LLM vertaalt tekst, geen bestanden. Converteer het document voordat je begint:
- DOCX of EPUB: exporteer naar platte tekst of Markdown met één paragraaf per blok, en houd koppen als aparte regels.
- PDF met een tekstlaag: extraheer de tekst en herstel daarna afgebroken regels en afbrekingen. Onze gids over het herstellen van OCR-regelafbrekingen en afbrekingen behandelt dezelfde opschoning. Een converter zoals Docling kan Markdown maken van PDF's en Office-bestanden.
- Gescannde PDF: voer eerst OCR uit. Als je niet zeker weet of een PDF bruikbare tekst heeft, zie PDF-tekstextractie versus OCR.
Houd de alineastructuur intact. Elke latere controle is afhankelijk van een een-op-een-overeenkomst tussen bron- en vertaalde alinea's.
2. Schakel de denkmodus uit en bevestig dit
Veel huidige open modellen redeneren voordat ze antwoorden. Voor vertaling kost dat tijd en uitvoertokens. In onze opstelling verbruikte een testverzoek van 200 tokens 199 tokens aan redeneren en gaf een leeg antwoord terug.
We hebben drie gangbare schakelaars geprobeerd. Het toevoegen van /no_think aan de prompt had geen effect, en chat_template_kwargs met enable_thinking: false had geen effect. Het versturen van "reasoning_effort": "none" in het verzoek schakelde het redeneren uit: het antwoord meldde 0 redeneertokens en gaf de vertaling direct terug. Deze parameter staat niet vermeld op LM Studio's chat completions-pagina, dus beschouw dit als gedrag dat wij hebben waargenomen in versie 0.4.8 met dit model. Controleer het aantal reasoning_tokens in je eigen antwoorden in plaats van een schakelaar te vertrouwen.
3. Bepaal de grootte van het contextvenster vóór de chunks
Het contextvenster moet de instructie, de chunk en de volledige vertaling bevatten. In onze chunked runs gebruikte een Duitse chunk van 500 tot 670 woorden ongeveer 800 tot 1.500 invoertokens, afhankelijk van de woordenlijst en context, en 640 tot 870 uitvoertokens, dus een paar duizend tokens is voldoende. Het enkele verzoek van 3.179 woorden had 4.953 invoertokens en 3.930 uitvoertokens nodig.
Ollama stelt de standaard contextlengte in op basis van beschikbaar geheugen: 4k tokens onder 24 GiB VRAM, 32k van 24 tot 48 GiB, en 256k bij 48 GiB of meer, volgens de documentatie over contextlengte geraadpleegd op 23 oktober 2026. Je kunt dit verhogen met OLLAMA_CONTEXT_LENGTH. Stel in LM Studio de contextlengte in wanneer je het model laadt. Als een chunk plus de vertaling niet past, kan de uitvoer worden afgekapt.
4. Chunk op alineagrenzen, ongeveer 600 woorden
Splits nooit binnen een alinea of zin. Onze chunks waren gericht op 700 woorden en eindigden op de dichtstbijzijnde alineagrens, wat zes chunks van 243 tot 667 woorden opleverde. Kleinere chunks kosten weinig: run A duurde 10,4 minuten tegen 9,5 minuten voor het enkele verzoek, en een mislukte chunk is goedkoop opnieuw uit te voeren.
Houd de instructie kort en identiek voor elke chunk. De onze was: vertaal naar het Engels, houd precies één uitvoeralinea per invoeralinea aan, gescheiden door een lege regel, en geef alleen de vertaling weer. Voeg een woordenlijst toe aan dezelfde instructie: één regel per naam, titel of terugkerende term, in de vorm Prokurist = chief clerk. Onze gids over een vertaalwoordenlijst opstellen behandelt wat je moet opnemen. Korte chunks verliezen het omringende verhaal, en de woordenlijst is wat dat draagt.
5. Controleer elke chunk voordat je ze samenvoegt
Voer drie controles uit op elke chunk:
- Alinea-aantal. De uitvoer moet hetzelfde aantal alinea's hebben als de invoer. Dit ving fout 2 op.
- Lengteverhouding per alinea. Vergelijk het woordenaantal van elke vertaalde alinea met de bron. Dit ving fout 1 op, die de alinea-aantalcontrole miste.
- Woordenlijsttermen per alinea. Waar een bronterm voorkomt, moet de vereiste vertaling even vaak voorkomen. Dit ving fout 3 op, die beide andere controles misten. Vervoegde talen vereisen hier enig oordeel, omdat een Duitse of Russische term van vorm verandert.
Voor Duits naar Engels proza bleven de alinea's van run A tussen 0,98 en 1,17 woorden uit per woord in. De beschadigde alinea van run C was 0,82. Stel je eigen bereik in door een paar alinea's te controleren die je vertrouwt in je talenpaar; de standaardwaarden in ons script zijn een startpunt, geen standaard.
Een gemarkeerde alinea is waar je het eerst moet lezen, niet het bewijs van een fout. Lees daarna de vertaling zelf, vooral namen, getallen, ontkenningen en alles waar een lezer naar zou handelen. De QA-checklist voor boekvertalingen behandelt die beoordeling.
6. Bouw het document opnieuw op
Het model geeft tekst terug. Kopteksten, voetnoten, tabellen, afbeeldingen, paginalay-out en stijlen moeten handmatig of met een conversietool worden teruggezet. Voor een kort rapport is dit gering. Voor een boek met voetnoten en tabellen kan het langer duren dan de vertaling.
Hoe lang een heel boek duurt
Onze chunked run vertaalde 3.179 woorden in 10,4 minuten, ongeveer 300 woorden per minuut op deze machine. In dat tempo zou een roman van 90.000 woorden ruwweg vijf uur genereren kosten, vóór controles en heruitvoeringen. Dat is eenvoudige rekenkunde uit één run, geen benchmark. Snelheid verandert met de modelgrootte, kwantisatie, hardware, talenpaar en hoeveel anders de machine doet.
Het modelbestand was 17,5 GB op schijf, en de contextcache en runtime-buffers vereisen daarbovenop geheugen, dus een machine heeft aanzienlijk meer vrij geheugen nodig dan de bestandsgrootte. Een kleiner model draait sneller en op minder geheugen, meestal met enige kwaliteitskosten. Test het op een representatieve steekproef voordat je een heel boek vastlegt. Onze gids over de beste LLM voor vertaling legt uit hoe je die steekproef samenstelt en modellen eerlijk vergelijkt.
Lokale LLM of documentvertaaldienst
| Vraag | Lokale LLM | Documentvertaaldienst |
|---|---|---|
| Kan het bestand je machine verlaten? | Niet vereist | Vereist |
| Wat je terugkrijgt | Platte tekst die je zelf weer samenvoegt | Een vertaald bestand |
| Modelgrootte | Beperkt door je geheugen | Beperkt door de aanbieder |
| Consistentie over een heel boek | Jouw taak: woordenlijst, opsplitsen, controles | Ingebouwd in sommige diensten |
| Kosten per document | Je hardware en tijd | Prijs per document of per woord |
Als je regels het uploaden van het bestand toestaan, neemt een documentdienst het meeste van het bovenstaande werk uit handen. BookTranslator vertaalt volledige PDF-, EPUB- en DOCX-bestanden en levert een vertaald bestand terug, en in de FAQ staat dat geüploade bestanden en vertaaloutput niet worden gebruikt om AI-modellen te trainen. Het is een clouddienst, dus het is geen optie wanneer het bestand op je machine moet blijven. Als je erover nadenkt om zelf modellen te draaien of te betalen voor een dienst, laat wat LLM-vertaling echt kost zien hoe je de tokenkant kunt budgetteren.
Download de testbestanden
Alle bestanden staan in de map /files/blog/translate-with-local-llm/:
local_llm_translation_test.py: de volledige test tegen LM Studio's lokale API, met alle drie de runs. Richt het op een ander model of een andere brontekst om de test te herhalen.check_translation.py: vergelijkt een brontekst en een vertaling alinea voor alinea en meldt verschillen in het aantal alinea's, lengteverhoudingen buiten bereik en ontbrekende woordenlijsttermen (met--term "Prokurist=chief clerk"). Het werkt met uitvoer van elk hulpmiddel.results.csv: elk verzoek met het aantal alinea's, het aantal woorden, het aantal tokens en de tijd.failure-examples.txt: de Duitse brontekst en de ruwe modeluitvoer voor alle drie de fouten.
Voer check_translation.py met je woordenlijsttermen uit op elke lange vertaling voordat je erop vertrouwt. Het kost seconden, en het markeerde alle drie de fouten in deze test. Het kan je niet vertellen of een vloeiende zin onjuist is, dus de gemarkeerde alinea's zijn waar je lezing begint, niet waar die eindigt.
Gerelateerde berichten





