Ускорение управления успехом клиентов через классификацию электронной почты с помощью Hugging Face на Amazon SageMaker

Ускорение успеха клиентов через классификацию электронной почты с помощью Hugging Face на Amazon SageMaker

Это гостевой пост от Scalable Capital, ведущего финтех-компании в Европе, предлагающей цифровое управление капиталом и брокерскую платформу с фиксированной торговой ставкой.

Как быстрорастущая компания, Scalable Capital стремится не только создать инновационную, надежную и надежную инфраструктуру, но и предоставить лучшие услуги для наших клиентов, особенно в части клиентского обслуживания.

Scalable ежедневно получает сотни запросов по электронной почте от наших клиентов. Благодаря внедрению современной модели обработки естественного языка (NLP) процесс ответа стал гораздо эффективнее, и время ожидания для клиентов значительно сократилось. Модель машинного обучения (ML) классифицирует новые поступающие запросы от клиентов сразу после их поступления и перенаправляет их в заранее определенные очереди, что позволяет нашим специалистам по клиентскому успеху сконцентрироваться на содержании электронных писем в соответствии с их навыками и предоставить соответствующие ответы.

В этом посте мы демонстрируем технические преимущества использования Hugging Face transformers, развернутых с помощью Amazon SageMaker, такие как масштабируемое обучение и экспериментирование, а также повышение производительности и экономии затрат.

Постановка задачи

Scalable Capital – одна из самых быстрорастущих финтех-компаний в Европе. С целью демократизации инвестиций компания предоставляет своим клиентам простой доступ к финансовым рынкам. Клиенты Scalable могут активно участвовать на рынке через брокерскую торговую платформу компании или использовать Scalable Wealth Management для интеллектуальных и автоматизированных инвестиций. В 2021 году Scalable Capital увеличил свою клиентскую базу в десять раз, с десятков тысяч до сотен тысяч.

Для обеспечения наших клиентов первоклассным (и последовательным) пользовательским опытом во всех продуктах и услугах компания искала автоматизированные решения для обеспечения эффективности масштабируемого решения при сохранении операционного превосходства. Команды по науке о данных и обслуживанию клиентов Scalable Capital выявили, что одним из крупнейших узких мест в обслуживании наших клиентов был этап классификации, на котором сотрудники ежедневно читали и маркировали тексты запросов. После того, как электронные письма были отправлены в соответствующие очереди, соответствующие специалисты быстро взаимодействовали и разрешали случаи.

Чтобы упростить этот процесс классификации, команда по науке о данных в Scalable создала и развернула многозадачную модель NLP с использованием современной архитектуры трансформатора, основанной на предварительно обученной модели distilbert-base-german-cased, опубликованной Hugging Face. distilbert-base-german-cased использует метод дистилляции знаний для предварительного обучения более маленькой обобщенной модели языкового представления, чем исходная базовая модель BERT. Упрощенная версия достигает сопоставимой производительности с исходной версией, при этом она является более компактной и быстрее. Чтобы упростить наш жизненный цикл ML, мы решили использовать SageMaker для создания, развертывания, обслуживания и мониторинга наших моделей. В следующем разделе мы представляем дизайн архитектуры нашего проекта.

Обзор решения

ML-инфраструктура Scalable Capital состоит из двух учетных записей AWS: одна для разработки, другая для производства.

Следующая диаграмма показывает рабочий процесс нашего проекта по классификации электронной почты, но также может быть обобщена на другие проекты по науке о данных.

Диаграмма проекта по классификации электронной почты

