我使用node-wit开发聊天机器人应用程序。 这主要是很好用的,但是我在使用上下文时遇到了问题。
我正在使用runActions api:
this.witClient.runActions(customer._key, messageText, witContext).then((newContext => {}
)).catch(reject);
我已经定义了许多设置上下文的操作。
这很好,只要上下文发生在一条消息上。 例如,如果我要调用名为addProduct的操作:
addProduct({sessionId, context, text, entities}) {
return new Promise((resolve, reject) => {
context.product = `myNewProduct';
resolve(context);
});
},
然后会使用'产品'上下文密钥。
然而,当我尝试使用它超过2条消息时,似乎已经丢失了上下文(例如,在询问多项选择问题,然后处理该响应时)。
如果我理解它是如何正常工作的,那么node-wit并不会将上下文保留在消息之外(我最初假设这是因为我传递会话密钥)。
我看到的解决方案是以会话/用户特定的方式存储结果上下文(在这种情况下为newContext),然后在用户发送新消息时将其恢复并再次传递。
含义,如下:
witContext = getContextFromSession();
this.witClient.runActions(customer._key,messageText,witContext).then((newContext => {setContextInSession(newContext)}
))赶上(拒绝);
这是处理它的正确方法吗?
答案 0 :(得分:0)
当然,您必须存储上下文状态,然后决定如何存储它。但是,如果你有很多用户,并且你的资源可用,那么考虑一下最有效的方法是什么。
正如您在nodeJs的官方示例中所看到的,https://github.com/wit-ai/node-wit/blob/master/examples/messenger.js上有一个名为findOrCreateSession的方法,它们会在调用机智动作之前获得会话。
在我的特定情况下,我将它存储在数据库中,所以我在调用操作之前得到会话,因此我可以发送上下文,然后在我再次查询会话的操作中修改结果上下文和存储再次,根据您的需求尝试最佳实施。