Время прочтения: 6 мин.

Страницы часто задаваемых вопросов — это самый распространенный способ для организаций уменьшить нагрузку на службу поддержки пользователей, автоматически отвечая на наиболее часто задаваемые вопросы. Однако с течением времени количество вопросов может оказаться слишком большим и поиск нужного будет затруднительным для пользователя. В последние годы стали значительно популярны различные чат-боты. В то время как предыдущее поколение чат-ботов было основано на правилах «если-то», сегодняшние чат-боты используют машинное обучение и искусственный интеллект для имитации диалогов с пользователями на естественном языке. В данной статье будет показан способ создания модели чат-бота для ответов на часто задаваемые вопросы из готового набора пар «вопрос-ответ» с применением библиотеки DeepPavlov на python.

Создание модели в Deeppavlov

Библиотека DeepPavlov представляет собой открытую программную библиотеку разговорного AI для создания виртуальных диалоговых ассистентов и анализа текста. Библиотека содержит набор натренированных нейросетевых моделей для анализа текста, компонентов диалоговых систем и пайплайнов, а также компонентов для создания и тестирования диалоговых моделей. Работа с DeepPavlov не требует от разработчика специальных навыков, библиотека бесплатна и дает широкие возможности для тонкой настройки. Построение и обучение модели чат-бота с помощью данной библиотеки представляет собой написание конфигурации пайплайна (конвеера операций) в виде json файла (примеры конфигураций для faq можно найти на github: ссылка. После чего можно обучить или построить модель с помощью следующих команд:

from deeppavlov import train_model, build_model
from deeppavlov.core.common.file import read_json
model_config = read_json('model_config.json')
model = train_model(model_config)  # или build_model(model_config)

После этого, для того чтобы отправить вопрос необходимо вызвать метод _faq c переданным текстом:

answers, probability = model._faq([question])

Модель возвратит наиболее подходящий ответ и массив вероятностей всех ответов.

Теперь поговорим о самой модели чатбота. Задача создания модели машинного обучения для faq чат-бота включает в себя 4 этапа:

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

Загрузка набора данных в DeepPavlov осуществляется с помощью добавления поля «dataset_reader» в конфигурацию.

На втором этапе необходимо провести:

  • удаление всех нерелевантных символов
  • токенизация текста
  • перевод всех символов в нижний регистр
  • удаление стоп-слов
  • стемминг или лемматизацию

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

На третьем этапе нужно осуществить векторизацию текста. В библиотеке доступны два предустановленных способа это сделать. Первый —  мешок слов с модификацией Tf-Idf, второй — с помощью word embeddings.

Tf-Idf векторизатор представлен в виде предобученной модели класса TfidfVectorizer из библиотеки sklearn. Данная модель была обучена на 1463888 статьях русской википедии. Альтернативой является модель векторного представления слов. В данном случае используется библиотека fasttext с предобученной моделью для русского языка. В качестве алгоритма используется метод SkipGram. Эта модель обучена на корпусе текстов, составленном из русской википедии и новостей сайта lenta.ru. Все вектора данной модели имеют размерность равную 300.

Последним шагом в цепочке процессов является поиск похожего вектора из датасета. Наиболее простым способом является поиск похожего вектора на основе косинусной меры. Другой подход — это использование любой модели классификации, например, многоклассовой логистической регрессии (количество классов равно количеству вопросов в датасете). Такую модель необходимо либо предварительно обучить и в процессе работы пайплайна использовать уже обученную модель, либо указать в конфигурации пайплайна необходимость обучения в процессе сборки модели. В этом случае можно указать параметры обучения такие как параметр C и метод регуляризации. За основу этой модели можно взять класс LogisticRegression из библиотеки sklearn.linear_model.

Пример модели

Следует обратить внимание на то, что ответа на вопрос может не содержаться в датасете, поэтому полученный ответ модели необходимо проверять на достоверность. Для этого можно сравнить вероятность самого близкого ответа с константным значением (threshold).

def _check_similarity(arr: list, threshold: float) -> bool:
   max_value = max(arr)
   if max_value < threshold:
       return False
   else:
       return True

В качестве примера модели можно привести созданную мною модель чат-бота для ответов на вопросы абитуриентов факультета ПММ Воронежского государственного университета. На изображении 1 показана часть исходного датасета. Он состоит из двух столбцов: Question и Answer.

изображение 1

Для более удобной работы с моделью был написан класс-обёртка AmmChatBot. Загрузка модели (изображение 2) занимает некоторое время, происходящие процессы выводятся в логи.

изображение 2

После загрузки модели, использовать её можно через метод ask класса AmmChatBot (изображение 3).

Исходный код класса и модели можно найти по данной ссылке.

Интеграция и использование

Любая модель может быть развернута в виде REST веб-сервиса. В самом простом случае достаточно одного файла конфигурации и указания порта. Запуск сервиса может осуществляться следующей командой:

python -m deeppavlov riseapi <config_path> -d [-p <port>]

В библиотеке также доступны возможности интеграции чат-бота с различными платформами, такими как: Telegram, Yandex Alisa, Amazon Alexa и AWS. Например, для интеграции с Telegram достаточно написать всего пару строк кода:

from deeppavlov.utils.telegram import interact_model_by_telegram interact_model_by_telegram(model_config=<config_path>, token=<telegram_token>)

Заключение

Сегодня чат-боты могут эффективно заменять службу поддержки в большинстве случаев. Многие компании используют их для снижения нагрузки на операторов. Например, чат-бот поддержки Ozon, отвечающий на вопросы по доставке и порядку возврата товара или чат-боты мобильных приложений банков СберБанк или Тинькофф, отвечающие на вопросы по комиссиям, условиям использования услуг и т. д. Также существуют различные чат-бот платформы с возможностью создания диалогов, используя user-frendly интерфейс, однако возникают вопросы с масштабированием, привязкой к платным API-сервисам и поддержкой русского языка. Поэтому использование библиотеки Deeppavlov может быть отличной альтернативой, которое сильно упростит создание FAQ чат-бота для ответа на вопросы на русском языке.