Chat bot Descriptions

From Bloomex Wiki
Jump to navigation Jump to search

Описание

Для обратной связи пользователей сайтов группы Blooxex©K применяется свободный фреймворк LivehelperChat (далее LHC). Он по умолчанию интегрирован в заглавную страницу сайта продаж и опционально в остальные страницы

Операторы должны быть онлайн 24/7 и почти всегда отвечают на однотипные вопросы. Поэтому было принято решение создать комплекс ПО, позволяющий перехватывать из чатов поддержки вопросы и перенаправлять их в простейший ИИ для генерации ответов.

ИИ создан на базе IBM Watson и в данном документе не описывается. Необходимым и достаточным условием для его интеграции в комплекс ПО является наличие точки доступа (эндпойнта), при отравлении на которую сообщения определенного формата ИИ формирует и отправляет в ответ сообщение, пригодное для помещения в чат, как ответа оператора.

Точку доступа и валидность ответа обеспечивает программа на языке Python.

При невозможности ответа (трудный вопрос, нецензурная лексика, ключевые слова типа «возврат денег», просьба вызвать оператора) ИИ создает и отправляет ответ со специальным признаком «отдать чат оператору».

Алгоритм

Photo 2022-12-29 11-54-58.jpg
Photo 2022-12-29 11-54-52.jpg


Таким образом, алгоритм работы связующей части ПО, реализующей объединение всех фреймворков (связующее ПО получило название «Автобот» в отличие от «Чатбота» - бот действует автоматически), выглядит так:

  1. При создании нового чата пользователем сайта, или при написании им сообщения основной фреймворк LHC должен отправить на входной эндпойнт Автобота сообщение, несущее исчерпывающую информацию о создании сообщения или изменении состояния чата.
  2. Автобот при получении сообщения помещает его во входную очередь(1) для последующей обработки. Причины применения очереди — надо вынести обработку в асинхронный поток для сокращения до минимума времени ответа основному чату
  3. Обработчик (консьюмер) очереди(1) анализирует сообщение (валидация, проверка классов). При необходимости создает объект для помещения в сокет (нужды фронтенда). По окончании предварительной обработки проверяется наличие динамической очереди(2) (топика). При отсутствии очередь создается и в нее помещается валидное сообщение. Динамическая очередь(2) имеет префикс, совпадающий с id чата. Разбивка на динамические очереди очень важна, так как сообщения должны обрабатываться чатботом строго последовательно в пределах чата, но сообщения из разных чатов не должны блокировать друг друга. (Информация для разработчиков — при удалении чата оператором реализовано удаление динамической очереди. Риск неправильного удаления ничтожен и компенсируется возможностью повторного создания очереди).
  4. Для каждой динамической очереди(2) создается свой консьюмер, связанный с ней именной точкой обмена (эксчейндж). Данные сущности являются связью брокера rabbitMQ и Автобота. Собственно брокер с версии 4 является неотъемлемой частью Автобота. Консьюмер ожидает посылки сообщения из очереди (push). При получении сообщения формирует запрос в ИИ Watson и ожидает ответа. При получении ответа или истечению времени ожидания консьюмер закрывает соединение с именованной очередью(2) и вызывает валидатор контракта (существует контракт между Автоботом и Чатботом — наличие и содержание необходимых полей, наличие дополнительных полей, расшифровка значений информационных флагов). При отрицательной валидации вызывается «Dummy Bot» — класс Автобота, формирующий один стандартный ответ типа «Оставайтесь в чате, мы вызываем оператора» или что-то подобное и устанавливающий флаг статуса ответа «alarm» для скорейшего вызова оператора.
  5. При положительной валидации консьюмер динамической очереди(2) отправляет на внутренний эндпойнт запрос, фактически содержащий ответ ИИ. При отрицательной — заглушку от Dummy Bot. Таком образом, на эндпойнт всегда приходит валидный ответ. Класс обработки запроса помещает ответ в общую очередь(3) ответов бота. Это необходимо для освобождения консьюмера, который «держит» эндпойнт ИИ. В момент удержания ИИ не может принимать новые сообщения (для строго последовательной обработки сообщений).
  6. Обработчик общей очереди(3) ответов бота либо помещает сообщения в базу LHC и обновляет окно чата (принудительно) или дополнительно вызывает оператора или вызывает оператора без помещения сообщения. Дополнительно отправляет уведомления в сокет (нужды фронта) и помещает дословный ответ бота в любом случае в специальную таблицу, недоступную для LHC, которая позволит увидеть история ответов бота даже пр принудительном удалении чата оператором.
  7. Сваггер имеет кроме указанных эндпойнотов еще те, которые потребны для нужд фронта (общим счетом около 10-ти). Работа фронта не рассматривается.

Версии

  1. 1 версия Автобота была написана на чистом PHP для простого размещения любого ответа ИИ в чат. Версия работала в общем синхронном потоке, имела связь с LHC посредсвом поллинга базы на порт 3306. Как следствие работа чата была невозможна, версия была тестовой. Исходный код версии утрачен.
  2. 2 версия написана на Laravel7 (исходный код доступен до сих пор). Сохранен поллинг базы (база грузится постоянными запросами) и работа в синхронном потоке для эндпойнтов. Введен простейший валидатор ответов. Фронт написан на внутреннем шаблонизаторе blade. У Автобота ведется собственная база для хранения ответов, что вынуждает приложению работать с двумя коннектами одновременно (не критично). Поскольку запросы обрабатываются синхронно, то связь с ИИ применена многопоточная (supervisor). Ограничения по потокам не предусмотрено, поэтому при повышении загрузки нагрузка на базу растет в геометрической прогрессии с индексом «два». Возможен перехлест событий. Эндпойнты обрабатываются на стороне бэка для уменьшения нагрузки на шаблонизатор.
  3. 3 версия (активная) написана на Laravel8. Устранен поллинг базы — примена инжекция curl-запроса во внутренний код LHC, база разгружена полностью. Эндпойнт приема сообщений от LHC работает в синхронном режиме (возможны задержки при записи в таблицы). Расширены родительские таблицы базы (с префиксом lhc_), созданы таблицы только для Автобота (префикс ab_). Наличие только одного коннекта позволило в 2 раза сократить время записи ответов чатбота. Связь с ИИ по прежнему многопоточная (supervisor) с ограничением потоков до 10. По прежнему возможен перехлест событий, хотя вероятность их уменьшена до разумной величины. Веден сокет для уведомления фронта (к сожалению, фронт не пошел в прод)
  4. 4 версия в разработке (база Symfony6+rabbitMQ+docker). Принципиальные отличия описаны выше и позволят устранить все недостатки предыдущих версий. Кардинальное отличие новой версии — все компоненты исполнены в микросервисной архитектуре (docker). Это позволит разворачивать приложение одной командой с последующим соединеним с внешними компонетами в течениее нескольких часов. Брокер очередей (rabbitMQ) имеет встроенный GUI, что позволяет следить онлайн за загрузкой очередей, созданием и удалением динамических компонентов. Альфа запланирована на середину августа, бета на середину сентября. На момент создания отчета сформировано ядро приложения и структура дополнительных таблиц, созданы миграции и основные классы, смоделированы работа ИИ, LHC и прослойки чатбота, полностью связаны все компоненты в цепочку обработки с эмуляцией работы оператора (задержка ответа) и пр. Ядро требует рефакторинга и перехода с аннотаций на атрибуты PHP8.

Update 2024

4 версия в проде с мая 2023 года, перевелена на mysql8, добавлен модуль антиспама. По итогам 3-х периодов пиковых загрузок - реализация годная, антиспам не всегда спавляется с работой