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.

Diagrama

Descrição gerada automaticamenteProductos de los modelos y posibles resultados

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:

  • Limitaciones de intercambio de datos relacionadas con las regulaciones de cada país;
  • Diferencias de idioma entre países (por ejemplo: portugués vs español);
  • Incluso entre los países de habla hispana, las diferencias de vocabulario hacen que la reutilización del modelo sea una tarea no trivial;
  • Diferencias en la “etapa de operaciones” en diferentes países:
    • productos disponibles (por ejemplo: tarjeta de crédito, cuenta de ahorro, inversiones);
    • madurez (por ejemplo: volumen de tickets, tamaño del equipo de atención al cliente).

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.

Tela de computador com texto preto sobre fundo branco

Descrição gerada automaticamente

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.

Diagrama

Descrição gerada automaticamente

¿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:

  1. La validación debe reflejar situaciones de la vida real;
  2. Los modelos de producción deben coincidir con los modelos validados;
  3. Los modelos deberían estar listos para producción con unos pocos pasos adicionales;
  4. La reproducibilidad y el análisis en profundidad de los resultados del modelo deberían ser fáciles de lograr;
  5. No te repitas (nuevo);
  6. Son preferibles los pequeños cambios a los grandes cambios (nuevos).

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:

  • Para que el marco sea extensible, las canalizaciones deben tratarse como un caso particular de un paso para garantizar que se puedan componer si es necesario;
  • Se debe tener cuidado al decidir qué se incluye en la biblioteca (es decir, qué tiene su propio «paso» creado), ya que queremos que sea versátil y extensible, pero solo hasta el punto en que no sacrifiquemos la simplicidad al sobreadaptarnos a casos de uso específicos que no agregan valor al dominio. Los mantenedores de la biblioteca desempeñan el papel de guardianes, lo cual es clave para mantener la biblioteca alineada con el objetivo principal de reducir los costos de mantenimiento de los modelos en producción.

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:

  1. Las instancias de Pydantic son fáciles de serializar ya que son objetos JSON;
  2. Pydantic viene con un potente marco de validación listo para usar;
  3. Pydantic impone la inmutabilidad de sus instancias.

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.

Diagrama

Descrição gerada automaticamente

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