2.0高级配置详解
更新时间:2021-07-22
2.0版本已停止日常维护,建议使用3.0版本。
前言
之前的章节,我们用一个例子让大家熟悉了TaskFlow的配置流程。接下来我们跟大家介绍各节点的高级配置。
词槽收集节点
-
澄清方式
- 是否随机询问:选择“否”时,每轮澄清时会按照话术顺序依次询问。
- 是否强制填充:选择“是”时,词槽澄清失败则终止对话;选择“否”时,达到最大询问次数后对话流程仍会进入下一个节点
-
打断恢复
- 打断后是否支持恢复:对话中节点若被打断到下一个流程(比如当前处于取快递流程,用户输入的语句进入了取外卖流程),默认处于等待恢复状态,当接收到下一个流程成功完成对话的信息后,会继续完成该流程的后续动作。若选择否,则不再恢复对话。
- 打断恢复话术:当恢复到原流程时,会主动答复用户打断恢复的话术,如果不填写,默认使用收集话术。
对话答复节点
-
打断恢复
- 当前节点是否支持恢复到原流程:对话中上一个流程是因为被打断才跳转到当前流程时,默认会在完成所有动作后,发送已完成的信息给上一个流程,若选否,则动作完成后直接结束。
- 打断后是否支持恢复:对话中节点若被打断到下一个流程(比如当前处于取快递流程,用户输入的语句进入了取外卖流程),默认处于等待恢复状态,当接收到下一个流程成功完成对话的信息后,会继续完成该流程的后续动作。若选择否,则不再恢复对话。
- 打断恢复话术:当恢复到原流程时,会主动答复用户打断恢复的话术,如果不填写,默认使用答复话术。
-
答复后动作
- 重置对话状态:若选择是,则会清空之前所有的对话信息,下一个节点时对话会重新开始,默认为否。
- 是否等待用户输入:默认为是,该节点完成所有动作后,接收到用户输入才会继续向下执行;若选择否,则不再等待,直接执行下一个节点的内容。
编程模式
考虑到业务的复杂需求,TaskFlow还为大家提供了节点编程机制,编程语言为Python,目前支持2.7.3版本。 支持节点编程机制的包括:
- 连线
- 对话答复节点
- 资源调用节点
- 自定义节点
编程变量
TaskFlow为大家预置了编程变量,方便大家的使用。
-
获取机器人请求参数的变量。
- 变量名称:svc_request
- 该变量支持获取session_id和本轮的用户query。
-
包含如下操作:
操作 类型 说明 svc_request.request.query string 本轮的用户输入query svc_request.session_id string 当前session的id -
使用示例
#判断是否为首轮 if svc_request.session_id == '': return True #根据用户输入进行判断 if svc_request.request.query == '你好': pass elif '你好' in svc_request.request.query: pass
-
获取技能的解析结果
- 变量名称:slu_results
- 该变量支持获取技能的意图和词槽结果。
-
包含如下操作:
操作 类型 含义 slu_results[skill_id] dict 根据技能id获取技能解析结果 slu_results[skill_id].intent string 技能的意图解析结果,无结果时为空字符串 slu_results[skill_id].slots list 技能词槽结果 slu_results[skill_id].slots[i].name string 技能词槽结果中的词槽名 slu_results[skill_id].slots[i].original_word string 技能词槽结果中的原始值 slu_results[skill_id].slots[i].normalized_word string 技能词槽结果中的归一化值 slu_results[skill_id].has_slots(slot_name) bool 判断是否存在某个词槽,slot_name为具体的词槽名 slu_results[skill_id].get_slots(slot_name) list 根据词槽名获取词槽结果,不存在返回空list slu_results[skill_id].get_slots(slot_name)[i] object 获取同一词槽名下的某一个词槽,结构和用法与slu_results[skill_id].slots[i]相同 - 使用示例
#获取单个技能结果并对意图词槽进行判断 skill_id = '12345' slu_res = slu_results[skill_id] if slu_res.intent == 'ROUTE': pass if slu_res.has_slots('user_arrival'): target_slots = slu_res.get_slots('user_arrival') if target_slots and target_slots[0].original_word in ['北京', '上海']: pass for slot in slu_res.slots: if slot.name == 'user_arrival': pass if slot.name == 'user_start' and slot.original_word == '北京': pass #判断是否所有技能结果均为空 for skill_id, skill_res in slu_results.items(): if skill_res.intent != '': return False return True
-
机器人当前包含的词槽列表
- 变量名称:svc_slots
- 该变量支持获取机器人的词槽结果。
- 包含如下操作:
操作 类型 说明 svc_slots.has_slots(slot_name, original_word='', normalized_word='') bool 判断机器人词槽结果中是否包含特定词槽 svc_slots.get_slots(slot_name) list 根据词槽名获取机器人词槽结果,不存在返回空list svc_slots.add(slot_name, original_word, normalized_word='') object 新增一个机器人词槽 svc_slots.remove(slot_name) object 删除一个机器人词槽 - 使用示例
#对机器人词槽进行判断 if svc_slots.has_slots('user_arrival', '北京'): pass target_slots = svc_slots.get('user_arrival') if target_slots and len(target_slots[0].normalized_word) >= 8: pass #新增一个机器人词槽 new_slot = svc_slots.add('user_arrival', '北京', '北京') new_slot.normalized_word = '北平' #删除机器人词槽 svc_slots.remove('user_arrival')
-
机器人的应答动作
- 变量名称:action_list
- 该变量支持处理机器人的应答动作。
-
包含如下操作:
操作 类型 说明 action_list.add(action_id='', say='') object 新增一个机器人应答动作,返回值为新增的对象实例 - 使用示例
#新增一个应答动作 new_action = action_list.add('route_satisfy', '为您导航') #新增一个应答动作 new_action = action_list.add() new_action.action_id = 'route_satisfy' new_action.say = '呵呵'
-
全局变量
- 变量名称:svc_vars
- 该变量为字典(dict)类型,控制全局变量的增删改查。
- 参考Python字典类型的操作语法。
- 使用示例
#新增一个全局变量 if 'test_var' not in svc_vars: svc_vars['test_var'] = 0 #查看一个变量的值 svc_vars.get('test_var') #删除一个全局变量 svc_vars.pop('test_var')
Demo示例
我们将示例项目中,取快递的流程用编程方式新增了一条流程。 注意:编程节点流程因为优先级最低,对话流程会被优先级为1的流程处理,仅供开发者参考,也可以自己修改入口连线的条件。
- 取快递入口连线
def condition():
if '1010204' in slu_results and slu_results['1010204'].intent == 'EXPRESS_DELIVERY':
return True
return False
- 资源调用
def process():
requrl = 'http://api.k780.com/?app=life.time&appkey=47834&sign=5f4452a33ef126dcfe324f26dfbd2321&format=json'
req_data = ''
try:
res_data = requests.get(requrl, data = req_data, verify = False)
res_str = res_data.text.strip()
res_json = json.loads(res_str)
svc_vars['datetime'] = res_json['result']['datetime_2']
except:
pass
- 对话答复节点
def process():
if 'datetime' in svc_vars:
say = '好的,您可以先放到收发室,我会通知主人' + str(svc_vars['datetime']) + '有个快递来电,让他看下这通电话。'
else:
say = '好的,您可以先放到收发室,我会通知主人有个快递来电,让他看下这通电话。'
action_list.add('express_delivery_satisfy', say)
- 获取个人信息连线
def condition():
if '1010204' in slu_results and slu_results['1010204'].intent == 'GET_USER_INFO':
return True
return False
除支持使用预置变量和函数进行编程外,还可以使用Python进行编程,当前支持使用如下工具包:
- 所有节点都支持:time,datetime,calendar,pytz,dateutil,copy,re,random,math,json,jieba,hashlib。
- 资源调用节点支持:urllib,urllib2,urllib3,requests,grequests。