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

3.0高级配置详解

前言

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

词槽收集节点

  1. 澄清方式

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

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

对话答复节点

  1. 打断恢复

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

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

编程模式

  考虑到业务的复杂需求,TaskFlow还为大家提供了节点编程机制,编程语言为Python,目前支持3.8.5版本。 支持节点编程机制的包括:

  • 连线
  • 对话答复节点
  • 资源调用节点
  • 自定义节点

编程变量

TaskFlow为大家预置了编程变量,方便大家的使用。

  1. 获取机器人请求参数的变量。

    • 变量名称:svc_request
    • 该变量支持获取机器人相关信息。
    • 包含如下操作:
    操作 类型 说明
    svc_request.service_id string 机器人ID
    svc_request.skill_ids list<string> 机器人下绑定的技能列表
    svc_request.log_id string 开发者在客户端生成的唯一id
    svc_request.context dict 上下文信息
    svc_request.session_id string 当前session的ID
    svc_request.terminal_id string 开发者生成的对应终端每一个用户的ID
    svc_request.query string 本轮的用户输入query
    svc_request.query_info object query的附带信息,对应类名为TFQueryinfo
    svc_request.query_info.type string query的类型
    svc_request.query_info.source string query的来源
    svc_request.hyper_params dict 超参数
    • 预置函数:
    函数 说明 参数列表 返回值
    svc_request.is_event() 判断本轮请求是否为事件 类型:bool
    True:本轮为事件请求
    False:本轮为普通请求
    svc_request.get_event_name() 获取事件名称 类型:string
    当本轮为事件请求时,返回事件名
    当本轮为普通文本请求时,返回空字符串
    • 使用示例
    #判断是否为首轮
    if svc_request.session_id == '':
        return True
    
    #根据用户输入进行判断
    if svc_request.query == '你好':
        pass
    if '你好' in svc_request.query:
        pass
    if svc_request.query.startswith('你好'):
        pass
    
    # 判断是否为事件请求
    if svc_request.is_event():
        return True
    
    # 获取事件名
    event_name = svc_request.get_event_name()
  2. 获取技能的解析结果

    • 变量名称:slu_results
    • 该变量支持获取技能的意图和词槽结果。
    • 包含如下操作:
    操作 类型 含义
    slu_results[skill_id] dict 根据技能id获取技能解析结果
    slu_results[skill_id].intents list<object> 技能的意图解析结果,无结果时为空字符串
    slu_results[skill_id].intents[i] object 第i个命中意图下的解析结果,对应的类名为TFIntent
    slu_results[skill_id].intents[i].intent_name string 意图名
    slu_results[skill_id].intents[i].intent_confidence double 意图置信度
    slu_results[skill_id].intents[i].slots dict<string,list<object>> 命中意图下的词槽列表
    • 预置函数
    函数 说明 参数列表 返回值
    slu_results.has_intent(skill_id, intent_name) 判断指定技能是否命中指定意图 skill_id:必需,技能ID
    intent_name:必需,意图名
    类型:bool
    True:命中意图
    False:未命中意图
    slu_results.get_intent_names(skill_id) 获取命中的意图列表 skill_id:必需,技能ID 类型:list<string>
    slu_results.has_slot(skill_id, slot_name, intent_name=None) 判断指定技能下是否存在指定词槽 skill_id:必需,技能id
    slot_name:必需,词槽名
    intent_name:可选,意图名,作为筛选条件,用于判断指定意图下是否存在slot_name词槽
    类型:bool
    True:词槽存在
    False:词槽不存在
    slu_results.get_slots(skill_id, slot_name=None, intent_name=None) 获取词槽列表 skill_id:必需,技能id
    slot_name:可选,词槽名,作为筛选条件,用于获取指定词槽名的词槽列表
    intent_name:可选,意图名,作为筛选条件,用于获取指定意图下的词槽列表
    类型:list<object>
    (列表中每一项为TFSlot类型)
    • 使用示例
    skill_id = '12345'
    
    # 对单个技能意图进行判断
    ## 判断技能skill_id解析意图是否包含WEATHER
    if slu_results.has_intent(skill_id, 'WEATHER'):
        pass
    ## 获取技能skill_id解析意图列表
    intent_names = slu_results.get_intent_names(skill_id)
    if 'WEATHER' in intent_names:
        pass
    
    # 对单个技能词槽进行判断
    ## 判断技能skill_id下词槽user_location是否存在
    if slu_results.has_slot(skill_id, 'user_location'):
        pass
    ## 获取技能skill_id下能够被解析的所有词槽列表
    all_slots = slu_results.get_slots(skill_id)
    for slot in all_slots:
        if slot.slot_name == 'user_location':
            pass
        if slot.slot_name == 'user_time' and slot.original_word == '今天':
            pass
    ## 获取技能skill_id下能够被解析的词槽名为user_location的词槽列表
    location_slots = slu_results.get_slots(skill_id, 'user_location')
    
    # 判断是否所有技能结果均为空(True-均为空;False-至少一个技能有解析结果)
    no_result = True
    for skill_id in slu_results:
        if not skill_id.isdigit():
            continue
        if slu_results.get_intent_names(skill_id):
            no_result = False
            break
  3. 机器人当前包含的词槽列表

    • 变量名称:svc_slots
    • 该变量支持获取机器人的词槽结果。
    • 包含如下操作:
    操作 类型 说明
    svc_slots[slot_name] list<object> 指定词槽列表
    svc_slots[slot_name][i] object 获取列表中第i个词槽对象,对应类名为TFSlot
    svc_slots[slot_name][i].slot_name string 词槽名
    svc_slots[slot_name][i].original_word string 词槽原始值
    svc_slots[slot_name][i].normalized_word string 词槽归一化值
    svc_slots[slot_name][i].confidence double 词槽置信度
    svc_slots[slot_name][i].session_offset int 词槽产生轮次,当前轮为0,上轮为1,以此类推
    svc_slots[slot_name][i].begin int 词槽原始值在query中的起始位置
    svc_slots[slot_name][i].length int 词槽原始值长度(字符个数)
    svc_slots[slot_name][i].sub_slots list<object> 子词槽,结构同父词槽(列表中每一项为TFSlot类型)
    • 预置函数

      函数 说明 参数列表 返回值
      svc_slots.has_slot(slot_name, original_word=None, normalized_word=None) 对话状态中是否存在指定词槽 slot_name:必需,词槽名
      original_word:可选,词槽原始值,作为筛选条件,用于判断是否存在指定原始值的词槽
      normalized_word:可选,词槽归一化值,作为筛选条件,用于判断是否存在指定归一化值的词槽
      类型:bool
      True:存在
      False:不存在
      svc_slots.get_slots(slot_name) 从对话状态中获取指定词槽 slot_name:词槽名 类型:list<object>
      (列表中每一项为TFSlot类型)
      svc_slots.add(slot_name, original_word, normalized_word=None) 在对话状态中新增一个词槽 slot_name:必需,词槽名
      original_word:必需,词槽原始值
      normalized_word:可选,词槽归一化值
      类型:object
      (对应TFSlot类型)
      svc_slots.remove(slot_name) 从对话状态中移除指定词槽 slot_name:必需,词槽名 类型:None
      svc_slots.clear() 清空对话状态(词槽) 类型:None
    • 使用示例
    # 对机器人词槽进行判断
      ## 判断机器人词槽中是否存在user_location词槽
      if svc_slots.has_slot('user_location'):
          pass
      ## 判断机器人词槽中是否存在原始值为“北京”的user_location词槽
      if svc_slots.has_slot('user_location', original_word='北京'):
          pass
      ## 判断机器人词槽中是否存在归一化值为“北京市”的user_location词槽
      if svc_slots.has_slot('user_location', normalized_word='北京市'):
          pass
      ## 判断机器人词槽中是否存在原始值为“北京”归一化值为“北京市”的user_location词槽
      if svc_slots.has_slot('user_location', original_word='北京', normalized_word='北京市'):
          pass
    
      # 获取机器人词槽
      ## 获取词槽名为user_location的所有词槽列表
      slots = svc_slots.get_slots('user_location')
      for slot in slots:
          if slot.original_word == '北京' and slot.normalized_word == '北京市':
              pass
    
      # 新增机器人词槽
      ## 新增一个原始值和归一化值均为“北京”的user_location词槽
      svc_slots.add('user_location', '北京')
      ## 新增一个原始值为“北京”归一化值为“北京市”的user_location词槽
      svc_slots.add('user_location', '北京', '北京市')
    
      # 删除机器人词槽
      ## 删除词槽名为user_location的词槽
      svc_slots.remove('user_location')
      svc_slots.pop('user_location')
    
      # 清空机器人词槽
      svc_slots.clear()
  4. 机器人的应答动作

    • 变量名称:svc_actions
    • 该变量支持处理机器人的应答动作。
    • 包含如下操作:

      操作 类型 说明
      svc_actions[i] object 获取第i个机器人应答动作信息,对应类名为TFAction
      svc_actions[i].action_id string 应答动作id
      svc_actions[i].confidence double 应答动作置信度
      svc_actions[i].say string 应答话术
      svc_actions[i].type string 应答动作类型
      svc_actions[i].custom_reply object 自定义应答动作事件,对应类名为TFCustomReply
      svc_actions[i].custom_reply.event_name string 事件名
      svc_actions[i].custom_reply.func string 函数名
      svc_actions[i].options list<object> 应答动作选项
      svc_actions[i].options[i] object 第i个应答动作选项,对应类名为TFOption
      svc_actions[i].options[i].option string 选项内容
      svc_actions[i].options[i].info dict 选项附加信息
    • 预置函数

      函数 说明 参数列表 返回值
      svc_actions.add(action_id, say, event_name=None) 新增一个机器人应答动作,并返回新增的对象实例 action_id:必需,应答动作标识
      say:必需,应答话术
      event_name:可选,应答动作事件名
      类型:object
      (对应TFAction类型)
      svc_actions.append(tf_action) 在机器人应答动作列表的末尾追加一个应答动作 tf_action:必需,为TFAction的实例化对象 类型:None
      svc_actions.pop(index=-1) 根据索引值来删除应答动作,并返回删除的对象实例 index:可选,索引值(下标) 类型:object
      (对应TFAction类型)
      svc_actions.clear() 清空机器人应答动作列表 类型:None
      svc_actions.get_skill_actions(skill_id) 获取当前轮技能应答动作列表 skill_id:必需,技能id 类型:list<object>
      (列表中每一项为TFAction类型)
      svc_actions.get_last_svc_actions() 获取上轮机器人应答动作列表 类型:list
      (列表中每一项为TFAction类型)
    • 使用示例
    # 新增机器人应答动作
    ## 新增一个指定动作id和应答话术say的机器人应答动作
    svc_actions.add('weather_satisfy', '为您查询天气')
    ## 新增一个包含特定事件“WEATHER_EVENT”的机器人应答动作
    svc_actions.add('weather_satisfy', '为您查询天气', 'WEATHER_EVENT')
    ## 新增一个包含多个选项的机器人应答动作
    tfoption1 = TFOption()
    tfoption1.option = '苹果'
    tfoption1.info['english'] = 'apple'
    tfoption2 = TFOption()
    tfoption2.option = '香蕉'
    tfoption2.info['english'] = 'banana'
    tfoption3 = TFOption()
    tfoption3.option = '桃子'
    tfoption3.info['english'] = 'peach'
    action = TFAction()
    action.action_id = 'select_clarify'
    action.confidence = 100
    action.say = '你喜欢哪种水果?'
    action.type = 'guide'
    action.options.append(tfoption1)
    action.options.append(tfoption2)
    action.options.append(tfoption3)
    svc_actions.append(action)
    
    # 删除机器人应答动作
    ## 删除机器人应答动作中末尾一项
    svc_actions.pop()
    ## 删除机器人应答动作中下标为1的一项
    svc_actions.pop(index=1)
    
    # 清空机器人应答动作
    svc_actions.clear()
    
    # 获取技能应答动作列表(通常用于获取问答、闲聊等技能应答动作)
    ## 获取某个技能应答动作并将其作为机器人应答动作
    skill_actions = svc_actions.get_skill_actions(skill_id)
    svc_actions.extend(skill_actions)
    ## 获取上轮机器人应答动作列表
    last_svc_actions = svc_actions.get_last_svc_actions()
  5. 全局变量

    • 变量名称:svc_vars
    • 该变量为字典(dict)类型,控制全局变量的增删改查。
    • 参考Python字典类型的操作语法。
    • 使用示例
    # 新增一个全局变量
    if 'test_var' not in svc_vars:
      svc_vars['test_var'] = 0
    
    # 查看一个变量的值
    test_var = svc_vars['test_var']     # 注意key不存在报错
    test_var = svc_vars.get('test_var', None)
    
    # 删除一个全局变量
    svc_vars.pop('test_var')
    
    # 清空所有全局变量
    svc_vars.clear()

Demo示例

我们将示例项目中,取快递的流程用编程方式新增了一条流程。 注意:编程节点流程因为优先级最低,对话流程会被优先级为1的流程处理,仅供开发者参考,也可以自己修改入口连线的条件。

  • 取快递入口连线
def condition():
    if slu_results.has_intent('1010204', 'EXPRESS_DELIVERY'):
        return True
    return False
  • 资源调用
def process():
    requrl = 'http://api.k780.com/?app=life.time&appkey=47834&sign=5f4452a33ef126dcfe324f26dfbd2321&format=json'
    try:
        res_data = requests.get(requrl)
        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 = '好的,您可以先放到收发室,我会通知主人有个快递来电,让他看下这通电话。'
    svc_actions.add('express_delivery_satisfy', say)
  • 获取个人信息连线
def condition():
    if slu_results.has_intent('1010204', 'GET_USER_INFO'):
        return True
    return False

  除支持使用预置变量和函数进行编程外,还可以使用Python进行编程,当前支持使用如下工具包:

  • 所有节点都支持:time、datetime、calendar、pytz、dateutil、copy、re、random、math、jieba、hashlib、json、urllib、urllib3、requests、grequests。
上一篇
发布上线
下一篇
2.0高级配置详解