Чат-бот — это интеллектуальное приложение, которое может общаться с помощью текста или речи без вмешательства человека. Это автономная система, которая может поддерживать потребителей, автоматически взаимодействуя с ними. В CarDekho, на нашем официальном номере WhatsApp, мы используем его для автоматической обработки различных пользовательских запросов. Система уже работает; вы можете пообщаться с номером WhatsApp +91 141 666 6666 и узнать цену Tata nexon, или узнать о дилерских центрах в вашем городе, или узнать подробности о текущих предложениях и многое другое.

В этой статье мы представляем дизайн и архитектуру разговорного чат-бота в CarDekho. Мы также обсуждаем проблемы, с которыми мы столкнулись при его создании, и их смягчение, которые могут быть полезны для других, столкнувшихся с аналогичными проблемами.

Раса

Мы использовали инструментарий Rasa для разработки нашего чат-бота. Rasa — это платформа машинного обучения с открытым исходным кодом, которая помогает в создании диалогового чат-бота. Он предоставляет строительные блоки для разработки чат-бота, а именно понимание сообщений, ведение разговоров, поддержание состояния, вызов пользовательских сторонних API и подключение к каналам обмена сообщениями, таким как WhatsApp и Facebook messenger. Нажмите здесь, чтобы узнать больше о расе.

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

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

Во время принятия решения о том, что ответить, мы классифицировали сообщение в соответствующий класс намерений, извлекали объекты и на основе которых мы будем отвечать. Это формирует подсистему NLP/NLU нашего чат-бота, чья работа состоит в том, чтобы понимать сообщения и извлекать из них соответствующие объекты.

Ниже приводится более подробная информация о намерениях и сущностях.

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

Eg.

1. показать намерение изображения

  • покажи мне фотки Таты Харриер
  • изображения свифт
  • изображения (если модель была упомянута ранее, она покажет изображения, иначе она запросит модель)

2. Цель электромагнитных помех

  • EMI для Swift 4 года на 4 л меньше
  • EMI (чат-бот шаг за шагом будет запрашивать необходимые данные, такие как срок пребывания в должности, авансовый платеж и т. д.)

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

Rasa требует, чтобы обучающие данные были в определенном формате внутри файла YAML. Данные обучения Rasa состоят из примеров высказываний пользователей, классифицированных по намерениям. Под каждым намерением есть примеры данного намерения с объектами, отмеченными в примерах.

Для диалогового потока Rasa также требуются истории и правила в обучающих данных.

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

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

- история: Наличие автомобиля

шаги:

- намерение: доступность

- действие: utter_availability

- действие: utter_ask_about_dealer

- намерение: утвердить

- действие: Dealer_details_form

- active_loop: дилер_детали_форма

- active_loop: null

- действие: action_dealer_details

- действие: action_lead_dealers

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

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

- правило: Попросите перефразировать резервный вариант nlu

шаги:

- намерение: nlu_fallback

- действие: произнести_перефразировать

- правило: Говорите «Я бот» каждый раз, когда пользователь бросает вызов

шаги:

- намерение: bot_challenge

- действие: utter_iamabot

Раса Архитектура

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

Rasa Framework содержит два основных компонента:

  1. RASA Core — механизм диалога, который решает, что делать дальше в разговоре, исходя из контекста. Ядро решает, основываясь на историях и правилах, какое действие предпринять или какой ответ дать.
  2. RASA NLU — Rasa NLU — это часть Rasa с открытым исходным кодом, которая выполняет понимание естественного языка (NLU), включая классификацию намерений и извлечение сущностей.

Пять частей Rasa Framework:

  1. Каналы ввода/вывода. Они служат связующим звеном между приложением пользователя (WhatsApp, twilio, facebook messenger и т. д.) и нашим чат-ботом. Для нашего случая мы создали пользовательский компонент, который взаимодействует с бэкендом BotsDekho.
  2. Раса с открытым исходным кодом — эта часть обрабатывает классификацию NLU (т. е. идентификацию намерений и объектов в сообщении пользователя) и управление диалогом (которое определяет, какое действие или ответ следует выполнить).
  3. Хранилище трекера. Хранилище трекера используется для хранения сообщений разговора и связанных с ним атрибутов. Он содержит информацию о текстовом сообщении, рейтинге намерений, ответе бота, слотах и ​​т. д. Он индексируется по идентификатору отправителя. В настоящее время мы используем DynamoDB для этого.
  4. Заблокировать хранилище — Блокировать хранилище гарантирует, что входящие сообщения от пользователя (идентификатор беседы) обрабатываются в правильном порядке, и блокирует поток бесед во время обработки. В настоящее время мы используем Redis для этого.
  5. Файловая система — где мы храним обучающие данные, файлы предметной области и обученные модели. В настоящее время мы используем для этого серверное хранилище (EBS).

Сервер действий (SDK)

