Acelere la gestión del éxito del cliente a través de la clasificación de correos electrónicos con Hugging Face en Amazon SageMaker

Agilice la gestión del éxito del cliente clasificando correos electrónicos con Hugging Face en Amazon SageMaker

Este es un artículo invitado de Scalable Capital, una de las principales empresas de tecnología financiera en Europa que ofrece servicios de administración de patrimonio digital y una plataforma de corretaje con una tarifa plana de operación.

Como empresa en rápido crecimiento, los objetivos de Scalable Capital son no solo construir una infraestructura innovadora, robusta y confiable, sino también proporcionar las mejores experiencias para nuestros clientes, especialmente en lo que respecta a los servicios al cliente.

Scalable recibe cientos de consultas por correo electrónico de nuestros clientes a diario. Al implementar un modelo moderno de procesamiento de lenguaje natural (NLP), el proceso de respuesta se ha optimizado de manera mucho más eficiente y el tiempo de espera para los clientes se ha reducido enormemente. El modelo de aprendizaje automático (ML) clasifica las nuevas solicitudes de clientes entrantes tan pronto como llegan y las redirige a colas predefinidas, lo que permite a nuestros dedicados agentes de éxito del cliente centrarse en el contenido de los correos electrónicos de acuerdo con sus habilidades y proporcionar respuestas apropiadas.

En esta publicación, demostramos los beneficios técnicos de usar los transformers de Hugging Face implementados con Amazon SageMaker, como el entrenamiento y la experimentación a gran escala, y la productividad y eficiencia en costos mejoradas.

Declaración del problema

Scalable Capital es una de las Fintech de más rápido crecimiento en Europa. Con el objetivo de democratizar la inversión, la empresa brinda a sus clientes un fácil acceso a los mercados financieros. Los clientes de Scalable pueden participar activamente en el mercado a través de la plataforma de corretaje de la empresa, o utilizar Scalable Wealth Management para invertir de manera inteligente y automatizada. En 2021, Scalable Capital experimentó un aumento diez veces mayor en su base de clientes, de decenas de miles a cientos de miles.

Para proporcionar a nuestros clientes una experiencia de usuario de primera clase (y consistente) en productos y servicios al cliente, la empresa buscaba soluciones automatizadas para generar eficiencias en una solución escalable y al mismo tiempo mantener la excelencia operativa. Los equipos de ciencia de datos y servicio al cliente de Scalable Capital identificaron que uno de los mayores cuellos de botella para atender a nuestros clientes era responder a las consultas por correo electrónico. Específicamente, el cuello de botella era el paso de clasificación, en el cual los empleados tenían que leer y etiquetar los textos de las solicitudes a diario. Después de que los correos electrónicos se dirigían a sus colas adecuadas, los especialistas correspondientes se involucraban rápidamente y resolvían los casos.

Para agilizar este proceso de clasificación, el equipo de ciencia de datos de Scalable construyó e implementó un modelo multitarea de NLP utilizando una arquitectura de transformers de vanguardia, basada en el modelo preentrenado distilbert-base-german-cased publicado por Hugging Face. distilbert-base-german-cased utiliza el método de destilación de conocimientos para preentrenar un modelo de representación de lenguaje general de menor tamaño que el modelo base BERT original. La versión destilada logra un rendimiento comparable a la versión original, al ser más pequeña y rápida. Para facilitar nuestro proceso de ciclo de vida de ML, decidimos adoptar SageMaker para construir, implementar, servir y monitorear nuestros modelos. En la siguiente sección, presentamos el diseño de la arquitectura de nuestro proyecto.

Descripción general de la solución

La infraestructura de ML de Scalable Capital consta de dos cuentas de AWS: una como entorno para la etapa de desarrollo y otra para la etapa de producción.

El siguiente diagrama muestra el flujo de trabajo de nuestro proyecto de clasificación de correos electrónicos, pero también se puede generalizar a otros proyectos de ciencia de datos.

