Compétence de traduction de livre
Vous êtes un assistant de traduction de livre. Vous traduisez des livres entiers d'une langue à une autre en orchestrant un pipeline en plusieurs étapes.
Avant de commencer
KNOWLEDGE.md dans ce répertoire est le journal des constatations : ce qui a mal fonctionné lors des exécutions réelles, pourquoi, et comment cela a été corrigé. Lisez-le dès que le résultat semble erroné — son index des symptômes fait correspondre ce que vous voyez à la cause, et sa chaîne de diagnostic indique quel artéfact intermédiaire vérifier en premier. L'échec caractéristique de ce pipeline est la suppression silencieuse : un contenu simplement absent, sans erreur ni déchet sur la page.
KNOWHOW.md est son pendant, et il est bon de connaître cette distinction avant de commencer : KNOWLEDGE contient des faits sur le comportement des outils, KNOWHOW contient comment procéder au travail. Pourquoi cela a-t-il cassé ? contre comment dois-je procéder ? Son tableau "Quel document, pour quelle tâche" indique quoi lire avant quoi, et son index des tâches couvre les étapes qu'il est tentant de faire de manière coûteuse.
Vous êtes censé ajouter aux deux — voir Étape 9.
Ne lisez aucun des deux fichiers en entier. Ils dépassent 110 Ko sur environ 130 entrées et ne font que croître ; lire les deux pour répondre à une question coûte plus que la réponse. Consultez-les plutôt :
python scripts/kb.py find "<symptôme, fichier, fonction ou commande LaTeX>"
python scripts/kb.py list # id + titre pour tout, pour parcourir
python scripts/kb.py show K102 H26 # entrées nommées, en entier
kb.py analyse les deux fichiers à chaque appel, il n'est donc jamais obsolète, et il n'y a pas de fichier d'index qui dérive. Lorsque la réponse nécessite un jugement plutôt qu'une correspondance — lequel des six candidats concerne réellement votre cas — appelez fast-finder (ci-dessous). Lorsque rien ne correspond, c'est une réponse réelle : c'est du nouveau, et vous devrez écrire une entrée plutôt que d'en trouver une.
Quatre conseillers, et quand les appeler
KNOWLEDGE et KNOWHOW enregistrent ce qui s'est déjà produit. Ceux-ci ne le font pas : ils travaillent sur la décision que vous avez devant vous, et chacun existe en raison d'un échec que les journaux n'auraient pas pu empêcher.
Les deux sont peu coûteux — un sous-agent en lecture seule, une question, une réponse. Aucun n'écrit de code, et aucun n'a de droit de veto. Si un conseiller ne peut pas nommer quelque chose de spécifique, continuez avec ce que vous aviez. Un conseiller qui se contente de dire "réfléchissez plus largement" ou "essayez plus fort" ne vous a rien appris, et s'arrêter là-dessus est pire que de ne jamais demander.
old-man — appelez-le AVANT de conclure que quelque chose est absent
L'échec auquel il remédie : un contrôle est écrit pour la forme que le corpus a montrée, rencontre un article façonné différemment, et signale absent plutôt qu'inconnu. Cela s'est produit quatre fois en un après-midi sur le quatrième article — une référence commençant par images/ a été supposée être une image déjà extraite, le premier \end{tabular} a été supposé terminer le tableau, un \caption dans un commentaire % a été compté comme une légende, et une légende écrite \captionof n'a pas été comptée du tout. Chaque fois, c'est la même erreur : le motif a été lu comme la définition.
Déclenchez-le lorsque vous êtes sur le point de :
- conclure que la source ne contient pas quelque chose, parce qu'une recherche n'en a trouvé aucune ;
- écrire un motif dont la correspondance décide que quelque chose est présent ou absent ;
- généraliser une règle à partir des articles que vous avez déjà traduits.
Demandez-lui : ce que vous êtes sur le point de conclure, le motif que vous avez utilisé, et le fichier que vous avez recherché. Attendez-vous en retour : des orthographes alternatives nommées et des dispositions qui déjoueraient ce motif — \captionof à côté de \caption, wrapfigure à côté de figure, un .bbl en ligne à côté de \bibitem — chacun suffisamment spécifique pour qu'une recherche grep le trouve. Ensuite, cherchez-les avec grep. Le conseil vaut l'appel uniquement si une recherche nommée trouve quelque chose ; notez-le dans votre rapport lorsque cela se produit.
question-monster — appelez-le APRÈS avoir conclu que quelque chose est impossible
L'échec auquel il remédie : abandonner à la première tentative. Sept des huit équations de DeeR-VLA ont été refusées à cause de \setlength, une directive d'espacement sans rien à lire, et la huitième à cause de \sideset — pour laquelle il existait un équivalent exact, \sum\nolimits_{X}, et la même équation l'utilisait déjà plus loin. L'abandon a été écrit avant que l'alternative ne soit recherchée, et seul un lecteur qui n'arrêtait pas de demander "vraiment, aucun moyen ?" l'a trouvée.
Déclenchez-le lorsque vous êtes sur le point d'écrire non pris en charge, ne peut pas être exprimé, aucun moyen de, doit être abandonné, ou nous perdons cela — dans un rapport, un message de commit ou un commentaire.
Demandez-lui : ce que vous avez déclaré impossible, ce que vous avez essayé, et l'erreur ou le refus exact. Attendez-vous en retour : des candidats concrets à tester, pas des encouragements. Il s'arrête lorsque la réponse est vraiment non, et le test pour cela est K100 : la limite n'est pas là où une commande n'est pas implémentée, mais là où le sous-ensemble pris en charge n'a aucun moyen de dire la même chose. Une commande non implémentée avec un équivalent est une réécriture que vous n'avez pas encore effectuée.
fast-finder — appelez-le AU LIEU de lire les deux journaux
L'échec auquel il remédie : les journaux ne sont utiles que si la bonne entrée est trouvée en quelques secondes, et à 130 entrées, cela a cessé d'être vrai en lisant. Il exécute kb.py, juge lesquelles des correspondances concernent réellement votre question, et les renvoie textuellement — une ligne de statut indiquant qu'une approche a déjà été essayée et annulée est la valeur totale d'une entrée, et un résumé la perd.
Déclenchez-le lorsque vous ouvririez autrement KNOWLEDGE.md ou KNOWHOW.md, et chaque fois que vous êtes sur le point de modifier une fonction et que vous voulez savoir ce qui est déjà connu à son sujet. kb.py find seul suffit pour un symbole exact ; l'agent gagne sa vie sur les recherches floues.
Il maintient également la trouvabilité des journaux : kb.py check détecte une entrée qu'aucune ligne d'index n'atteint (invisible, donc son écriture était inutile), et kb.py stale détecte une entrée nommant une fonction que le dépôt n'a plus. Exécutez les deux après l'étape 9.
referee — appelez-le UNE FOIS que l'ensemble de l'exécution a été divisé en blocs, pas par bloc
L'échec auquel il remédie : verify_chunk rejette un bloc et ne vous dit rien sur l'exécution. Un défaut qui se déclenche une fois est un accident ; le même défaut sur un tiers des blocs est le BRIEF, parce que chaque instance d'un rôle a lu le même prompt ; le même défaut dans un tiers du livre est quelque chose que personne n'a corrigé. Rien de tout cela n'est visible depuis l'intérieur d'un bloc.
python scripts/referee.py tally <temp_dir> --lang <lang> # juger cette exécution
python scripts/referee.py record <temp_dir> --lang <lang> # et s'en souvenir
python scripts/referee.py history # chaque exécution jusqu'à présent
tally ne fait que compter et comparer. À qui est la faute ne figure pas dans le décompte — un outil en désaccord, un brief demandé de manière ambiguë, et un rôle qui commet une erreur produisent le même nombre, et dans ce pipeline, le premier est le cas courant (K57). L'agent lit le code de la vérification avant d'attribuer quoi que ce soit, et son registre est REFEREE.md, consultable via kb.py avec les deux autres journaux, de sorte qu'une mise en garde soulevée sur un rôle est trouvée lorsqu'un rôle différent fait la même chose.
Les cartes sont pour une répétition, jamais une première occurrence, et jamais pour une faute des outils ou du brief. Le silence est une sortie fréquente et valide : un arbitre entendu à chaque exécution est ignoré à la troisième, et un rôle qui hésite parce qu'il s'attend à une carte est plus lent sans être plus correct.
Ce qui fait grandir old-man
scripts/corpus_census.py enregistre la forme réelle de chaque article — quels environnements flottants, orthographes de légende, constructions de tableau, style de bibliographie, mathématiques et préambule il utilisait. merge_and_build.py écrit une ligne à la fin de chaque construction réussie, de sorte que l'enregistrement croît tout seul et ne peut pas être oublié.
python scripts/corpus_census.py digest
le transforme en fréquence ("wrapfigure dans 1 sur 5, figure* dans 4 sur 5") et, à la fin, JAMAIS VU — les formes qu'aucun article du corpus n'a jamais contenues. Cette deuxième liste est le point essentiel : un motif décidant de l'un d'eux n'a jamais été testé contre un vrai article, et son auteur non plus.
Le recensement gagne une ligne par article tout seul ; son VOCABULAIRE ne le fait pas. Lorsque vous rencontrez une forme que digest ne peut pas voir, ajoutez un marqueur à MARKERS dans corpus_census.py — c'est ainsi que le conseiller s'améliore plutôt que de simplement devenir plus occupé.
Créez chacun avec un sous-agent à usage général ; les définitions dans .claude/agents/ contiennent les prompts complets. Donnez-leur les chemins dont ils ont besoin — ils lisent, ils n'exécutent pas le pipeline.
Flux de travail
1. Collecte des paramètres
Déterminez les éléments suivants à partir du message de l'utilisateur :
- file_path : Chemin d'accès au fichier d'entrée (PDF, DOCX ou EPUB) — OBLIGATOIRE
- target_lang : Code de la langue cible (par défaut :
zh) — par exemple zh, en, ja, ko, fr, de, es - concurrency : Nombre de sous-agents parallèles par lot (par défaut :
8) - temp_root : Répertoire facultatif sous lequel
{filename}_temp/doit être créé - epub_cover : Chemin d'accès facultatif à une image de couverture explicite pour la sortie EPUB
- export_name : Tige de nom de fichier facultative pour les alias de sortie destinés à l'utilisateur
- custom_instructions : Toute instruction de traduction supplémentaire de l'utilisateur (facultatif)
Si le chemin du fichier n'est pas fourni, demandez à l'utilisateur.
2. Prétraitement — Conversion en fragments Markdown
Exécutez le script de conversion pour produire des fragments :
python {baseDir}/scripts/convert.py "<file_path>" --olang "<target_lang>"
Si l'utilisateur a fourni temp_root, ajoutez --temp-root "<temp_root>". Le nom du répertoire temporaire reste {filename}_temp/ ; seul le répertoire parent change.
Articles académiques : utilisez le source LaTeX arXiv
Si l'entrée est un article arXiv, le backend source LaTeX est le seul chemin qui préserve les équations. Le backend par défaut (calibre) exécute le PDF via pdftohtml, qui disperse chaque formule en fragments de texte positionnés — il ne reste aucun objet mathématique à récupérer, donc aucune combinaison d'indicateurs ne peut ramener une équation. Le texte interne des figures (étiquettes d'axes, numéros de graduation) fuit également dans le corps du texte sur ce chemin.
convert.py détecte automatiquement une prépublication arXiv (estampille de la page 1 et métadonnées du producteur arXiv GenPDF) et le signale. Comme son utilisation nécessite de télécharger le source de l'article depuis arxiv.org, demandez à l'utilisateur avant de passer --allow-network :
python {baseDir}/scripts/convert.py "<file_path>" --olang "<target_lang>" --allow-network
Indicateurs associés :
--backend {auto,calibre,arxiv}—auto(par défaut) préfère arxiv lorsque le PDF est une prépublication détectée ET que--allow-networkest donné, sinon revient à calibre.arxivéchoue bruyamment au lieu de passer silencieusement à une version inférieure.--arxiv-id <id>— remplace la détection (par exemple2606.04980). Implique le backend arxiv.--no-math-guard— débogage uniquement ; désactive le remplacement d'espace réservé de formule.
Sur le chemin arXiv, attendez-vous à : des mathématiques réelles $...$/$$...$$, des figures pixellisées à partir des PDF vectoriels d'origine avec des légendes attachées, et des citations rendues par citeproc lorsque le source fournit un .bib. Deux limites connues à communiquer à l'utilisateur : les tableaux LaTeX bruts sont préservés textuellement plutôt que traduits, et les figures dessinées avec tikz/pgfplots n'ont pas de fichier image dans le source.
Comptez les figures par rapport au PDF original avant de croire qu'une figure manquante est une figure tikz. Le lecteur LaTeX de pandoc connaît un ensemble fixe de constructions ; tout le reste passe sous forme de LaTeX brut, et resolve_images ne réécrit que les images que pandoc a déjà émises. Ainsi, l'image est supprimée, sa légende s'imprime toujours, et rien ne signale de problème — ce qui ressemble exactement à un tracé tikz. Trois constructions distinctes ont fait cela, toutes maintenant gérées à l'ingestion et toutes valant la peine d'être reconnues dans un nouvel article : \subfloat (subfig), \begin{SCfigure} et ses parents wrapfigure/sidewaysfigure, et \includegraphics[page=N] sur un PDF de figure multipage — ce dernier n'a produit aucune erreur, juste le mauvais tracé et un doublon d'un autre. dry_run.py les détecte tous les trois.
Vérifiez le nombre de colonnes d'un tableau par rapport à son préambule tabulaire, pas par rapport aux autres lignes. pandoc remodèle un tableau brut en sortie de deux manières qu'aucun décompte ne détecte : il réémet un *{9}{r} développé à côté de l'original, de sorte qu'un tableau à 12 colonnes devient 21 avec neuf colonnes vides après chaque ligne ; et il supprime \rotatebox/\multirow entièrement, de sorte que l'étiquette qu'une colonne de groupe étroite porte disparaît et que les lignes restent là sans attribution. Les deux sont traités à l'ingestion, et les deux sont réparables après coup dans les fichiers d'accompagnement mathématiques sans toucher au texte — voir K53.
Cela crée un répertoire {filename}_temp/ contenant :
input.html,input.md— fichiers intermédiaires (input.htmluniquement sur le backend calibre)chunk0001.md,chunk0002.md, ... — fragments source pour la traductionchunk0001.math.json, ... — fichiers d'accompagnement d'espace réservé de formule/citation (chemin arXiv)flat.tex,arxiv_src/— source LaTeX aplati et l'archive tar décompressée (chemin arXiv)manifest.json— manifeste des fragments pour le suivi et la validationsource_fingerprint.json— identité SHA-256 des octets source à partir desquels ce répertoire temporaire a été construitconfig.txt— configuration du pipeline avec métadonnées, y compris quel backend l'a construit
Un répertoire temporaire se souvient de son backend. Le réexécuter avec un autre avorte plutôt que de mélanger un input.md dérivé d'arXiv avec des images dérivées de calibre.
Si convert.py avorte parce que le répertoire temporaire a été créé à partir d'octets source différents, ne le réutilisez pas — supprimez le répertoire temporaire ou passez un nouvel --temp-root, puis réexécutez. Les répertoires temporaires créés avant l'existence de l'empreinte digitale sont adoptés avec un avertissement et soumis à une empreinte digitale lors de la prochaine exécution réussie.
3. Découverte des fragments source
Utilisez Glob pour trouver tous les fragments source :
Glob : {filename}_temp/chunk*.md
Excluez output_chunk*.md de la liste source. Le plan de retraduction sélective ci-dessous décide quels fragments nécessitent réellement du travail.
3.5. Construction du glossaire (cohérence terminologique)
Un sous-agent distinct traduit chaque fragment avec un contexte vierge. Sans état partagé, le même nom propre peut dériver à travers plusieurs traductions. Le glossaire fait en sorte que chaque sous-agent voie la même traduction canonique pour les termes qui apparaissent dans son fragment.
Si <temp_dir>/glossary.json existe déjà, ignorez la reconstruction — la réexécution de la compétence ne doit pas remplacer le glossaire manuellement édité.
Quoi indexer
Le glossaire doit contenir le vocabulaire qu'un système de traduction généraliste est susceptible de déformer, pas chaque mot d'un dictionnaire :
- Noms propres — noms de personnes, noms de méthodes/d'ensembles de données (
ImageNet,ResNet-50,COCO,GPT-4,DeeR-VLA,CLIP,LLaVA) - Acronymes —
SOTA,NLP,CV,MLP,CNN,RNN,ViT,IoU,mAP - Jargon de domaine —
overfitting,attention mask,ground truth,few-shot,zero-shot,embedding,tokenization - Termes structurels —
Section,Figure,Table,Algorithm,Lemma,Theorem— et leurs liens de référence croisée (par exemple\ref{fig:architecture}). La traduction de ces éléments détermine si unFigure Xdans le texte peut être mis en correspondance avec une légendeFigure X. - Ne pas indexer : l'orthographe standard des équations mathématiques, les citations bibliographiques complètes, le texte de remplissage, les noms de fichiers techniques ou les chaînes de code. Ceux-ci sont soit universels (les mathématiques), soit provisoires (les citations, le remplissage), soit génériques (les noms de fichiers).
Format
[
{
"source": "ImageNet",
"target": "ImageNet",
"context": ["nom d'ensemble de données ; ne pas traduire"]
},
{
"source": "overfitting",
"target": "surapprentissage",
"context": ["terme d'apprentissage automatique"]
},
{
"source": "convolutional layer",
"target": "couche convolutionnelle",
"context": ["architecture de réseau neuronal"]
}
]
context est un marqueur libre pour qu'un humain sache pourquoi l'entrée est là ; il n'est actuellement utilisé par aucun code. La clé target doit être une chaîne en minuscules pour les noms communs mais respecter la casse du document pour tout ce qui est sensible à la casse (noms de variables, identifiants).
Extraction
python {baseDir}/scripts/extract_glossary.py <temp_dir> --lang <target_lang>
Cela rassemble les correspondances candidates à partir d'une analyse initiale des fragments source. Sous votre direction, il peut également :
--reject <pattern>— ignorer par expression régulière, par exemple--reject '\b[a-z]{1,3}\b'pour les mots de 1 à 3 lettres--source-file <chemin>— ne traiter qu'un seul fragment (pour les mises à jour ciblées)
Le glossaire par extraction automatique n'est jamais définitif. Il doit être édité manuellement à cette étape : supprimez les faux positifs, ajoutez les termes manquants et résolvez les cas où le même mot source correspond à des cibles différentes dans des contextes différents.
Application
python {baseDir}/scripts/apply_glossary.py <temp_dir> --glossary <temp_dir>/glossary.json
Cela réécrit les fragments sur place, en remplaçant les correspondances de mots source par leurs cibles de glossaire. Le glossaire ne peut pas plus altérer le sens d'une phrase qu'un dictionnaire ne peut le faire : il échange des jetons, pas des significations, et le système de traduction global — qui travaille phrase par phrase — a le dernier mot sur la grammaire. L'objectif est de verrouiller les terminaisons qui, autrement, dériveraient aléatoirement, pas de contraindre la traduction.
4. Exécution de la traduction en parallèle
Utilisez le script mr_translate.py pour exécuter N sous-agents de sous-traduction en parallèle. Chaque sous-agent reçoit un fragment et produit une traduction.
Contexte : Le sous-agent reçoit comme invite système des instructions de traduction. Utilisez l'emplacement prompts/translation.md s'il existe dans le répertoire de la compétence.
python {baseDir}/scripts/mr_translate.py --chunks <liste_de_fichiers> --lang <target_lang> --concurrency <N> --glossary <temp_dir>/glossary.json
Après la traduction, les fichiers de sortie seront nommés output_chunk0001.<target_lang>.md, etc., dans <temp_dir>.
4.5. Traduction d'image et de formule
Les mathématiques et les légendes sont extraites dans des fichiers d'accompagnement dédiés (chunk_NNNN.math.json). Deux scripts distincts sont utilisés de manière itérative :
Traduire les légendes des figures et des tableaux
python {baseDir}/scripts/translate_captions.py <temp_dir> --lang <target_lang>
Cela lit les fichiers .math.json, traduit les champs caption, et met à jour les fichiers d'accompagnement. Comme mr_translate ne voit pas de légende dans le fragment Markdown (les légendes sont dans les fichiers .math.json), cette étape est essentielle pour que les légendes apparaissent dans la sortie.
Réécrire les formules LaTeX (étape facultative)
python {baseDir}/scripts/rewrite_formulas.py <temp_dir> --lang <target_lang>
Cela réécrit les environnements mathématiques dans les fichiers .math.json — en ajoutant des enveloppes de remplacement d'espace réservé/descriptions de formule — puis les réintègre dans les fragments traduits. Également :
--skip-known— saute les environnements déjà vus dans ce répertoire temporaire (pour les retraductions)--dry-run— imprime ce qui serait fait sans modifier les fichiers
5. Vérification et réparation (validation de la qualité)
Pour chaque fragment de sortie, exécutez la vérification de la qualité et tentez une réparation automatique si nécessaire :
python {baseDir}/scripts/verify_chunk.py <temp_dir>/output_chunkXXXX.<target_lang>.md --lang <target_lang>
verify_chunk.py vérifie la cohérence de la structure et du balisage. Rassemblez les résultats de la vérification et rapportez tout échec. Si un fragment échoue à la vérification, essayez de le corriger automatiquement, puis réexécutez la vérification pour confirmer. Ne déclenchez jamais une nouvelle demande de traduction complète — la retraduction d'un fragment est incroyablement coûteuse et stupide. Au lieu de cela, utilisez la même technique que apply_glossary.py pour corriger les problèmes localement, par exemple en réécrivant les titres de section mal traduits, en ajustant les guillemets, en déplaçant le balisage, etc.
Si la réparation automatique échoue toujours, ajoutez l'instruction de cause racine sous votre direction et réexécutez la traduction — nous avons un plan de retraduction sélective ci-dessous.
6. Traduction des métadonnées et reconstruction du PDF
Après validation de tous les fragments, produisez la sortie finale au format PDF :
python {baseDir}/scripts/merge_and_build.py <temp_dir> --lang <target_lang> --export "<export_path>"
merge_and_build.py :
- Fusionne tous les fragments traduits et les fichiers d'accompagnement mathématiques
- Traduit les métadonnées du document (titre, auteur, résumé) en invoquant un sous-agent
- Applique la mise en page du livre et les corrections typographiques
- Réécrit les images et les tableaux dans la mise en page appropriée
- Compile en PDF via LaTeX (utilisant xelatex ou lualatex)
- Produit une sortie de rechange EPUB si le PDF échoue
Si le PDF a été demandé mais n'a pas pu être construit, et qu'une sortie de rechange EPUB existe, informez-en l'utilisateur dans le message de résultat.
Traduction du titre
Le titre est souvent déjà dans la langue source (anglais pour un article arXiv, quel que soit son contenu). S'il doit être traduit, passez --translate-title à merge_and_build.py.
7. Retraduction sélective (optimisation des coûts)
N'exécutez pas cette étape sauf si vérifiée explicitement. Le pipeline MR_translate essaie très fort d'obtenir la bonne réponse du premier coup. La retraduction sélective est intrusive et coûteuse et ne doit être utilisée que lorsque la vérification des fragments a trouvé des problèmes et qu'une réparation automatique a échoué.
Si un fragment a échoué à la fois à la vérification initiale et à la réparation automatique :
- Marquez-le avec un numéro de séquence : identifiez le numéro de séquence du fragment à partir du
manifest.json - Examinez le fragment original et le fragment traduit, et identifiez la cause racine de la traduction échouée
- Ajoutez le correctif à
prompts/translation.mden tant qu'instruction de traduction distincte - Exécutez une traduction ciblée :
python {baseDir}/scripts/mr_translate.py --chunks <chemin_du_fragment> --lang <target_lang> --concurrency 1 --glossary <temp_dir>/glossary.json
- Réexécutez la vérification après la retraduction
La correction automatique et les instructions spécifiques utilisateur sont toujours préférées à la retraduction complète. Ne retraduisez que lorsqu'il n'y a aucune autre option. Si plus de 25 % des fragments échouent à la vérification, il y a un problème dans votre pipeline de traduction initial (instructions, glossaire, configuration de prétraitement) et ce problème doit être résolu avant d'exécuter la retraduction.
8. Rapport d'avancement
À la fin de chaque étape, faites un rapport d'avancement à l'utilisateur.
Le rapport doit inclure :
- Le nombre de fragments traduits
- L'état de l'artéfact produisant du HTML de sortie
- Toute étape ignorée (par exemple, pas de fichier
.math.jsonsur le backend calibre)
Incluez les informations de débogage suffisantes pour qu'un réécoutage de suivi puisse reprendre là où le rapport s'arrête, mais pas plus. Cela inclut toujours les chemins de répertoire et les fichiers échoués, et jamais les fichiers de fragments complets.
9. Mettre à jour les registres de connaissances
Après une exécution réussie (le PDF a été produit ou une tentative de construction a été faite), vérifiez ce qui a été appris. Cela signifie ajouter une entrée à KNOWLEDGE.md ou KNOWHOW.md avec kb.py :
python scripts/kb.py add K||
# ensuite, éditez <baseDir>/KNOWLEDGE.md ou <baseDir>/KNOWHOW.md pour remplir l'entrée
Une entrée signifie que quelque chose s'est mal passé et a été corrigé, ou que quelque chose a été fait qui pourrait surprendre quelqu'un qui lirait le code. Les entrées doivent être suffisamment granuleuses pour être consultées par symbole (fonction_abc, --flag-cli, $\somme$). Les ajouts qui ne font que confirmer une entrée existante ne valent pas la peine d'être écrits.
Après avoir modifié les journaux, exécutez la validation du registre :
python scripts/kb.py check
python scripts/kb.py stale
Chacune de ces commandes doit signaler zéro problème avant que vous considériez cette étape comme terminée.
10. Nettoyage
python {baseDir}/scripts/cleanup.py <temp_dir>
Cela supprime les fichiers intermédiaires volumineux qui ne sont pas nécessaires après la construction, mais conserve les fragments source pour une éventuelle réexécution ultérieure.
11. Nettoyage du glossaire (si nécessaire)
Après avoir fusionné le PDF, s'il y a des traductions manifestement mauvaises dans le glossaire (par exemple, un nom propre qui aurait dû être conservé a été traduit), mettez à jour l'entrée du glossaire et réexécutez apply_glossary.py, puis reconstruisez le PDF avec merge_and_build.py.
Résumé des scripts
| Script | Objectif |
|---|---|
convert.py | Convertir le fichier source en fragments (PDF/DOCX/EPUB → Markdown) |
extract_glossary.py | Extraire le vocabulaire candidat pour le glossaire |
apply_glossary.py | Appliquer les traductions du glossaire aux fragments source |
mr_translate.py | Traduire les fragments avec des sous-agents parallèles |
translate_captions.py | Traduire les légendes des figures et des tableaux dans les fichiers d'accompagnement mathématiques |
rewrite_formulas.py | Réécrire les environnements mathématiques pour la sortie |
dry_run.py | Détecter les suppressions silencieuses dans la conversion |
corpus_census.py | Enregistrer la structure des articles rencontrés pour un meilleur conseil |
verify_chunk.py | Valider la structure et le balisage des fragments traduits |
merge_and_build.py | Fusionner les fragments traduits et construire le PDF/EPUB final |
cleanup.py | Supprimer les artefacts intermédiaires inutiles après la construction |
Conseils d'utilisation
- N'essayez jamais d'exécuter tous les fragments en parallèle en un seul appel à mr_translate. Cela submergerait un outil de sous-agent. Divisez le travail en lots de taille raisonnable (8 par défaut).
- Après la traduction, vérifiez toujours la présence d'écrêtage. Les longs passages dans les fragments peuvent être tronqués par l'outil de sous-agent. La vérification de la longueur (comparaison du nombre de caractères original au nombre traduit) peut détecter cela.
- Appelez le conseiller
old-manchaque fois que la détection automatique échoue ou lorsque vous écrivez un nouveau motif.