在聊天机器人中实现多会话支持

时间:2019-05-17 12:13:14

标签: python django chatbot django-channels rasa-nlu

我目前仅在python中实现Chatbot。

在我当前的实现中,每次用户从会话开始新的聊天时,都会启动另一个Chatbot实例,因此Chatbot从初始状态开始。

我希望改变这种行为,使其类似于在Facebook / Messenger上进行的聊天,在聊天中,您可以在会话之间无缝切换,同时聊天时不会出现不一致的情况。即,我想要这些属性:

  1. 如果用户从会话A中输入了任何内容,则应该在所有正在进行的会话中立即看到该用户。同样,Chatbot回复应立即在所有设备上可见。
  2. 所有会话均显示相同的聊天记录

要实现第一点,我使用了django-channels文档中的this example,并通过为每个用户创建单个组/聊天室对其进行了修改。来自同一用户的所有会话都连接到相同的组/聊天室,因此无论从何处发送邮件,都接收该组/聊天室中的所有消息。

但是,此实现当前存在一个错误。每次连接用户时,它都会初始化一个Chatbot实例,该实例再次从初始状态开始,而较旧的连接具有当前处于不同状态的Chatbot实例。

这会导致不一致的回复,具体取决于用户在哪个窗口中键入内容。

基本上,我们有两个会话与两个不同的Chatbot实例对话,而不是让两个会话与同一个Chatbot实例对话,并且来自这四个来源的消息都添加到了同一个聊天室中。

此外,我们通过每个用户保留多个Chatbot实例来浪费资源,而该实例随着当前活动会话的数量而增加。

我希望所有用户窗口都与同一个Chatbot实例进行交互。最好的实现方式是什么?

目前,我可以想到三种解决方案:

  1. 创建另一个Django项目Chatbot并向该HTTP服务器发出请求。 Chatbot状态在该服务器中维护,并且来自用户的任何请求都将转到相同的Chatbot实例。
    • 这对我来说很容易实现(只需启动另一个服务器)
    • 这自然解决了所有与状态有关的问题,因为所有实例都将查询同一个Chatbot对象
  2. 创建一个 Master 通道线程,该线程将保存实际的Chatbot实例(一个python对象),任何新的通道都将根据Chatbot的回复进行操作。
    • 实施起来会很复杂
    • 我将必须维护哪个线程是主线程,哪些线程是从线程
    • 在用户关闭主线程连接的情况下,我将不得不以某种方式将一个从属连接更改为一个主连接并传递整个对象(?!),或者至少传递状态变量并重新创建chatbot实例。
  3. 在python中为chatbot实例生成一个独立的线程/进程,并使所有通道连接都与该线程/进程通信。
    • 这对我来说很难实现,因为我目前不知道如何在python中进行IPC

还有其他解决方案吗?理想的解决方案是什么?

我正在使用以下技术:

  1. Django作为主要后端,其中Django Channels用于WebSockets
  2. RASA NLU用于聊天机器人的NLU组件,以及使用pytransitions实现的用于python中对话框管理的有限状态机模型

1 个答案:

答案 0 :(得分:0)

您是否看过rasa(Rasa Core + Rasa NLU)?如果使用的是Facebook messenger channel,则期望的行为是默认行为。