В данном проекте перед нами стояла задача – с помощью чат-бота разгрузить КЦ, а также оперативно и качественно отвечать на вопросы студентов и школьников группы образовательных организаций. В группе состоят 9 образовательных учреждений, у каждого из которых есть свой сайт с виджетом и бот в Telegram. Конечные каналы общения подключены к омниканальной платформе Helpdeskeddy. В качестве платформы для low-code создания бота и настройки интеграции с Helpdeskeddy была выбрана чат-бот платформа chatme.ai. На платформе 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% обращений, (даже с учетом, что исходная обучающая выборка изначально была очень некачественная). Далее заказчик начал самостоятельно дообучать бота и смог добиться результатов распознавания даже выше, чем планировалось.