使用多语音库在 VUI 的 Dialogflow 中配置重复意图

Use multivocal libary to configure repeat intent in Dialogflow for VUI

我正在尝试将我的 VUI 配置为在出现提示时在 Dialogflow 中重复一个句子。小故事,我正在帮助开发一个老年人社交机器人,所以重复一句话是一个非常需要的功能。我刚刚开始这个项目,负责这个项目的前任开发人员已经离开并且联系不上,而且,我没有 Node.js.

方面的经验

我希望为此使用 multivocal。这些是我到目前为止完成的步骤:

  1. 创建了一个名为 'Repeat' 的意图。
  2. 为意图添加了训练短语
  3. 已添加 'multivocal.repeat' 作为操作
  4. 为此意图启用 webhook 调用
  5. 在Node.js中添加'intentMap.set('Repeat',重复);'到我现有的 intentMap
// Run the proper function handler based on the matched Dialogflow intent name
  let intentMap = new Map();
  intentMap.set('Game_Rock_Paper_Scissors - Result', game_stone_paper_scissors);
  intentMap.set('Game_Rock_Paper_Scissors - Result - yes', game_stone_paper_scissors_again);
  intentMap.set('Conversation tree', conversation_tree);
  intentMap.set('Question date', question_date);
  intentMap.set('Question time', question_time);
  intentMap.set('Music', music);
  intentMap.set('Repeat', repeat);

接下来,在 'Fulfillment' 选项卡下,我想在 Inline Editor 'index.js' 选项卡中输入函数,并确保在 'package.json' 中安装了多声库并可以使用.到目前为止,我的 package.json

中有一些东西
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "dialogflow": "^0.6.0",
    "dialogflow-fulfillment": "^0.5.0"
  }
}

那么,我该如何安装这个库呢?在 Read.me 中说 'You can install it using npm install --save multivocal.' 但是我应该在哪里安装它?我是把它放在 index.js 还是 packages.js 的某处?

此外,在此 example 中,它显示 index.js 代码为:

const Color = require('./color.js');
Color.init();

const Multivocal = require('multivocal');
exports.webhook = Multivocal.processFirebaseWebhook;

我是否应该将其添加到 index.js 的末尾?还是应该将其包装在一个函数中?很抱歉没有这方面的经验,但我希望我能解释清楚。

使用 Dialogflow 内联编辑器使用多声部的一些答案:

如何将其包含在 package.json 文件中?

使用 npm 的说明是在您在本地编写履行而不是使用编辑器的情况下。

您需要在 dependencies 部分添加这一行:

    "multivocal": "^0.14.0"

Dialogflow / Firebase Cloud Functions 将负责导入库。您不需要 "actions-on-google"、"dialogflow" 或 "dialogflow-fulfillment" 库,因此该部分可以如下所示:

  "dependencies": {
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "multivocal": "^0.14.0"
  }

我的index.js怎么写?

这个简单示例假设您可以将您的配置和代码放在一个单独的文件中(示例中的"color.js")。由于您不能使用内联编辑器执行此操作,因此您的代码的一般样板将如下所示:

// Import the library on the first line, so you can call methods on it to setup your configuration
const Multivocal = require('multivocal');

// Your configuration and code go here

// Setup the webhook as the final line
exports.dialogflowFirebaseFulfillment = Multivocal.processFirebaseWebhook;

Intent Handler 注册和函数去哪了?

与 dialogflow-fulfillment 库不同,multivocal 不使用明确的 intentMap。它自己维护一个,因此要注册一个 Intent Handler 函数,您可以使用

Multivocal.addIntentHandler( intentName, handlerFunction );

但是请记住处理函数也有一点不同。

什么?它们有什么不同?

Multivocal 有很多事情是通过配置而不是代码来处理的。因此,与 dialogflow-fulfillment 或 actions-on-google 库中的 agent.add() 函数调用没有直接对应关系。

相反,您的 Intent Handler 函数应该执行任何逻辑、数据库调用或其他任何操作来获取将在响应中使用的值并将它们保存在环境中。每个处理程序都应该 return 一个包含环境的 Promise。

您还应该为您的 Intent 设置配置 - 其中最常见的是设置可能的 "Response" 模板。最简单的响应模板只包含文本,以及从环境中插入值的位置。提示用户下一步可以做什么也是最佳实践,因此我们可能会设置一个 "Suffix" 模板以供默认使用,或者设置一个用于特定 Intents、Actions 或 Outents。

因此,如果您有一个名为 "color.favorite" 的 Intent,并且在名为 "color" 的环境中有一个值(您的处理程序可能已从数据库加载),则此响应的配置为英文可能看起来像这样。它还包括一个默认后缀,以提示用户下一步可以做什么。

  const config = {
    Local: {
      en: {
        Response: {
          "Intent.color.favorite": [
              "{{color}} is one of my favorite colors as well.",
              "Oh yes, {{color}} can be quite striking.",
              "I can certainly understand why you like {{color}}."
          ]
        },
        Suffix: {
          Default: [
            "What other color do you like?"
            "Tell me another color."
          ]
        }
      }
    }
  }

并且您将使用

注册此配置
  new Multivocal.Config.Simple( config );

您可以(并且应该)注册多个配置,尽管您可以将它们组合在一个对象中。因此,上面的 Response 部分可以按名称包含每个 Intent 的响应部分。

好的,但是我该如何处理 "repeat" Intent?

需要做的就是提供一个 Intent,在 Dialogflow UI 中将其 "Action" 设置为 "multivocal.repeat" 并且具有网络钩子启用。所以这样的事情会起作用:

Multivocal 已经注册了处理程序和基于此的配置。

如果要更改可能的响应,可以为 "multivocal.repeat" 操作添加配置。这可能看起来像这样:

const enRepeat = [
  "Sorry about that, let me try again.",
  "I said:"
];

const config = {
  Local: {
    en: {
      Response: {
        "Action.multivocal.repeat": enRepeat
      }
    }
  }
}

然后将此配置与您编写的其他配置相结合,或按上述方式加载。

强调一下——你不需要为此编写任何代码,只是一些可选的配置。