【问题标题】:calling intents created in dialogFlow console在 dialogFlow 控制台中创建的调用意图
【发布时间】:2018-10-02 12:57:16
【问题描述】:

由于我是 dialogFlow 编码的新手,我对在控制台 DialogFlow 中创建的意图几乎没有疑问。

1) 如果我在 dialogFlow 控制台中创建了一个意图“intent1”,是否可以在 firebase 函数中调用此意图?如果可以,该怎么做?

2) 如何让用户选择选项而不是打字?我必须为此使用什么?

3) 如何配置用户输入号码时调用的intent?

4) 实体、事件、动作和参数的目的是什么?

【问题讨论】:

    标签: firebase google-cloud-firestore google-cloud-functions actions-on-google dialogflow-es


    【解决方案1】:

    我对 Actions on Google 编程还有些陌生,但这是我的理解。

    Dialogflow 允许您定义意图。然后,您可以定义代码来实现这些意图。该控制台为 Google Cloud Functions 提供了一个内联 JavaScript 编辑器。您可以转到 Google 云函数控制台并查看那里的代码。或者,如果您想部署更复杂的代码(例如,将 JavaScript 拆分为多个文件 - 内置编辑器仅适用于单个 index.js 文件),您可以将其翻转为“Web 实现”。

    因此,dialogflow 接受人工输入(他们说的一个短语),针对不同的意图查看训练短语集,然后选择它认为正确的短语。然后它调用该意图的实现代码(代码存储在 firebase 中)。因此,当您问“是否可以在 firebase 函数中调用此意图”时,感觉有点倒退。 Intent 是用户说话和调用 firebase 函数(通过 HTTP)之间的粘合剂。 Intent 本身并不是可以调用的代码。

    如果您希望用户选择选项,您可以使用选项名称(如“一”、“二”、“三”等)创建一个实体,或者为每个选项名称创建意图。当用户说“一”时会触发“一”意图。由您的应用程序代码来了解用户在菜单浏览结构中的位置以了解“一”的含义。 (您还可以在带屏幕的设备上使用建议,向他们展示他们必须点击的选项。)理想情况下,您应该允许用户说出短语或数字,以提供更大的灵活性。

    所以您的第三个问题(如何配置在用户键入数字时调用的意图),您的应用程序可能会执行一些操作,例如从默认的“欢迎”意图(起点)开始。你会口头上说菜单选项“说一个用于家居用品,两个用于服装,三个用于鞋子,......”。然后,您会记住用户在菜单中的位置。然后,您将“一个”连接为一个意图,并在云功能中检查用户正在使用哪个菜单,因此会知道“在欢迎意图之后,“一个”表示家居用品”。然后,该应用程序可能会询问第二个问题,例如“说一个家具,两个花瓶,三个迪斯科舞会……”。如果他们再次说“一个”,它会达到相同的意图,但您的应用会保存一个变量来跟踪用户在菜单树中的位置。

    实体允许您定义术语词汇表。例如。 “我想买一个 ${color} ${thing}”。您可以定义一个颜色实体,其值为“red”、“green”、“blue”等。您可以定义“dress”、“hat”、“shoes”等第二个实体。意图训练短语可能是“I想买一件红色的衣服”。 Dialogflow 可以在该训练句子中被告知“红色”是“颜色”实体,而“衣服”是“事物”实体。然后将这些值作为参数传递给支持实现的 Web 服务 - 也就是说,您的“购买”意图将获得“颜色”和“事物”参数。

    事件是系统生成的触发器,而不是用户输入触发器。例如,启动您的应用程序的“欢迎”意图是系统生成事件。当应用程序从一个设备移动到另一个设备时,使用另一个事件。如果您请求开始使用推送通知的权限,还有其他系统事件。这是一种让您的代码在发生某些事情时运行的方法(不仅仅是当用户说某事时)。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您可以通过事件直接调用一个意图,也可以通过 API 发送请求,让该意图被引擎自动匹配。按照the SDK documentation here 上的说明进行操作。但本质上你所做的是:

      const dialogflow = require('dialogflow');
      const sessionClient = new dialogflow.SessionsClient();
      // Define session path
      const sessionPath = sessionClient.sessionPath(projectId, sessionId);
      
      const r_text = "What's the weather like in Rio de Janeiro?"
      
      // The text query request.
      const request = {
        "session": sessionPath,
        "queryParams": {
          "payload": payload
        },
        "queryInput": {
          "text": {
            "text": r_text,
            "languageCode": languageCode,
          },
        },
      };
      
      return sessionClient
      .detectIntent(request)
      .then(responses => {
        console.log('Detected intent');
        const result = responses[0].queryResult;
        ...do stuff with responses...
        return Promise.resolve('Resolved intent');
      })
      if (result.intent) {
        console.log(`  Intent: ${result.intent.displayName}`);
        return Promise.resolve('Resolved intent');
      } else {
        console.log(`  No intent matched.`);
        return Promise.resolve('Not resolved intent');
      }
      

      此外,在定义您的有效负载时,请注意一个小烦人的错误(这让我花了几天的时间)并将您的 JSON 转换为 API 期望接收的结构:

      const payload = structjson.jsonToStructProto({
        "user": userId,
        "location": r_location,
        "timestamp": r_timestamp,
        "sender": r_sender
      })
      

      您可以在 Google 的存储库中找到 structjson library

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2023-02-08
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多