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

Miz*_*lul 2 javascript bots chatbot google-cloud-functions dialogflow-es

我正在使用 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
        }

    }
},
Run Code Online (Sandbox Code Playgroud)

这会起作用,但是如果这对多个用户同时起作用,我想创建一个存储来存储由唯一 ID 附加的请求,并为每个请求设置不同的计数器!

您对在 Dialogflow 中实现这样的事情有什么更好的想法吗?

Pri*_*ner 6

这不会按照您设计的方式工作。不像你想的那样,但很接近。

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

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

您关于在数据库中保留一个计数器并针对用户进行键入的解决方案确实有意义。但对于这种需要,它是矫枉过正的。这对于对话之间保存数据很有用,但有更好的方法可以在同一个对话中保存信息。

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

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

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

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

通过“发送上下文”,我的意思是上下文将作为回复的一部分包含在内。因此,不是只向sendGoogleResponse()or发送一个字符串,而是sendResponse()发送一个包含speech属性和outputContexts属性的对象。像这样的东西:

var outputContexts = [
  {
    name: 'unknown_counter',
    lifespan: 1,
    parameters: {
      'val': counterValue,
    }
  }
];
sendResponse({
  speech: "I'm confused. What did you say?",
  outputContexts: outputContexts
});
Run Code Online (Sandbox Code Playgroud)