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

How to throw a custom message using Dialogflow after three times of fallback

我正在使用 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 中实现这样的事情,您有更好的想法吗?

这不会按照您设计的方式工作。不完全是你想的原因,但接近。

您没有显示其余代码(没关系),但 counter 变量可能位于每次处理消息时都会调用的函数中。当该函数完成时, counter 变量超出范围 - 它丢失了。同时进行多个调用并不是真正的问题,因为每个调用都有不同的范围(我忽略了一些技术细节,但这应该足够好了)。

一个解决方案是您可以将变量存储在全局上下文中——但是您确实会遇到多个用户最终使用同一个计数器的问题。那是非常非常糟糕的。

关于在数据库中保留一个针对用户的计数器的解决方案确实有意义。但是对于这个需求,就有点大材小用了。它对于在 对话之间保存数据很有用,但是在 相同 对话期间有更好的方法来保存信息。

最简单的解决方案是使用 Dialogflow Context。上下文让您可以在同一会话在同一对话期间以及针对从用户收到的特定数量的消息(生命周期)保存状态。

在这种情况下,最好创建一个名为 unknown_counter 且生命周期为 1 的上下文。在参数中,您可以将 val 设置为 1。

生命周期为 1 意味着您只会在下次调用 webhook 时看到此上下文。如果他们通过其他一些 Intent 来处理它(即 - 你理解他们),那么上下文将在你的履行运行后消失。

但是如果您的 input.unknown 处理程序再次被调用,那么您会看到上下文在那里以及值是什么。如果它不满足阈值,再次发送上下文(再次使用 1 的生命周期),但值增加 1。如果它确实满足阈值 - 你会回复一些其他答案并关闭连接.

"send the context" 我的意思是上下文将作为回复的一部分包含在内。因此,不是只向 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
});