执行方式定义了 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 客户端库来处理请求 并返回响应。以下是使用客户端库的一般流程:
- 初始化 Dialogflow 对象。 该对象会自动处理请求的监听和解析操作, 你可以在 fulfillment 中处理它们。
- 创建用于处理请求的函数。 这些函数可处理用户输入和 intent 的其他组件, 构建响应以返回到 Dialogflow。
初始化 Dialogflow
对象
以下代码会实例化 Dialogflow
并执行一些样板代码
适用于 Google Cloud Functions 的 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);
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。在本课中, 函数,您通常需要执行以下操作:
- 执行处理用户输入所需的任何逻辑。
- 构建响应以响应触发的意图。考虑 来生成适当的回答。请参阅 表面功能 详细了解如何迎合不同 surface 的响应。
- 使用您的响应调用
ask()
函数。
以下代码展示了如何构建两个用于处理
调用 intent (input.welcome
) 和对话框 intent (input.number
),
欢迎用户使用你的 Action,并回显用户曾说过的一个数字
Dialogflow intent,其名称如下:
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}`); });
@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">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; } });
// 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,请执行以下操作:
- 点击 Dialogflow 导航菜单中的意图 (Intents)。
- 点击创建意图 (Create Intent) 旁边的 ⋮,然后选择 创建回退 intent。(或者,点击默认后备广告 Intent 进行修改。)
指定用于回应用户的重新提示短语。这些词组应该 尽量在用户当前所处的情境下使用。
在不使用 fulfillment 的情况下执行此操作:在 Response 区域中指定短语 intent 的实现。Dialogflow 从此列表中随机选择短语进行朗读 返回给用户,直到触发更具体的意图为止。
如需通过 fulfillment 执行此操作,请执行以下操作:
- 在意图的 Fulfillment 部分中,切换为此意图启用 webhook 调用 (Enable webhook call for this intent)。
- 在执行方式逻辑中,像处理其他 intent 一样处理回退 intent intent,如创建用于处理请求的函数中所述。 部分。
例如,以下函数使用
<ph type="x-smartling-placeholder">conv.data
对象( 可用于维护状态的任意数据载荷) Node.js 客户端库 用于跟踪后备意图触发次数的计数器。如果 触发多次,则相应操作会退出。虽然它不会显示在 您应使其他 intent 将此计数器重置为 0 当非后备 intent 触发时触发。(请参阅 Number Genie 示例 ,详细了解如何实现此功能。)</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。