Portada del artículo sobre Vellum Sentinel, clasificador Naive Bayes para detección de spam

Cómo funciona Sentinel Verified — clasificador Naive Bayes

ENRead in English
Authorship Responsible for the idea, research, development and voice of this article. The authorship is full over the content and its direction.
Views

Qué es Sentinel Verified

Sentinel Verified es el analizador de contenido de Vellum. Toma el asunto y el cuerpo en texto plano de cada correo recibido y calcula la probabilidad de que un filtro de spam real lo rechace. No usa reglas fijas del tipo “si contiene la palabra ‘gratis’ suma 2 puntos”: usa un clasificador Naive Bayes multinomial entrenado con ejemplos reales de spam y ham. El modelo aprende las frecuencias relativas de cada palabra en cada clase y toma decisiones de forma probabilística. El resultado es una puntuación entre 0 y 1, donde valores cercanos a 1 indican alta probabilidad de que el correo sea clasificado como spam.

Cómo se construye el modelo

El modelo parte de dos conjuntos de datos de entrenamiento: ejemplos de spam y ejemplos de ham. El entrenamiento es fundamentalmente un proceso de conteo. Por cada ejemplo, el algoritmo convierte el texto a minúsculas y extrae tokens de al menos 3 caracteres compuestos exclusivamente de letras y dígitos. Las palabras cortas como “de”, “la” o “un” se descartan automáticamente por no superar la longitud mínima.

Por cada token único dentro de un documento —sin repetirlo si aparece varias veces en el mismo texto— se incrementa el contador de esa palabra en la clase correspondiente. Al finalizar, el modelo almacena cuántos documentos hay por clase y la frecuencia absoluta de cada token en cada clase. El vocabulario es la unión de todos los tokens únicos de ambas clases.

El resultado se serializa como JSON y se incrusta directamente en el binario de Vellum mediante una directiva de embed en tiempo de compilación. Al arrancar la aplicación, el modelo se carga en memoria y queda listo para inferencia sin necesidad de archivos externos ni conexiones a servicios de terceros.

Inferencia: de un correo a una probabilidad

Cuando llega un correo, Sentinel concatena el asunto y el cuerpo en texto plano y ejecuta el siguiente proceso de cinco pasos.

Tokenización

El texto se convierte a minúsculas y se divide en tokens. Solo pasan los tokens de al menos 3 caracteres compuestos exclusivamente de letras o dígitos. El criterio es idéntico al del entrenamiento: un token que el modelo no vio durante el entrenamiento no tiene una frecuencia registrada, pero el suavizado de Laplace garantiza que igualmente contribuya con un valor pequeño en lugar de producir una división por cero o un logaritmo indefinido.

Prior logarítmico

Antes de analizar el contenido, el clasificador parte de una estimación inicial sobre cuán probable es que cualquier correo sea spam o ham, basada en la distribución del conjunto de entrenamiento:

logPrior(ham)  = log( (docsHam  + 1) / (totalDocs + 2) )
logPrior(spam) = log( (docsSpam + 1) / (totalDocs + 2) )

El +1 en el numerador y el +2 en el denominador son suavizado de Laplace. Sin este ajuste, una clase con cero documentos produciría log(0), que es matemáticamente indefinido. Con el ajuste, incluso una clase sin ejemplos tiene una probabilidad a priori pequeña pero válida.

Verosimilitud por token

Por cada token único del correo, el modelo calcula cuán probable es que esa palabra aparezca en cada clase:

logP(token | clase) = log( (count(token, clase) + 1) / (totalTokens(clase) + VocabSize) )

El +1 en el numerador asegura que un token nunca visto en esa clase no produzca log(0). El VocabSize en el denominador normaliza la distribución considerando el tamaño completo del vocabulario. Este es el mismo principio de suavizado de Laplace aplicado a nivel de palabra en lugar de a nivel de documento.

Puntuación acumulada

La puntuación final de cada clase es la suma del prior y todas las log-probabilidades de los tokens únicos del correo:

score(ham)  = logPrior(ham)  + Σ logP(token | ham)
score(spam) = logPrior(spam) + Σ logP(token | spam)

Trabajar en escala logarítmica tiene una razón práctica: multiplicar muchas probabilidades pequeñas entre sí produce valores tan cercanos a cero que la aritmética de punto flotante los redondea a cero. Sumar logaritmos produce el mismo resultado matemático sin ese problema.

