此页面介绍了如何通过 Google 上的操作将 Dialogflow 聊天机器人连接到您的服务。 Fulfillment 允许您将数据库中的动态数据显示给用户。

部署和启用 fulfillment

要启用 fulfillment:

  • 单击左侧菜单中的Fulfillment。如果看不到导航,请单击左上角的菜单按钮。

  • 单击“内联编辑器”旁边的开关启用内联编辑器。

  • 使用此文件中的代码替换内联编辑器中的代码。 代码

  • 单击页面底部的“部署”。

您需要为创建第一个聊天机器人程序中创建的“名称”意图启用 fulfillment:

  • 单击左侧菜单中的 Intents,然后单击“name”意图。

  • 向下滚动到Fulfillment部分,然后单击开关以启用它。

注意:启用 fulfillment 会覆盖在意图的“响应”部分中设置的响应。 * 单击“保存”按钮。

创建一个处理程序

处理程序是您可以在整个代码中调用的函数。这些处理程序设置为在匹配特定意图时运行。

单击左侧菜单中的 Fulfillment 导航回到 Fulfillment 页面,然后查看代码。

最后一行应如下所示:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app)

这是一个来自 Dialogflow 的处理HTTP请求的函数,它使用Cloud Functions for Firebase。

在以 exports.dialogflowFirebaseFulfillment 开头的最后一行上方添加以下代码:

app.intent('name', conv => {
  conv.ask('My name is Dialogflow!')
})

当Dialogflow与“name”意图匹配时,上面的代码会响应用户的查询。

要测试它,请单击页面底部的“部署”。完成后,输入“你的名字是什么?”来调用“名字”意图。进入右侧的模拟器。你应该看到你的新消息作为回应!

在 fulfillment 中使用实体和上下文

注意:本节中的任务需要具有Dialogflow实体和上下文的经验。确保您知道如何使用实体提取数据并在继续之前使用上下文管理状态。

实体

实体用于从用户的查询中提取参数值。您希望从用户的请求中获取的任何重要数据都必须具有相应的实体。

在“使用实体提取数据”指南中,您创建了“语言”意图来识别语言和编程语言。意图有参数language和ProgrammingLanguages。

要访问这些参数:

  • 单击左侧菜单中的Intents,然后单击“Languages”意图。

  • 在intent的 Fulfillment 部分下,单击“为此intent启用webhook调用”选项的开关。

  • 单击意图页面顶部的“保存”按钮。

  • 单击左侧菜单中的Fulfillment。

现在,您将编写一些代码来处理 fulfillment 中的“语言”意图。在以exports.dialogflowFirebaseFulfillment 开头的最后一行上方添加以下代码:

app.intent('Languages', (conv, {language, ProgrammingLanguage}) => {
  if (language) {
    conv.ask(`Wow! I didn't know you knew ${language}`);
  } else if (ProgrammingLanguage) {
    conv.ask(`${ProgrammingLanguage} is cool.`);
  } else {
    conv.ask(`What language do you know?`)
  }
});

在此代码中,您将检索参数 language 和 ProgrammingLanguages 。当任一参数从Dialogflow发送到您的 fulfillment 中时,您构建与我们的 fulfillment 中相同的响应。如果没有发送参数,您可以使用其他响应来询问用户他们所知道的语言。

要试用它,请单击“部署”并通过说“我知道如何说德语”之类的方式调用“语言”意图。

上下文

上下文表示用户请求的当前上下文。这有助于区分可能含糊不清或具有不同含义的短语,具体取决于用户的偏好,用户的地理位置,应用中的当前页面或对话主题。

在具有上下文的管理状态指南中,您创建了“语言”意图的后续意图。如该页面所述,后续意图通过从父意图设置输出上下文并使用相同的上下文作为子意图的输入来工作。

为了在您的实现中正确模仿相同的行为,您需要设置与Dialogflow相同的输出上下文,具有相同的生命周期(在上下文处于活动状态的会话轮次)和参数。 使用 conv.contexts.set 方法修改处理程序以包含上下文:


app.intent('Languages', (conv, {language, ProgrammingLanguage}) => {
  if (language) {
    conv.ask(`Wow! I didn't know you knew ${language}`);
    conv.contexts.set('Languages-followup', 2, {language: language})
  } else if (ProgrammingLanguage) {
    conv.ask(`${ProgrammingLanguage} is cool.`);
    conv.contexts.set('Languages-followup', 2, {ProgrammingLanguage: ProgrammingLanguage})
  } else {
    conv.ask(`What language do you know?`)
  }
});

在此代码中,您将在上下文中添加名为“languages-followup”的输出上下文,生命周期为2轮,以及参数值(language 或 ProgrammingLanguages)以供以后检索。 单击“部署”以试用它。

要在 fulfillment 中检索上下文,可以使用 conv.contexts.get 方法或使用app.getContexts 获取所有上下文的列表。 例如,如果要为“languages-followup”后续意图创建 fulfillment 处理程序,它将如下所示:

app.intent('Languages - custom', (conv, {duration}) => {
  const langContext = conv.contexts.get('languages-followup')
  const language = langContext.parameters.language || langContext.parameters.ProgrammingLanguage;
  conv.ask(`I can't believe you've know ${language} for ${duration.amount} ${duration.unit}!`);
});

英文原文:https://dialogflow.com/docs/getting-started/integrate-services-actions-on-google