如何使用 fulfillment 返回开始等待 Dialogflow 中的新输入文本?

How to back to start wait new input-text in Dialogflow by using fulfillment?

大家好,

我对 Dialogflow 中的控制流有疑问。是否可以完全控制 Dialogflow?

下面是我的 Dialogflow 流程。

  1. 我创建了 'Intent1' -> 等待有关 'Document Type' 的用户输入,例如 'Document No.1' 或 'Document No.2',等等...
  2. 我创建了 'Intent2' -> 这是 'Intent1' 的后续意图。它获取用户输入(训练短语),例如 'Document No.1' 或 'Document No.2' 等。此 'Intent2' 已为获取 'Document Type' 创建参数,例如 'No.1' 或 'No.2' 来自用户输入。
  3. 我也为 'Intent2' 创建了实现 'Inline'。在用户输入 'No.1' 或 'No.2' 等之后。我用我的 Firebase 实时数据库检查参数值。然后 return 向用户发送结果消息,等待用户使用 ...
  4. 进行下一次输入

agent.add("...some phrase...");

我想知道,是否可以完全控制 Dialogflow?

Such as, if I check 'No.3' does not in by Database, may I send message "It is not in database" and force process back to 'Intent1'.

But if 'No.1' is in my Database, may I send message "Please input time to get it?" to user and wait user input at 'Intent3' (follow-up intent of 'Intent2').

我尝试搜索解决指南但没有找到。

提前致谢

使用 Firebase 检索数据

当使用 firebase 为您的 dialogflow 代理检索数据时,尽量不要在您的数据库中包含任何“业务逻辑”。相反,查询数据库,在您的应用程序代码中获取结果(对于此示例 内联实现 ),并在那里设置您的逻辑(即结果是返回 null 还是非 null,具体取决于on 如果它存在于数据库中)。现在,让我们回到您面临的问题。

实施解决方案

首先,您应该使用如下所示的代码来设置 Dialogflow 和 Firebase 之间的连接。

const admin = require('firebase-admin');
admin.initializeApp({
    credential: admin.credential.applicationDefault(),
    databaseURL: 'ws://project_name.firebaseio.com/'
});

If you have issues with respect to using firebase-admin, you will need greater permission and check out .

接下来,当您的用户对代理说 Document Type 时,您将根据从用户那里提取的内容查询数据库。此提取存储在您在控制台中创建 parameters 时命名的变量中。您可以将此变量命名为任何名称;我将调用这个提取的参数 userType。内联实现代码如下:

function getDoc(agent){
    // userType is what the user responded to you
    const response = agent.parameters.userType;
    return admin.database().ref('data').once('value').then((snapshot) => {
        const type = snapshot.child(response).val();// response is variable so no quotes
        if(type!== null){
            agent.add(`You chose Document type ${type}`);
        }
        else{
            // type == null indicating the type doesn't exist in the database
            agent.add('You gave an invalid type');
        }
    });
}

如果用户对代理说的 Document Type 存在于您的数据库中,那么上面我调用的变量 type 将是某个值(非空)。如果为空,则用户请求的内容不在数据库中,您可以向用户提示一条消息作为跟进,例如“您的输入无效。”

在您的示例中,如果用户要求第 3 位,则 response 将引用 No. 3,而 type 将为空。表明 No. 3 不是您的数据库。

资源:

  • Video 作者 Axle Web Technologies 关于将 Dialogflow 连接到 Firebase 的工作流程和语法(强烈推荐)
  • Accessing parameters 来自 fulfillment,来自 GCP Quickstart
  • Get data 使用 Firebase,来自 Firebase 文档