Реализация поддержки нескольких сессий в чат-боте - PullRequest
0 голосов
/ 17 мая 2019

В настоящее время я использую Chatbot исключительно на python.

В моей текущей реализации каждый раз, когда пользователь запускает новый чат из сеанса, запускается другой экземпляр Chatbot и, следовательно, Chatbot запускается из исходного состояния..

Я хочу изменить это поведение и сделать его похожим, скажем, на чат в Facebook / Messenger, в котором вы можете без проблем перемещаться между сеансами во время чата без несоответствий.А именно, я хочу эти атрибуты:

  1. Если пользователь вводит что-либо из, скажем, сеанса А, это должно быть сразу видно во всех текущих сеансах.Точно так же ответ Chatbot должен быть виден сразу на всех устройствах.
  2. Чтобы все сеансы отображали одинаковую историю чата

Для реализации первого пункта я использовал в этом примере из документации django-channel и изменил ее, создав отдельную группу / чат для каждого пользователя.Все сеансы одного и того же пользователя подключаются к одной группе / чату и, следовательно, получают все сообщения в группе / чате независимо от того, откуда они были отправлены.

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

Это приводит к противоречивым ответам, которые различаются в зависимости от того, в какое окно пользователь что-то набрал.

По сути, вместо того, чтобы два сеанса говорили с одним экземпляром Chatbot, у нас два сеанса говорят с двумяразличные экземпляры и сообщения Chatbot из всех этих четырех источников добавляются в один и тот же чат.

Более того, мы тратим ресурсы, сохраняя несколько экземпляров Chatbot на пользователя, которые увеличиваются с увеличением количества активных в данный момент сеансов.

Я хочу, чтобы все пользовательские окна взаимодействовали с одним и тем же экземпляром Chatbot.Как лучше всего это реализовать?

В настоящее время я могу придумать три решения:

  1. Создание другого проекта Django - Chatbot и выполнение запросов к этому HTTP-серверу.Состояние Chatbot поддерживается на этом сервере, и любой запрос от пользователя будет направляться в тот же экземпляр Chatbot.
    • Для меня это просто реализовать (просто раскрутить другой сервер)
    • Это естественным образом решает все проблемы, связанные с состоянием, поскольку все экземпляры будут запрашивать один и тот же объект Chatbot
  2. Создание потока канала Master , который будет содержать фактический экземпляр Chatbot (объект python), и любые новые каналы будут использовать его для ответа от Chatbot.
    • Это будет сложно реализовать
    • Мне нужно будет указать, какой поток является главным, а какие - подчиненными
    • В ситуациях, когда пользователь закрывает соединение с главным потоком, я будукаким-то образом нужно изменить одно из подчиненных соединений на главное соединение и передать весь объект (?!) или, по крайней мере, передать переменную состояния и заново создать экземпляр chatbot.
  3. Spawn anнезависимый поток / процесс в python для экземпляра chatbot и все соединения канала общаются с этим потоком / процессом.
    • Это будет трудно реализовать, поскольку в настоящее время я не знаю, как выполнить IPC в python

Возможны ли другие решения?Каким было бы идеальное решение?

Я использую следующие технологии:

  1. Django в качестве основного бэкэнда, с Django Channels для WebSockets
  2. RASA NLU для компонента NLU чат-бота и модели конечного автомата, реализованной с использованием pytransitions для управления диалогами в python

1 Ответ

0 голосов
/ 19 июня 2019

Вы смотрели на rasa (Rasa Core + Rasa NLU)?Требуемое поведение является поведением по умолчанию, если используется канал сообщений Facebook .

...