介绍

在对话技能中,如果您需要访问自己的服务以进行响应,或者需要与其他系统集成,回答服务是您的最佳选择。通过回答服务,您可以连接到其他服务和系统,以将自定义的富回复发送给终端用户。

意图技能都可以启用回答服务。默认情况下,回答服务处于禁用状态,技能会返回正常的模版回复。当回答服务启用时,若意图技能被匹配,请求(以及一些其他信息)将始终被发送到您的服务(外部API或Webhook),模版回复是失效的。例如,您正在构建在特定城市检查特定类型汽油(如92号或95号)平均价格的服务。您的服务需要首先从意图中收集此信息,然后调用第三方服务(如汽油价格报价API),找出汽油价格并将其发送回去。

下图显示了在对话中回答服务的简要处理流程:

FLow

如何使用

首先,如果您还没有技能,通过机器人内部或我的技能来创建一个新的对话技能。

Create skill

下一步,进入技能。您可以根据需要创建意图和词典。在我们的示例中,我们创建一个名为“汽油价格报价”的意图和两个词典“中国汽油类型”和“中国城市”,如下图所示。

意图:

Intent

词典:

Entity

在该示例中,回答服务默认是禁用状态,任何与意图匹配的查询都将返回模版答案“7.44元/升”。如下图所示。

Entity

从左侧的“回答服务”面板来启用回答服务。点击滑动按钮打开它,并填入您的回答服务API服务地址。

Entity

回答服务打开后,旧的模版回答将自动被遮蔽,如下所示。

Entity

使用回答服务时,我们平台将向您的服务/Webhook发送HTTP POST请求。该POST请求的请求体会包含技能、匹配的意图和所有匹配的词典/槽位等信息。

在该示例中,我们有一个外部服务,它将词典“中国汽油类型”、“中国城市”和原始请求作为输入。发送到您到服务/Webhook的HTTP POST请求体如下所示。

[
{
"skillid":"2c9480d26e61b5b3016ff385d3af17a4",
"query":"How much is a litre of regular gas cost in Waterloo?",
"intentid":"2c9480d26e61b5b3016ff3861fb617a5",
"slotProperties":{
"CanadianCities":[
{
"slotType":"CanadianCities",
"value":"Waterloo",
"key":"Waterloo"
}
],
"GasType":[
{
"slotType":"CanadianGasType",
"value":"premium",
"key":"premium"
}
]
}
}
]

您的服务/Webhook应该基于这些字段作出行动并返回动态响应。在我们的示例中,您的服务/Webhook可以访问一些第三方的汽油价格查询API,查找信息价格,并将其返回给终端用户。您也可以增加自定义返回内容,如图片、视频、卡片等。

您的服务/Webhook的输出/回调示例如下所示。有关我们支持的完整响应类型集(包括图片、视频、音频、卡片、快速回复等),请参阅我们的富回复文档

{
"stage":[
{
"text":{
"text":[
"Average regular gas price in Waterloo is: 112.4 cents/litre "
]
}
},
{
"image": {
"title": "Image Title",
"url": "http://www.example.org/Costco-Waterloo-Ontario-Gas-Station.jpg",
"alt": "Some image."
}
}
]
}

在本示例中,回答服务将返回为一段文本,如下所示。

Entity

高级功能

错误处理

为了表明已发生错误,请在输出/回调中添加状态、错误信息和异常字段。

字段名称类型是否必要描述
statusString如果值为“failed”,表明当前操作失败。
errorMsgString发送回终端用户的错误信息。
errorMsgFullString完整的错误消息。在调试信息中可用,用于常规调试。

下面是一个示例:

{
"status":"failed",
"errorMsg":"java.lang.NullPointerException.",
"errorMsgFull":"Exception in thread main java.lang.NullPointerException at Entity.<init>(Entity.java:24) at Main.<init>(Main.java:22) at Main.main(Main.java:18)"
}