调用在 dialogFlow 控制台中创建的意图

calling intents created in dialogFlow console

由于我是 dialogFlow 编码的新手,所以我对在控制台 DialogFlow 中创建的意图有一些疑问。

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

2) 如何让用户使用 select 选项而不是键入?我必须为此使用什么?

3) 如何配置每当用户输入号码时调用的意图?

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

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

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

所以 dialogflow 接受人工输入(他们说的一个短语),查看不同意图的短语训练集,然后选择它认为正确的短语。然后它调用该意图的实现代码(代码存储在 firebase 中)。所以当你问 "is it possible to call this intent in firebase functions" 时感觉有点倒退。意图是用户说话和调用 firebase 函数(通过 HTTP)之间的粘合剂。意图本身不是可以调用的代码。

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

所以你的第三个问题(如何配置在用户键入数字时调用的意图),你的应用程序可能会做一些事情,比如从默认的 "welcome" 意图(起点)开始。您会口头说出菜单选项 "say one for homewares, two for clothing, three for shoes, ..."。然后您会记住用户在菜单中的位置。然后,您将 "one" 作为意图连接起来,在 Cloud Function 中,它会检查用户正在访问哪个菜单,因此会知道 "just after the welcome intent, 'one' means homewares"。该应用程序可能会问第二个问题,例如 "say one for furniture, two for vases, three for disco balls, ..."。如果他们再次说 'one',它会达到相同的目的,但您的应用程序会保存一个变量来跟踪用户在菜单树中的位置。

实体允许您定义词汇表。例如。 "I want to buy a ${color} ${thing}"。您可以定义具有值 "red"、"green"、"blue" 等的颜色实体。您可以定义 "dress"、"hat"、[=45 的第二个事物实体=]等。意图训练短语可能是"I want to buy a red dress"。可以告诉 Dialogflow "red",因为训练句子是一个 "color" 实体,而 "dress" 是一个 "thing" 实体。然后将这些值作为参数传递给支持实施的 Web 服务 - 也就是说,您的 "buy" 意图将获得 "color" 和 "thing" 参数。

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

希望对您有所帮助!

您可以直接通过事件调用一个意图,或者您可以通过 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