Autobot Instructions: Difference between revisions
No edit summary |
(→Версии) |
||
(7 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
При невозможности ответа (трудный вопрос, нецензурная лексика, ключевые слова типа «возврат денег», просьба вызвать оператора) ИИ создает и отправляет ответ со специальным признаком «отдать чат оператору». | При невозможности ответа (трудный вопрос, нецензурная лексика, ключевые слова типа «возврат денег», просьба вызвать оператора) ИИ создает и отправляет ответ со специальным признаком «отдать чат оператору». | ||
== Алгоритм == | |||
Таким образом, алгоритм работы связующей части ПО, реализующей объединение всех фреймворков (связующее ПО получило название «Автобот» в отличие от «Чатбота» - бот действует автоматически), выглядит так: | Таким образом, алгоритм работы связующей части ПО, реализующей объединение всех фреймворков (связующее ПО получило название «Автобот» в отличие от «Чатбота» - бот действует автоматически), выглядит так: | ||
Line 20: | Line 22: | ||
# Обработчик общей очереди(3) ответов бота либо помещает сообщения в базу LHC и обновляет окно чата (принудительно) или дополнительно вызывает оператора или вызывает оператора без помещения сообщения. Дополнительно отправляет уведомления в сокет (нужды фронта) и помещает дословный ответ бота в любом случае в специальную таблицу, недоступную для LHC, которая позволит увидеть история ответов бота даже пр принудительном удалении чата оператором. | # Обработчик общей очереди(3) ответов бота либо помещает сообщения в базу LHC и обновляет окно чата (принудительно) или дополнительно вызывает оператора или вызывает оператора без помещения сообщения. Дополнительно отправляет уведомления в сокет (нужды фронта) и помещает дословный ответ бота в любом случае в специальную таблицу, недоступную для LHC, которая позволит увидеть история ответов бота даже пр принудительном удалении чата оператором. | ||
# Сваггер имеет кроме указанных эндпойнотов еще те, которые потребны для нужд фронта (общим счетом около 10-ти). Работа фронта не рассматривается. | # Сваггер имеет кроме указанных эндпойнотов еще те, которые потребны для нужд фронта (общим счетом около 10-ти). Работа фронта не рассматривается. | ||
== Версии == | |||
# 1 версия Автобота была написана на чистом PHP для простого размещения любого ответа ИИ в чат. Версия работала в общем синхронном потоке, имела связь с LHC посредсвом поллинга базы на порт 3306. Как следствие работа чата была невозможна, версия была тестовой. Исходный код версии утрачен. | |||
# 2 версия написана на Laravel7 (исходный код доступен до сих пор). Сохранен поллинг базы (база грузится постоянными запросами) и работа в синхронном потоке для эндпойнтов. Введен простейший валидатор ответов. Фронт написан на внутреннем шаблонизаторе blade. У Автобота ведется собственная база для хранения ответов, что вынуждает приложению работать с двумя коннектами одновременно (не критично). Поскольку запросы обрабатываются синхронно, то связь с ИИ применена многопоточная (supervisor). Ограничения по потокам не предусмотрено, поэтому при повышении загрузки нагрузка на базу растет в геометрической прогрессии с индексом «два». Возможен перехлест событий. Эндпойнты обрабатываются на стороне бэка для уменьшения нагрузки на шаблонизатор. | |||
# 3 версия (активная) написана на Laravel8. Устранен поллинг базы — примена инжекция curl-запроса во внутренний код LHC, база разгружена полностью. Эндпойнт приема сообщений от LHC работает в синхронном режиме (возможны задержки при записи в таблицы). Расширены родительские таблицы базы (с префиксом lhc_), созданы таблицы только для Автобота (префикс ab_). Наличие только одного коннекта позволило в 2 раза сократить время записи ответов чатбота. Связь с ИИ по прежнему многопоточная (supervisor) с ограничением потоков до 10. По прежнему возможен перехлест событий, хотя вероятность их уменьшена до разумной величины. Веден сокет для уведомления фронта (к сожалению, фронт не пошел в прод) | |||
# 4 версия в разработке (база Symfony6+rabbitMQ+docker). Принципиальные отличия описаны выше и позволят устранить все недостатки предыдущих версий. Кардинальное отличие новой версии — все компоненты исполнены в микросервисной архитектуре (docker). Это позволит разворачивать приложение одной командой с последующим соединеним с внешними компонетами в течениее нескольких часов. Брокер очередей (rabbitMQ) имеет встроенный GUI, что позволяет следить онлайн за загрузкой очередей, созданием и удалением динамических компонентов. Альфа запланирована на середину августа, бета на середину сентября. На момент создания отчета сформировано ядро приложения и структура дополнительных таблиц, созданы миграции и основные классы, смоделированы работа ИИ, LHC и прослойки чатбота, полностью связаны все компоненты в цепочку обработки с эмуляцией работы оператора (задержка ответа) и пр. Ядро требует рефакторинга и перехода с аннотаций на атрибуты PHP8. | |||
Update 2024 | |||
4 версия в проде с мая 2023 года, перевелена на mysql8, добавлен модуль антиспама. По итогам 3-х периодов пиковых загрузок - реализация годная, антиспам не всегда спавляется с работой |
Latest revision as of 13:34, 20 May 2024
Описание
Для обратной связи пользователей сайтов группы Blooxex©K применяется свободный фреймворк LivehelperChat (далее LHC). Он по умолчанию интегрирован в заглавную страницу сайта продаж и опционально в остальные страницы
Операторы должны быть онлайн 24/7 и почти всегда отвечают на однотипные вопросы. Поэтому было принято решение создать комплекс ПО, позволяющий перехватывать из чатов поддержки вопросы и перенаправлять их в простейший ИИ для генерации ответов.
ИИ создан на базе IBM Watson и в данном документе не описывается. Необходимым и достаточным условием для его интеграции в комплекс ПО является наличие точки доступа (эндпойнта), при отравлении на которую сообщения определенного формата ИИ формирует и отправляет в ответ сообщение, пригодное для помещения в чат, как ответа оператора.
Точку доступа и валидность ответа обеспечивает программа на языке Python.
При невозможности ответа (трудный вопрос, нецензурная лексика, ключевые слова типа «возврат денег», просьба вызвать оператора) ИИ создает и отправляет ответ со специальным признаком «отдать чат оператору».
Алгоритм
Таким образом, алгоритм работы связующей части ПО, реализующей объединение всех фреймворков (связующее ПО получило название «Автобот» в отличие от «Чатбота» - бот действует автоматически), выглядит так:
- При создании нового чата пользователем сайта, или при написании им сообщения основной фреймворк LHC должен отправить на входной эндпойнт Автобота сообщение, несущее исчерпывающую информацию о создании сообщения или изменении состояния чата.
- Автобот при получении сообщения помещает его во входную очередь(1) для последующей обработки. Причины применения очереди — надо вынести обработку в асинхронный поток для сокращения до минимума времени ответа основному чату
- Обработчик (консьюмер) очереди(1) анализирует сообщение (валидация, проверка классов). При необходимости создает объект для помещения в сокет (нужды фронтенда). По окончании предварительной обработки проверяется наличие динамической очереди(2) (топика). При отсутствии очередь создается и в нее помещается валидное сообщение. Динамическая очередь(2) имеет префикс, совпадающий с id чата. Разбивка на динамические очереди очень важна, так как сообщения должны обрабатываться чатботом строго последовательно в пределах чата, но сообщения из разных чатов не должны блокировать друг друга. (Информация для разработчиков — при удалении чата оператором реализовано удаление динамической очереди. Риск неправильного удаления ничтожен и компенсируется возможностью повторного создания очереди).
- Для каждой динамической очереди(2) создается свой консьюмер, связанный с ней именной точкой обмена (эксчейндж). Данные сущности являются связью брокера rabbitMQ и Автобота. Собственно брокер с версии 4 является неотъемлемой частью Автобота. Консьюмер ожидает посылки сообщения из очереди (push). При получении сообщения формирует запрос в ИИ Watson и ожидает ответа. При получении ответа или истечению времени ожидания консьюмер закрывает соединение с именованной очередью(2) и вызывает валидатор контракта (существует контракт между Автоботом и Чатботом — наличие и содержание необходимых полей, наличие дополнительных полей, расшифровка значений информационных флагов). При отрицательной валидации вызывается «Dummy Bot» — класс Автобота, формирующий один стандартный ответ типа «Оставайтесь в чате, мы вызываем оператора» или что-то подобное и устанавливающий флаг статуса ответа «alarm» для скорейшего вызова оператора.
- При положительной валидации консьюмер динамической очереди(2) отправляет на внутренний эндпойнт запрос, фактически содержащий ответ ИИ. При отрицательной — заглушку от Dummy Bot. Таком образом, на эндпойнт всегда приходит валидный ответ. Класс обработки запроса помещает ответ в общую очередь(3) ответов бота. Это необходимо для освобождения консьюмера, который «держит» эндпойнт ИИ. В момент удержания ИИ не может принимать новые сообщения (для строго последовательной обработки сообщений).
- Обработчик общей очереди(3) ответов бота либо помещает сообщения в базу LHC и обновляет окно чата (принудительно) или дополнительно вызывает оператора или вызывает оператора без помещения сообщения. Дополнительно отправляет уведомления в сокет (нужды фронта) и помещает дословный ответ бота в любом случае в специальную таблицу, недоступную для LHC, которая позволит увидеть история ответов бота даже пр принудительном удалении чата оператором.
- Сваггер имеет кроме указанных эндпойнотов еще те, которые потребны для нужд фронта (общим счетом около 10-ти). Работа фронта не рассматривается.
Версии
- 1 версия Автобота была написана на чистом PHP для простого размещения любого ответа ИИ в чат. Версия работала в общем синхронном потоке, имела связь с LHC посредсвом поллинга базы на порт 3306. Как следствие работа чата была невозможна, версия была тестовой. Исходный код версии утрачен.
- 2 версия написана на Laravel7 (исходный код доступен до сих пор). Сохранен поллинг базы (база грузится постоянными запросами) и работа в синхронном потоке для эндпойнтов. Введен простейший валидатор ответов. Фронт написан на внутреннем шаблонизаторе blade. У Автобота ведется собственная база для хранения ответов, что вынуждает приложению работать с двумя коннектами одновременно (не критично). Поскольку запросы обрабатываются синхронно, то связь с ИИ применена многопоточная (supervisor). Ограничения по потокам не предусмотрено, поэтому при повышении загрузки нагрузка на базу растет в геометрической прогрессии с индексом «два». Возможен перехлест событий. Эндпойнты обрабатываются на стороне бэка для уменьшения нагрузки на шаблонизатор.
- 3 версия (активная) написана на Laravel8. Устранен поллинг базы — примена инжекция curl-запроса во внутренний код LHC, база разгружена полностью. Эндпойнт приема сообщений от LHC работает в синхронном режиме (возможны задержки при записи в таблицы). Расширены родительские таблицы базы (с префиксом lhc_), созданы таблицы только для Автобота (префикс ab_). Наличие только одного коннекта позволило в 2 раза сократить время записи ответов чатбота. Связь с ИИ по прежнему многопоточная (supervisor) с ограничением потоков до 10. По прежнему возможен перехлест событий, хотя вероятность их уменьшена до разумной величины. Веден сокет для уведомления фронта (к сожалению, фронт не пошел в прод)
- 4 версия в разработке (база Symfony6+rabbitMQ+docker). Принципиальные отличия описаны выше и позволят устранить все недостатки предыдущих версий. Кардинальное отличие новой версии — все компоненты исполнены в микросервисной архитектуре (docker). Это позволит разворачивать приложение одной командой с последующим соединеним с внешними компонетами в течениее нескольких часов. Брокер очередей (rabbitMQ) имеет встроенный GUI, что позволяет следить онлайн за загрузкой очередей, созданием и удалением динамических компонентов. Альфа запланирована на середину августа, бета на середину сентября. На момент создания отчета сформировано ядро приложения и структура дополнительных таблиц, созданы миграции и основные классы, смоделированы работа ИИ, LHC и прослойки чатбота, полностью связаны все компоненты в цепочку обработки с эмуляцией работы оператора (задержка ответа) и пр. Ядро требует рефакторинга и перехода с аннотаций на атрибуты PHP8.
Update 2024
4 версия в проде с мая 2023 года, перевелена на mysql8, добавлен модуль антиспама. По итогам 3-х периодов пиковых загрузок - реализация годная, антиспам не всегда спавляется с работой