【问题标题】:How to throw a custom message using Dialogflow after three times of fallback三次回退后如何使用 Dialogflow 抛出自定义消息
【发布时间】:2018-02-13 12:55:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 您已经很好地解释了这一点,我认为这应该可行。谢谢!
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2017-02-28
    相关资源
    最近更新 更多