Время прочтения: 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 этапа:
- Загрузка набора данных. Нам понадобятся датасет вопрос-ответ, для каждого входящего вопроса пользователя будет произведен поиск ближайшего вопроса из набора и выведен соответствующий ответ.
- Нормализация и предварительная обработка текста. Каждый вопрос должен пройти процедуры нормализации и токенизации.
- Векторизация текста. Полученный на втором этапе массив токенов необходимо векторизировать.
- Модель сравнения векторов. Здесь необходимо для полученного вектора входящего вопроса найти ближайший вектор из датасета вопросов. Можно использовать либо модели классификации либо меры сходства.
Загрузка набора данных в 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.
Для более удобной работы с моделью был написан класс-обёртка AmmChatBot. Загрузка модели (изображение 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 чат-бота для ответа на вопросы на русском языке.