在Facebook机器人聊天中存储用户答案的​​最佳方式?

使用Claudia JS构buildFacebook messenger bot并计划在AWS Lambda上托pipe。

我想问用户一系列的问题。

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

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

我正在考虑一些caching层,如redis,但因为它存储在RAM中,所以当lamda服务器closures时,我将丢失它。 Mongodb在连接时显然有很多开销,但至less会持久。

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

其他人怎么做呢? 我觉得有一个简单的解决scheme,我错过了。

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

有了我的特别的“路线图”,我决定和Mongo一起在处理用户“对象”时采用更“OOP”的风格,而不必明确定义用户类,这要归功于Mongo的规范化结构。 我理解也可以为MySQL做同样的事情,只是处理json数据对我来说更像是“对象”,也就是说, user = getUserFromMongo ,它给了我一个Python代码,然后我可以做user['first_name'] 。 下面的代码将解释这种简单性:

与MongoDB进行交互 (不知何故,这是感觉像…不必编写用于Rails简单数据库交互的SQL命令)

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

最后,关于如何pipe理用户input ,我采用了Wit.ai的context概念。 我不知道他们是如何做到的,但是对我来说,一种context是正在进行的谈话目的。 我使用它像一个堆栈,一旦当前的上下文完成,popup它的用户的上下文数据。 对于机器人接收到的每条消息,程序将获取当前的上下文并引导stream程。 每当发生未知错误(exception处理)时,很可能是因为用户说了一些bot不理解的东西,我也清除了context数据。

关于MongoDB的好处在于,我可以根据需要调整context ,并将其作为一个对象来对待。 一个简单的{name: yelp-search, stage:ask-for-user-location}就是{name: yelp-search, stage:ask-for-user-location} ,我想也可以在这个结构上构build复杂的。 当然, context的栈实现并不能处理复杂的过去引用的对话。

如果你想看看,我把我的项目放在Github上。

我也使用mysql的chatbot,但我已经使用NodeJS的后端应用程序。对于该模块将是非常有用的。

您需要存储用户的问题答案会话的当前状态 ,并存储来自用户的答案本身 ,您需要进行切换或if-else-if基于其状态作为开关(状态)向用户提问的情况并且在切换的情况下只是更新它的状态。 你在chatbot的事件对象中有用户的facebook-id,这样你就可以将每个用户的数据分别存储在不同的表中。

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

用户的状态将在开始时为1,因此只要问他一个问题1,并将其存储为答案1,您可以通过它的状态检查来做到这一点,并在此更新状态之后为2。

所以,这样你可以根据自己的状态询问每个学生的问题并回答他。

我已经完成了上述方式。

希望这会对你有所帮助。