Рабочий процесс состоит из следующих компонентов:

  • Эксперименты с моделями – Научные сотрудники используют Amazon SageMaker Studio для выполнения первых шагов в жизненном цикле науки о данных: исследовательский анализ данных (EDA), очистку и подготовку данных и создание прототипов моделей. Когда исследовательская фаза завершена, мы обращаемся к VSCode, размещенному на заметке SageMaker, в качестве нашего удаленного инструмента разработки для модулизации и производственной разработки нашего кодовой базы. Для исследования различных типов моделей и конфигураций моделей, а также для отслеживания наших экспериментов, мы используем SageMaker Training и SageMaker Experiments.
  • Создание модели – После выбора модели для нашего производственного случая, в данном случае многозадачной модели distilbert-base-german-cased, настроенной на основе предварительно обученной модели от Hugging Face, мы фиксируем и публикуем наш код в ветку разработки Github. Событие слияния Github запускает нашу CI-программу Jenkins, которая в свою очередь запускает задание SageMaker Pipelines с тестовыми данными. Это служит тестом, чтобы убедиться, что код работает, как ожидалось. Развертывается тестовая конечная точка для тестовых целей.
  • Развертывание модели – После убеждения в том, что все работает, научные сотрудники сливают ветку разработки в основную ветку. Это событие слияния теперь запускает задание SageMaker Pipelines с использованием производственных данных для обучения. Затем производятся артефакты модели и хранятся в выходном ведре Amazon Simple Storage Service (Amazon S3), а новая версия модели регистрируется в реестре моделей SageMaker. Научные сотрудники изучают производительность новой модели, затем одобряют ее, если она соответствует ожиданиям. Событие одобрения модели регистрируется Amazon EventBridge, который затем развертывает модель в конечную точку SageMaker в производственной среде.
  • MLOps – Поскольку конечная точка SageMaker является закрытой и не может быть доступна для сервисов за пределами VPC, требуются функция AWS Lambda и общедоступная конечная точка Amazon API Gateway для связи с CRM. Когда в CRM-почтовом ящике появляются новые электронные письма, CRM вызывает общедоступную конечную точку API Gateway, которая в свою очередь запускает функцию Lambda для вызова закрытой конечной точки SageMaker. Функция затем передает классификацию обратно в CRM через общедоступную конечную точку API Gateway. Для мониторинга производительности развернутой модели мы реализуем обратную связь между CRM и научными сотрудниками для отслеживания метрик прогнозирования модели. Ежемесячно CRM обновляет исторические данные, используемые для экспериментов и обучения моделей. Мы используем Amazon Managed Workflows для Apache Airflow (Amazon MWAA) в качестве планировщика для ежемесячной повторной тренировки.

В следующих разделах мы подробно рассмотрим этапы подготовки данных, экспериментирования с моделями и развертывания моделей.

Подготовка данных

Scalable Capital использует инструмент CRM для управления и хранения данных электронной почты. Содержимое электронной почты, которое имеет значение, включает тему, текст и банк-краудиторы. К каждому письму присваиваются три метки: строка бизнеса, откуда письмо поступило, очередь, к которой оно подходит, и конкретная тема письма.

Перед тем, как мы начнем обучение моделей NLP, мы убедимся, что входные данные чистые и метки присваиваются согласно ожиданиям.

Для получения чистого содержимого запроса от клиентов Scalable мы удаляем из исходных данных электронной почты дополнительный текст и символы, такие как подписи электронной почты, импрессумы, цитаты предыдущих сообщений в цепочках электронной почты, символы CSS и т.д. В противном случае наши будущие обученные модели могут испытывать снижение производительности.

Метки для писем меняются со временем, поскольку команды обслуживания клиентов Scalable добавляют новые метки и уточняют или удаляют существующие метки в соответствии с потребностями бизнеса. Чтобы убедиться, что метки для обучающих данных, а также ожидаемые классификации для прогнозирования актуальны, команда по науке о данных тесно сотрудничает с командой обслуживания клиентов, чтобы обеспечить правильность меток.

Экспериментирование с моделями

Мы начинаем наши эксперименты с готовой предварительно обученной моделью distilbert-base-german-cased, опубликованной Hugging Face. Поскольку предварительно обученная модель является универсальной моделью представления языка, мы можем адаптировать архитектуру для выполнения конкретных задач — таких как классификация и ответ на вопросы — путем подключения соответствующих головок к нейронной сети. В нашем случае конкретной задачей, которая нас интересует, является классификация последовательности. Без изменения существующей архитектуры мы решаем донастраивать три отдельные предварительно обученные модели для каждой из требуемых категорий. С использованием контейнеров SageMaker Hugging Face Deep Learning (DLC) начало и управление экспериментами NLP становится простым благодаря контейнерам Hugging Face и API SageMaker Experiments.

