意图对话包括 意图词典 两部分内容。

1. 进入意图对话设置页面

1.1 途径一

  • 我的机器人页面,点击机器人卡片的配置,就可以进入技能配置页面了
  • 首先打开意图对话卡片的小开关,确保技能处于激活状态
  • 点击意图对话卡片的意图键进入意图对话的界面

1.2 途径二

  • 我的技能页面,点击技能卡片的意图,可以直接进入意图对话界面

1.3 差别

  • 两种进入的途径都能对问答对进行操作,它们的差别在于

    • 途径一是在机器人的层面上对技能进行操作,操作完毕后,训练机器人然后与机器人进行对话测试

    • 途径二是在技能对层面上对技能进行操作;操作完毕后,训练技能然后与技能进行对话测试

  • 它们本质上是没有差别的。前期我们推荐您使用途径一,后续的文档也是基于途径一进行操作的

2. 意图

  • 意图用于处理较复杂的意图、问题模板、回答
  • 用户可以在意图页面中编辑自定义的意图对话内容
  • 机器人会将用户自定义的问题模版以及与该模版所对应的模版答案通过训练进行匹配

2.1 添加意图

  • 点击添加意图,并输入名称和描述,即可添加一个新的意图对话模版
  • 点击保存

2.2 编辑意图

  • 在意图列表中,点击意图名称即可进入对应意图
  • 编辑区域包括模版模版回答槽位三部分

2.2.1 编写模版

  • 模版是用来模拟用户可能输入的对话
  • 用户可以通过对话意图为机器人编写对话模版。对话模版包括问题模版和答案模版
  • 通过输入模板框输入新的模板问题,按 enter,即可添加新的模板
  • 通过输入模板回答框可添加新的回答,按 enter,即可添加新的模板
  • 再次点击模版中的问题/回答可以编辑此问题/回答(需按 enter 保存)

2.2.2 编写模版回答

  • 模版回答是机器人对模版的回复语句

2.2.3 添加槽位

  • 槽位可以对模版模版回答语句中的词进行标注
  • 用户可以在槽位表格中输入新的槽位名称、其基于的词典(为必选项)并点击添加标志(或输入名称后按 enter)即可添加一个新的槽位
  • 再次点击槽位名称(如‘地点’)可以编辑此槽位的名称
  • 输入槽位类型栏中可选择/重选此槽位基于的词典

2.2.4 标注槽位

  • 标注槽位的方法是:鼠标选中模板/模板回答的句子中的一个片段,槽位选项会立即弹出,此时只需点击想选的槽位
  • 每一个模版可以添加多个槽位
  • 模版问题和模版答案均可添加槽位
  • 成功添加槽位后,原模版内容将会被放入对应槽位的颜色块中。

2.2.5 删除槽位

  • 用户可以对槽位进行删除

  • 被删除的槽位在模版中将自动失效

2.3 训练并测试

  • 技能编辑之后一定要训练!点击左上角“调试版本”的训练
  • 然后就可以在对话框中测试啦

2.4 回答服务

  • 意图对话可以由用户自定义的回答服务对模版问题进行回复
  • 开启对话服务状态后,用户可以输入对话服务 API 的 URL,同时模版回答功能和脚本功能将失效
  • 开启脚本功能状态后,用户可以自行编辑脚本支持 Groovy 和 Python 语言,同时模版回答功能和对话服务将失效
  • 开启以上任意功能时,模版回答功能将失效

2.5 脚本服务

  • 介绍

在对话技能中,如果您需要自己设定自定义脚本,脚本回答可以完成您的需求。

意图技能可以启用回答服务。默认情况下,回答服务及脚本回答都处于禁用状态,技能会返回正常的模板回复。当回答服务启用时,脚本及模本回复是失效的。当脚本回答开启时,模板和回答服务将会失效。如下图所示:

introduce

目前脚本编辑支持 groovy 及 python 两种语言,用户可自行选择

select

