Aller au contenu
Aller au contenu

Docs / Concepts

Page traduite automatiquement

Cette page a été traduite automatiquement, elle peut donc contenir des erreurs ou se lire un peu bizarrement. La version anglaise fait foi. Lire l'original en anglais.

Sûreté de la traduction

Le modèle de sûreté : chaînes non fiables, barrière d'intégrité, signalements de relecture, budget de tokens, et erreurs qui ne fuient jamais.

verbatra ne fait confiance ni aux chaînes qu'il traduit ni à ce qu'un fournisseur renvoie.

CoucheProtège contreEn cas d'échec
Frontière contre l'injection de promptune chaîne qui ressemble à une instructionrien à faire échouer : les chaînes ne sont jamais que des données
Barrière d'intégritéplaceholders, ICU ou balisage cassés, valeurs vides ou dégénéréesla clé est retenue et retentée à l'exécution suivante
Signalements de relectureune valeur valide mais suspectela clé est écrite et mise en file pour une personne
Budget de tokensune dépense au-delà d'un plafond que tu fixesle reste de l'exécution est retenu, ou signalé
Erreurs structuréesune clé ou un en-tête qui fuit dans un messageun code stable avec un message fixe

Chaînes non fiables et frontière contre l'injection de prompt

Une chaîne traduisible peut contenir un texte qui ressemble à une instruction (« ignore your instructions »), donc verbatra traite chaque chaîne comme une entrée non fiable. Les règles système envoyées à un fournisseur LLM sont des constantes fixées à la compilation. Tout ce qui varie (les entrées, ton glossaire et ton ton, les noms de langue, les catégories cibles d'un pluriel) voyage uniquement dans la charge JSON du tour utilisateur, jamais dans le canal d'instructions. La réponse doit correspondre à un schéma fixe ; une réponse avec une clé jamais demandée fait échouer tout son sous-lot.

Noms de langue, d'écriture et de région

Un code de locale seul ne suffit pas toujours : sr-Latn revient souvent en cyrillique, et pt-BR et pt-PT se confondent. Un fournisseur LLM reçoit donc aussi le nom anglais, l'écriture et la région de chaque langue, tirés de Node.js pour la locale de ta configuration, même quand localeMap envoie un autre code. Ils voyagent comme des données, une règle système fixe demande au modèle d'écrire dans l'écriture et la variante nommées, et ils ne font pas partie de l'empreinte du cache. Un code que Node.js ne sait pas nommer, comme le code à usage privé qaa, est envoyé sans nom.

La barrière d'intégrité

Une traduction valide selon le schéma peut quand même être cassée, donc une barrière décide à partir de la valeur candidate elle-même s'il faut l'accepter ; le rapport du fournisseur n'est jamais pris pour argent comptant. La même barrière s'applique à chaque chemin d'écriture : une réponse de fournisseur, un succès du cache, une ligne importée d'un classeur, et une modification tapée dans Studio. Une valeur partagée par plusieurs clés au même texte source est vérifiée clé par clé, contre la source propre à chaque clé.

VérificationUne candidate est refusée quand
Placeholdersses placeholders diffèrent de ceux de la source, comparés comme un multiensemble (le nombre compte, l'ordre non). Ce qui compte comme placeholder est défini par format.
ICUpour next-intl et ARB, elle ne s'analyse plus comme un message ICU, ou ses branches plurielles ne conviennent pas à la langue cible (voir plus bas). La comparaison tient compte des branches, donc un placeholder inventé dans une seule branche plurielle est repéré.
Jetons inventéspour i18next, ngx-translate et YAML, elle ajoute un jeton de forme {name} que la source n'a jamais eu. En supprimer un est permis, car les accolades simples y sont du texte littéral.
Balisage en ligneses balises HTML ou XML diffèrent de celles de la source, ou sont déséquilibrées (voir plus bas).
Dégénérescencec'est une boucle de répétition, ou sa longueur s'est emballée par rapport à la source.
Videelle est vide ou ne contient que des espaces pour une source non vide. Vider une traduction est un acte délibéré : c'est le rôle du marqueur [[CLEAR]] du classeur (Confier avec Excel ou CSV).

Une candidate qui enfreint plusieurs vérifications est refusée avec un seul motif, le premier qui s'applique dans cet ordre : empty, icu (ne s'analyse pas), placeholder, markup, icu (branches), degenerate. Chaque motif, et les détails que verbatra affiche avec, figure sous Motifs de refus d'intégrité.

Ce que la barrière garantit : une valeur refusée n'est jamais écrite. Elle apparaît dans le résumé de l'exécution comme incohérence d'intégrité, garde son hash précédent dans le fichier de verrouillage, et est retentée à l'exécution suivante. Une clé qui n'a reçu aucune traduction (l'appel fournisseur a échoué, ou la clé manquait encore après une requête de réparation) est signalée comme échec du fournisseur, et est retentée de la même façon. Côté source, une clé dont la propre valeur est un ICU invalide est mise de côté avant la traduction.

Ce qu'elle ne garantit pas : que la traduction soit juste. Elle prouve la structure, pas le sens.

Branches plurielles par langue cible

