Il computer più limitato che la maggior parte delle persone userà mai è quello su cui stai leggendo queste righe. Non il telefono. La scheda.
Una scheda del browser non ha un programma di installazione, non ha una scheda grafica su cui contare, ha qualche centinaio di megabyte di memoria prima che le cose si mettano male, e davanti un utente la cui pazienza di fronte a una barra di avanzamento si misura in secondi. È il posto peggiore dell'informatica moderna in cui mettere una rete neurale. Noi ci abbiamo messo la nostra apposta.
Perché il modello deve stare nella scheda
L'anonimizzazione come servizio è una contraddizione. Per usarla carichi il documento riservato all'azienda che promette di proteggerlo. Non hai ridotto la tua esposizione. L'hai spostata, aggiungendo un fornitore.
Per questo la nostra rilevazione gira dentro il tuo browser: la lettura del PDF, il riconoscimento dei caratteri sulle pagine scansionate e il modello che capisce che Margarida Rodrigues è una persona e che 1249-300 Lisboa è un indirizzo, in sette lingue, senza che nessuno gli dica quale. Il che obbliga il modello a stare dentro una scheda. La prima versione non ci stava.
La tassa sull'alfabeto
Il nostro rilevatore nasce da un BERT multilingue affinato per individuare nomi, organizzazioni e luoghi. Ottimo modello. Si porta però dietro un vocabolario di 119.547 token per 104 lingue.
Noi ne offriamo sette: inglese, francese, tedesco, spagnolo, italiano, olandese, portoghese. Tutte in alfabeto latino.
A 768 dimensioni quella tabella di vocabolario pesa circa 92 MB su un file da 178,5 MB: più di metà del modello, e all'incirca il 97% di tutto ciò che scarica chi arriva per la prima volta. Dentro ci sono devanagari, cirillico, hangul, thai, armeno, ebraico, arabo, kana e tredicimila ideogrammi. Scaricati da ogni utente. Usati da nessuno.
Chiamiamola tassa sull'alfabeto. Ogni visitatore paga per portarsi dietro 104 lingue allo scopo di leggerne una. E qui viene la parte di cui andiamo meno fieri: lo strumento che risolve la cosa lo avevamo già scritto, e avevamo già dimostrato che non peggiorava nulla — poi lo abbiamo lasciato lì, un comando facoltativo che non lanciava nessuno. Un passaggio di build facoltativo è un passaggio di build che non avviene da nessuna parte.
Cancellare righe, non comprimere foto
La risposta consueta è la distillazione: addestrare un piccolo modello allievo a imitarne uno grande. Funziona, e scambia accuratezza per dimensione: uno scambio che non si fa alla chetichella in uno strumento il cui unico mestiere è non farsi sfuggire niente. Quindi non l'abbiamo fatto.
Quello che abbiamo fatto somiglia piuttosto a cancellare righe inutilizzate da un foglio di calcolo. Non viene toccato un solo peso dell'encoder: i dodici strati che fanno il vero lavoro di comprensione sono copiati tali e quali. La tabella del vocabolario è quantizzata per tensore, così una riga conservata mantiene il suo valore esatto, che le vicine ci siano o no. E il tokenizzatore prende sempre il frammento più lungo disponibile: togliere solo frammenti irraggiungibili in scrittura latina lascia il testo latino segmentato in modo identico.
Risultato: da 119.547 token a 68.875. Da 178,5 MB a 139,6 MB, circa 100 MB in rete. E l'affermazione non è «quasi identico». Abbiamo fatto girare i due modelli su 77 documenti reali in tutte e sette le lingue: zero differenze nella segmentazione del testo, zero differenze su 2.219 entità rilevate, e una differenza massima in uscita dal modello di 0,0000000000. Non un modello più piccolo che se la cava più o meno allo stesso modo. Lo stesso modello, senza la zavorra.
Arrivarci ci è costato una brutta settimana. Gli identificativi dei token compaiono in tre punti del file del tokenizzatore; ne abbiamo aggiornati due. Tutti i test passavano, il testo si segmentava identico, e il modello restituiva in silenzio risposte diverse su sessanta documenti. La regola che ce ne è rimasta: confrontare l'uscita grezza del modello, mai l'elenco delle entità. Due elenchi di entità possono trovarsi d'accordo per caso.
Due volte abbiamo provato a spingerci oltre
Il vocabolario è ancora un terzo di quel che resta, in buona parte scrittura latina per lingue che non offriamo. Sembravano esserci altri 30 o 40 megabyte a portata di mano. Non è un compromesso. È un precipizio.
Tenere 58.000 dei 68.875 token latini — l'84% — faceva risparmiare 8 MB e perdere il 13% di tutte le rilevazioni. Poi la prova che ha chiuso la discussione: un elenco con i soli token che i nostri documenti di test usano davvero — 22.800 tenuti, 46.000 buttati — ha prodotto una segmentazione identica bit per bit e il 100% di concordanza. Un vocabolario piccolo non costa nulla, dunque. È il token mancante a costare tutto. Non c'è una curva su cui regolarsi, e la ri-segmentazione colpisce più duramente le parole rare, cioè esattamente i nomi propri.
A decidere è stato un numero. I caratteri latini delle lingue in cui non vendiamo — il turco ğ ı, il vietnamita ư ạ ế, il rumeno ă ț, il ceco ř ů, l'ungherese ő, il nordico ø — fanno 4.200 frammenti. 3,2 MB. È l'alfabeto di ogni nome straniero in un contratto europeo: dato personale allo stato puro, nei documenti che più probabilmente lo contengono, per tre megabyte. Se la nostra rilevazione vacilla sul tuo cognome perché il tuo cognome è turco, abbiamo costruito il prodotto sbagliato.
Secondo tentativo: DistilBERT — sei strati invece di dodici, circa 70 MB in rete contro i nostri 100. Poi lo abbiamo misurato su 137 entità verificate a mano. La rilevazione scendeva dal 77,2% al 73,5%: abbastanza poco da convincersi da soli. Ma la media nasconde la forma: il tedesco perdeva 13 punti, l'inglese 9, lo spagnolo 22. E i due modelli concordavano solo sul 76% di quello che trovavano. Non rilevava meno entità. Ne rilevava un insieme diverso, di dimensioni simili. Con «meno» si lavora. Con «diverso» no.
Minuscule
Il modello che distribuiamo si chiama Minuscule. La minuscola carolina è la scrittura normalizzata in tutto l'impero di Carlo Magno nell'VIII secolo: una scrittura latina pulita, volutamente stretta, ed è il motivo per cui un copista di Aquisgrana poteva leggere un manoscritto ricopiato a Tours. Molte lingue, un alfabeto, niente di superfluo. E poi è piccolissima.
68.875 token. 139,6 MB su disco, circa 100 MB trasferiti una volta sola e poi tenuti in cache per sempre. Non un peso dell'encoder modificato rispetto al modello da cui deriva. Si porta dietro la propria scheda di fabbricazione — modello d'origine, impostazioni, dimensioni del vocabolario, impronta dei propri pesi — perché un modello che non sa dire da dove viene non ha niente a che fare con ciò che stai cercando di proteggere. È pubblicato su Hugging Face — pesi, tokenizzatore e scheda di fabbricazione — così i numeri qui sopra puoi verificarli tu invece di crederci sulla parola.
Che cosa comprano cento megabyte
In questo momento, da qualche parte, un assistente legale sta incollando il contratto di un cliente in una finestra di chat. Un'infermiera carica una lettera di dimissioni. Un assistente sociale lascia il fascicolo di una famiglia su un sito di traduzione gratuito. Non sono persone imprudenti. Sono in ritardo. La strada approvata richiede un ticket, una verifica di sicurezza e due settimane, e la scadenza è giovedì.
L'unica versione di «protetto» che vince davvero è quella già aperta. Nessuna installazione, nessun diritto di amministratore, nessuna autorizzazione, nessuna riunione. Quindi una scheda del browser. Quindi un modello che stia in una scheda del browser. Ecco perché delle persone adulte hanno passato una settimana a discutere di 3,2 megabyte di segni diacritici turchi.
Lavoro ingrato, invisibile per costruzione. Ma finisce con una persona davanti a un portatile, in un ufficio che non vedrai mai, che consegna in tempo e il cui cliente non ha mai visto il proprio nome uscire dalla stanza. Cento megabyte, una volta. Da lì in poi sono tuoi.
Domande frequenti
Togliere vocabolario a un modello ne riduce l'accuratezza?
No, quando il vocabolario tolto è irraggiungibile nelle lingue che offri. Non viene modificato alcun peso dell'encoder e ogni riga conservata è copiata bit per bit, quindi per il testo in alfabeto latino il risultato è numericamente identico all'originale: abbiamo misurato zero differenze su 2.219 entità in 77 documenti. Tagliare nel vocabolario che il modello può raggiungere è tutt'altra faccenda, e lì il peggioramento è netto.
Perché non usare semplicemente un modello più piccolo?
Ci abbiamo provato. Un DistilBERT a sei strati della stessa famiglia pesa circa 70 MB in rete contro i nostri 100, ma otteneva 73,5% contro 77,2% sul nostro insieme verificato, e la media nascondeva 22 punti persi in spagnolo e 13 in tedesco. Inoltre concordava con il modello che distribuiamo solo sul 76% dei suoi risultati: un insieme di entità diverso, non minore. Il nostro confronto con Microsoft Presidio spiega come lo misuriamo.
Un modello di queste dimensioni può davvero girare in una scheda del browser?
Sì, con due avvertenze. Il download avviene una volta sola e resta poi nella cache del dispositivo, e il modello deve comunque essere compilato in una sessione a ogni avvio: da qui la barra di caricamento al primo uso. Tutto il resto è locale, nessuna pagina del tuo documento viene caricata. Perché abbiamo costruito il nostro motore di rilevazione racconta il resto della catena.
Quali lingue copre e che fine fanno le altre?
Inglese, francese, tedesco, spagnolo, italiano, olandese e portoghese, più qualsiasi altra lingua in alfabeto latino i cui caratteri sopravvivano nel vocabolario: turco, vietnamita, rumeno, ceco, ungherese e nordico sono stati tenuti apposta, perché nei contratti europei i nomi stranieri compaiono di continuo. Una lingua in una scrittura rimossa, come il giapponese, richiede un proprio pacchetto invece di un unico modello che ingrassa a ogni lingua aggiunta.