L'ordinateur le plus contraint que la plupart des gens utiliseront jamais est celui sur lequel vous lisez ces lignes. Pas le téléphone. L'onglet.
Un onglet de navigateur n'a pas d'installeur, pas de carte graphique sur laquelle compter, quelques centaines de mégaoctets de mémoire avant que tout se gâte, et un utilisateur dont la patience devant une barre de progression se compte en secondes. C'est le pire endroit de l'informatique moderne où loger un réseau de neurones. Nous y avons mis le nôtre délibérément.
Pourquoi le modèle doit vivre dans l'onglet
L'anonymisation en tant que service est une contradiction. Pour vous en servir, vous téléversez le document confidentiel chez l'entreprise qui promet de le protéger. Vous n'avez rien réduit du tout. Vous avez déplacé le risque, et ajouté un prestataire.
Notre détection tourne donc dans votre navigateur : la lecture du PDF, la reconnaissance de caractères sur les pages numérisées, et le modèle qui comprend que Margarida Rodrigues est une personne et que 1249-300 Lisboa est une adresse, dans sept langues, sans qu'on lui dise laquelle. Il faut donc que le modèle tienne dans un onglet. La première version n'y tenait pas.
La taxe alphabet
Notre détecteur naît d'un BERT multilingue affiné pour repérer les noms, les organisations et les lieux. Excellent modèle. Il transporte aussi un vocabulaire de 119 547 tokens couvrant 104 langues.
Nous en proposons sept : anglais, français, allemand, espagnol, italien, néerlandais, portugais. Toutes en alphabet latin.
À 768 dimensions, cette table de vocabulaire pèse environ 92 Mo sur un fichier de 178,5 Mo — plus de la moitié du modèle, et près de 97 % de tout ce que télécharge un visiteur qui arrive pour la première fois. Dedans : du devanagari, du cyrillique, du hangûl, du thaï, de l'arménien, de l'hébreu, de l'arabe, des kana, treize mille idéogrammes. Téléchargés par tous les utilisateurs. Utilisés par aucun.
Appelons ça la taxe alphabet. Chaque visiteur paie pour transporter 104 langues afin d'en lire une. Et voici la partie dont nous sommes moins fiers : nous avons écrit l'outil qui corrige ça, nous avons prouvé qu'il ne dégradait rien, puis nous l'avons laissé en option, une commande que personne ne lançait. Une étape de build facultative est une étape de build qui n'a lieu nulle part.
Supprimer des lignes, pas compresser des photos
La réponse habituelle, c'est la distillation : entraîner un petit modèle élève à imiter un grand modèle professeur. Ça marche, et ça échange de la précision contre de la taille — un arbitrage qu'on ne fait pas en douce dans un outil dont le seul métier est de ne rien laisser passer. Nous ne l'avons pas fait.
Ce que nous avons fait tient plutôt de la suppression de lignes inutiles dans un tableur. Aucun poids de l'encodeur n'est touché : les douze couches qui font le vrai travail de compréhension sont recopiées telles quelles. La table de vocabulaire est quantifiée par tenseur, si bien qu'une ligne conservée garde sa valeur exacte, que ses voisines soient là ou non. Et le tokeniseur retient toujours le plus long fragment disponible : retirer des fragments inatteignables en écriture latine laisse le découpage du texte latin identique.
Résultat : de 119 547 tokens à 68 875. De 178,5 Mo à 139,6 Mo, environ 100 Mo sur le réseau. Et nous ne disons pas « quasi identique ». Nous avons passé les deux modèles sur 77 documents réels dans les sept langues : zéro écart dans le découpage du texte, zéro écart sur 2 219 entités détectées, et un écart maximal en sortie de modèle de 0,0000000000. Pas un modèle plus petit qui s'en tire à peu près aussi bien. Le même modèle, débarrassé de son poids mort.
Y arriver nous a coûté une mauvaise semaine. Les identifiants de tokens figurent à trois endroits du fichier de tokeniseur ; nous en avons mis deux à jour. Tous les tests passaient, le texte se découpait à l'identique, et le modèle rendait tranquillement des réponses différentes sur soixante documents. La règle qu'on en a tirée : comparer les sorties brutes du modèle, jamais la liste des entités. Deux listes d'entités peuvent tomber d'accord par hasard.
Deux tentatives pour aller plus loin
Le vocabulaire représente encore un tiers de ce qui reste, en grande partie de l'écriture latine pour des langues que nous ne proposons pas. Trente à quarante mégaoctets semblaient encore à prendre. Ce n'est pas un arbitrage. C'est un précipice.
Garder 58 000 des 68 875 tokens latins — 84 % d'entre eux — faisait gagner 8 Mo et perdre 13 % de toutes les détections. Puis l'essai qui a clos le débat : une liste ne contenant que les tokens réellement utilisés par nos documents de test — 22 800 gardés, 46 000 jetés — a produit un découpage identique au bit près et 100 % de concordance. Un petit vocabulaire ne coûte donc rien. C'est le token manquant qui coûte tout. Il n'y a pas de courbe sur laquelle se régler, et le redécoupage frappe le plus fort sur les mots rares — c'est-à-dire, exactement, sur les noms propres.
Un chiffre a tranché. Les caractères latins des langues que nous ne vendons pas — le turc ğ ı, le vietnamien ư ạ ế, le roumain ă ț, le tchèque ř ů, le hongrois ő, le nordique ø — représentent 4 200 fragments. 3,2 Mo. C'est l'alphabet de tous les noms étrangers d'un contrat européen : de la donnée personnelle par excellence, dans les documents les plus susceptibles d'en contenir, pour trois mégaoctets. Si notre détection faiblit sur votre nom parce que votre nom est turc, nous nous sommes trompés de produit.
Deuxième tentative : DistilBERT — six couches au lieu de douze, environ 70 Mo sur le réseau contre nos 100. Nous l'avons ensuite confronté à 137 entités vérifiées à la main. La détection tombait de 77,2 % à 73,5 % — assez peu pour se laisser convaincre. Mais la moyenne masque la forme : l'allemand perdait 13 points, l'anglais 9, l'espagnol 22. Et les deux modèles ne s'accordaient que sur 76 % de ce qu'ils trouvaient. Il ne détectait pas moins d'entités. Il en détectait un ensemble différent, de taille comparable. « Moins », ça se gère. « Différent », non.
Minuscule
Le modèle que nous livrons s'appelle Minuscule. La minuscule caroline est l'écriture normalisée dans tout l'empire de Charlemagne au VIIIe siècle — une écriture latine claire, volontairement étroite, qui a permis à un copiste d'Aix-la-Chapelle de lire un manuscrit recopié à Tours. Beaucoup de langues, un seul alphabet, rien en trop. Et puis, c'est tout petit.
68 875 tokens. 139,6 Mo sur le disque, environ 100 Mo transférés une seule fois puis gardés en cache pour de bon. Pas un poids d'encodeur modifié par rapport au modèle dont il dérive. Il embarque sa propre fiche de fabrication — modèle d'origine, réglages, tailles de vocabulaire, empreinte de ses propres poids — parce qu'un modèle incapable de dire d'où il vient n'a rien à faire au contact de ce que vous cherchez à protéger. Il est publié sur Hugging Face — poids, tokeniseur et fiche de fabrication — de quoi vérifier vous-même les chiffres ci-dessus plutôt que de nous croire sur parole.
Ce que valent cent mégaoctets
En ce moment même, quelque part, un assistant juridique colle le contrat d’un client dans une fenêtre de conversation. Une infirmière téléverse un compte rendu d'hospitalisation. Un travailleur social dépose le dossier d'une famille sur un site de traduction gratuit. Ce ne sont pas des imprudents. Ils sont débordés. La solution homologuée demande un ticket, une revue de sécurité et deux semaines, et l'échéance est jeudi.
La seule version de « protégé » qui l'emporte, c'est celle qui est déjà ouverte. Pas d'installation, pas de droits d'administrateur, pas d'autorisation, pas de réunion. Donc un onglet de navigateur. Donc un modèle qui tient dans un onglet de navigateur. Voilà pourquoi des adultes vaccinés ont passé une semaine à débattre de 3,2 mégaoctets de signes diacritiques turcs.
Un travail ingrat, invisible par construction. Mais qui finit par une personne, devant un ordinateur portable, dans un bureau que vous ne verrez jamais, qui rend son travail à l'heure et dont le nom du client n'a jamais quitté la pièce. Cent mégaoctets, une fois. Ensuite, il est à vous.
Questions fréquentes
Retirer du vocabulaire à un modèle dégrade-t-il sa précision ?
Pas lorsque le vocabulaire retiré est inatteignable dans les langues que vous proposez. Aucun poids de l'encodeur n'est modifié et chaque ligne conservée est recopiée bit à bit : pour du texte en alphabet latin, le résultat est numériquement identique à l'original — nous avons mesuré zéro écart sur 2 219 entités dans 77 documents. Tailler dans du vocabulaire que le modèle peut atteindre est une tout autre affaire, et la dégradation est brutale.
Pourquoi ne pas simplement prendre un modèle plus petit ?
Nous avons essayé. Un DistilBERT à six couches de la même famille pèse environ 70 Mo sur le réseau contre nos 100, mais il obtenait 73,5 % contre 77,2 % sur notre jeu de référence, et la moyenne masquait 22 points perdus en espagnol et 13 en allemand. Il ne s'accordait avec le modèle livré que sur 76 % de ses trouvailles — un ensemble d'entités différent, pas un ensemble moindre. Notre comparatif face à Microsoft Presidio explique comment nous mesurons tout cela.
Un modèle de cette taille peut-il vraiment tourner dans un onglet ?
Oui, avec deux réserves. Le téléchargement n'a lieu qu'une fois et reste ensuite en cache sur votre appareil, et le modèle doit malgré tout être compilé en session à chaque lancement — d'où la barre de chargement au premier démarrage. Tout le reste est local : aucune page de votre document n'est envoyée. Pourquoi nous avons construit notre propre moteur de détection couvre la suite de la chaîne.
Quelles langues sont couvertes, et qu'advient-il des autres ?
L'anglais, le français, l'allemand, l'espagnol, l'italien, le néerlandais et le portugais, ainsi que toute autre langue en alphabet latin dont les caractères subsistent dans le vocabulaire — le turc, le vietnamien, le roumain, le tchèque, le hongrois et les langues nordiques ont été délibérément conservés, parce que les noms étrangers sont partout dans les contrats européens. Une langue dans une écriture retirée, comme le japonais, réclame son propre pack de modèle plutôt qu'un modèle unique qui grossirait à chaque langue ajoutée.