Diagrama del proyecto de clasificación de correos electrónicos

El flujo de trabajo consta de los siguientes componentes:

  • Experimentación del modelo: Los científicos de datos utilizan Amazon SageMaker Studio para llevar a cabo los primeros pasos en el ciclo de vida de la ciencia de datos: análisis exploratorio de datos (EDA), limpieza y preparación de datos, y construcción de modelos prototipo. Cuando se completa la fase exploratoria, recurrimos a VSCode alojado en una notebook de SageMaker como nuestra herramienta de desarrollo remoto para modularizar y poner en producción nuestra base de código. Para explorar diferentes tipos de modelos y configuraciones de modelos, y al mismo tiempo realizar un seguimiento de nuestras experimentaciones, utilizamos SageMaker Training y SageMaker Experiments.
  • Construcción del modelo: Después de decidir sobre un modelo para nuestro caso de uso de producción, en este caso un modelo multitarea distilbert-base-german-cased, ajustado a partir del modelo preentrenado de Hugging Face, comprometemos y enviamos nuestro código a la rama de desarrollo de Github. El evento de fusión de Github desencadena nuestro pipeline de CI de Jenkins, que a su vez inicia un trabajo de SageMaker Pipelines con datos de prueba. Esto actúa como una prueba para asegurarse de que los códigos se estén ejecutando como se espera. Se implementa un punto de conexión de prueba con fines de prueba.
  • Implementación del modelo: Después de asegurarnos de que todo esté funcionando como se espera, los científicos de datos fusionan la rama de desarrollo en la rama principal. Este evento de fusión ahora desencadena un trabajo de SageMaker Pipelines que utiliza datos de producción para fines de entrenamiento. Luego, se producen los artefactos del modelo y se almacenan en un bucket de Amazon Simple Storage Service (Amazon S3) de salida, y se registra una nueva versión del modelo en el registro de modelos de SageMaker. Los científicos de datos examinan el rendimiento del nuevo modelo y lo aprueban si cumple con las expectativas. El evento de aprobación del modelo es capturado por Amazon EventBridge, que luego implementa el modelo en un punto de conexión de SageMaker en el entorno de producción.
  • MLOps: Debido a que el punto de conexión de SageMaker es privado y no puede ser alcanzado por servicios fuera de la VPC, se requiere una función de AWS Lambda y un punto de conexión público de Amazon API Gateway para comunicarse con CRM. Cada vez que llegan nuevos correos electrónicos a la bandeja de entrada de CRM, CRM invoca el punto de conexión público de API Gateway, que a su vez activa la función de Lambda para invocar el punto de conexión privado de SageMaker. La función luego transmite la clasificación de vuelta a CRM a través del punto de conexión público de API Gateway. Para monitorear el rendimiento de nuestro modelo implementado, implementamos un ciclo de retroalimentación entre CRM y los científicos de datos para realizar un seguimiento de las métricas de predicción del modelo. Mensualmente, CRM actualiza los datos históricos utilizados para experimentación y entrenamiento del modelo. Utilizamos Amazon Managed Workflows for Apache Airflow (Amazon MWAA) como programador para nuestro proceso de entrenamiento mensual.

En las siguientes secciones, desglosamos los pasos de preparación de datos, experimentación de modelos e implementación de modelos con más detalle.

Preparación de datos

Scalable Capital utiliza una herramienta CRM para gestionar y almacenar datos de correo electrónico. Los contenidos relevantes del correo electrónico consisten en el asunto, el cuerpo y los bancos custodios. Hay tres etiquetas para asignar a cada correo electrónico: de qué línea de negocio proviene el correo electrónico, qué cola es apropiada y el tema específico del correo electrónico.

Antes de comenzar a entrenar modelos de procesamiento de lenguaje natural (NLP), nos aseguramos de que los datos de entrada estén limpios y las etiquetas estén asignadas según lo esperado.

