most read
Building Stories
Modo Rua: Redefiniendo el desarrollo de aplicaciones mediante iteración centrada en el usuario Ago 23
Building Stories
NuStories: Adaptación de productos para clientes fanáticos en varios países Oct 30
Culture & Values
Cómo los valores y la cultura de Nu dan forma a los productos que creamos Ago 7
Careers
We are building diverse teams with the most creative and innovative professionals for each position we open.



Escrito por: Ricardo Ocampo, Carlos Pegueros y Gabriel Ferreira
En Nu, tenemos una cultura centrada en el cliente, donde buscamos brindarles una experiencia placentera en cada uno de los pasos de su viaje con nosotros. Cada aspecto de nuestros productos está pensado para ser lo más simple y directo posible, con el objetivo de empoderar a los clientes y hacer que nos amen fanáticamente 💜. Como era de esperar, nos tomamos muy en serio el servicio de atención al cliente: tener un servicio de atención al cliente increíble es uno de los pilares de Nu y ya nos ha valido varios premios.
Cuando hablamos de Servicios al Cliente, existen numerosos sistemas que deben funcionar detrás de escena para brindar la fantástica experiencia que nuestros clientes merecen y esperan.
¿Tienes curiosidad acerca de estos sistemas y del desafío que supone aplicarlos en nuevas geografías? ¡Sigue leyendo este artículo!
Enrutamiento de boletos
Actualmente, Nu cuenta con tres canales principales donde los clientes pueden contactarnos: teléfono, correo electrónico y chat. Cada vez que un cliente se comunica con nosotros a través de cualquiera de esos canales, tenemos la tarea de dirigirlo al equipo más adecuado para responder su pregunta. A este proceso lo llamamos «enrutamiento».
Un buen ruteo es muy importante ya que nos permite brindar un mejor servicio a los clientes: son atendidos por personas especializadas en el tema de su interés. También reciben un servicio más rápido y no tienen que esperar mientras se les transfiere (lo que puede resultar muy molesto). En general, cuando este proceso funciona bien, tenemos un servicio más rápido y una mayor satisfacción del cliente.
Si quieres profundizar en cómo funciona este sistema en Nu, no te pierdas este otro artículo.
Check our job opportunies
Respuestas automáticas
Cada vez que los clientes se comunican con nosotros por chat y correo electrónico, queremos poder brindar respuestas rápidas y reflexivas a preguntas simples y comunes. Esto nos ayuda a garantizar que los clientes no tengan que esperar mucho para resolver sus dudas. Activamos este tipo de mensaje cuando nuestros sistemas evalúan que un mensaje personalizado y predefinido podría ser suficiente para aclarar el problema en cuestión. Nuestro objetivo, una vez más, es siempre la satisfacción del cliente: queremos resolver sus problemas por encima de cualquier cosa. Por eso no ofrecemos ninguna fricción en caso de que el cliente quiera hablar con un agente.
Los dos sistemas mencionados (Enrutamiento y Respuesta Automática) funcionan con modelos de Aprendizaje Automático (ML). Los modelos reciben entradas de los clientes (es decir, lo que escribieron en el chat o en el cuerpo del correo electrónico) y devuelven una clasificación de temas (que identifica el tema del que está hablando el cliente). Dicha salida es utilizada por nuestros sistemas para decidir si debemos enviar una respuesta automática o dirigir al cliente a hablar con un agente.
Complejidad global
Actualmente, Nu opera en Brasil, Colombia y México y tiene más de 70 millones de clientes. Cuando hablamos de internacionalización de dichos sistemas para diferentes países, los sistemas de toma de decisiones y los microservicios suelen ser más sencillos de adaptar y reutilizar. Sin embargo, los Modelos de Aprendizaje Automático pueden convertirse en un cuello de botella y un desafío, ya que no es fácil reutilizar el modelo creado en un país directamente en otro.
Esta dificultad para reutilizar modelos se debe principalmente a:
Durante el resto de este artículo explicaremos con más detalle el problema de reutilización de los modelos de Aprendizaje Automático, cómo afecta la escalabilidad y cómo estamos resolviendo este problema en Nu.
Enfrentando problemas de escalabilidad
Al principio, el equipo se centró en iteraciones rápidas y adquirió cierta deuda técnica a lo largo del camino. Por lo tanto, para cada una de nuestras tareas posteriores (enrutamiento de tickets y respuesta automática de tickets) y canales (correo electrónico, chat, teléfono), se implementó un modelo con su propio código.
Tener diferentes implementaciones del mismo problema provocó problemas de escalabilidad que afectaron no solo al mantenimiento del código, sino también a la redundancia de la fuerza laboral. En cuanto a cada tarea y canal downstream teníamos un modelo diferente, se nos exigió asignar más recursos humanos a cada modelo a medida que nos estábamos expandiendo a México y Colombia.
Pero no todo estaba perdido, porque Nubank reconoce el valor que aportan los MLOps a la organización. Cuando empezamos a abordar los problemas de escalabilidad, ya existía un marco llamado Sheep. El marco maneja el ciclo de vida del desarrollo de un modelo, es independiente del modelo y proporciona las herramientas necesarias para entrenar e implementar modelos en nuestros entornos.
El marco nos ha permitido realizar muchos experimentos y adoptar la naturaleza de iteración rápida de la ciencia de datos.
En el momento que iniciamos operaciones en México, el equipo de experiencia del cliente de Brasil ya contaba con alrededor de 6 modelos independientes para abordar el enrutamiento de tickets y la respuesta automática para cada uno de los tres canales. Además de eso, seguimos el mismo patrón y agregamos otros 2 en México (enrutamiento de chat y respuesta automática). Después de implementar dichos modelos, comenzamos a experimentar algunos problemas generados por la duplicación de código. Por ejemplo, si encontrábamos un error en el modelo de enrutamiento de tickets, teníamos que corregirlo también en el modelo de respuesta automática. Pero no solo eso, a veces un error no se solucionaba en ambas bases de código y comenzaban a divergir. Esto último hacía muy difícil su mantenimiento.
Además de eso, la propagación del código fue alarmante. El preprocesamiento, el entrenamiento, la inferencia e incluso las pruebas unitarias fueron casi idénticas. Las únicas diferencias fueron el objetivo y el preprocesamiento. El proceso de depuración llevó mucho tiempo porque, aunque los modelos resolvían problemas similares, cada uno de los miembros que los implementó añadió su propio sabor especial. Las convenciones de nomenclatura, la definición de funciones, su alcance e implementación fueron diferentes entre los modelos. Esto hizo que incluso las solicitudes de extracción fueran muy difíciles de realizar.
Un avance rápido hasta el día de hoy parece que asumir que los modelos son completamente independientes entre sí, como lo era en la concepción original de Sheep, no es suficiente. Por otro lado, es beneficioso pensar en una capa intermedia de abstracción que convierta no sólo el código y la estructura de los modelos, sino todos los dominios en cajas negras.
¿Cómo solucionamos esto?
El problema podría generalizarse como una clasificación de texto que se aplica a diferentes dominios o tareas posteriores. Por ejemplo, (1) para el enrutamiento de tickets, la entrada es la descripción que hace el cliente del problema que enfrenta (texto) y la salida es el equipo especializado que puede ayudarlo. (2) para la respuesta automática del ticket, la entrada es la misma y la salida es la respuesta que intenta resolver su pregunta.
Con todas estas consideraciones, decidimos abordar este problema centrándonos en los 4 principios clave de cómo construimos modelos de Aprendizaje Automático en Nubank, además de 2 nuevas incorporaciones:
Entonces, decidimos crear una biblioteca para centralizar todo el código común en estos modelos, siguiendo un enfoque basado en la configuración compuesto de pasos y canalizaciones configurables.
¿Por qué basado en configuración?
Porque nos permite exponer modelos a través de un marco de configuración declarativo que tiene dos ventajas: no es necesario probar los archivos de configuración (aparte de asegurarse de que las configuraciones sean válidas) y cuanto menos código expongamos a nuestros usuarios, menos espacio para errores dejamos.
¿Por qué pasos y canalizaciones?
Porque los modelos de aprendizaje automático pueden entenderse bien como una serie de operaciones (también conocidas como pasos) que se encadenan en canales que conforman un modelo. Este enfoque tiene dos limitaciones:
Junto con el requisito de hacer que la biblioteca funcione bien con nuestra infraestructura actual, la API declarativa se creó sobre pydantic (un marco que proporciona validación de datos y administración de configuraciones mediante anotaciones tipo Python) para aprovechar tres beneficios principales que lo convierten en un puente perfecto entre nuestra filosofía y Sheep:
Con estas 3 ideas en mente, puedes imaginarte la biblioteca como un marco de abstracción para encerrar los canales de Aprendizaje (la abstracción para los modelos que usamos en Nubank) en configuraciones serializables JSON inmutables que brindan integridad, en el sentido de que son suficientes para crear instancias de un modelo.
En la práctica, estos pipelines serían las cajas negras que contienen el conocimiento de dominio de los modelos de Excelencia del Cliente y pueden entenderse como fábricas serializables de canales de Aprendizaje. Como estas fábricas son inmutables, se garantiza que haya reproducibilidad, de modo que dos fábricas siempre crearán el mismo modelo y las configuraciones se validan en el momento de la creación para garantizar que, si se puede predecir que algo fallará, así sea.
Una vez que se serializa una fábrica, distribuir modelos para entrenarlos e implementarlos en tareas específicas es solo una cuestión de distribuir JSONs y conectarlos a nuestra infraestructura. Se pasan a Sheep junto con las funciones de análisis adecuadas integradas en la biblioteca que saben cómo convertirlos en modelos de Excelencia para el Cliente.
La centralización del código ha facilitado la distribución de modelos en diferentes casos de uso y mejora el mantenimiento al mismo tiempo que mantiene los modelos limpios. También permite revisiones de código más rápidas, una validación más sencilla y menos conflictos de fusión, a costa de perder algo de flexibilidad. Encontrar el punto óptimo entre cuánto vale la pena perder ha sido un proceso de varios meses de prueba y error con diferentes niveles de abstracción, pero nos ha permitido aprender mucho del dominio de Excelencia del Cliente y, aunque siempre hay margen de mejora, todos los beneficios comenzaron a brillar incluso desde la etapa de creación del prototipo.
La Historia de Éxito
Cuando se lanzó la primera versión de la biblioteca, se empezó a utilizar en 4 modelos diferentes en México que se implementaron en producción. Poco después, Nubank decidió comenzar a integrar modelos similares en Colombia. Incluso con todas las incertidumbres y la baja plantilla que conlleva la apertura de un nuevo negocio en territorios desconocidos, pudimos lanzar 2 modelos diferentes en poco tiempo con un coste de mantenimiento tan bajo que el equipo existente pudo gestionarlos sin problemas. Actualmente estamos trabajando con el equipo de operaciones de Brasil para probar la solución allí.
Hoy en día, esto suma hasta 6 modelos diferentes, que cubren tareas como enrutamiento y respuesta automática (para chat y correo electrónico) implementadas en México y Colombia utilizando la biblioteca desarrollada. Lo más sorprendente es que todos utilizan exactamente el mismo código (gracias a la Biblioteca) y la única diferencia es la configuración específica y los datos subyacentes utilizados, que varían según la tarea, el canal y el país.
Esto ha reducido la duplicación de código en un 85% y, como nuestros modelos se componen principalmente de archivos de configuración declarativos, difundir una nueva característica (o una corrección de errores) a todos nuestros modelos es solo una cuestión de actualizar la versión de la biblioteca.
Esta capacidad de pagar rápidamente la deuda técnica o propagar grandes cambios sin una gran cantidad de código reduce los costos al reducir la cantidad de horas de ingeniería que deben dedicarse al mantenimiento. Además de eso, también le da tiempo al equipo para mejorar nuestros datos y experimentar con todas las nuevas ideas que están surgiendo en el acelerado campo del procesamiento del lenguaje natural, que ha sido clave para entregar lo que ha sido una firma de Nubank desde su creación: ofrecer un excelente servicio al cliente.
Check our job opportunies