Comment traduire de longs documents avec un LLM local : découpage et vérifications
Nous avons traduit 3 179 mots avec un LLM local dans LM Studio de trois manières, et chacune cachait une erreur silencieuse. La taille des segments, les réglages et les vérifications qui les détectent.

Les gens traduisent des documents avec un LLM local pour une seule raison : le fichier ne peut pas quitter leur machine. Un modèle local peut faire le travail, mais il vous donne du texte brut, pas un fichier traduit, et ses pires erreurs sont silencieuses. Dans notre test, une seule requête pour un extrait de 3 179 mots est revenue avec le bon nombre de paragraphes et un signal de fin propre, pourtant un paragraphe avait perdu plus d'un tiers de son contenu et gagné des phrases absentes de la source.
Réponse courte : découpez le texte aux limites des paragraphes en segments d'environ 600 mots, placez un glossaire des noms et des termes récurrents dans l'instruction système, désactivez le mode de réflexion du modèle, et comparez chaque segment avec sa source paragraphe par paragraphe avant de lui faire confiance. Chacune des trois manières dont nous avons mené le test a échoué quelque part, et aucune défaillance n'a produit de message d'erreur. Attendez-vous à ce qu'un modèle de taille moyenne sur un ordinateur portable prenne des heures pour un livre entier, et prévoyez de reconstruire vous-même la mise en forme.
Tout ce qui suit provient d'une seule exécution le 23 octobre 2026 : Qwen 3.6 27B (Q4_K_M GGUF) dans LM Studio 0.4.8 sur un Apple M4 Max avec 64 Go de mémoire, traduisant le début de Die Verwandlung de Kafka de l'allemand vers l'anglais. Le script de test, les résultats et les exemples bruts d'échec sont téléchargeables gratuitement pour que vous puissiez répéter l'expérience avec votre propre modèle.
Quand un LLM local est l'outil adapté
Exécutez la traduction localement lorsque ce sont les règles du document, et non la commodité, qui dictent la décision :
- un contrat client, un accord de recherche ou une politique d'employeur interdit le téléversement du fichier vers un service externe ;
- le texte est personnel ou confidentiel et vous ne pouvez pas en retirer d'abord les parties sensibles ; ou
- vous devez traiter de nombreux fichiers sans coût par document et vous disposez déjà d'un matériel adapté.
Si aucune de ces situations ne s'applique, un modèle local est généralement la voie la plus lente vers un moins bon résultat. Vous renoncez à trois choses qu'offre un service de traduction de documents : un fichier traduit dans le format d'origine, un modèle plus grand que ce que votre machine peut héberger, et un flux de travail conçu pour la cohérence sur tout un livre. Avant de choisir l'une ou l'autre voie, parcourez la liste de contrôle de confidentialité pour la traduction de documents. Elle couvre l'autorisation de traiter le fichier, les copies de travail minimales et ce qu'un service fait des fichiers téléversés.
« Local » nécessite aussi une définition précise. Le modèle s'exécute sur votre ordinateur, et dans notre test les requêtes n'allaient que vers localhost. Cela ne vous dit pas ce que l'application autour du modèle journalise, met à jour ou signale. Si vos règles exigent la preuve que rien ne quitte l'appareil, vérifiez les propres réglages et la politique du moteur d'exécution, ou exécutez-le sur une machine sans accès réseau.
Ce que nous avons testé
Nous avons traduit les 19 premiers paragraphes de Die Verwandlung (3 179 mots allemands) à partir de l'édition du domaine public de Project Gutenberg. L'allemand littéraire est un bon test de résistance : les paragraphes sont longs, les phrases s'imbriquent et les mêmes personnages et intitulés de poste reviennent.
Les trois exécutions ont utilisé le même modèle et les mêmes réglages : température 0,2, un maximum de 12 000 jetons de sortie et une fenêtre de contexte de 16 384 jetons. L'instruction demandait un paragraphe anglais par paragraphe allemand et rien d'autre.
| Exécution | Ce que nous avons envoyé | Paragraphes en sortie (source : 19) | Mots en sortie | Temps |
|---|---|---|---|---|
| A. Découpé | 6 segments d'environ 600 mots, instruction seule | 19 | 3,319 | 10,4 min |
| B. Découpé + glossaire + contexte | Mêmes segments, un glossaire de 7 termes et le paragraphe source précédent marqué « ne PAS traduire » | 20 | 3,446 | 10,5 min |
| C. Une seule requête | Les 19 paragraphes en une fois | 19 | 3,309 | 9,5 min |
Chaque exécution s'est terminée par un signal d'arrêt normal, et chaque exécution contenait une erreur silencieuse différente. L'exécution C a supprimé et inventé du texte. L'exécution B a traduit un texte qu'on lui avait demandé d'ignorer. L'exécution A, la plus propre, a attribué le mauvais rôle à un personnage dans son dernier segment.
Échec 1 : une seule grande requête a supprimé une partie d'un paragraphe
L'exécution C s'est terminée normalement et a renvoyé exactement 19 paragraphes. Un contrôle du nombre de paragraphes l'aurait validée. Le paragraphe 6, cependant, est revenu avec 214 mots pour une source de 260 mots.
Dans la source, Gregor regarde l'horloge, réalise qu'il a raté son train, puis envisage de se faire porter malade : son patron arriverait avec le médecin de l'assurance maladie, qui considère tout le monde comme bien portant mais réfractaire au travail, et Gregor admet qu'il se sent en fait bien, à part une somnolence et un appétit inhabituel. L'exécution C a traduit la première partie, puis a supprimé tout le passage sur le congé maladie, soit 98 des 260 mots allemands du paragraphe. À la place, elle a écrit que Gregor « aurait été renvoyé sur-le-champ », que le commis de bureau a « tendance à voir tout ce qu'on lui rapporte comme une occasion de se mettre en valeur », et que cette pensée « lui avait arraché un sourire ». Rien de tout cela ne figure dans l'allemand.
L'exécution par segments a traduit le même paragraphe intégralement, à 267 mots.
Un seul échantillon ne prouve pas que les longues requêtes échouent toujours. Il montre ce qu'il faut vérifier : une longue requête unique peut silencieusement compresser ou inventer du texte tout en paraissant structurellement complète. Un lecteur qui ne connaît pas l'allemand n'aurait aucune raison de s'en apercevoir.
Échec 2 : le modèle a traduit le « contexte » qu'on lui avait demandé d'ignorer
Un conseil courant consiste à envoyer le paragraphe précédent avec chaque segment pour que le modèle garde le fil. Dans l'exécution B, nous l'avons ajouté au message sous l'étiquette « Contexte (déjà traduit, ne PAS traduire) ».
Dans le segment 4, le modèle l'a traduit quand même. Le segment a renvoyé quatre paragraphes pour trois paragraphes source, et le premier était une seconde traduction du dernier paragraphe du segment 3. Une fois assemblés, le livre aurait contenu ce paragraphe deux fois, avec une formulation différente à chaque fois.
La règle pratique : si vous envoyez du contexte, gardez-le hors du texte que le modèle doit traduire, gardez-le court et vérifiez le nombre de paragraphes de chaque segment. Si vous ne pouvez pas vérifier, n'en envoyez pas.
Échec 3 : un segment envoyé seul a attribué le mauvais rôle à un personnage
L'exécution A envoyait chaque segment sans glossaire ni contexte. Pour les cinq premiers segments, cela a bien fonctionné : Prokurist est devenu « chef de bureau » dans les 16 occurrences. Le sixième segment était un paragraphe unique dans lequel le chef de bureau réprimande Gregor à travers la porte. Vu isolément, le modèle a traduit der Prokurist par « le voyageur de commerce », qui est le métier de Gregor lui-même. Le nombre de paragraphes correspondait et le ratio de longueur était de 1,00, donc aucun des deux contrôles structurels ne l'a remarqué.
Dans l'exécution B, qui avait le glossaire dans l'instruction système et le paragraphe précédent comme contexte, le même paragraphe a correctement utilisé « chef de bureau ». Ce test ne permet pas de dire lequel des deux a corrigé le problème. Comme le contexte a aussi causé l'échec 2, le glossaire est l'endroit le plus sûr pour transporter les noms et les rôles d'un segment à l'autre : il est court, il se trouve dans l'instruction et vous pouvez le vérifier mécaniquement.
Le flux de travail qui a tenu bon
1. Extraire d'abord le texte brut du fichier
Un LLM local traduit du texte, pas des fichiers. Convertissez le document avant de commencer :
- DOCX ou EPUB : exportez en texte brut ou en Markdown avec un paragraphe par bloc, en gardant les titres sur des lignes séparées.
- PDF avec couche de texte : extrayez le texte, puis réparez les lignes coupées et les césures. Notre guide pour corriger les sauts de ligne et les césures de l'OCR couvre le même nettoyage. Un convertisseur comme Docling peut produire du Markdown à partir de PDF et de fichiers Office.
- PDF numérisé : lancez d'abord l'OCR. Si vous ne savez pas si un PDF contient du texte exploitable, consultez Extraction de texte PDF vs OCR.
Conservez la structure des paragraphes intacte. Toutes les vérifications ultérieures reposent sur une correspondance univoque entre les paragraphes source et traduits.
2. Désactivez le mode réflexion et confirmez-le
De nombreux modèles ouverts actuels raisonnent avant de répondre. Pour la traduction, cela gaspille du temps et des jetons de sortie. Dans notre configuration, une requête de test de 200 jetons a dépensé 199 jetons en raisonnement et renvoyé une réponse vide.
Nous avons essayé trois commutateurs courants. L'ajout de /no_think au prompt n'a rien changé, et chat_template_kwargs avec enable_thinking: false n'a rien changé non plus. L'envoi de "reasoning_effort": "none" dans la requête a désactivé le raisonnement : la réponse indiquait 0 jeton de raisonnement et renvoyait directement la traduction. Ce paramètre n'est pas répertorié sur la page de complétions de chat de LM Studio, considérez-le donc comme un comportement que nous avons observé dans la version 0.4.8 avec ce modèle. Vérifiez le nombre de reasoning_tokens dans vos propres réponses plutôt que de faire confiance à un commutateur.
3. Dimensionnez la fenêtre de contexte avant les segments
La fenêtre de contexte doit contenir l'instruction, le segment et la traduction complète. Dans nos exécutions par segments, un segment allemand de 500 à 670 mots utilisait environ 800 à 1 500 jetons d'entrée, selon le glossaire et le contexte, et 640 à 870 jetons de sortie, donc quelques milliers de jetons suffisent. La requête unique de 3 179 mots nécessitait 4 953 jetons d'entrée et 3 930 jetons de sortie.
Ollama définit sa longueur de contexte par défaut en fonction de la mémoire disponible : 4k jetons en dessous de 24 Gio de VRAM, 32k de 24 à 48 Gio, et 256k à partir de 48 Gio, selon sa documentation sur la longueur de contexte consultée le 23 octobre 2026. Vous pouvez l'augmenter avec OLLAMA_CONTEXT_LENGTH. Dans LM Studio, définissez la longueur de contexte lors du chargement du modèle. Si un segment plus sa traduction ne tient pas, la sortie peut être tronquée.
4. Segmentez aux limites de paragraphe, environ 600 mots
Ne coupez jamais à l'intérieur d'un paragraphe ou d'une phrase. Nos segments visaient 700 mots et se terminaient à la limite de paragraphe la plus proche, ce qui a produit six segments de 243 à 667 mots. Des segments plus petits coûtent peu : l'exécution A a pris 10,4 minutes contre 9,5 minutes pour la requête unique, et un segment échoué est peu coûteux à relancer.
Gardez l'instruction courte et identique pour chaque segment. La nôtre était : traduisez en anglais, conservez exactement un paragraphe de sortie par paragraphe d'entrée séparé par une ligne vide, et ne produisez que la traduction. Ajoutez un glossaire à la même instruction : une ligne par nom, titre ou terme récurrent, sous la forme Prokurist = chief clerk. Notre guide pour construire un glossaire de traduction couvre ce qu'il faut inclure. Les segments courts perdent l'histoire environnante, et c'est le glossaire qui la porte.
5. Vérifiez chaque segment avant de les assembler
Effectuez trois vérifications sur chaque segment :
- Nombre de paragraphes. La sortie doit avoir le même nombre de paragraphes que l'entrée. Cela a détecté l'échec 2.
- Ratio de longueur par paragraphe. Comparez le nombre de mots de chaque paragraphe traduit avec sa source. Cela a détecté l'échec 1, que le nombre de paragraphes avait manqué.
- Termes du glossaire par paragraphe. Là où un terme source apparaît, sa traduction requise doit apparaître le même nombre de fois. Cela a détecté l'échec 3, que les deux autres vérifications avaient manqué. Les langues à flexion demanderont un certain jugement ici, car un terme allemand ou russe change de forme.
Pour de la prose allemande vers l'anglais, les paragraphes de l'exécution A se situaient entre 0,98 et 1,17 mot sorti par mot entré. Le paragraphe endommagé de l'exécution C était à 0,82. Définissez votre propre plage en vérifiant quelques paragraphes auxquels vous faites confiance dans votre paire de langues ; les valeurs par défaut de notre script sont un point de départ, pas une norme.
Un paragraphe signalé est l'endroit où lire en premier, pas une preuve d'erreur. Lisez ensuite la traduction elle-même, en particulier les noms, les nombres, les négations et tout ce sur quoi un lecteur agirait. La liste de contrôle d'assurance qualité pour la traduction de livres couvre cette relecture.
6. Reconstruisez le document
Le modèle renvoie du texte. Les titres, notes de bas de page, tableaux, images, mise en page et styles doivent être remis en place à la main ou par un outil de conversion. Pour un court rapport, c'est mineur. Pour un livre avec des notes de bas de page et des tableaux, cela peut prendre plus de temps que la traduction.
Combien de temps prend un livre entier
Notre exécution par segments a traduit 3 179 mots en 10,4 minutes, soit environ 300 mots par minute sur cette machine. À ce rythme, un roman de 90 000 mots prendrait environ cinq heures de génération, avant les vérifications et les relances. C'est une simple arithmétique à partir d'une exécution, pas un benchmark. La vitesse change avec la taille du modèle, la quantification, le matériel, la paire de langues et la charge de la machine.
Le fichier du modèle faisait 17,5 Go sur disque, et le cache de contexte et les tampons d'exécution nécessitent de la mémoire en plus, donc une machine a besoin de nettement plus de mémoire libre que la taille du fichier. Un modèle plus petit s'exécutera plus vite et avec moins de mémoire, généralement au prix d'une certaine qualité. Testez-le sur un échantillon représentatif avant d'engager un livre entier. Notre guide sur le meilleur LLM pour la traduction explique comment constituer cet échantillon et comparer les modèles équitablement.
LLM local ou service de traduction de documents
| Question | LLM local | Service de traduction de documents |
|---|---|---|
| Le fichier peut-il quitter votre machine ? | Non requis | Requis |
| Ce qui est renvoyé | Du texte brut à réassembler | Un fichier traduit |
| Taille du modèle | Limitée par votre mémoire | Limitée par le fournisseur |
| Cohérence sur l'ensemble d'un livre | À votre charge : glossaire, découpage, vérifications | Intégrée à certains services |
| Coût par document | Votre matériel et votre temps | Prix par document ou par mot |
Si vos règles autorisent l'envoi du fichier, un service de traduction de documents élimine la majeure partie du travail décrit ci-dessus. BookTranslator traduit des fichiers PDF, EPUB et DOCX complets et renvoie un fichier traduit, et sa FAQ indique que les fichiers envoyés et les traductions produites ne servent pas à entraîner des modèles d'IA. C'est un service cloud, donc ce n'est pas une option lorsque le fichier doit rester sur votre machine. Si vous hésitez entre exécuter vous-même des modèles et payer un service, ce que coûte réellement une traduction par LLM explique comment budgéter le volet tokens.
Obtenir les fichiers de test
Tous les fichiers se trouvent dans le dossier /files/blog/translate-with-local-llm/ :
local_llm_translation_test.py: le test complet contre l'API locale de LM Studio, avec les trois exécutions. Pointez-le vers un autre modèle ou un autre texte source pour refaire le test.check_translation.py: compare un texte source et une traduction paragraphe par paragraphe et signale les écarts de nombre de paragraphes, les ratios de longueur hors limites et les termes manquants du glossaire (avec--term "Prokurist=chief clerk"). Il fonctionne avec la sortie de n'importe quel outil.results.csv: chaque requête avec ses nombres de paragraphes, de mots, de tokens et sa durée.failure-examples.txt: la source allemande et la sortie brute du modèle pour les trois échecs.
Exécutez check_translation.py avec les termes de votre glossaire sur toute traduction longue avant de vous y fier. Cela ne prend que quelques secondes, et il a signalé les trois échecs de ce test. Il ne peut pas vous dire si une phrase fluide est erronée, donc les paragraphes signalés constituent le point de départ de votre relecture, pas son point d'arrivée.
Articles connexes





