在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']
。 下面的代码将解释这种简单性:
(不知何故,这是感觉像…不必编写用于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。
所以,这样你可以根据自己的状态询问每个学生的问题并回答他。
我已经完成了上述方式。
希望这会对你有所帮助。