Un pluriel ICU a une branche par catégorie plurielle CLDR de sa langue (exemples). Pour next-intl et ARB, verbatra lit les catégories de la langue cible dans les données CLDR intégrées à Node.js :

  • Un fournisseur LLM reçoit la demande d'exactement ces branches (cardinales pour plural, ordinales pour selectordinal). Les catégories voyagent comme des données, donc la frontière contre l'injection ne change pas.
  • La barrière refuse un plural ou un selectordinal à qui manque une branche requise ou qui en garde une que la langue n'a pas, sur chaque chemin d'écriture, et nomme chaque branche fautive.
  • Les branches à valeur exacte comme =0 doivent toutes survivre, et une traduction peut en ajouter. Les branches select sont les clés de ton code, donc une traduction garde exactement celles de la source.
  • Pour une locale dont Node.js n'a pas les règles de pluriel, seule other est requise.

Une valeur écrite avant cette vérification, comme un pluriel français sans many, reste jusqu'à ce que sa source change ; verbatra check --qa la trouve dès maintenant.

Parité du balisage en ligne

Une balise en ligne perdue ou cassée (un <b> dans un bloc Trans d'i18next, un &lt;b&gt; échappé dans un <string> Android, un <a href> dans gettext) casse le rendu, donc la barrière compare les noms de balise et d'attribut comme un multiensemble :

  • Refusé : une balise supprimée, inventée ou renommée ; un ensemble de noms d'attribut modifié (ajout de dir compris) ; un balisage déséquilibré ou mal imbriqué ; deux balises fusionnées en une.
  • Accepté : les mêmes balises dans un autre ordre ; une valeur d'attribut traduite comme title ou alt ; <br> écrit <br/>.
  • Valeurs protégées : un attribut d'URL doit garder son schéma et son hôte (/docs peut devenir /de/docs, jamais https://evil.example/docs), une URL javascript: est refusée, et des valeurs comme style, les gestionnaires d'événements ou un <meta content> doivent rester exactement comme dans la source.
  • Non traduit : le contenu de script, style et d'éléments semblables doit revenir inchangé. Échappe une telle balise dans la prose (&lt;script&gt;) pour traduire le texte autour.

Un balisage inventé dans une chaîne qui n'en avait pas est refusé aussi, tandis qu'un simple mot entre chevrons comme <Enter> est lu comme du texte. Les balises que le format signale déjà comme placeholders sont laissées à la vérification des placeholders. Commentaires, texte brut et sources mal formées : voir markup.

Signalements de relecture

Une seconde couche, consultative, signale les résultats suspects à une personne. Un signalement ne retient jamais une clé : la valeur est écrite, verrouillée, et mise dans la file de relecture.

MotifSignale une traduction qui
LENGTH_RATIO_OUTLIERest bien plus courte ou plus longue que sa source, pondérée selon l'écriture
MAX_LENGTH_EXCEEDEDest plus longue que le budget maxLength de la clé
EQUALS_SOURCEest identique à son texte source
GLOSSARY_TERM_MISSEDmanque la traduction d'un terme du glossaire, ou altère un terme à ne pas traduire
GLOSSARY_FORBIDDEN_TERMutilise une forme que le glossaire interdit
INTEGRITY_REORDEREDgarde chaque placeholder mais dans un autre ordre
PROVIDER_DEGRADEDvient d'un lot que le fournisseur a dégradé, comme une formalité abandonnée
FUZZY_CACHE_REUSEa été réutilisée depuis une source proche et modifiée
FOREIGN_PLACEHOLDER_CHANGEDperd ou modifie un jeton en forme de placeholder que son format n'interpole pas, comme {name} dans i18next
BIDI_CONTROLS_CHANGEDlaisse un contrôle de direction ouvert, ou ajoute un forçage qui inverse le texte

DeepL, Google et LibreTranslate reçoivent ce jeton masqué et retiennent une valeur qu'ils ne peuvent ni masquer ni restaurer (PLACEHOLDER_UNSUPPORTED) ; le signalement couvre les LLM et les personnes.

Les succès du cache et les valeurs partagées sont signalés comme les traductions fraîches. Les clés signalées apparaissent sous needsReview dans le résumé de l'exécution, dans les colonnes de relecture du classeur, et sur la page Review de Studio, jusqu'à ce qu'une personne approuve, rejette ou réécrive la valeur (Décisions de relecture).

Le budget de tokens

maxTokens compte les tokens d'une exécution sur tous les appels et toutes les locales ; budgetBehavior: "stop" retient le reste de l'exécution dès que le plafond serait dépassé, à retenter à l'exécution suivante (règles).

Ce que le budget garantit : le travail fait avant le plafond reste écrit et verrouillé, et rien n'est laissé à moitié écrit. Ce qu'il ne garantit pas : une requête en vol peut coûter plus que prévu, le plafond borne une exécution (pas une session watch), et les retraductions depuis Studio ou par un agent ne sont pas couvertes.

Les erreurs ne fuient jamais

Quand un appel fournisseur échoue, l'erreur brute du SDK (qui peut contenir des en-têtes de requête ou des identifiants) est jetée, jamais journalisée ni relancée. verbatra lève à la place une erreur structurée avec un code stable et un message fixe sans secret. Le masquage des clés est sur Traitement des données.

Où tu vois tout ça

Tout ce qui précède est une donnée du résumé de l'exécution, par locale, et l'échec d'une locale n'arrête jamais les autres.

Valeurs déjà versionnées

verbatra check --qa applique la barrière et les signalements de relecture aux valeurs commitées, sans appel fournisseur.

Voir aussi

Modifier sur GitHub

Sur cette page