本文是用户模拟器系列文章的实践篇,主要介绍用户模拟器在贝壳IM场景中的应用。
贝壳找房作为房产平台行业公司的领跑者,有完善的在线服务,使经纪人和客户能够高效的进行沟通。为了更好的服务客户和经纪人,公司从18年开始开发智能对话系统——小贝助手。小贝助手一方面帮助经纪人快速准确的回答客户的提问,提高经纪人引导会话的能力,同时也会在真实对话之外,提供模拟客户陪练的训练场,帮助经纪人提升业务能力。目前开发用户模拟器的目的主要有以下几个方面:
小贝助手的动作类型有多种,比如回答详情、推荐房源、询问需求、约带看等,每次修改动作策略之后都需要进行测试,以评估时机或者答案的准确性,这时如果引入模拟用户进行仿真测试,将会非常高效和可信。
目前小贝助手的对话管理(DM)是通过规则和监督学习来实现的,DM下一阶段的目标是使用强化学习,而强化学习训练需要对话系统和用户进行交互得到对话数据和累积得分来进行。在IM场景中,和真实用户的交互成本昂贵,数据回流周期慢,不足以支持模型的快速迭代,因此必须构建一个用户模拟器作为对话系统的交互环境来进行闭环训练。有了用户模拟器便可以产生任意多的数据,对话系统可以对状态空间和动作空间进行充分地探索以寻找最优策略。
在线下培训经纪人,有时需要模拟实际工作场景,比如与客户的交流,有了用户模拟器,经纪人便可以在模拟环境中与客户进行交互,不断提升自己的专业知识和业务能力。
综合考虑业务需求和模拟器的实现方法,最终确定的模拟器方案如下图所示,其中红色框为模拟器内部结构,绿色框为对话系统即小贝助手内部结构:以下将针对每一个环节进行详细说明。
从前面两篇文章的介绍我们就已经知道,用户模拟器的第一步就是生成一个用户对话的目标,对话系统对此是不可知的,但它需要通过多轮对话交互来帮助用户完成该目标。
不管是基于规则的用户模拟器还是基于模型的用户模拟器,在每次对话开始之前,都会统一的构建出一个显式的用户目标 Goal G=(C,R),G 由约束条件 C 和问询内容 R 组成。
那么如何来生成用户目标呢,针对IM对话场景,我们提出以下方法:
这样生成的用户目标比较符合线上实际的人群分布,同时因为用户是真实存在的,生成的用户目标也很合理,不会发生不符合现实情况的现象(比如海淀区总价100万的别墅)。
生成的一个用户目标如下所示:
{
"Requests":{
"intents":[
"house_floorLevel",
"house_elevatorNum",
"house_elevatorCensusRate"]
},
"Constraints":{
"slots":{
"priceTotal":1200,
"district":"西城区",
"resblock":"展览路",
"decoration":"简装",
"floorLevel":"高楼层"
}
}
}
前面两篇文章分别介绍了基于统计模型和深度模型实现用户模型的方法,然而,基于深度模型的方法依赖大量标注会话数据集,目前我们正在努力构建IM场景下的会话数据集,所以第一个版本选择了agenda方式来实现。
用户模型中的对话状态表示由四个变量组成:S=<A,S_R,S_C,S_I>,其中S_R,S_C,S_I为二进制向量,各个变量的含义如下所示:
这么设计的好处在于:
每一轮会话,模型会根据更新后的状态进行动作采样,根据经验,我们设定状态优先级顺序为:A>S_I>S_C>S_R。
具体流程如下图所示:
2.1我们得到了用户目标,知道了模拟用户的约束条件和问询内容;2.2我们根据当前对话状态选择出了模拟用户要执行的动作,但是最终需要输出的是人能够看懂的自然语言,那如何将动作映射为自然语言呢?
当前版本我们选择了模板映射的方法,输入为<动作,槽位,槽位值,话术模板>,输出为自然语言。
模板示例如下:
{
"Inform": {
"district": {
"msg": [
"我想找个%(district)s的房子",
"有没有%(district)s的房子"],
"type": "string"
},
"bizcircle": {
"msg": [
"我想找个%(bizcircle)s的房子",
"我想看看%(bizcircle)s的房子"],
"type": "string"
},
"resblock": {
"msg": [
"我想找个%(resblock)s的房子",
"有没有%(resblock)s的房子"],
"type": "string"
},
"bedroom": {
"msg": [
"我想找个%(bedroom)s居室",
"我想买个%(bedroom)s居室"],
"type": "int"
}
},
"Request": {
"house_price": {
"msg": [
"这套房子房屋价格是多少?",
"这套房子价格是多少?"],
"slot": [
"priceTotal"]
},
"macket_shellIndex": {
"msg": [
"这套房子均价是多少?",
"这套房子的均价是多少呢?"],
"slot": [
"priceAverage"]
},
"house_floor": {
"msg": [
"这套房子在几层?",
"这套房子是在第几层?"],
"slot": [
"floorLevelNum"]
}
}
}
当前用户模拟器可接收15类经纪人动作,可发出8类模拟用户动作,具体如下:
经纪人动作 | 模拟用户动作 |
---|---|
开场语、询问整体需求、询问特定条件、推荐房源、询问联系方式、约带看、回答房源信息、平台保障、确认需求、询问买房目的、约时间、约地点、结束语、留下联系方式、询问买方情况 | 开场语、告知、询问、反馈、约时间、约地点、留下联系方式、结束语。 |
1个交互示例展示:
simuser:你好
simuser:有没有朝阳区的房子
xiaobei:您是想看哪个小区的房子呢?
simuser:有没有中国铁建花语城的房子?
xiaobei:您这边总价预算多少呢?
simuser:总价最好在1260万左右
xiaobei:您考虑几居室呢?
simuser:我想找个三居室
xiaobei:您对楼高有什么要求?
simuser:都行
xiaobei:<房源卡片> (符合约束)
simuser:这套房子是日式装修吗?
xiaobei:想考虑装修好的吗?
simuser:比较喜欢精装的房子
simuser:这小区停车方便吗?
xiaobei:小区车位比较充足,车位比为1:1.2
simuser:好,先这样吧,我有需要再联系你。
当前实现的用户模拟器是贝壳IM场景下用户模拟器的初版探索,在缺乏具体业务场景标准数据集的情况下,借鉴和考虑了深度模型的特征表示方法,使用了工业上应用最广泛的agenda方法来实现。该方法具有可冷启动,在缺乏标注对话语料时可以根据经验进行设计;用户行为完全可控,保证了用户动作生成的一致性,一般不会出现异常用户行为等优点。
但该版本用户模拟器还有很大的改善空间,也是我们未来要做的工作:
刘娜,2019年6月毕业于北京邮电大学自动化学院,毕业后加入贝壳找房语言智能与搜索部,主要从事对话系统及强化学习相关工作。
廖明月,就读于中国人民大学,2019.11—2020.06于贝壳找房语言智能与搜索部实习。
推荐阅读
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