开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

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高级配置详解
下一篇
常见问题