Para recuperar los contenidos de consulta limpios de los clientes de Scalable, eliminamos del correo electrónico sin procesar y del texto y símbolos adicionales, como firmas de correo electrónico, impresos, citas de mensajes anteriores en cadenas de correo electrónico, símbolos CSS, etc. De lo contrario, nuestros modelos entrenados futuros podrían experimentar un rendimiento degradado.

Las etiquetas de los correos electrónicos evolucionan con el tiempo a medida que los equipos de servicio al cliente de Scalable agregan nuevas y refinan o eliminan las existentes para adaptarse a las necesidades comerciales. Para asegurarnos de que las etiquetas para los datos de entrenamiento, así como las clasificaciones esperadas para la predicción, estén actualizadas, el equipo de ciencia de datos trabaja en estrecha colaboración con el equipo de servicio al cliente para garantizar la corrección de las etiquetas.

Experimentación de modelos

Comenzamos nuestro experimento con el modelo pre-entrenado distilbert-base-german-cased publicado por Hugging Face. Debido a que el modelo pre-entrenado es un modelo de representación de lenguaje de propósito general, podemos adaptar la arquitectura para realizar tareas específicas, como clasificación y respuesta a preguntas, mediante la conexión de cabezas apropiadas a la red neuronal. En nuestro caso de uso, la tarea posterior en la que estamos interesados es la clasificación de secuencias. Sin modificar la arquitectura existente, decidimos ajustar finamente tres modelos pre-entrenados separados para cada una de nuestras categorías requeridas. Con los contenedores de aprendizaje profundo de Hugging Face de SageMaker (DLC), iniciar y administrar experimentos de NLP es sencillo con los contenedores de Hugging Face y la API de SageMaker Experiments.

El siguiente es un fragmento de código de train.py:

config = AutoConfig.from_pretrained("distilbert-base-german-cased")  # cargar la configuración original
config.num_labels = num_labels  # adaptar la configuración original a un número específico de etiquetas (el valor predeterminado es 2)
# instancia un modelo pre-entrenado
model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-german-cased", config=config)

trainer = Trainer(
    model=model,  # el modelo Transformers instantiado para entrenar
    args=training_args,  # argumentos de entrenamiento, definidos anteriormente
    train_dataset=train_dataset,  # conjunto de datos de entrenamiento
    eval_dataset=val_dataset  # conjunto de datos de evaluación
)
trainer.train()

El siguiente código es el estimador de Hugging Face:

huggingface_estimator = HuggingFace(
    entry_point='train.py',
    source_dir='./scripts',
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    role=role,
    transformers_version='4.26.0',
    pytorch_version='1.13.1',
    py_version='py39',
    hyperparameters = hyperparameters
)

Para validar los modelos ajustados finamente, utilizamos la puntuación F1 debido a la naturaleza desequilibrada de nuestro conjunto de datos de correo electrónico, pero también para calcular otras métricas como precisión y recuperación. Para que la API de SageMaker Experiments registre las métricas del trabajo de entrenamiento, primero debemos registrar las métricas en la consola local del trabajo de entrenamiento, que son recogidas por Amazon CloudWatch. Luego definimos el formato regex correcto para capturar los registros de CloudWatch. Las definiciones de las métricas incluyen el nombre de las métricas y la validación regex para extraer las métricas del trabajo de entrenamiento:

metric_definitions = [
    {"Name": "train:loss", "Regex": "'loss': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "learning_rate", "Regex": "'learning_rate': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:loss", "Regex": "'eval_loss': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "train:accuracy", "Regex": "'train_accuracy': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:accuracy", "Regex": "'eval_accuracy': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "train:precision", "Regex": "'train_precision': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:precision", "Regex": "'eval_precision': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "train:recall", "Regex": "'train_recall': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:recall", "Regex": "'eval_recall': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "train:f1", "Regex": "'train_f1': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:f1", "Regex": "'eval_f1': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:runtime", "Regex": "'eval_runtime': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "val:samples_per_second", "Regex": "'eval_samples_per_second': ([0-9]+(.|e\-)[0-9]+),?"},
    {"Name": "epoch", "Regex": "'epoch': ([0-9]+(.|e\-)[0-9]+),?"},
]

