如何在三次回退后使用Dialogflow抛出自定义消息

时间:2018-02-13 12:55:09

标签: javascript bots google-cloud-functions chatbot dialogflow

我正在使用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中实现这样的事情吗?

1 个答案:

答案 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
});