El ordenador más limitado que la mayoría de la gente usará jamás es ese en el que está leyendo esto. No el teléfono. La pestaña.
Una pestaña del navegador no tiene instalador, ni una tarjeta gráfica con la que contar, dispone de unos cientos de megabytes de memoria antes de que la cosa se ponga fea, y tiene delante a un usuario cuya paciencia ante una barra de progreso se mide en segundos. Es el peor sitio de la informática moderna para meter una red neuronal. Nosotros metimos la nuestra ahí a propósito.
Por qué el modelo tiene que estar en la pestaña
La anonimización como servicio es una contradicción. Para usarla, usted sube el documento confidencial a la empresa que promete protegerlo. No ha reducido su exposición. La ha movido de sitio, y ha añadido un proveedor.
Por eso nuestra detección se ejecuta en su navegador: la lectura del PDF, el reconocimiento de caracteres en las páginas escaneadas y el modelo que deduce que Margarida Rodrigues es una persona y que 1249-300 Lisboa es una dirección, en siete idiomas, sin que nadie le diga cuál. Lo que obliga al modelo a caber en una pestaña. La primera versión no cabía.
El impuesto del alfabeto
Nuestro detector nace de un BERT multilingüe afinado para localizar nombres, organizaciones y lugares. Buen modelo. También carga con un vocabulario de 119.547 tokens que abarca 104 idiomas.
Nosotros ofrecemos siete: inglés, francés, alemán, español, italiano, neerlandés y portugués. Todos en alfabeto latino.
A 768 dimensiones, esa tabla de vocabulario ocupa unos 92 MB de un archivo de 178,5 MB: más de la mitad del modelo, y en torno al 97 % de todo lo que descarga quien entra por primera vez. Dentro hay devanagari, cirílico, hangul, tailandés, armenio, hebreo, árabe, kana y trece mil ideogramas. Descargado por todos los usuarios. Usado por ninguno.
Llamémoslo el impuesto del alfabeto. Cada visitante paga por cargar con 104 idiomas para leer uno. Y aquí viene la parte de la que estamos menos orgullosos: habíamos escrito la herramienta que lo arregla y demostrado que no degradaba nada, y luego la dejamos como un comando opcional que no ejecutaba nadie. Un paso de compilación voluntario es un paso de compilación que no ocurre en ninguna parte.
Borrar filas, no comprimir fotos
La respuesta habitual es la destilación: entrenar a un modelo alumno pequeño para que imite a uno maestro grande. Funciona, y cambia precisión por tamaño, un canje que no se hace a la ligera en una herramienta cuyo único oficio es no dejar pasar nada. Así que no lo hicimos.
Lo que hicimos se parece más a borrar filas inservibles de una hoja de cálculo. No se toca ni un peso del codificador: las doce capas que hacen el trabajo real de comprensión se copian tal cual. La tabla de vocabulario está cuantizada por tensor, de modo que una fila conservada mantiene su valor exacto estén o no sus vecinas. Y el tokenizador siempre se queda con el fragmento más largo disponible: al retirar solo fragmentos inalcanzables en escritura latina, el texto latino se segmenta igual que antes.
Resultado: de 119.547 tokens a 68.875. De 178,5 MB a 139,6 MB, unos 100 MB por la red. Y la afirmación no es «casi idéntico». Pasamos los dos modelos por 77 documentos reales en los siete idiomas: cero diferencias en la segmentación del texto, cero diferencias en 2.219 entidades detectadas y una diferencia máxima en la salida del modelo de 0,0000000000. No es un modelo más pequeño que rinde más o menos igual. Es el mismo modelo sin el lastre.
Llegar hasta ahí nos costó una mala semana. Los identificadores de token aparecen en tres sitios del archivo del tokenizador; actualizamos dos. Todas las pruebas pasaban, el texto se segmentaba igual, y el modelo devolvía calladamente respuestas distintas en sesenta documentos. La regla que nos quedó: comparar la salida bruta del modelo, nunca la lista de entidades. Dos listas de entidades pueden coincidir por casualidad.
Dos veces intentamos ir más lejos
El vocabulario sigue siendo un tercio de lo que queda, buena parte de él escritura latina para idiomas que no ofrecemos. Parecía haber otros 30 o 40 megabytes a mano. No es un equilibrio entre dos cosas. Es un precipicio.
Conservar 58.000 de los 68.875 tokens latinos — el 84 % — ahorraba 8 MB y costaba el 13 % de todas las detecciones. Luego llegó la prueba que zanjó el debate: una lista con solo los tokens que nuestros documentos de test usan de verdad — 22.800 conservados, 46.000 descartados — produjo una segmentación idéntica bit a bit y un 100 % de coincidencia. Un vocabulario pequeño no cuesta nada. Es el token ausente el que lo cuesta todo. No hay curva sobre la que ajustar, y la resegmentación golpea con más fuerza en las palabras raras, que es exactamente lo que son los nombres propios.
Un número lo decidió. Los caracteres latinos de los idiomas a los que no vendemos — la ğ ı turca, la ư ạ ế vietnamita, la ă ț rumana, la ř ů checa, la ő húngara, la ø nórdica — suman 4.200 fragmentos. 3,2 MB. Ese es el alfabeto de todo nombre extranjero en un contrato europeo: datos personales en estado puro, en los documentos con más probabilidades de contenerlos, por tres megabytes. Si nuestra detección flaquea con su apellido porque su apellido es turco, hemos construido el producto equivocado.
Segundo intento: DistilBERT — seis capas en lugar de doce, unos 70 MB por la red frente a nuestros 100. Después lo medimos contra 137 entidades revisadas a mano. La detección bajaba del 77,2 % al 73,5 %: lo bastante poco como para autoconvencerse. Pero la media esconde la forma: el alemán perdía 13 puntos, el inglés 9, el español 22. Y los dos modelos solo coincidían en el 76 % de lo que encontraban. No detectaba menos entidades. Detectaba un conjunto distinto de tamaño parecido. Con «menos» se puede trabajar. Con «distinto» no.
Minuscule
El modelo que enviamos se llama Minuscule. La minúscula carolina fue la escritura normalizada en todo el imperio de Carlomagno en el siglo VIII: una escritura latina limpia, deliberadamente estrecha, y por eso un copista de Aquisgrán podía leer un manuscrito copiado en Tours. Muchas lenguas, un alfabeto, nada de más. Y además, es diminuta.
68.875 tokens. 139,6 MB en disco, unos 100 MB transferidos una sola vez y guardados en caché para siempre. Ni un peso del codificador alterado respecto al modelo del que deriva. Lleva encima su propia ficha de fabricación — modelo de origen, ajustes, tamaños de vocabulario y la huella de sus propios pesos — porque un modelo que no sabe decir de dónde viene no tiene nada que hacer cerca de lo que usted intenta proteger. Está publicado en Hugging Face — pesos, tokenizador y ficha de fabricación — para que las cifras de arriba las compruebe usted en vez de creernos.
Para qué sirven cien megabytes
Ahora mismo, en algún sitio, un auxiliar jurídico está pegando el contrato de un cliente en una ventana de chat. Una enfermera sube un informe de alta. Un trabajador social deja el expediente de una familia en una web de traducción gratuita. No son imprudentes. Van con retraso. La vía aprobada exige un ticket, una revisión de seguridad y dos semanas, y el plazo vence el jueves.
La única versión de «protegido» que gana alguna vez es la que ya está abierta. Sin instalación, sin permisos de administrador, sin autorización, sin reunión. Es decir, una pestaña del navegador. Es decir, un modelo que quepa en una pestaña del navegador. Por eso hubo personas adultas hechas y derechas discutiendo una semana entera sobre 3,2 megabytes de diacríticos turcos.
Trabajo ingrato, invisible por diseño. Pero termina con una persona ante un portátil, en una oficina que usted no verá nunca, entregando a tiempo, y con el nombre de su cliente sin haber salido nunca de la habitación. Cien megabytes, una vez. A partir de ahí, son suyos.
Preguntas frecuentes
¿Quitar vocabulario a un modelo reduce su precisión?
No, cuando el vocabulario retirado es inalcanzable en los idiomas que usted ofrece. No se modifica ningún peso del codificador y cada fila conservada se copia bit a bit, así que para texto en alfabeto latino el resultado es numéricamente idéntico al original: medimos cero diferencias en 2.219 entidades repartidas por 77 documentos. Recortar vocabulario que el modelo sí puede alcanzar es otra cosa muy distinta, y ahí la degradación es brusca.
¿Por qué no usar sencillamente un modelo más pequeño?
Lo intentamos. Un DistilBERT de seis capas de la misma familia ocupa unos 70 MB en red frente a nuestros 100, pero sacó un 73,5 % contra un 77,2 % en nuestro conjunto revisado, y la media escondía 22 puntos perdidos en español y 13 en alemán. Además solo coincidía con el modelo que enviamos en el 76 % de sus hallazgos: un conjunto de entidades distinto, no uno menor. Nuestra comparativa frente a Microsoft Presidio explica cómo lo medimos.
¿De verdad puede ejecutarse un modelo así en una pestaña del navegador?
Sí, con dos salvedades. La descarga ocurre una vez y luego queda en la caché de su dispositivo, y el modelo aún debe compilarse en una sesión en cada arranque, que es la razón de la barra de carga la primera vez. Todo lo demás es local: no se sube ninguna página de su documento. Por qué construimos nuestro propio motor de detección cubre el resto de la cadena.
¿Qué idiomas cubre y qué pasa con los demás?
Inglés, francés, alemán, español, italiano, neerlandés y portugués, más cualquier otro idioma en alfabeto latino cuyos caracteres sigan en el vocabulario: el turco, el vietnamita, el rumano, el checo, el húngaro y las lenguas nórdicas se conservaron a propósito, porque los nombres extranjeros aparecen sin parar en los contratos europeos. Un idioma en una escritura retirada, como el japonés, necesita su propio paquete de modelo en lugar de un único modelo que engorde con cada idioma añadido.