Под капотом у чат-бота: что умеет и как работает RocketBot

RocketBot — это программируемый чат-бот, который интегрируется с VK, Telegram и Bitrix24. Сегодня мы расскажем об инфраструктуре и других технологиях, на которых он построен.

vft_jnhxmkcnqm19hug1qohxzpy.jpeg
/ фото Darryl Braaten CC BY-SA

Инструментарий


Разрабатывая RocketBot, мы делали упор на скорость разработки и прототипирования. По этой причине система написана на Python, а в качестве базы данных выбрана MySQL.

На сегодняшний день Python занимает третье место в рейтинге TIOBE по популярности. Это означает, что у языка большое комьюнити и нескончаемое количество справочной литературы: книг, сайтов, курсов и исходников. Например, на GitHub можно найти сборники лучших практик по разработке на Python, а на StackOverflow открыто большое число тредов. Множество книг этому языку посвятило издательство O«Reilly, можно выделить «Автостопом по Python» и «Машинное обучение с Python».

Помимо большого количества источников, одним из главных преимуществ Python является разнообразие библиотек и функциональных ML-фреймворков. Примерами могут быть PyTorch и SciKit-learn — это мощные инструменты, которые упрощают обработку естественной речи, диалогов и скриптов.

В частности, для разработки моделей обучения мы использовали PyTorch, так как он обладает широкими возможностями для прототипирования. Дополнительно мы внедрили scikit-learn, который выполняет предварительную обработку данных, а также pymorth2 и gensim (для работы с морфологией и векторизации текстов соответственно). Еще мы испытываем DeepPavlov — оцениваем его возможности.


Что касается базы данных, то её мы выбирали из соображений «не усложнять». MySQL также остается самой популярной из мощных серверных БД. По этой причине в интернете о ней можно найти большое количество информации (например, есть подробный мануал от разработчиков), а обширное комьюнити всегда подскажет решение проблемы, если таковая возникнет. Плюс MySQL предлагает широкую функциональность, хотя и не следует всем SQL-стандартам.

Что умеет наш чат-бот


Наш чат-бот позволяет настроить автоматические ответы на вопросы пользователей (например, для реализации FAQ), а также автоматизировать рутинные операции (например, опросы) при помощи скриптов.

Система способна работать с двумя типами вопросов: кастомными и стандартными. В первом случае администратор самостоятельно прописывает суть вопроса и ключевые слова, на которые бот будет реагировать. Перечислять все ключевики необязательно. Алгоритмы RocketBot оценят смысл фразы и найдут ответ по семантической близости.

Для оценки семантической близости используется векторное представление запроса. В нем выделяются главные компоненты (PCA) и ищется ближайший по расстоянию вариант в базе данных. В нашем случае, лучше всего себя показала метрика cosine_similarity (sciki-learn).

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

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

Для составления скрипта используются три типа блоков:

  1. Блок вопроса — задает вопрос пользователю и пишет в переменную ответ на него.
  2. Блок условий — реализует ветвление скрипта.
  3. Блок проверки переменных — управляет маршрутом пользователя по скрипту.


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

tj7nps4s0rfvjsk8oa3sug_ipl4.png
Пример настроек с выходом из скрипта при ответе «Нет» на вопрос «Вам есть 18 лет?»

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

Помимо ответов на вопросы и реализации скриптов, бот умеет работать с системами обработки естественного языка. Однако пока они выполняют очень узкий спектр задач: ищут ответ на вопрос в базе знаний и определяют намерения пользователя (для этого используется все тот же Dialogflow).

Мы ограничили спектр задач интеллектуального решения из-за потенциальных сложностей с непрогнозируемостью поведения. Современные системы ИИ по-прежнему подвержены ошибкам, а при создании бизнес-сервисов нельзя, чтобы бот реагировал на 80% вопросов одним образом, а на остальные 20% — другим.

Для реализации системы обработки естественной речи пока используется очень простой алгоритм поиска. Со временем мы хотим реализовать новую версию на базе LSTM-сетей, использующую обучение с подкреплением (reinforcement learning). Скорее всего новая реализация будет основана на уже упомянутом фреймворке DeepPavlov.

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

В последующих релизах мы планируем добавить боту возможность создавать автоворонки. Это позволит бизнесу ознакомить потенциального клиента с товаром и закрыть сделку прямо в чате. Система будет самостоятельно добавлять необходимые сущности в CRM — лиды, сделки, задачи — на основе введенных ответов и вопросов.

qmfailfzjrk_v_2gqw0rg_akhqu.jpeg
/ фото spencer cooper CC BY-ND

Инфраструктура, на которой построен чат-бот


Все наши сервисы работают в облаке «ИТ-ГРАД» — там размещаются frontend-серверы, базы данных и серверы приложений. В целом облачная инфраструктура помогает нам оперативно масштабировать свои сервисы, справляться с ростом нагрузки и внезапными скачками трафика. По этой причине в дальнейшем мы планируем только расширять свое присутствие в облаке.

Сам бот представляет собой набор из пяти микросервисов, которые взаимодействуют друг с другом по HTTP–JSON (все внутренние коммуникации между сервисами проводятся в защищенном сегменте). Хотя это и приводит к возникновению задержек при ответе на вопрос в одну–две секунды, такая архитектура обладает большим потенциалом к масштабированию и позволяет нам модифицировать отдельные блоки, не затрагивая другие. Например, обновление микросервиса поиска в FAQ не затронет микросервис интеграции с CRM.

Для тестирования и создания моделей машинного обучения и нейронных сетей мы используем Nvidia Tesla M40 16GB. Но даже на ней обучение происходит не очень быстро. Своды данных, которые мы используем для задач обработки естественного языка, исчисляются десятками гигабайт. По этой причине в некоторых случаях (например, для векторизации датасетов) мы использовали виртуальные машины с 64 CPU.



Дополнительное чтение — посты из Первого блога о корпоративном IaaS:
Из нашего Telegram-канала:

© Habrahabr.ru