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.
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.