simdial 中对个各个用户acttion 的处理逻辑 - tedrepo/SimDial GitHub Wiki

  1. step 函数

    外界传入数据 inputs step函数首先根据 inputs更新 user state中的当前的 1.对话者 2. 对话历史 3.将系统动作存入buffer中 然后在while循环中中调用 policy 函数

  2. policy 函数 每次从 buffer 中 取出一个 system action ,然后生成对应 user action

    1. sys action 是 非确定性澄清 IMPLICIT_COFIRM 从 action 参数中取出 需要澄清的 slot name 和slot value 判断 该slot 是否是用户slot 如果不是跑出异常 如果是 当前曹值同用户约束的值一样 或者用户约束的值是none(ignore) 不做任何处理

      如果不满足约束,生成否认曹值的动作(reject) 或 否认+inform (reject + inform) 并返回 同时更新 user state 如果是 reject 将当前槽位置为 未输出 如果是 reject + inform 将当前槽位值置为已输出

    2. sys action 是确定性澄清 EXPLICIT confirm 取出当前的slot name 和slot 值 判断是否是用户约束槽位 如果满足约束 返回 Action(UserAct.CONFIRM, (slot_type, slot_val)) 将user state 的slot 置为True 如果不满足约束 返回 Action(UserAct.DISCONFIRM, (slot_type, slot_val)) 将 user state 的 slot 置为 false

    3. 系统的动作是INFORM 这时系统会将所有已经收集到的槽位返回, 需要执行 全部约束 是否满足的判断,返回不满足约束的槽位 如果满足约束 更新goal的状态 将当前 goal置为True: update_goals_met() , 随机的选择下一个goal state.unmet_goal() 如果新采样到的goal 为 none 随机改变约束槽位 _increment_goal() 如果随机采样的约束槽位不为None 更新 user state 中的约束改变, 并更新user state 中对应的约束曹值, 返回的动作是: [Action(UserAct.NEW_SEARCH, (BaseSysSlot.DEFAULT, None)), Action(UserAct.INFORM, (slot_key, self.usr_constrains[slot_key]))] 如果随机采样的约束槽位值为None: 告诉系统同对当前的搜索结果满意的动作, 并返回结束动作 [Action(UserAct.SATISFY, [(g, None) for g in complete_goals]), Action(UserAct.GOODBYE)] 如果采样到的goal不为 None 将 user state 中的当前goal val 置为 新的goal val user state 中的goal change 标记置为 True 将Action(UserAct.MORE_REQUEST, [(g, None) for g in complete_goals]) 作为待返回的 act前缀 随机采样当前是否 为yn 问题 如果是yn问题,name 找出goal对应的slot, 并采样一个slot值,将yn更新到 user state 中 追加 动作: [ack_act, Action(UserAct.YN_QUESTION, (slot.name, expected_val))] 如果不是yn问题, 返回正常问: [ack_act, Action(UserAct.REQUEST, (next_goal, None))] 如果不满足约束条件: 返回inform动作告诉系统不满足约束的槽位的值 Action(UserAct.INFORM, (wrong_slot, self.usr_constrains[wrong_slot]))

  3. 如果系统的动作是request 取出当前request 对应的槽位 以及对应的值 如果 slot type 为 BaseSlot Need 返回一个没有满足的 goal Action(UserAct.REQUEST, (next_goal, None)) 并更新 user state 为当前的goal 如果 系统返回的槽位为 BaseSlot.HAPPY 就什么也不做返回 None 如果是用户约束槽位 # 采样出随机个数的多余槽位, 返回inform slot slotval 列表 ,更新 user state的状态 如果不满足上面所有的条件 抛出异常

  4. 如果系统的动作是 澄清 SystemAct.CLARIFY 抛出异常,没有对应的处理方法

  5. 再说一遍 : SystemAct.ASK_REPEAET: 从 userstate中取出上一次说的内容, 返回

  6. 换一种方式说: SystemAct.ASK_REPHRASE:

    取出最近一轮 , 向 action列表中追加again 标志

       for a in last_usr_actions:
            a.add_parameter(BaseUsrSlot.AGAIN, True)
    

8 如果系统动作是 QUERY: 这时需要查询数据库 从action 的参数中取出 参数列表 含有query 和goals 调用api 从数据库中查询出想要的数据 随机的选择一条返回的记录 为goals赋值 返回用户动作: Action(UserAct.KB_RETURN, [query, results])

以上就是policy 的处理逻辑

user state 中含有的记录内容 1. hisotry [] 历史对话 内容 speaker + action_list 2. spk_state : 当前的会话状态 listen or exit 3. input_buffer: 当前的系统动作列表 4. goal_met 有序字典: 当前goals是否满足 6. constrain_slot_state 有序字典 当前用户约束slot 是否满足 7. change_dic goal 约束 yn 的字典 8. change_slot_dic 改变的slot 以及对应的值 9. cur_goal: 当前的goal

含有的函数: update history( speaker , actions) is_terminal()返回当前的对话状态是否为 exit yield_floor() 返回当前的对话状态是否为listen UNmet goal() 找到一个没有满足的goal update_goals_met(top_action) 更新当前goal的met状态 update_usr_constrains(usr_slots, is_fill) 更新当前slot 填充状态 reset_goal() : 重置当前的goals 为未满足状态 当前的用户约束槽位为未输出状态 reset_change_dict: 置空change dict