Revolut maneja más de 40 millones de cuentas. Los usuarios, diariamente, enfrentan problemas como transacciones bloqueadas y tarjetas extraviadas. En 2024, la fintech británica implementó chatbots con Rasa Open Source para gestionar el 65% de sus consultas primarias. Dos años después, estos bots procesan más de 2 millones de tickets al mes. Sin embargo, lo sorprendente no es la cantidad de consultas resueltas automáticamente, sino cuántas veces el chatbot debe ser "recalibrado" debido a patrones erróneos aprendidos de usuarios frustrados.
Photo: Igor Omilaev on Unsplash
La mayoría de los artículos sobre chatbots destacan métricas como el tiempo de respuesta. Este tutorial revelará la arquitectura que Revolut diseñó con Rasa, abordará problemas operativos poco documentados y explicará cómo montar un sistema similar sin incurrir en deuda técnica. Lo curioso es que un modelo de NLU, al entrenarse con millones de conversaciones reales, también absorbe toxicidad y ambigüedades de usuarios que detestan hablar con bots.
Por qué Revolut eligió Rasa en lugar de Dialogflow o Lex
En 2023, Revolut consideró tres plataformas: Google Dialogflow CX, Amazon Lex v2 y Rasa Open Source. Dialogflow ofrecía integraciones nativas con GCP y análisis de sentimiento incorporado. Lex permitía un deploy instantáneo en AWS con escalado automático. Sin embargo, Rasa, aunque no prometía estas características, ofrecía un control total sobre el pipeline de NLU. Ojo, sin el riesgo de vendor lock-in.
Revolut maneja información financiera sensible en 38 países. Cada conversación puede manejar números de cuenta o detalles legales. Enviar esos datos a APIs externas de Google o Amazon implicaba un riesgo regulatorio que el equipo no quería tomar. Con Rasa, los modelos pueden entrenarse localmente y la infraestructura ser alojada en servidores propios, asegurando auditoría total del bot sin depender de black boxes de terceros.
La customización del pipeline de NLU fue otra razón crucial. Revolut necesitaba reconocer intenciones en varios idiomas y entender jerga financiera específica. Dialogflow exigía entrenar intents separados para cada idioma. Con Rasa, es posible compartir features usando transformers multilingües, reduciendo en 40% el tiempo de entrenamiento para nuevos idiomas.
La arquitectura completa: de Rasa Open Source a producción en Kubernetes
Photo: Luke Jones on Unsplash
El stack de Revolut para chatbots incluye:
- Rasa Open Source 3.6 para NLU y gestión de diálogo.
- PostgreSQL 15 como tracker store para guardar conversaciones.
- Redis 7 para sincronización entre réplicas.
- RabbitMQ 3.12 para eventos de diálogo asíncronos.
- Kubernetes 1.28 para orquestación y autoscaling.
- Sentry y Grafana + Prometheus para monitoreo y métricas.
El flujo básico inicia así: un usuario contacta desde la app móvil, el mensaje llega a un API Gateway interno y se direcciona a un pod de Rasa en Kubernetes. Rasa identifica intents y entities, consulta el tracker store en Postgres, ejecuta políticas de diálogo y envía la respuesta al cliente, además de generar un evento a RabbitMQ para análisis.
Tracker Store en Postgres: cada conversación tiene un conversation_id único. Rasa guarda eventos como user_uttered, generando una gran cantidad de eventos mensuales. Para consultas rápidas, el equipo usa particionamiento por fecha en Postgres y archiva mensualmente en Google Cloud Storage.
Autoscaling reactivo: el sistema ajustado por Revolut permite que Kubernetes aumente el número de pods durante picos de tráfico, como los lunes por la mañana. Este mecanismo permite que el cluster escale de 12 a 60 pods en menos de 3 minutos.
El infierno del NLU training: cuando el bot aprende de usuarios enfadados
El modelo de NLU de Rasa se entrena con ejemplos reales. Inicialmente, Revolut usó un dataset curado manualmente. Pero, el bot colapsaba en producción. La realidad es que los usuarios no escriben formalmente. Es más común leer "WTF someone stole my money fix this NOW".
A los tres meses, se descubrió que el 18% de los mensajes tenían un confidence score bajo. La solución fue implementar active learning supervisado. Cuando hay baja confianza, el bot escala a un agente humano y almacena el mensaje para revisión. Luego, esos ejemplos se añaden al dataset de reentrenamiento.
El problema de la contaminación de datos: en 2025, el bot malinterpretó mensajes neutrales como urgentes. Un análisis reveló que "help" se asociaba erróneamente con urgencia. Se rebalanceó el dataset y se añadieron ejemplos negativos explícitos.
Usuarios agresivos recibían atención más rápida. Esto llevó a ajustar las políticas de diálogo para que el sentiment no priorizara directamente las consultas.
Políticas de diálogo: cuando las reglas no son suficientes
Rasa usa rules (determinísticas) y machine learning policies (predictivas). Las rules son útiles, pero pueden fallar cuando el usuario cambia de tema. Para esos casos, Revolut emplea TED Policy, un modelo basado en transformers que maneja cambios de contexto.
Una implementación reciente es la meta-policy de cambio de contexto. Si el usuario menciona un tema distinto, el bot pregunta si desea pausar la consulta actual. Esta simple pregunta redujo las escalaciones por frustración en un 22%.
Custom actions: cuando el bot necesita APIs externas y no solo respuestas prefabricadas
Rasa ejecuta custom actions para interactuar con sistemas externos. En Revolut, eso incluye verificar transacciones, congelar tarjetas y ejecutar verificaciones KYC. Cada acción es un servicio independiente, manejado vía HTTP.
El desafío es el manejo de errores. Si una API externa falla, el bot escala automáticamente al usuario a un agente humano. La implementación de un circuit breaker permite manejar eficientemente estos errores.
Métricas que importan (y las que engañan)
Revolut mide el éxito de su chatbot con:
Deflection rate: en 2026, está en 68%. Pero cuidado, una conversación "completada" no siempre significa satisfacción. Puede ser simplemente que el usuario se rindió.
Containment rate ajustado por satisfacción: solo cuenta como éxito si el usuario responde "sí" a una pregunta de satisfacción post-conversación. Así, el containment real es 54%.
Confidence score promedio: es 0.78. Sin embargo, el percentil 10 es 0.52, donde el bot adivina. Ese 10% representa el 34% de las escalaciones.
Turn count por conversación: las conversaciones efectivas promedian 6 turnos. Si superan 10 turnos sin resolución, la probabilidad de escalación sube al 76%.
Latency end-to-end: P50 es 420ms, pero el P99 es problemático, especialmente cuando Rasa consulta múltiples APIs externas.
Lecciones operativas que nadie te cuenta en la documentación de Rasa
1. El modelo necesita reentrenamiento continuo: Revolut reentrena semanalmente su modelo de NLU con nuevos ejemplos. Sin reentrenamiento, la precisión cae rápidamente.
2. Los slots son tu sistema nervioso: almacenan el contexto de la conversación. La validación estricta es crucial para evitar problemas.
3. Las reglas son frágiles: más de 200 reglas y el sistema se vuelve inmanejable. Revolut migró el 40% de sus rules a patrones manejados por TED Policy.
4. El action server es tu single point of failure: Revolut corre múltiples réplicas con balance de carga y pruebas de salud para evitar caídas.
5. La escalación a humanos debe ser elegante: el agente recibe un resumen completo de la conversación, evitando empezar de cero.
Conclusión: la IA conversacional es ops intensivo, no solo NLU
Implementar Rasa a escala no es solo entrenar un modelo de NLU. Es crear una arquitectura sólida que soporte millones de conversaciones, construir pipelines de reentrenamiento continuo y depurar políticas de diálogo inesperadas. Revolut procesa 2 millones de tickets mensuales con este sistema, respaldado por un equipo dedicado a su mantenimiento. Si estás considerando construir un chatbot con Rasa, pregúntate: ¿tienes el equipo para mantenerlo? ¿O solo deseas que funcione y luego olvidarlo?