构建复杂对话
在本教程中,您将为助手创建一个对话,以帮助用户查询名为 Truck Stop Gourmand的虚构餐厅。
学习目标
在完成教程时,您将学习如何执行以下操作:
- 规划对话。
- 定义定制意向。
- 添加可处理意向的对话节点。
- 添加实体以使您的响应更具体。
- 添加模式实体,并在对话框中使用该实体在用户输入中查找模式。
- 设置和引用上下文变量。
期限
完成本教程大约需要 2 到 3 个小时。
先决条件
开始之前,请完成 对话教程入门。
使用您创建的对话框,并将节点添加到作为入门练习的一部分构建的简单对话框。
规划对话
您正在为一家名为 Truck Stop Gourmand 的餐厅构建助手,该餐厅具有一个位置和一个蓬勃发展的蛋糕烘焙业务。 您希望助手能够简单地回答有关餐厅和菜单的用户问题,还能取消客户蛋糕订单。 因此,您需要创建一些意向来处理与以下主题相关的查询:
- 餐厅信息
- 菜单详细信息
- 订单取消
首先创建表示这些主题的意向,然后构建用于响应用户有关这些主题的问题的对话。
回答餐厅相关问题
添加一个意向来识别客户提出的有关餐厅详细信息的问题。 意向是用户输入中表达的目的或目标。 随附于#General_About_You
常规*内容目录的 * 意向提供了类似功能,但其用户示例主要针对助手相关查询,而不是使用助手来帮助客户的情况。 所以,你添加自己的意图。
添加 #about_restaurant 意向
-
在“意向”页面上,单击 创建意向。
-
添加以下意向名称,然后单击创建意向:
about_restaurant
已添加 #about_restaurant 意向。 向意向名称添加了数字符号 (
#
) 前缀,以将其标记为意向。 这种命名约定有助于您和其他人将该意向识别为意向。 它还没有与之关联的用户话语示例。 -
在 添加用户示例 字段中,输入以下话语:
Tell me about the restaurant i want to know about you who are the restaurant owners and what is their philosophy? What's your story? Where do you source your produce from? Who is your head chef and what is the chef's background? How many locations do you have? do you cater or host functions on site? Do you deliver? Are you open for breakfast?
-
单击 关闭 箭头
以完成添加
#reservation
意向及其示例发声。
您添加了一个意向,并提供了实际用户可能输入的用于触发此意向的话语示例。
添加由 #about_restaurant 意向触发的对话节点
添加一个对话节点,用于识别用户输入映射到您在上一步中创建的意向的情况,这意味着该节点的条件会检查助手是否在用户输入中识别到 #about_restaurant
意向。
-
单击 对话框 以打开对话框树。
-
在对话树中查找 #General_Greetings 节点。
您需要在此初始问候语节点之后添加一个节点,用于检查餐厅相关问题,以反映您所期望的正常交谈流。 例如,
Hello.
thenTell me about yourself.
-
单击 问候客户 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
在 如果助手识别 字段中开始输入
#about_restaurant
,然后从列表中选择该字段。如果用户输入与
#about_restaurant
意向匹配,那么将使用此节点。 -
在 助手响应中,输入文本响应:
Truck Stop Gourmand is the brainchild of Gloria and Fred Smith. What started out as a food truck in 2004 has expanded into a thriving restaurant. We now have one brick-and-mortar restaurant in downtown Portland. The bigger kitchen brought with it new chefs, but each one is faithful to the philosophy that made the Smith food truck so popular to begin with: deliver fresh, local produce in inventive and delicious ways. Join us for lunch or dinner seven days a week. Or order a cake from our bakery.
还向响应添加图像。
-
单击添加响应类型。
-
从下拉列表中选择图像。 在图像源字段中,添加
https://www.ibmlearningcenter.com/wp-content/uploads/2018/02/IBM-Learning-Center-Food4.jpg
。 -
将图像响应类型上移,以便在显示文本之前将其显示在响应中。 单击 上移 箭头
可对两种响应类型进行重新排序。
文本响应和响应之前的图像 -
单击“关闭”图标
以关闭节点编辑视图。
测试 #about_restaurant 对话节点
通过检查用户话语是否与您添加的示例相似但与您添加的示例不同来测试意向,以训练助手识别具有 #about_restaurant
意向的输入。
-
单击试用。
-
类型
I want to learn more about your restaurant.
助手会指示已识别到
#about_restaurant
意向,并会返回包含您为对话节点指定的图像和文本的响应。试用
您添加了定制意向以及知道如何处理该意向的对话节点。
#about_restaurant
意向旨在识别有关餐厅的各种常规问题。 您添加了一个节点来捕获此类问题。 响应时间有点长,但它是单个语句,可回答有关以下所有主题的问题:
- 餐馆老板
- 餐厅历史记录
- 哲学
- 站点数量
- 运行天数
- 所提供的膳食
- 餐厅点饼
对于一般问题,一个单一的,一般的答案是适合的。
管理蛋糕订单
客户可以亲自,通过电话或通过使用 Web 站点上的订单表单来下订单。 下订单后,用户可以通过虚拟助手取消订单。 首先,您需要定义一个可识别订单号的实体。 然后,添加一个意向,用于识别用户想要取消蛋糕订单的情况。
添加订单号模式实体
您希望助手识别订单号,因此创建模式实体以识别餐厅用于标识其订单的唯一格式。 餐厅面包店使用的订单号语法是两个大写字母,后跟 5 个数字。 例如,YR34663
。 请添加一个可识别此字符模式的实体。
-
单击 我的实体 以打开“实体”页面。
-
单击创建实体。
-
在实体名称字段中输入
order_number
。 -
单击创建实体。
-
将
order_syntax
添加到 值名称 字段。 -
单击 同义词 旁边的向下箭头以将类型更改为 模式。
模式 -
将以下正则表达式添加到“模式”字段:
[A-Z]{2}\d{5}
-
单击添加值。
-
单击 关闭 箭头
以完成添加
@order_number
实体。
添加取消订单意向
-
在“意向”页面上,单击 创建意向。
-
添加以下意向名称,然后单击创建意向:
cancel_order
-
在 添加用户示例 字段中,输入以下话语:
I want to cancel my cake order I need to cancel an order I just placed Can I cancel my cake order? I'd like to cancel my order There's been a change. I need to cancel my bakery order. please cancel the birthday cake order I placed last week The party theme changed; we don't need a cake anymore that order i placed, i need to cancel it.
-
单击 关闭 箭头
以完成添加
#cancel_order
实体。
添加肯定回答意向
在代表用户完成任务之前,必须确认您正在执行正确的操作。 请向对话添加一个 #yes 意向,用于识别用户同意助手建议内容的情况。
-
在“意向”页面上,单击 创建意向。
-
添加以下意向名称,然后单击创建意向:
yes
-
在 添加用户示例 字段中,输入以下话语:
Yes Correct Please do. You've got it right. Please do that. that is correct. That's right yeah Yup Yes, I'd like to go ahead with that.
-
单击 关闭 箭头
以完成添加
#yes
意向。
添加用于管理取消订单请求的对话节点
现在,添加一个用于处理取消蛋糕订单请求的对话节点。
-
单击 对话框 以打开对话框树。
-
在对话树中查找 #menu 节点。
-
单击 #menu 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
开始在此节点的 如果助手识别 字段中输入
#cancel_order
,然后从列表中选择该字段。 -
在 助手响应中,输入文本响应:
If the pickup time is more than 48 hours from now, you can cancel your order.
在可以取消订单之前,您需要知道订单号。 用户会在原始请求中指定订单号。 因此,为了避免再次询问订单号,请使用原始输入中的订单号模式来检查数字。 要执行此操作,请定义一个上下文变量来保存所指定的订单号。
-
在 助手响应中,单击 选项 图标
图标,然后选择 打开上下文编辑器。
-
使用以下值设置上下文:
订单号上下文变量详细信息 Variable(变量) 值 $ordernumber
<? @order_number.literal ?>
上下文变量值 (
<? @order_number.literal ?>
) 是一个 SpEL 表达式,用于捕获用户指定的与 @order_number 模式实体定义的模式匹配的数字。 它会将数字保存到$ordernumber
变量中。 -
单击 关闭 图标
以关闭节点编辑视图。
现在,添加要求提供订单号的子节点,或者从用户处确认他们要取消具有检测到的订单号的订单。
-
单击 #cancel_order 节点上的 Node 选项图标
,然后选择 添加子节点。
-
向节点添加标签以将其与要添加的其他子节点区分开来。 在 输入节点名 字段中,添加
Ask for order number
。 -
在 如果助手识别中,输入
true
作为条件。 -
在 助手响应中,输入文本响应:
What is the order number?
-
单击 关闭 图标
以关闭节点编辑视图。
现在,添加另一个子节点,通知用户您要取消订单。
-
单击 询问订单号 节点上的 Node 选项图标
,然后选择 添加子节点。
-
在 如果助手识别中,输入
@order_number
作为条件。 -
在 助手响应中,单击 选项 图标
图标,然后选择 打开上下文编辑器。
-
使用以下值设置上下文:
订单号上下文变量详细信息 Variable(变量) 值 $ordernumber
<? @order_number.literal ?>
-
在 助手响应中,输入文本响应:
OK. The order $ordernumber is canceled. We hope we get the opportunity to bake a cake for you sometime soon.
-
单击 关闭 图标
以关闭节点编辑视图。
添加另一个节点,用于捕获用户所提供的数字不是有效订单号的情况。
-
单击 @order_number 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
在 如果助手识别中,输入
true
作为条件。 -
在 助手响应中,输入文本响应:
I need the order number to cancel the order for you. If you don't know the order number, please call us to cancel over the phone.
-
单击 关闭 图标
以关闭节点编辑视图。
在初始订单取消请求节点之后添加一个节点,用于对用户在初始请求中提供了订单号而您无需再次询问的情况进行响应。
-
单击 #cancel_order 节点上的 Node 选项图标
,然后选择 添加子节点。
-
为该节点添加标签,以区别于其他子节点。 在 输入节点名 字段中,添加
Number provided
。 -
在 如果助手识别中,输入
@order_number
作为条件。 -
在 助手响应中,输入文本响应:
Just to confirm, you want to cancel order $ordernumber?
-
单击 关闭 图标
以关闭节点编辑视图。
必须添加子节点来检查用户对您的确认问题的响应。
-
单击 提供的编号 节点上的 Node 选项图标
,然后选择 添加子节点。
-
在 如果助手识别中,输入
#yes
作为条件。 -
在 助手响应中,输入文本响应:
OK. The order $ordernumber is canceled. We hope we get the opportunity to bake a cake for you sometime soon.
-
单击 关闭 图标
以关闭节点编辑视图。
-
单击 #yes 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
在 如果助手识别中,输入
true
作为条件。
请勿将响应添加到 助手响应。 而是将用户重定向到要求提供先前创建的订单号详细信息的分支。
-
在 那么助手应该 中,选择 跳至。
-
选择 询问订单号 节点。
-
选择 如果助手识别 (条件)。
跳转至 -
单击 关闭 图标
以关闭节点编辑视图。
强制对话在运行时评估 #cancel_order 节点下的子节点。
-
单击以在编辑视图中打开
#cancel_order
节点。 -
在 那么助手应该 选择
Skip user input
。 -
单击 关闭 图标
以关闭节点编辑视图。
测试订单取消
测试助手是否可以识别与用户输入中用于产品订单号的模式匹配的字符模式。
-
单击试用。
-
类型
i want to cancel my order number TW12345.
助手识别到
#cancel_order
意向和@order_number
实体。 它响应为If the pickup time is more than 48 hours from now, you can cancel your order. Just to confirm, you want to cancel order TW12345?
。 -
输入
Yes
。助手可识别
#yes
意向并使用OK. The order TW12345 is canceled. We hope we get the opportunity to bake a cake for you sometime soon.
进行响应。试用 现在,试一试处理您不知道订单号的情况。
-
在“试用”窗格中,单击清除以重新开始。
-
类型
I want to cancel my order.
助手可识别
#cancel_order
意向,并使用If the pickup time is more than 48 hours from now, you can cancel your order. What is the order number?
进行响应。 -
输入
I don't know.
助手通过
I need the order number to cancel the order for you. If you don't know the order number, please call us to cancel over the phone.
进行响应。
添加节点以阐明订单号格式
如果执行更多测试,您可能会发现该对话框在用户不记得订单号格式的场景中无济于事。 用户可能只记得数字或字母,而忘了字母要大写。 在这些情况下,要是为他们提供一个提示,会不会很好呢? 要让对话更友好,可以在对话树中添加另一个节点,用于检查用户输入中的数字。
-
单击 @order_number 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
在 如果助手识别中,输入
input.text.find('\d')
作为条件。 -
在条件字段中,添加
input.text.find('\d')
,这是一个 SpEL 表达式,当您在用户输入中找到一个或多个数字时,即会触发此响应。 -
在 助手响应中,输入文本响应:
The correct format for our order numbers is AAnnnnn. The A's represents 2 uppercase letters, and the n's represent 5 numbers. Do you have an order number in that format?
-
单击 关闭 图标
以关闭节点编辑视图。
-
单击 input.text.find('\d') 节点上的 Node 选项图标
,然后选择 添加子节点。
-
在 如果助手识别中,输入
true
作为条件。 -
单击 定制,将 多个条件响应 开关设置为 开启,然后单击 应用。
-
在 ** Assistant 响应中,添加具有以下条件的响应:
条件详细信息 如果助手识别到 助手响应 那助理应该 @order_number
OK. The order $ordernumber is canceled. We hope we get the opportunity to bake a cake for you sometime soon.
缺省为节点设置 true
I need the order number to cancel the order for you. If you don't know the order number, please call us to cancel over the phone.
条件详细信息 -
单击 关闭 图标
以关闭节点编辑视图。
现在,当您测试时,可以提供一组数字或数字与文本混合作为输入,对话框会提醒您正确的订单号格式。 您测试了对话,发现了其中的弱点,并对其进行了更正。
另一种可以解决此类型场景的方法是添加具有槽的节点。 要了解有关使用槽的更多信息,请参阅向对话添加带槽的节点教程。
添加个人风格
如果用户对机器人本身表现出兴趣,您会希望虚拟助手能够识别这种好奇心,并以更个性化的方式与用户互动。 您可能记得在添加自己的定制 #about_restaurant
意向之前,我们之前考虑使用的 常规 内容目录随附的 #General_About_You
意向。 它是为了识别用户的此类问题而构建的。 请添加一个以此意向为条件的节点。 您可以在响应中询问用户的姓名,然后将其保存到 $username 变量中,以根据需要在对话中的其他位置使用。
添加用于处理机器人相关问题的节点
添加一个对话节点,用于识别用户对机器人的兴趣并进行响应。
-
单击 对话框 以打开对话框树。
-
单击 欢迎 节点上的 Node 选项图标
,然后选择 在下面添加节点。
-
在 如果助手识别 字段中开始输入
#General_About_You
,然后从列表中选择该字段。 -
在 助手响应中,输入文本响应:
I am a virtual assistant that is designed to answer your questions about the Truck Stop Gourmand restaurant. What should I call you?
-
单击 关闭 图标
以关闭节点编辑视图。
-
单击 #General_About_You 节点上的 Node 选项图标
,然后选择 添加子节点。
-
在 如果助手识别中,输入
true
作为条件。 -
在 助手响应中,输入文本响应:
Hello, <? input.text ?>! It's lovely to meet you. How can I help you today?
要捕获用户提供的姓名,请向节点中添加一个上下文变量。
-
在 助手响应中,单击选项菜单
,然后选择 打开上下文编辑器。
-
使用以下值设置上下文:
设置上下文 Variable(变量) 值 $username
"<? input.text ?>"
上下文变量值 (
<? input.text ?>
) 是一个 SpEL 表达式,用于捕获用户指定的用户名,然后将其保存到$username
上下文变量。 -
单击 关闭 图标
以关闭节点编辑视图。
如果在运行时,用户触发此节点并提供名称,那么您将记录该用户的名称。 当您知道了用户姓名后,就应该好好地使用它! 将条件响应添加到您先前添加的问候语对话节点,以包含使用用户名的条件响应 (如果已知)。
将用户名添加到问候语
如果您知道用户姓名,那么应该将其加入到问候语中。 要执行此操作,请添加条件响应,并加入一个包含用户姓名的问候语变体。
-
在对话树中查找 问候客户 节点,然后单击以在编辑视图中打开该节点。
-
单击 定制,将 多个条件响应 开关设置为 开启,然后单击 应用。
-
单击添加响应。
-
在 如果助手识别中,输入
$username
。 -
在 响应中,输入文本响应:
Good day to you, $username!
-
单击 上移 箭头
可对两种响应类型进行重新排序。
上移响应 -
单击 关闭 图标
以关闭节点编辑视图。
测试个性化
测试助手是否可以识别并保存用户姓名,然后在将来通过该姓名指代该用户。
-
单击试用。
-
单击清除以重新开始交谈会话。
-
输入
Who are you?
助手识别到
#General_About_You
意向。 其响应以问题What should I call you?
结束。 -
输入
Jane
。助手将
Jane
保存在$username
变量中并响应Hello, Jane! It's lovely to meet you. How can I help you today?
。 -
要测试
Greet customers
节点,请输入Hello.
。您的助手可识别
Greet customers
意向,并显示Good day to you, Jane!
。 在问候语节点被触发时,$username
上下文变量中包含一个值,因此服务会使用包含用户姓名的条件响应。
您可以添加一个条件响应,使其以用户姓名为条件,并将用户姓名用于任何其他响应中,以通过个性化来增加交谈价值。
摘要
您创建了一个更复杂的对话,用于对来自客户的问题和请求作出反应。