我将首先回答关于我如何做的部分:我正在使用 MongoDB。我玩弄了你提到的想法,但出于同样的原因很快就删除了内存解决方案(Memcached、Redis)。我的最终解决方案归结为关系数据库或像 MongoDB 这样的 noSQL。老实说,在我的项目规模上,我没有考虑过稳健地比较数据库类型之间的性能。
借助我的特殊功能“路线图”,我决定使用 Mongo 在处理用户“对象”时采用更“OOP”的风格,而无需显式定义用户类,这要归功于 Mongo 的规范化结构。我知道 MySQL 也可以这样做,只是处理json
数据对我来说更像“对象” flask
,即user = getUserFromMongo
,这给了我一个 Python 中的 dict,然后我就可以做user['first_name']
。下面的代码将解释这种简单性:
(不知何故,这感觉就像......不必为 Rails 中的简单数据库交互编写 SQL 命令)
我在 MongoDB 上的用户对象数据

最后,关于如何管理用户输入,我采用了 Wit.ai 的概念context
。我不知道他们到底是怎么做的,但context
对我来说,这是正在进行的对话目的类型。我像堆栈一样使用它,一旦当前上下文完成,就将其从用户的上下文数据中弹出。对于机器人收到的每条消息,程序将获取当前上下文并引导流程。每当发生未知错误(异常处理)时,很可能是因为用户说出了机器人不理解的内容,我context
也会清除数据。
MongoDB 的优点在于我可以context
随心所欲地塑造它,并将其视为一个对象。一个简单的就像{name: yelp-search, stage:ask-for-user-location}
,我想复杂的也可以建立在这个结构上。当然,堆栈实现context
不处理具有复杂过去引用的复杂对话。
如果您想看一下,我将我的项目放在 Github上。