Вот фрагмент кода train.py:

config = AutoConfig.from_pretrained("distilbert-base-german-cased")  # загрузить исходную конфигурацию
config.num_labels = num_labels  # адаптировать исходную конфигурацию для определенного количества меток (по умолчанию 2)
# создать экземпляр предварительно обученной модели
model = DistilBertForSequenceClassification.from_pretrained("distilbert-base-german-cased", config=config)

trainer = Trainer(
    model=model,  # предварительно обученная модель Transformers, которую нужно обучить
    args=training_args,  # аргументы обучения, определенные выше
    train_dataset=train_dataset,  # обучающий набор данных
    eval_dataset=val_dataset  # набор данных для оценки
)
trainer.train()

Следующий код является оценщиком 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
)

Для проверки качества донастроенных моделей мы используем F1-меру из-за несбалансированности нашего набора данных электронной почты, а также для вычисления других метрик, таких как точность и полнота. Чтобы API SageMaker Experiments зарегистрировал метрики задания обучения, мы должны сначала зарегистрировать метрики в локальной консоли задания обучения, которые затем перехватываются Amazon CloudWatch. Затем мы определяем правильный формат регулярного выражения для захвата журналов CloudWatch. Определения метрик включают имя метрики и проверку по регулярному выражению для извлечения метрик из задания обучения:

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]+),?"},
]

В рамках итерации обучения модели классификатора мы используем матрицу ошибок и отчет о классификации для оценки результата. На следующей фигуре показана матрица ошибок для предсказания бизнес-линии.

Матрица ошибок

На следующем скриншоте показан пример отчета о классификации для предсказания бизнес-линии.

Отчет о классификации

В качестве следующей итерации нашего эксперимента мы воспользуемся многозадачным обучением для улучшения нашей модели. Многозадачное обучение – это форма обучения, при которой модель учится решать несколько задач одновременно, поскольку общая информация между задачами может улучшить эффективность обучения. Добавив две дополнительные головы классификации к исходной архитектуре distilbert, мы можем провести многозадачную донастройку, которая достигает приемлемых метрик для нашей команды обслуживания клиентов.

Развертывание модели

В нашем случае классификатор электронной почты должен быть развернут на конечную точку, на которую наша CRM-программа может отправлять пакеты неклассифицированных электронных писем и получать предсказания. Поскольку у нас есть другие логики, такие как очистка входных данных и многозадачные предсказания, помимо вывода модели Hugging Face, нам нужно написать собственный скрипт вывода, соответствующий стандарту SageMaker.

Ниже приведен фрагмент кода 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"Unsupported content type: {content_type}")

    data = preprocess(data)

    # Вывод
    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

Когда все готово и готово, мы используем SageMaker Pipelines для управления нашей обучающей конвейером и присоединяем его к нашей инфраструктуре для завершения настройки MLOps.

Для мониторинга производительности развернутой модели мы создаем обратную связь, чтобы CRM могла предоставлять нам статус классифицированных электронных писем при закрытии случаев. Исходя из этой информации, мы вносим изменения для улучшения развернутой модели.

Вывод

В этой статье мы поделились тем, как SageMaker облегчает работу команды по науке о данных в Scalable, чтобы эффективно управлять жизненным циклом проекта по науке о данных, а именно проектом классификатора электронной почты. Жизненный цикл начинается с начальной фазы анализа данных и исследования с помощью SageMaker Studio; переходит к экспериментированию и развертыванию модели с помощью обучения SageMaker, вывода и Hugging Face DLCs; и завершается обучающим конвейером с помощью SageMaker Pipelines, интегрированных с другими сервисами AWS. Благодаря этой инфраструктуре мы можем более эффективно итерировать и развертывать новые модели, что позволяет улучшать существующие процессы в Scalable, а также опыт наших клиентов.

Чтобы узнать больше о Hugging Face и SageMaker, см. следующие ресурсы:

  • Использование Hugging Face с Amazon SageMaker
  • Что такое AWS Deep Learning Containers?
  • Использование версии 2.x Python SDK SageMaker: Frameworks: Hugging Face