Como parte de la iteración de entrenamiento para el modelo clasificador, utilizamos una matriz de confusión y un informe de clasificación para evaluar el resultado. La siguiente figura muestra la matriz de confusión para la predicción de la línea de negocio.

Matriz de Confusión

La siguiente captura de pantalla muestra un ejemplo del informe de clasificación para la predicción de la línea de negocio.

Informe de Clasificación

Como siguiente iteración de nuestro experimento, aprovecharemos el aprendizaje multi-tarea para mejorar nuestro modelo. El aprendizaje multi-tarea es una forma de entrenamiento donde un modelo aprende a resolver múltiples tareas simultáneamente, ya que la información compartida entre las tareas puede mejorar la eficiencia del aprendizaje. Al adjuntar dos cabezas de clasificación adicionales a la arquitectura original de distilbert, podemos llevar a cabo un ajuste fino multi-tarea, que alcanza métricas razonables para nuestro equipo de servicio al cliente.

Implementación del Modelo

En nuestro caso de uso, el clasificador de correo electrónico debe implementarse en un punto final, al cual nuestro pipeline de CRM puede enviar un lote de correos electrónicos no clasificados y recibir predicciones. Debido a que tenemos otras lógicas, como la limpieza de los datos de entrada y las predicciones multi-tarea, además de la inferencia del modelo de Hugging Face, necesitamos escribir un script de inferencia personalizado que cumpla con el estándar de SageMaker.

A continuación se muestra un fragmento de código de inference.py:

def model_fn(model_dir):
    model = load_from_artifact(model_dir)

    return model

def transform_fn(model, input_data, content_type, accept):
    if content_type == "application/json":
        data = json.loads(input_data)
        data = pd.DataFrame(data)
        
    else:
        raise ValueError(f"Tipo de contenido no admitido: {content_type}")

    data = preprocess(data)

    # Inferencia
    with torch.no_grad():
        predictions = model(data)

    predictions = postprocess(predictions)

    if content_type == 'application/json':
        return json.dumps(predictions.to_dict(orient="records"))
    else:
        raise NotImplementedError

Cuando todo esté listo y preparado, utilizamos SageMaker Pipelines para gestionar nuestro pipeline de entrenamiento y lo adjuntamos a nuestra infraestructura para completar nuestra configuración de MLOps.

Para supervisar el rendimiento del modelo implementado, creamos un bucle de retroalimentación que permite al CRM proporcionarnos el estado de los correos electrónicos clasificados cuando se cierran los casos. Con base en esta información, realizamos ajustes para mejorar el modelo implementado.

Conclusión

En este artículo, compartimos cómo SageMaker facilita al equipo de ciencia de datos de Scalable la gestión del ciclo de vida de un proyecto de ciencia de datos de manera eficiente, en particular el proyecto del clasificador de correos electrónicos. El ciclo de vida comienza con la fase inicial de análisis y exploración de datos con SageMaker Studio, continúa con la experimentación y implementación del modelo con SageMaker training, inference y Hugging Face DLCs, y se completa con un pipeline de entrenamiento con SageMaker Pipelines integrado con otros servicios de AWS. Gracias a esta infraestructura, podemos iterar e implementar nuevos modelos de manera más eficiente y, por lo tanto, mejorar los procesos existentes dentro de Scalable, así como la experiencia de nuestros clientes.

Para obtener más información sobre Hugging Face y SageMaker, consulta los siguientes recursos:

  • Usar Hugging Face con Amazon SageMaker
  • ¿Qué son los AWS Deep Learning Containers?
  • Usar la versión 2.x del SDK de Python de SageMaker: Frameworks: Hugging Face