资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

2.0高级配置详解

2.0版本已停止日常维护,建议使用3.0版本。

前言

  之前的章节,我们用一个例子让大家熟悉了TaskFlow的配置流程。接下来我们跟大家介绍各节点的高级配置。

词槽收集节点

  1. 澄清方式

    • 是否随机询问:选择“否”时,每轮澄清时会按照话术顺序依次询问。
    • 是否强制填充:选择“是”时,词槽澄清失败则终止对话;选择“否”时,达到最大询问次数后对话流程仍会进入下一个节点
  2. 打断恢复

    • 打断后是否支持恢复:对话中节点若被打断到下一个流程(比如当前处于取快递流程,用户输入的语句进入了取外卖流程),默认处于等待恢复状态,当接收到下一个流程成功完成对话的信息后,会继续完成该流程的后续动作。若选择否,则不再恢复对话。
    • 打断恢复话术:当恢复到原流程时,会主动答复用户打断恢复的话术,如果不填写,默认使用收集话术。

对话答复节点

  1. 打断恢复

    • 当前节点是否支持恢复到原流程:对话中上一个流程是因为被打断才跳转到当前流程时,默认会在完成所有动作后,发送已完成的信息给上一个流程,若选否,则动作完成后直接结束。
    • 打断后是否支持恢复:对话中节点若被打断到下一个流程(比如当前处于取快递流程,用户输入的语句进入了取外卖流程),默认处于等待恢复状态,当接收到下一个流程成功完成对话的信息后,会继续完成该流程的后续动作。若选择否,则不再恢复对话。
    • 打断恢复话术:当恢复到原流程时,会主动答复用户打断恢复的话术,如果不填写,默认使用答复话术。
  2. 答复后动作

    • 重置对话状态:若选择是,则会清空之前所有的对话信息,下一个节点时对话会重新开始,默认为否。
    • 是否等待用户输入:默认为是,该节点完成所有动作后,接收到用户输入才会继续向下执行;若选择否,则不再等待,直接执行下一个节点的内容。

编程模式

  考虑到业务的复杂需求,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。
上一篇
3.0高级配置详解
下一篇
常见问题