В настоящее время я использую Chatbot исключительно на python.
В моей текущей реализации каждый раз, когда пользователь запускает новый чат из сеанса, запускается другой экземпляр Chatbot и, следовательно, Chatbot запускается из исходного состояния..
Я хочу изменить это поведение и сделать его похожим, скажем, на чат в Facebook / Messenger, в котором вы можете без проблем перемещаться между сеансами во время чата без несоответствий.А именно, я хочу эти атрибуты:
- Если пользователь вводит что-либо из, скажем, сеанса А, это должно быть сразу видно во всех текущих сеансах.Точно так же ответ Chatbot должен быть виден сразу на всех устройствах.
- Чтобы все сеансы отображали одинаковую историю чата
Для реализации первого пункта я использовал в этом примере из документации django-channel и изменил ее, создав отдельную группу / чат для каждого пользователя.Все сеансы одного и того же пользователя подключаются к одной группе / чату и, следовательно, получают все сообщения в группе / чате независимо от того, откуда они были отправлены.
Однако в этой реализации в настоящее время есть ошибка.Каждый раз, когда пользователь подключается, он инициализирует экземпляр Chatbot, который снова запускается из исходного состояния, в то время как более старые подключения имеют экземпляры Chatbot, которые в данный момент находятся в другом состоянии.
Это приводит к противоречивым ответам, которые различаются в зависимости от того, в какое окно пользователь что-то набрал.
По сути, вместо того, чтобы два сеанса говорили с одним экземпляром Chatbot, у нас два сеанса говорят с двумяразличные экземпляры и сообщения Chatbot из всех этих четырех источников добавляются в один и тот же чат.
Более того, мы тратим ресурсы, сохраняя несколько экземпляров Chatbot на пользователя, которые увеличиваются с увеличением количества активных в данный момент сеансов.
Я хочу, чтобы все пользовательские окна взаимодействовали с одним и тем же экземпляром Chatbot.Как лучше всего это реализовать?
В настоящее время я могу придумать три решения:
- Создание другого проекта Django - Chatbot и выполнение запросов к этому HTTP-серверу.Состояние Chatbot поддерживается на этом сервере, и любой запрос от пользователя будет направляться в тот же экземпляр Chatbot.
- Для меня это просто реализовать (просто раскрутить другой сервер)
- Это естественным образом решает все проблемы, связанные с состоянием, поскольку все экземпляры будут запрашивать один и тот же объект Chatbot
- Создание потока канала Master , который будет содержать фактический экземпляр Chatbot (объект python), и любые новые каналы будут использовать его для ответа от Chatbot.
- Это будет сложно реализовать
- Мне нужно будет указать, какой поток является главным, а какие - подчиненными
- В ситуациях, когда пользователь закрывает соединение с главным потоком, я будукаким-то образом нужно изменить одно из подчиненных соединений на главное соединение и передать весь объект (?!) или, по крайней мере, передать переменную состояния и заново создать экземпляр chatbot.
- Spawn anнезависимый поток / процесс в python для экземпляра chatbot и все соединения канала общаются с этим потоком / процессом.
- Это будет трудно реализовать, поскольку в настоящее время я не знаю, как выполнить IPC в python
Возможны ли другие решения?Каким было бы идеальное решение?
Я использую следующие технологии:
- Django в качестве основного бэкэнда, с Django Channels для WebSockets
- RASA NLU для компонента NLU чат-бота и модели конечного автомата, реализованной с использованием pytransitions для управления диалогами в python