我正在使用Dialogflow开发一个聊天机器人,当聊天机器人连续三次不理解用户输入并且第四次用自定义消息(不是其中一个)响应时,我想向用户发送消息对话框界面上声明的选项)
我的一个想法是在输入未知操作中制作一个计数器,如下所示:
var counter = 1;
// The default fallback intent has been matched, try to recover (https://dialogflow.com/docs/intents#fallback_intents)
'input.unknown': () => {
// Use the Actions on Google lib to respond to Google requests; for other requests use JSON
if (requestSource === googleAssistantRequest) {
sendGoogleResponse('I\'m having trouble, can you try that again?'); // Send simple response to user
} else {
if (counter == 3) {
counter = 1;
sendResponse('Custom message');
} else {
counter++;
sendResponse('I\'m having trouble, can you try that again?'); // Send simple response to user
}
}
},
这样可行,但如果这对多个用户同时有用,我想创建一个存储空间,用于存储由唯一ID附加的请求,并为每个请求设置不同的计数器!
你有更好的想法在Dialogflow中实现这样的事情吗?
答案 0 :(得分:4)
这不会像你设计的那样有效。不是因为你认为的原因,而是接近。
您没有显示其余的代码(没关系),但counter
变量可能在每次处理消息时调用的函数中。当该函数完成时,counter
变量超出范围 - 它将丢失。同时进行多个呼叫并不会成为一个问题,因为每个呼叫都有不同的范围(我正在掩盖一些技术细节,但这应该足够好了。)
一个解决方案是您可以将变量存储在全局上下文中 - 但是您确实遇到了多个用户以同一个计数器结束的问题。这非常糟糕。
关于将计数器保存在数据库中的解决方案,对用户起了作用,确实有意义。但是对于这种需要,它是过度的。它对于在对话之间保存数据很有用,但在相同的对话期间有更好的方法来保存信息。
最简单的解决方案是使用Dialogflow Context。通过上下文,您可以在同一个会话中调用webhook履行和从用户收到的特定数量的消息(生命周期)之间保存状态。
在这种情况下,最好是创建一个名为unknown_counter
的上下文,其生命周期为1.在参数中,您可以将val
设置为1。
1的生命周期意味着您只会在下次调用webhook时看到此上下文。如果他们通过其他一些意图处理它(即 - 你理解它们),那么在你的履行运行之后上下文就会消失。
但是,如果再次调用input.unknown处理程序,那么您将看到上下文存在且值是什么。如果它不符合阈值,再次发送上下文(生命周期为1),但值增加1.如果它确实达到阈值 - 您将回复其他一些答案并关闭连接
通过“发送上下文”,我的意思是上下文将作为回复的一部分包含在内。因此,您不会仅向sendGoogleResponse()
或sendResponse()
发送字符串,而是发送包含speech
属性和outputContexts
属性的对象。像这样:
var outputContexts = [
{
name: 'unknown_counter',
lifespan: 1,
parameters: {
'val': counterValue,
}
}
];
sendResponse({
speech: "I'm confused. What did you say?",
outputContexts: outputContexts
});