Conversión a probabilidad

Los dos scores se convierten a una probabilidad en [0, 1] mediante softmax con corrección de desbordamiento numérico:

maxScore = max(score(ham), score(spam))
pSpam = exp(score(spam) - maxScore) / (exp(score(ham) - maxScore) + exp(score(spam) - maxScore))

Restar maxScore antes de calcular las exponenciales evita overflow y underflow en aritmética de 64 bits. El resultado es matemáticamente equivalente al softmax estándar pero numéricamente estable independientemente de la magnitud de los scores.

El umbral y los tokens disparadores

La decisión final aplica un umbral de 0.75. Si pSpam >= 0.75, el correo se clasifica como spam. El umbral está calibrado para reducir los falsos positivos en contexto de desarrollo: plantillas con vocabulario técnico no deberían clasificarse como spam por palabras que son neutras fuera del contexto de marketing masivo.

Cuando el clasificador supera el umbral, identifica hasta 5 tokens disparadores: las palabras cuya contribución diferencial a score(spam) sobre score(ham) es mayor. Estos tokens se muestran en la interfaz de Vellum junto con el porcentaje de probabilidad. El desarrollador puede ver con precisión qué parte concreta de su plantilla está activando el clasificador y actuar en consecuencia.

Por qué Naive Bayes

Naive Bayes es el clasificador de referencia para detección de spam desde los trabajos de Paul Graham en 2002. Su supuesto de independencia entre palabras es técnicamente incorrecto —las palabras de un texto no son independientes entre sí— pero produce resultados sólidos en clasificación de correo porque el patrón de vocabulario por clase es lo suficientemente distinto. Su coste computacional es mínimo: una suma de logaritmos por cada token del mensaje.

Por qué este enfoque funciona dentro de Vellum

Un clasificador estadístico embebido en el binario cumple exactamente los requisitos de un servidor de pruebas: opera sin llamadas a servicios externos, sin latencia de red y sin dependencias adicionales. La inferencia es una operación de microsegundos que corre en el mismo proceso que recibe el correo SMTP.

El resultado no pretende replicar los filtros de spam de producción como SpamAssassin o los modelos propietarios de Google. Pretende detectar los patrones más comunes que hacen fallar a las plantillas de correo durante el desarrollo, en el momento en que aún es barato y rápido corregirlos. Ese es el objetivo de Sentinel Verified: que el problema aparezca en el entorno donde no tiene costo resolverlo.

Frequently asked questions

Q ¿Por qué Sentinel usa Naive Bayes en vez de una red neuronal o un LLM moderno? Proposed by the Noumeno team
A La inferencia de Naive Bayes tarda microsegundos, no milisegundos, corre embebida en el binario sin llamadas a API y no añade dependencias externas. Un modelo neuronal necesitaría infraestructura de inferencia externa, introduciendo latencia de red y un servicio adicional que gestionar. Para dar feedback en tiempo de desarrollo el enfoque estadístico es rápido, autocontenido y suficiente — el objetivo no es replicar los filtros propietarios de Gmail sino detectar los patrones más comunes que rompen las plantillas antes de que lleguen a producción.
Q ¿Se puede actualizar o reentrenar el modelo de detección de spam con datos propios? Proposed by the Noumeno team
A El modelo actual se compila dentro del binario de Vellum en tiempo de build mediante una directiva embed de Go. Reemplazarlo requiere publicar una nueva imagen. Los datos de entrenamiento, la lógica de tokenización y los parámetros del clasificador están documentados en el código fuente para quien quiera evaluarlos, proponer mejoras o reentrenar con un conjunto de datos diferente.
Q ¿Un score de Sentinel por debajo del umbral significa que el correo llegará al inbox? Proposed by the Noumeno team
A No. Sentinel Verified usa un modelo estadístico entrenado con patrones generales de spam — no los algoritmos propietarios de Gmail, Outlook o Yahoo. Un score inferior a 0.75 significa que el correo no activa patrones de vocabulario de spam conocidos, pero la entregabilidad real depende de la reputación del dominio, la configuración de SPF, DKIM y DMARC, el volumen de envío, el historial de engagement y decenas de señales adicionales que un servidor de desarrollo no puede controlar.