Сервер действий Rasa запускает настраиваемые действия для чат-бота. Поскольку настраиваемое действие — это класс, который может делать все, что запрограммировано, например, вызывать API, запрашивать базу данных и т. д. Сейчас мы используем настраиваемые действия для вызова статических API Cardekho, возврата кураторских ответов с использованием jinja и представить Лиды потенциальных покупателей автомобилей.

НЛУ Трубопровод

Этот конвейер содержит компоненты, используемые для классификации намерений и распознавания сущностей. Для управления NLU и Dialogue мы используем несколько компонентов, включая архитектуру DIET.

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

1. Токенизаторы — токенизаторы разбивают текст на токены.

  • Whitespace Tokenizer — разбивает текст на слова и предложения на основе пробелов и точек.
  • Токенизатор эмодзи — удалить токен эмодзи из текста

2. Featurizers — преобразование токенов и предложений в функции.

  • CountVector Featurizer — создание разреженных функций на основе количества ngram
  • Lexical Featurizer — создает разреженные функции на основе BOS, EOS, POS, цифры, суффикса, префикса выше, ниже и т. д. для каждого токена.

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

  • BPE — встраивание пар байтов. Предварительно обученные вложения слов

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

  • DIET Classifier — модель Dual Intent и Entity Transformer, использующая слой Transformer с FFN для классификации намерений.

5. Экстракторы сущностей. Экстракторы сущностей используются для извлечения сущностей из сообщения пользователя. Это может быть местоположение, имя, бренд, возраст, номер телефона и т. д.

  • DIET Classifier — модель Dual Intent и Entity Transformer с использованием уровня Transformer и CRF для извлечения объектов
  • На основе регулярных выражений — использование выражений регулярных выражений и создание дополнительных выражений регулярных выражений из таблиц поиска.

ДИЕТ Архитектура

Двойной преобразователь намерений и сущностей (DIET) — это многозадачный преобразователь, который обрабатывает распознавание намерений и классификацию сущностей.

  1. Мы пропускаем входящие токенизированные слова сообщения пользователя через слой внедрения. Мы можем использовать предварительно обученные вложения вместе с недавно обученными вложениями.
  2. Мы передаем результат предыдущего шага в слой преобразователя, обеспечивающий нам контекстное встраивание слов и предложения.
  3. Эти трансформирующие вложения предложения проходят через FFN, а затем используются для классификации намерений. Трансформаторные вложения слов используются для обучения части MLM (Masked Language Modeling).
  4. Преобразователи слов также используются в модели CRF (условное случайное поле) для идентификации сущности.

Проблемы и методы смягчения последствий

Ниже перечислены некоторые проблемы, с которыми столкнулись при разработке чат-бота, а также методы и решения, реализованные для их обхода.

1. Создание обучающих данных из шаблонных сообщений

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

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

Например:

Пользователь написал: «Покажи мне фото creta». Таким образом, нашим первым обучающим образцом/шаблоном для «image_intent» будет «Покажи мне фотографии [creta](model)», где модель определяет тип сущности.

Теперь из этого шаблона мы можем сгенерировать несколько обучающих образцов, изменив имя модели, например, «Покажи мне фотографии [swift] (модель)».

Таким образом, мы можем генерировать 5–10-кратные обучающие данные из шаблонов со случайно выбранными именами сущностей из наших таблиц поиска.

2. Создание данных из незасекреченных сообщений

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

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

3. Орфографические ошибки

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

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

Шаги для кластеризации лидеров с помощью фонетического хэширования:

  1. Мы создаем частотную карту всех элементов в нашем корпусе, по сути, сколько раз конкретное слово появлялось в корпусе.
  2. Для каждого слова в частотном отображении (отсортированном по убыванию частоты) мы вычисляем фонетический хэш, который будет действовать как ключи или наши кластеры.
  3. Для каждого слова в фонетическом хеше мы создаем подкластеры с лидерами и последователями. Новый подкластер формируется с текущим словом в качестве его лидера, если расстояние Левенштейна между текущим словом и лидерами всех подкластеров в фонетическом кластере больше порогового значения. В противном случае текущее слово становится последователем подкластера, если его расстояние по Левенштейну от лидера подкластера меньше порога.

Здесь мы получаем кластеры и подкластеры, в которых лидеры имеют правильное написание для своих последователей.

Результаты и влияние на бизнес

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

Показанные модели:

  • Orig — оригинальная архитектура, доступная в Rasa.
  • Light — оригинальная архитектура без трансформаторного слоя.
  • Heavy — оригинальная архитектура с 4 слоями трансформатора.
  • bpe_4T_100D — Исходный + 4 слоя преобразователя + предварительно обученные встраивания BPE
  • Data_eng — исходные данные + BPE + данные шаблона (используется в рабочей версии)
  • Test_bert_eng — Оригинал + вложения BERT + данные шаблона

Несмотря на то, что встраивание BERT дало нам несколько лучшие результаты, оно вызывает проблему с задержкой, поскольку вычисление встраивания BERT является вычислительно сложной задачей. Поэтому мы используем вложения BPE + модель данных шаблона в производстве.

Авторы
Танмай Гвалера
Манджит Дахия