在对话技能中,如果您需要访问自己的服务以进行响应,或者需要与其他系统集成,回答服务是您的最佳选择。通过回答服务,您可以连接到其他服务和系统,以将自定义的富回复发送给终端用户。
意图技能都可以启用回答服务。默认情况下,回答服务处于禁用状态,技能会返回正常的模版回复。当回答服务启用时,若意图技能被匹配,请求(以及一些其他信息)将始终被发送到您的服务(外部API或Webhook),模版回复是失效的。例如,您正在构建在特定城市检查特定类型汽油(如92号或95号)平均价格的服务。您的服务需要首先从意图中收集此信息,然后调用第三方服务(如汽油价格报价API),找出汽油价格并将其发送回去。
下图显示了在对话中回答服务的简要处理流程:
首先,如果您还没有技能
,通过机器人
内部或我的技能
来创建一个新的对话技能。
下一步,进入技能。您可以根据需要创建意图和词典。在我们的示例中,我们创建一个名为“汽油价格报价”的意图和两个词典“中国汽油类型”和“中国城市”,如下图所示。
意图:
词典:
在该示例中,回答服务默认是禁用状态,任何与意图匹配的查询都将返回模版答案“7.44元/升”。如下图所示。
从左侧的“回答服务”面板来启用回答服务。点击滑动按钮打开它,并填入您的回答服务API服务地址。
回答服务打开后,旧的模版回答将自动被遮蔽,如下所示。
使用回答服务时,我们平台将向您的服务/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."}}]}
在本示例中,回答服务将返回为一段文本,如下所示。
为了表明已发生错误,请在输出/回调中添加状态、错误信息和异常字段。
字段名称 | 类型 | 是否必要 | 描述 |
---|---|---|---|
status | String | 否 | 如果值为“failed”,表明当前操作失败。 |
errorMsg | String | 否 | 发送回终端用户的错误信息。 |
errorMsgFull | String | 否 | 完整的错误消息。在调试信息中可用,用于常规调试。 |
下面是一个示例:
{"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)"}