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

自定义编程

考虑到业务的复杂需求,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')

节点示例

我们将示例项目中,取快递的流程用编程方式新增了一条流程。 注:编程节点流程因为优先级最低,对话流程会被优先级为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