以 python 脚本为例,用户可以自由编写自定义脚本从而获得相应的回复

  • 编写脚本时,下列参数可直接使用不需要另行定义
参数名称类型说明
questionStringquestion 为用户输入的问题
lastQuestionStringlastQuestion 存有上一轮回答的问题
lastDialogAnswerStringlastDialogAnswer 存有上一轮回答的答案
  • 通过 import 关键字,用户可以导入希望使用的相关库
import
  • 通过函数定义,用户可以定义任意函数 如:
Entity
  • 用户可以调用自己编写的函数 如:
Entity
  • 当编写脚本时,用户需编写 getResponse 函数,并调用该函数用于返回回复。用户可通过 DialogAnswer()获得 reponse 数据结构并添加内容,通过 return 返回 如:
Entity
  • DialogAnswer 目前支持的添加功能如下:
Entity
  • 更多:
添加文字回复
public void addText(String text)
添加错误信息
public void addErrorText(String text)
添加信息列表
public void addText(List<String> textList)
添加错误信息列表
public void addErrorText(List<String> textList)
通过url添加图片
public void addImage(String url)
通过url添加图片并设置标题和别名
public void addImage(String url, String title, String alt)
通过url添加视频
public void addVideo(String url)
通过url添加视屏并设置标题和别名
public void addVideo(String url, String title, String alt)
通过url添加音频
public void addAudio(String url)
通过url添加音频并设置标题和别名
public void addAudio(String url, String title, String alt)
通过url添加下载链接
public void addDownloadable(String url)
通过url添加下载链接并设置标题
public void addDownloadable(String url, String title)
添加卡片回复(需求格式为json String)
public void addCards(String cardsJson)
添加快速回复
public void addQuickReplies(String quickRepliesJson)
转译json String为DialogAnswer
public static DialogAnswer parserJsonString(String json)
获取主题
public String getTopic()
设置主题
public void setTopic(String topic)
获取前缀
public String getPrefix()
设置前缀
public void setPrefix(String prefix)
获取问答状态
public ArrayList<DialogStage> getStage()
设置问答状态
public void setStage(ArrayList<DialogStage> stage)
添加问答状态
public void addStage(DialogStage d)
添加问答状态到指定位置
public void addStage(DialogStage d, int index)
获取后缀
public String getSuffix()
设置后缀
public void setSuffix(String suffix)
获取状态
public int getStatus()
设置状态
public void setStatus(int status)
获取表情包
public String getEmotion()
设置表情包
public void setEmotion(String emotion)
获取情形
public String getState()
设置情形
public void setState(String state)
获取消耗时长
public String getTimeCost()
设置细节消耗时长
public void setTimeCost(String timeCost)
获取细节消耗时长
public JSONObject getDetailTimeCost()
设置时间消耗时长
public void setDetailTimeCost(JSONObject detailTimeCost)
获取超时时间
public String getTimeout()
设置超时时间
public void setTimeout(String timeout)
通过key obj 添加键值对参数
public void addParams(String key, Object obj)
获取参数map
public Map<String, Object> getParams()
设置参数map
public void setParams(Map<String, Object> params)
转译为json String并返回
public String toJsonString()
  • 展示代码:
import json
from ai.rsvp.datatype.dialog import DialogAnswer
from ai.rsvp.datatype.dialog import DialogStage
# question为用户输入的问题
def getAns():
if question == u'北京':
ans = u'北京天气晴,西南风3级'
elif question == u'上海':
ans = u'上海天气多云,东南风5级'
else:
ans = u'找不到所在城市的信息:' + question
return ans
# 获得回复
def modifyResponse():
response = DialogAnswer()
# 增加图片回复
response.addImage(u'https://dev.rsvp.ai/weather_forcast.jpg','','')
# 增加文字回复
response.addText([u'你本次查询天气的城市为:' + question, u'正在查询以下城市的天气...' + question])
response.addText([u'本次为您查询到的结果:' + getAns()])
# 增加卡片回复(仅用于展示用法)
response.addCards(u'{\"type\":\"horizontal\",\"cards\":[{\"title\":\"卡片标题\",\"buttons\":[{\"text\":\"按钮1\",\"postback\":\"https://qingyu.rsvp.ai/\"},{\"text\":\"按钮2\",\"postback\":\"sendbacktext\"}]}]}')
# 增加快速回复按钮(仅用于展示用法)
response.addQuickReplies(u'{\"quickReplies\":[{\"text\":\"快速回复1\",\"postback\":\"https://qingyu.rsvp.ai/\"},{\"text\":\"快速回复2\",\"postback\":\"Sendbacktext\"}]}')
# response变量作为最后的返回输出
response = response.toJsonString()
return response
response = modifyResponse()
  • 问答展示:
show
  • 目前支持对上一轮询问的保留,用户可通过 lastQuestion 与 lastAnswer 获得上一轮回答的问题与答案,并进行相应的判断如:.
# 获得回复
def modifyResponse():
response = DialogAnswer()
# lastQuestion变量存有为上一轮回答中的问题
# lastDialogAnswer变量存有为上一轮回答中的答案
response = DialogAnswer()
if lastQuestion is not None:
response.addText(u'您上一次查询天气的城市为:' + lastQuestion)
lastDialogAnswer = DialogAnswer.parserJsonString(lastAnswer)
if lastDialogAnswer is not None:
stageList = lastDialogAnswer.getStage()
if stageList.size() == 7:
lastDialogStageJson = stageList[stageList.size()-3].toJsonString()
else:
lastDialogStageJson = stageList[stageList.size()-1].toJsonString()
lastDialogStage = json.loads(lastDialogStageJson)['text']['text'][0]
if lastDialogStage is not None:
response.addText(u'您上一次查询天气的结果为:' + lastDialogStage)
# 增加图片回复
response.addImage(u'https://dev.rsvp.ai/weather_forcast.jpg','','')
# 增加文字回复
response.addText([u'你本次查询天气的城市为:' + question, u'正在查询以下城市的天气...' + question])
response.addText([u'本次为您查询到的结果:' + getAns()])
# 增加卡片回复(仅用于展示用法)
response.addCards(u'{\"type\":\"horizontal\",\"cards\":[{\"title\":\"卡片标题\",\"buttons\":[{\"text\":\"按钮1\",\"postback\":\"https://qingyu.rsvp.ai/\"},{\"text\":\"按钮2\",\"postback\":\"sendbacktext\"}]}]}')
# 增加快速回复按钮(仅用于展示用法)
response.addQuickReplies(u'{\"quickReplies\":[{\"text\":\"快速回复1\",\"postback\":\"https://qingyu.rsvp.ai/\"},{\"text\":\"快速回复2\",\"postback\":\"Sendbacktext\"}]}')
# response变量作为最后的返回输出
response = response.toJsonString()
return response
response = modifyResponse()
效果如图:
show2

2.6 导入/导出

  • 用户可以批量导入意图对话数据,导入的数据将覆盖用户在平台中添加的意图对话内容
  • 点击上图中查看示例可查看用于上传的示例文件
  • 点击导出将出现确认框;输入文件名并点击导出即可把当前意图对话技能下载为 json 文件

3. 词典

  • 有时候,用户使用了近义词来表达了相同的询问,但是系统却无法识别,比如
  • 词典可以轻松解决这一问题

  • 词典用于定义和描述槽位词的类型与内容

  • 当用户设置槽位时,除了要填写槽位名称之外,还需要选择被创建词槽所基于的词典

  • 点击添加词典以添加自定义词典

用户可以在词典页面添加一系列自定义词典,同时可以编辑和删除自定义词典中的每一条内容

现在回到“意图”界面使用它。用户自定义的词典将在用户添加槽位时显示在槽位类型中的userdef列表下

  • 同样,让我们标注对应槽位
  • 修改完毕后,一定要记得点击训练!然后就可以在对话框测试啦