构建 fulfillment (Dialogflow)

执行方式定义了 Action 获取的对话界面 用户输入以及处理输入并最终满足的逻辑 操作。

定义对话

现在您已经定义了操作,可以构建 这些 Action 的相应对话。为此,您需要 创建定义语法或用户所需内容的 Dialogflow intent 要触发 intent 以及要处理的相应执行方式 intent。

您可以创建任意数量的意图,以定义整个对话的 语法。

创建意图

点击 Dialogflow 的意图菜单项旁边的 + 号 左侧导航栏。系统会显示 Intent 编辑器,您可在其中输入以下信息:

  • intent 名称是 IDE 中显示的 intent 的名称。
  • 通过上下文,您可以将 intent 的触发范围限定在特定情况下。 阅读有关上下文的 Dialogflow 文档 。
  • 事件会触发意图,而无需用户执行任何操作。一个 GOOGLE_ASSISTANT_WELCOME 事件就是这样的事件,它允许 Google 让 Google 助理调用您的 Action。此事件用于您的 Action 的 默认操作。 如需详细了解内置帮助程序 intent,请参阅我们的文档。
  • 训练短语定义用户需要说出的内容(语法)才能触发 intent。在此处输入几个短语(5-10 个),代表用户可以说出的内容来触发 intent。Dialogflow 会自动处理示例的自然变体 您提供的词组。
  • 操作和参数定义要传递给 fulfillment 的数据(如果 已为此意图启用 fulfillment。这包括从 用户输入以及您可以在 fulfillment 中使用的名称,以检测哪个 intent。稍后,您将使用此名称将您的意图映射到 相应的 fulfillment 逻辑。请参阅操作和参数 请参阅 Dialogflow 文档。

  • Responses 是 Dialogflow 响应构建器,您可以在其中定义 直接在 Dialogflow 中响应此意图,无需调用 fulfillment。该功能对于不需要 fulfillment。您可以用它提供简单的欢迎消息或再见消息。 不过,在大多数情况下,您可能需要使用 fulfillment 来响应用户 intent。

  • Fulfillment 指定您是否要调用 fulfillment 。您很可能会为大多数用户启用此功能 意图。要在 intent 中查看此项目,您必须 在 Fulfillment 菜单中为代理启用 fulfillment。

在 Dialogflow 中构建响应

对于某些 intent,您可能不需要让执行方式返回响应。 在这些情况下,你可以使用 Dialogflow 中的响应构建器 响应。

Responses(响应)区域,提供要返回的文本响应。 用户。默认文本响应是简单的 TTS 文本响应, 多种 Dialogflow 集成。对 Google 助理的回复有相关说明 (位于响应页面上)。

构建 fulfillment 响应

您的执行方式代码托管在 Action 的网络钩子执行方式逻辑中。 例如,在 Silly Name Maker 示例中, 您可以在 index.js 的 Cloud Functions for Firebase 中找到此逻辑。

触发使用 fulfillment 的意图时,您会收到来自 包含 intent 相关信息的 Dialogflow。然后,您会对 方法是处理 intent 并返回响应。此请求和 响应由 Dialogflow webhook 定义。

我们强烈建议您使用 Node.js 客户端库来处理请求 并返回响应。以下是使用客户端库的一般流程:

  1. 初始化 Dialogflow 对象。 该对象会自动处理请求的监听和解析操作, 你可以在 fulfillment 中处理它们。
  2. 创建用于处理请求的函数。 这些函数可处理用户输入和 intent 的其他组件, 构建响应以返回到 Dialogflow。

初始化 Dialogflow 对象

以下代码会实例化 Dialogflow 并执行一些样板代码 适用于 Google Cloud Functions 的 Node.js 设置:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

创建用于处理请求的函数

当用户说出触发 intent 的短语时,您会收到来自 使用 fulfillment 中的函数处理的 Dialogflow。在本课中, 函数,您通常需要执行以下操作:

  1. 执行处理用户输入所需的任何逻辑。
  2. 构建响应以响应触发的意图。考虑 来生成适当的回答。请参阅 表面功能 详细了解如何迎合不同 surface 的响应。
  3. 使用您的响应调用 ask() 函数。

以下代码展示了如何构建两个用于处理 调用 intent (input.welcome) 和对话框 intent (input.number), 欢迎用户使用你的 Action,并回显用户曾说过的一个数字 Dialogflow intent,其名称如下:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

与上述代码一起显示的自定义 intent Input Number 使用 @sys.number 实体,用于从用户话语中提取数字。然后, 将包含用户号码的 num 参数发送到 函数。

除了为每个意图设置单独的处理程序之外,您还可以 一个后备函数在回退函数内,检查触发了哪个 intent 然后执行相应的操作

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

无匹配项重新提示

当 Dialogflow 无法匹配意图中定义的任何输入语法时 训练短语时,它会触发后备意图。通常后备意图 重新提示用户为您的 Action 提供必要的输入。您可以 在回复部分 也可以使用 webhook 来提供响应。

如果用户的回答与您的 Action 的训练短语不符,Google Google 助理会尝试处理输入。此行为便于用户 对话过程中的操作。例如,用户问:“什么电影 这周都在玩什么?”然后在对话过程中更改上下文:“什么是 明天的天气怎么样?”在这个例子中,因为“明天的天气怎么样?” 不是对初始提示所触发的对话的有效响应, Google 助理会自动尝试处理匹配,并将用户移至 适当的对话

如果 Google 助理找不到与用户输入匹配的 Action, 用户返回到您的 Action 上下文。

因为 Google 助理可能会中断你的 Action,对有效的非匹配结果做出响应 场景,请勿使用后备 intent 来执行用户查询。您 应仅使用后备 intent 来重新提示用户进行有效输入。

如需创建后备 intent,请执行以下操作:

  1. 点击 Dialogflow 导航菜单中的意图 (Intents)。
  2. 点击创建意图 (Create Intent) 旁边的 ⋮,然后选择 创建回退 intent。(或者,点击默认后备广告 Intent 进行修改。)
  3. 指定用于回应用户的重新提示短语。这些词组应该 尽量在用户当前所处的情境下使用。

    在不使用 fulfillment 的情况下执行此操作:在 Response 区域中指定短语 intent 的实现。Dialogflow 从此列表中随机选择短语进行朗读 返回给用户,直到触发更具体的意图为止。

    如需通过 fulfillment 执行此操作,请执行以下操作:

    1. 在意图的 Fulfillment 部分中,切换为此意图启用 webhook 调用 (Enable webhook call for this intent)。
    2. 在执行方式逻辑中,像处理其他 intent 一样处理回退 intent intent,如创建用于处理请求的函数中所述。 部分。

    例如,以下函数使用 conv.data 对象( 可用于维护状态的任意数据载荷) Node.js 客户端库 用于跟踪后备意图触发次数的计数器。如果 触发多次,则相应操作会退出。虽然它不会显示在 您应使其他 intent 将此计数器重置为 0 当非后备 intent 触发时触发。(请参阅 Number Genie 示例 ,详细了解如何实现此功能。)

    <ph type="x-smartling-placeholder">
    </ph> <ph type="x-smartling-placeholder">
    </ph>
    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

使用上下文

如果您希望 Dialogflow 仅在特定情况下触发后备意图,请使用上下文 情况。如果您希望对同一组对象使用不同的后备 intent, 不同的非匹配场景。

  • 如果您未针对后备意图设置上下文,系统会将其视为 当没有其他意图时,Dialogflow 触发的全局后备意图 匹配。如果您选择使用其中一个参数,则只能定义其中一个参数。
  • 如果您在后备意图上设置输入上下文,Dialogflow 会触发此操作 后备意图:

    • 用户的当前上下文是在 intent。
    • 没有其他意图匹配。

    这样,您就可以使用具有不同输入上下文的多个后备 intent 来 针对特定场景自定义非匹配重新提示。

  • 如果您针对回退 intent 设置了输出上下文,则可以让用户留在 触发并处理后备意图后,在相同上下文中发生的所有事件。

如需了解详情,请参阅 Dialogflow 上下文

无输入时重新提示

如需详细了解具体如何操作,请参阅重新提示页面。 处理没有在语音设备(例如 需要持续互动的 Google Home。