OpenAI Privacy Filter: detecta PII sin enviar datos a la nube
Detecta nombres, emails y contraseñas en texto sin enviar datos a la nube. Aprende cómo funciona y cómo usarlo desde Python.
Colaboradores: Manu Rubio, Ivan Garcia Villar
Imagina que construyes una aplicación que analiza contratos de trabajo. El usuario sube el PDF, tu código extrae el texto y se lo manda a un modelo de lenguaje para que encuentre las cláusulas importantes. El problema: ese contrato tiene el nombre completo del empleado, su dirección y su número de cuenta. Mandarlo sin limpiar antes es una mala práctica que puede meterte en un lío legal.
El OpenAI Privacy Filter es un modelo diseñado exactamente para ese problema: detectar y enmascarar información personal en texto, de forma local, sin enviar los datos a ningún servidor externo. Lo publicaron el 22 de abril de 2026 con licencia Apache 2.0.
Para seguir este post necesitas: haber usado Python antes y saber instalar librerías con pip. No hace falta experiencia previa con modelos de inteligencia artificial.
¿Qué es PII y por qué tu app necesita filtrarlo?
PII son las siglas de Personally Identifiable Information, que en español es Información Personal Identificable. Es cualquier dato que permite identificar a una persona real: su nombre, su teléfono, su correo electrónico, su contraseña.
Piénsalo así: cuando rellenas un formulario del banco online y te pide nombre, DNI y dirección, eso es PII. Si esos datos aparecen en un texto que vas a procesar con un LLM (un modelo de lenguaje, como ChatGPT o Claude), tienes que decidir qué haces con ellos antes de mandárselos.
La razón es doble. Enviar datos personales de tus usuarios a servicios externos puede generar problemas legales en muchos contextos, especialmente en Europa. Y los modelos externos pueden usar esos datos de formas que no controlas. Filtrar antes de enviar es la solución más limpia.
Qué detecta exactamente el filtro
El modelo reconoce ocho categorías concretas de datos sensibles:
| Categoría | Qué detecta | Ejemplo |
|---|---|---|
private_person | Nombres de personas | ”Ana García” |
private_address | Direcciones físicas | ”Calle Mayor 23, Madrid” |
private_phone | Números de teléfono | ”+34 612 345 678” |
private_email | Correos electrónicos | ”ana@gmail.com” |
account_number | Números de cuenta o tarjeta | ”ES12 1234 5678…” |
private_url | URLs privadas o personales | ”https://drive.google.com/file/d/abc123” |
private_date | Fechas asociadas a personas | ”1990-01-02” |
secret | Contraseñas y claves | ”mi_contraseña_123” |
Solo esas ocho. Si necesitas detectar algo diferente, como matrículas de coches o números de expediente interno, tendrías que hacer fine-tuning: entrenar el modelo con ejemplos etiquetados propios. Para esos casos concretos con formato fijo, una expresión regular sencilla suele ser suficiente y mucho más rápida.
Cómo funciona: leer y subrayar, no generar
Aquí hay una diferencia importante con modelos como ChatGPT. Los LLMs generativos escriben texto nuevo palabra por palabra, como si estuvieran dictando en voz alta. El Privacy Filter no genera nada: lee el texto completo de una sola vez y marca qué partes son datos sensibles.
Es como si le dieras a alguien un documento y un rotulador. No está escribiendo nada nuevo. Solo marca lo que ya está ahí.
Para hacer ese marcado con precisión, el modelo usa dos técnicas que vale la pena entender con una frase cada una:
BIOES es un sistema de etiquetas que indica exactamente dónde empieza y termina un dato sensible. Si el modelo detecta “Ana García” como nombre, no dice simplemente “esto es un nombre”. Dice: “Ana” es el comienzo (Begin), “García” es el final (End). Si el nombre tuviera tres o más palabras, como “Ana María García”, “Ana” sería B (Begin), “María” sería I (Inside) y “García” sería E (End). Si fuera solo “Ana”, usaría la etiqueta única (Single). Todo lo demás es fondo (Outside). Esto evita detectar solo “Ana” y dejar “García” sin marcar.
Viterbi es un algoritmo que evalúa si la secuencia de etiquetas tiene coherencia global, no solo pieza por pieza. Funciona como un rompecabezas: si “Ana” se marcó como comienzo de nombre, lo siguiente tiene que ser el interior o el final del mismo, no otro comienzo de algo diferente. El algoritmo revisa la frase entera antes de confirmar las etiquetas, lo que evita que detecte solo la mitad de un correo electrónico y deje la otra mitad visible.
Cómo usarlo en tu proyecto
Primero instala la librería de Hugging Face:
# Hugging Face Transformers es la librería que carga el modelo
npm install @huggingface/transformers
Luego, tres líneas de TypeScript son suficientes para empezar:
// Cargamos el modelo desde Hugging Face
// La primera vez descarga los pesos del modelo: ten paciencia
const detector = await pipeline(
"token-classification", // tarea: etiquetar partes del texto
"openai/privacy-filter", // nombre del modelo en Hugging Face
{ aggregation_strategy: "simple" } // agrupa subpalabras en entidades completas
);
// Pasamos el texto que queremos analizar
const resultado = await detector("Mi nombre es Ana García y mi email es ana@gmail.com");
// resultado es una lista con los fragmentos detectados y su categoría
console.log(resultado);
// Salida esperada:
//[
// {'entity_group': 'private_person', 'score': 0.998, 'word': 'Ana García', 'start': 13, 'end': 23},
// {'entity_group': 'private_email', 'score': 0.995, 'word': 'ana@gmail.com', 'start': 37, 'end': 50}
// ]
El modelo no solo detecta los fragmentos y su categoría (como private_person o private_email), sino que te facilita el trabajo devolviendo directamente el texto ya anonimizado en la propiedad redacted_text. De esta forma, las partes sensibles se sustituyen por sus etiquetas correspondientes automáticamente, y te ahorras tener que calcular posiciones o reemplazar cadenas manualmente antes de enviar el texto a otro servicio.”
console.log(resultado.redacted_text);
// "<PRIVATE_PERSON> y mi email es <PRIVATE_EMAIL>"
Una ventaja práctica: el modelo tiene una ventana de contexto de 128.000 tokens. La ventana de contexto es la cantidad máxima de texto que puede leer de una sola vez, como la memoria de trabajo de una persona. Para hacerte una idea, un token es aproximadamente una palabra corta o una sílaba. Con esa capacidad puedes procesar un contrato de varias páginas completo sin tener que cortarlo en trozos. Sin embargo, transformers aplica truncación por defecto en muchos casos; si procesas documentos largos, pasa truncation=True o usa max_length explícitamente para evitar que el modelo ignore el final del texto sin avisar. Para más detalle sobre cómo gestionar esto bien, el post sobre ventana de contexto y buenas prácticas lo explica en profundidad.
El modelo funciona completamente en local una vez descargado. Si necesitas velocidad extra, acepta parámetro device="cuda" para correr en GPU. Sin GPU funciona igualmente, aunque más lento. En un portátil moderno espera entre 10 y 30 segundos por texto.
Errores comunes al usarlo
Tratarlo como una garantía legal de anonimización
El Privacy Filter es una herramienta de ayuda, no un certificado de cumplimiento. Tiene falsos negativos: puede pasar por alto un nombre poco común, un formato de fecha inusual o una contraseña que parezca texto corriente. Si tu aplicación trabaja con datos de altísimo riesgo como historiales médicos o datos judiciales, necesitas capas adicionales. El concepto de guardarrailes en agentes IA aplica aquí: un solo filtro nunca es suficiente para datos críticos.
Esperar el mismo rendimiento en todos los idiomas
El modelo se entrenó principalmente con texto en inglés. “John Smith” lo detecta casi siempre. “İbrahim Çelik” o “Xiao-Wei Chen” pueden pasar desapercibidos. En contratos en español, los apellidos compuestos son uno de los puntos donde más falsos negativos he visto: el modelo los trata como palabras independientes y a veces solo marca el primero. La model card en Hugging Face incluye métricas de precisión por categoría para que puedas evaluar si los números encajan con tu caso de uso antes de comprometerte. Haz pruebas con muestras reales antes de asumir que funciona correctamente con tus datos.
Mandarlo texto sin contexto suficiente
Si mandas solo “García, 34 años”, el modelo no sabe si “García” es el apellido de una persona real o el nombre de un personaje histórico en un artículo. El contexto cambia la decisión. Siempre que puedas, manda oraciones completas.
Asumir que detecta cualquier dato sensible
Solo conoce sus ocho categorías fijas. Un número de matrícula, un código de empleado interno o un identificador de expediente no entran en ninguna de ellas. El modelo los ignorará sin avisar.
Checklist de implementación
-
El modelo corre localmente o en tu propio servidor, no en servicios externos
-
Has probado el modelo con una muestra representativa de tus datos reales antes de desplegarlo
-
Tienes claro que los falsos negativos son posibles y has añadido revisión adicional para casos críticos
-
Conoces las limitaciones con nombres y formatos no anglosajones si tu app procesa esos textos
-
Has decidido qué reemplaza a los tokens detectados:
[NOMBRE], un ID anónimo, o eliminación directa -
La licencia Apache 2.0 es compatible con el uso que planeas hacer del modelo
Preguntas Frecuentes
¿El modelo envía mis datos a OpenAI?
No. El Privacy Filter se ejecuta completamente en local. Una vez que descargas los pesos del modelo desde Hugging Face, todo el procesamiento ocurre en tu máquina. Ningún dato sale de tu servidor. Esta es precisamente la razón por la que existe: para filtrar PII sin depender de servicios de terceros. Esto aplica siempre que el entorno de ejecución sea tu propio servidor o máquina; si usas entornos cloud compartidos, la privacidad depende también de la seguridad de esa infraestructura.
¿Funciona bien en español?
El modelo fue entrenado principalmente con datos en inglés, así que su rendimiento en español es menor, especialmente con nombres propios y formatos que no son habituales en el mundo anglosajón. Para texto en español conviene hacer pruebas con tus propios datos antes de desplegarlo en producción. Si necesitas detección fiable en español, considera combinarlo con reglas adicionales o explorar el fine-tuning con datos etiquetados en tu idioma.
¿Qué son los 50M parámetros activos si el modelo tiene 1.5B en total?
El modelo usa una arquitectura llamada mixture-of-experts. Es como un equipo de 1.500 personas donde solo 50 participan en cada tarea: no convocas a todos para cada consulta. El resultado es que el modelo se comporta como uno de 1.5B parámetros en cuanto a calidad, pero el coste de cada cálculo se parece más al de un modelo de 50M. Por eso puede correr en hardware modesto, incluso en un portátil.
¿Puedo analizar un PDF directamente?
No. El modelo trabaja con texto plano. Un PDF es un archivo binario con formato propio; antes de pasarlo al detector tienes que extraer el contenido. Librerías como pdfplumber o PyMuPDF hacen eso en pocas líneas: extraes el texto, limpias espacios y saltos de página raros, y entonces llamas al detector con el string resultante.
¿Puedo añadir categorías nuevas que no están en las ocho por defecto?
Sí, pero requiere fine-tuning: entrenar el modelo con ejemplos etiquetados tuyos. OpenAI publicó el código de entrenamiento junto con el modelo, así que técnicamente es posible. Para patrones con formato fijo como “EXP-12345”, una expresión regular sencilla es suficiente, más rápida y más fácil de mantener.