用户模拟器是在任务型多轮对话场景中,用于模拟用户在指定目标下多轮对话过程,可以用于生成对话数据,以及通过强化的方式训练系统决策。在具体的任务型场景需要定义有哪些用户行为、用户意图、用户可能说的槽位等,而之后用户模拟器是怎么来推进对话过程的呢?
论文:A User Simulator for Task-Completion Dialogues
代码地址: https://github.com/MiuLab/TC-Bot
本文首先简单介绍用户模拟器方法,再从源码细节分析具体多轮对话中的用户模拟器应该如何构建。
首先第一步就是确定用户会有哪些action,以及action对应的意图、槽位有哪些,这个与具体的任务有关。但是很对最近的论文都是复用剑桥提出的DSTC2/3(餐馆预订)中对用户action的定义,那么他们定义了哪些呢:
act | 包含的slot | 描述 |
---|---|---|
inform | 槽值(s, v), ... | 用户告知系统的值,例如:饭店是xx,厂家是xxx |
request | 槽位名s | 用户询问系统的槽位,例如:xx药的厂家有哪些? |
ack | None | 肯定(这里和确认很像,但是这里是会话的肯定,肯定的返回结果),例如:Okay, what’s the phone number of that place?” |
affirm | None | 认可/是的 |
negate | None | 否定/不是 |
reqalts | None | 其他、以上都不是 |
confirm | one slot (s, v) | s是可以告知的槽位,v是对应的值,例如:这个药品是同仁堂生产的吗? |
deny | one slot (s, v) | s是可以告知的槽位,v是对应的值,例如:不要国产的格列卫 |
null | None | 空、非当前域、未理解 |
reqmore | None | 还有哪些、还有更多的剂型吗 |
thankyou | 致谢 | |
help | None | 你有什么功能、你可以做什么、我可以问什么 |
repeat | None | 重复一下、你说什么 |
bye | None | |
Hello | None |
例子:
[{"act":"confirm", "slots":[["area", "centre"]]},
{"act":"request", "slots":[["slot", "phone"]]},
{"act":"deny", "slots":[["area","north"]]},
{"act":"hello", "slots":[]},]
其实affirm和confirm和合并,negate和deny也可以合并
确定了user action,以及任务的槽位和意图之后,就可以开始构建基于Agenda-Based的用户模拟器了。
Agenda-Based主要通过生成用户目标,然后将其通过出栈的形式来生成对话流,主要包含以下模块:
通过主函数中DM(run.py)来完成agent和user之间的对话,state_tracker记录并结合KB结果给agent作为其infrom。两者交互通过action(包含request,infrom,diaact等),并非自然语言。agent、user、act_set、slot_set、state_tracker、user_action、reward、episode_over。
也可以利用user bot在线训练agent,然后agent与真实用户交互来继续在线训练。
state_tracker.py中的state_tracker类包含:
本文主要介绍模拟器,state_tracker这块感兴趣可以自行细读。
用户模拟器代码:usersim_rule.py,其中有一个RuleSimulator类,对于其输入、输出为:
首次对话,调用initialize_episode(),直接会输出,无需输入。
对话过程中调用next(),需要输入system_action, map形式,key包含:
举例子:system_action: {'request_slots': {'date': 'UNK'}, 'turn': 3, 'speaker': 'agent', 'inform_slots': {}, 'diaact': 'request'}
自然语言。例如:which restaurant and what is the address for breaskfast for 10 people on tomorrow morning
输出是自然语言还是结构化的字段(user action),可以按需更改,因为按照M2M对话产生对话的outline也可以是user action。
params举例:{'max_turn': 20, 'slot_err_mode': 0, 'slot_err_probability': 0.05, 'intent_err_probability': 0.05, 'simulator_act_level': 0, 'learning_phase': 'all', 'simulator_run_mode': 0}
。
记录状态的数据结构: history_slots, insorm_slots, request_slot, rest_slot都为空, turn(int)=0
Episode_over、dialog_status。
goal产生(_sample_goal):从start_set随机选一条记录。其中ticket设为UNK
_sample_action:初始action选择,包含以下:
根据action调用NLG生成自然语言,加入到action'nl'中。方法:模板,对于agent和usr每类request和infrom都有相应模板。lstm_decoder。
很多逻辑冗余,例如state'request_slots'刚添加,就判空。以及一些不可能出现的情况(上层已经判断过)。
输出:user_action,包含diaact、infrom_slots、request_slots、turn、nl。
输入:DM输入system_action, 包含request_slot, inform_slots等信息。
输出:response_action
更新信息:state'turn'加2,dialog_status。turn超过最大次数,则state'diaact'='closing'。更新history_slots,清空inform_slots。
对于不同的sys_act,回应不同:
模拟agent SLU识别错误、交互噪声的情况,增加鲁棒性,数据集也会扩充。
经过NLG。
S = (A,G) , goal G, G=(c, r),c是要求,r是用户请求获得什么。还需要加入intent信息。agenda A堆栈类型(未完成),对话系统解决一个出栈一个。
数据生成方式:
将user goal生成database,然后对话开始时候从中随机采样生成user goal。
首轮:会有特殊限制,如一般都会包含request,至少一个infrom slot,movie名如果知道首轮会出现。
对话过程中,包含一个类堆的agenda,过程中会出栈和入栈(agenda出现没有的slot)。
no_outcome_yet, success(回答所有requestable slots,通过NLU来识别,并给出正确的票), failure。还会限制对话轮次,超出算失败。并决定返回奖励。
intent和slots联合训练,使用Seq2Seq方法,数据为全部对话action和utterance,IOB的slot标签和intent标签
对于dialog act,如果找到了规则模板,则输出模板,否则使用模型的输出。
最近也有很多使用模型来做用户模拟器的,这里简单提一下,后续有机会细说。主要还是通过数据驱动的模型方法来自动学习用户,通过对话历史、user profile、task schema作为输入,预测下一轮应该说什么,主要有:
另外看了一篇感觉比较合理google AI: USER MODELING FOR TASK ORIENTED DIALOGUES,可以简单看下他的模型图
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。