Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Краткое описание проекта
В данном проекте перед нами стояла задача – с помощью чат-бота разгрузить КЦ, а также оперативно и качественно отвечать на вопросы студентов и школьников группы образовательных организаций.
В группе состоят 9 образовательных учреждений, у каждого из которых есть свой сайт с виджетом и бот в Telegram. Конечные каналы общения подключены к омниканальной платформе Helpdeskeddy.
В качестве платформы для low-code создания бота и настройки интеграции с Helpdeskeddy была выбрана чат-бот платформа chatme.ai.
Интеграция с Helpdeskeddy
На платформе chatme.ai нет встроенного коннектора к Helpdeskeddy. Поэтому интеграция к Helpdeskeddy реализована внутри бота через HTTP-запросы, а на стороне Helpdeskeddy настроены правила отправки вебхуков. Интеграционные возможности конструктора платформы позволили быстро реализовать подобную интеграцию и в отсутствие встроенного коннектора.
Создание бота
На старте нам был предоставлен набор интентов и обучающие выборки для обучения NLU модуля, ответы бота на интенты, а также описание поведения бота при попадании в конкретные интенты. Обучающие выборки оставляли желать лучшего, но времени на их проработку было недостаточно, проект запускался в спешке. При этом, подрядчик понимал, что на старте будет все не очень хорошо с распознаванием, и мы сможем качественно дообучить чат-бота на реальных данных уже после запуска в продакшн.
Интент — намерение собеседника в сказанной боту реплике, которое тот должен распознать.
Половина интентов была одинакова у разных учреждений, а вторая половина была распределена по-разному. По договору мы не могли сделать 9 разных ботов с 9-ю разными NLU-моделями, которые в будущем пришлось бы отдельно поддерживать и дообучать. Было принято решение собрать единую NLU-модель и проверять, подходит ли определенный интент той организации, из которой пришел собеседник, и отправлять собеседника в фоллбек, если интент не соответствует учреждению.
Fallback — ветка сценария, отвечающая за поведение бота в случае если интент не распознан.
В процессе проектирования решили на уровне платформы разделить бота на две части (NLU бот и бот-коннектор), а также хранить ответы бота в Google таблице для быстрого доступа к редактированию текстовок.
Составляющие системы:
Простейший NLU бот, отвечающий на вопросы названием того интента, который он определил. Фактически этот бот является NLU-сервисом, в который можно по API отправить реплику собеседника и получить обратно название определенного интента. Возможности платформы позволили быстро собрать такого бота, используя таблицу Excel в качестве входного файла.
Бот-коннектор, содержащий в себе всю логику, связанную с интеграцией с Helpdeskeddy, и отправляющий HTTP-запросы в NLU бота для определения намерения собеседника.
Google таблица с ответами бота.
Такое решение позволило разделить работы над ботом на модули, в результате чего мы смогли:
Отдельно заниматься NLU ботом, собирать его с помощью инструмента генерации конфигурационных файлов из таблиц Excel, быстро менять обучающую выборку по необходимости.
Отдельно в другом сценарии работать со скриптовым сценарием (в некоторых интентах нужно было задать собеседнику уточняющие вопросы для более точного определения интента, а также проверить реплику через регулярные выражения для достижения той же цели), а также с интеграционной частью.
Хранить ответы бота в отдельной базе данных, при внесении изменений в которую ответы автоматически «подтягиваются» в бота.
Основной бот, содержащий скриптовую логику и интеграцию с Helpdeskeddy, имеет следующий алгоритм работы:
Получает по общему API chatme.ai запрос из Helpdeskeddy с новым сообщением.
По API Helpdeskeddy узнает, из какого учреждения пришел собеседник.
Проверяет реплику на один из триггеров автоматического подключения оператора:
Нецензурная лексика;
Сообщение > 120 символов.
Отправляет реплику собеседника в NLU бота через общий API chatme.ai. Получает в ответ название определенного интента.
Отправляет API-запрос в таблицу, в которой хранится соответствие учреждений, интентов и ответов. В ответ получает ответ на определенный интент для конкретного учреждения, из которого пришел собеседник.
В тех интентах, в которых, помимо текстового ответа, требовалось выполнение более сложного сценария (регулярные выражения, уточняющие вопросы), в ответе бота указана управляющая конструкция вида function < --regex5-- >, или, например, function < --regex_or_operator-- >.
При наличии подобной конструкции бот вырезает ее из ответа, отправляет ответ и делает сценарий, указанный в конструкции.
В случае если интент требует только текстовый ответ, бот отправляет его собеседнику через API Helpdeskeddy.
В процессе работы главной сложностью было спроектировать решение, которое позволит решить задачу быстро и не выйти за рамки определенного договором бюджета. Удалось уложиться в 5 рабочих дней.
Результаты
В среднем за первый месяц работы бот закрывал самостоятельно 33% обращений, (даже с учетом, что исходная обучающая выборка изначально была очень некачественная). Далее заказчик начал самостоятельно дообучать бота и смог добиться результатов распознавания даже выше, чем планировалось.