4

使用 Claudia JS 构建 Facebook Messenger 机器人并计划在 AWS Lambda 上托管。

我想问用户一系列问题。

当用户回复答案时,我需要将其保存以备后用,一旦获得所需的所有信息,我会将答案传递给函数。

保存此信息的最佳方法是什么?

我在考虑一些缓存层,例如 redis,但是因为它存储在 RAM 中,所以当 lamda 服务器关闭时我会丢失它。Mongodb 在连接时显然有很多开销,但至少会持久。

也许只是一个简单的 mySQL 服务器?

其他人是怎么做到的?我觉得我缺少一个简单的解决方案。

4

2 回答 2

6

我将首先回答关于我如何做的部分:我正在使用 MongoDB。我玩弄了你提到的想法,但出于同样的原因很快就删除了内存解决方案(Memcached、Redis)。我的最终解决方案归结为关系数据库或像 MongoDB 这样的 noSQL。老实说,在我的项目规模上,我没有考虑过稳健地比较数据库类型之间的性能。

借助我的特殊功能“路线图”,我决定使用 Mongo 在处理用户“对象”时采用更“OOP”的风格,而无需显式定义用户类,这要归功于 Mongo 的规范化结构。我知道 MySQL 也可以这样做,只是处理json数据对我来说更像“对象” flask,即user = getUserFromMongo,这给了我一个 Python 中的 dict,然后我就可以做user['first_name']。下面的代码将解释这种简单性:

与 MongoDB 交互 (不知何故,这感觉就像......不必为 Rails 中的简单数据库交互编写 SQL 命令)

我在 MongoDB 上的用户对象数据 用户

最后,关于如何管理用户输入,我采用了 Wit.ai 的概念context。我不知道他们到底是怎么做的,但context对我来说,这是正在进行的对话目的类型。我像堆栈一样使用它,一旦当前上下文完成,就将其从用户的上下文数据中弹出。对于机器人收到的每条消息,程序将获取当前上下文并引导流程。每当发生未知错误(异常处理)时,很可能是因为用户说出了机器人不理解的内容,我context也会清除数据。

MongoDB 的优点在于我可以context随心所欲地塑造它,并将其视为一个对象。一个简单的就像{name: yelp-search, stage:ask-for-user-location},我想复杂的也可以建立在这个结构上。当然,堆栈实现context不处理具有复杂过去引用的复杂对话。

如果您想看一下,我将我的项目放在 Github上。

于 2016-09-15T20:17:19.213 回答
3

我也将mysql 用于聊天机器人,但我将NodeJS用于后端应用程序。对于那个mysql模块将非常有帮助。

您需要为问答会话存储用户的当前状态,还需要存储来自用户的答案本身,并且您需要根据用户的状态作为 switch(state) 进行切换或 if-else-if 案例以向用户提问并且在切换的情况下只需更新它的状态。并且您在聊天机器人的事件对象中拥有用户的 facebook-id,以便您可以将每个用户的数据及其状态和问题答案单独存储在不同的表中。

例如定义标志{1,2,3}

用户的状态在开始时将为 1,因此仅向他询问问题 1,并将其存储为答案 1,您可以通过状态检查来执行此操作,然后将状态更新为 2。

因此,通过这种方式,您可以根据每个学生的状态询问每个学生的问题并回答他。

我以上述方式做了同样的事情。

希望这对您有所帮助。

于 2016-09-16T09:38:53.547 回答