前言:本文作者是团员“大番薯”,“交互式课程推荐BOT”这个重度干货非常长,将会分成3篇文章来叙述,本文是第2篇;也欢迎有更多的团员们来分享你的AI干货~
注:第1篇文章在《团员分享_交互式课程推荐BOT尝试心得(1)_@大番薯_20200519》
对话管理模块,分为用户对话状态跟踪+对话策略生成。
通过BOT与用户交互式的对话,引导或限定用户的回答范围,理解用户的意图,管理对话的状态,基于状态进行对话策略的判断,从而生成下一步的动作。
这里就涉及到几个关键点:
1)对话如何设计:包括BOT的对话的类型和话术,根据用户可能的回答来设置不同的回复方式
2)对话状态:包括用户全局状态,和在语境中上下文所处的状态
3)对话策略:基于对话状态进行对话策略的设置和判断,从而生成下一步动作
4)对话生成:针对每个BOT动作,生成对应的话术
在对话流中,首先需要考虑BOT的说话都有哪些种类。在这个场景下,除了开场白/结束语,其余的总结为三个大类别:提问、回复、推荐
总结了如下不同的问题类型及问题:
拆解完有哪些场景下的问题以后,最重要的是设想每个场景每个问题下面用户可能的回复。如何预测用户的回复,并作出应对?
即使在强话术引导的情况下,用户的回答也可能是千奇百怪,不按照你的既定套路进行的,所以需要做好各种情况下的预判和回复话术。
在这里也赞一下饭官大人的分享,笔者之前在整个项目过程中时,也经历了测试时期焦头烂额的情况,测试的时候才发现很多异常情况没有兜底回复,究其原因还是一开始没有想清楚用户在每个问题下可能的回复,拆解得不够清晰,在看了@饭官大人 的文章以后,有了豁然开朗的感觉,感觉分享的这一套方法论在交互式推荐的这个场景下,还是蛮适用的。
方法论中,用户可能的回答有几种情况:
A)跟随 也就是乖宝宝型,我就是按照你的套路认真填充
B)筛选与修订 在课程推荐的场景下,就是对BOT给出的对话选项或者是否问题不满意,人为回答了一些其他的回答。比如BOT问职能一、职能二、职能三当中你对哪个更感兴趣的时候,用户回答“都不感兴趣,我喜欢职能四”。
C)关联咨询 比如推荐课程以后,针对不太理解的名词,会进行QA问答。或是针对课程详情中的各种属性有一些疑问,均可能产生问题,比如:xx课的讲师是谁?/ 有没有其他跟这门课类似又适合xx职能的课程?
D)无意图表述
无意图表述本身可能包含很多种情况,如下:
我也不知道/ 稍等我想想/ 我不喜欢你的推荐 /你看着办吧/随便吧 /你怎么总给我推荐这个/ 你推荐下吧
这里针对无意图表述,利用情感模型识别出了喜欢/不喜欢的情况(如果有槽位也会抽取)
比如 “我不喜欢你的推荐” 这句话,会被识别成“负向情感”,接下来可能会请求用户问具体不喜欢的点。
还有 【推荐】这个意图,即使没有明确方向,还是会被识别出来的,接下来会通过各种随机问题去增加话题,激发用户的兴趣,找到推荐方向。
剩余的无意图表述,在每种状态下面可以配置不同的回复策略。
E)命令控制 这个场景下暂时不存在
F)用户表达跳出/退出
跳出是跳出当前对话,在这个场景下主要是用户明确表达否定意图或拒绝继续当前的推荐,这时候可以跳出当前推荐流程,切换到其他话题;
退出则是明确说再见,是整体这轮对话流的结束。
增加挽留确认话术和退出引导话术也是继续对话比较重要的,有时候用户可能只是对当前的推荐流程不太满意,但还不至于退出整个对话流,因此跳出的时候需要增加挽留确认话术,猜测用户感到厌烦的点,切换其他用户可能感兴趣的点。同样退出的时候,加上引导话术也是给用户更好的体验。
其实拆解完用户如何答以后,用户的意图模块也补充得差不多了。
提问的类型也是要依据不同场景和语境进行切换的,同时需要根据用户可能的回复设置不同的提问方式,大致分为以下三种:
A)开放型:不限制用户的回答,提问的问题属于开放型的问题,但由于整体属于课程推荐的场景,正常情况下预期用户的回答是局限在这个场景下的,因此,如何设计针对性的提问会显得比较重要。比如:现在是互联网大数据时代,技能傍身不用愁,你有没有想要学习的技能呀?
B)选择型:提问中提供几个选项,让用户进行选择。比如:你是男孩子还是女孩子丫? / 我统计了跟你同职能的职场人士,职业路径发展的top3是:职能1,职能2,职能3,你对哪个职能比较感兴趣?
C)是否类:事先生成了一些需要确认的信息,通过是否类的问题来让用户进行确认。比如:需要我为您再推荐一些课吗?/ 看出来你很喜欢xx相关的内容啊,要我再为您推荐一些类似的课程么?
这三种类型,开放型给用户最为自由的权利,其次是选择型,最后是是否类。
开放型在给予用户极大权利的同时,也带来了极大的不确定性。因为用户会针对你的问题产生各种各样的回复,如果开放型太多,没有做好异常回复管理,用户心理预期反而会下降。
解决方案就是在设计的时候,尽量引导用户,使得用户正常回复的范围是限定在某个领域下的。比如用户反馈不喜欢的理由的时候,BOT可以引导说:“我发现你对xx课不太满意, 能否告诉我具体对哪方面不满意?你可以从讲师、兴趣爱好、行业领域、适用岗位、推荐力度这些角度来考虑,方便我重新推荐更合适的课程给你。” 而这些领域,正是算法会着重识别并理解,最终反馈到推荐效果的方面。这样一方面给了用户一个心理预期,一方面也会使得用户的感知更好。
选择型的问题有两种类型,一种是枚举型且数量较少的,比如性别、学历等;另一种是为了引导用户按照既定的思路和节奏走。这里需要注意的是,用户不按照既定选项回答的情况,要怎么回复。
比如BOT问:你是男孩子还是女孩子丫?
此时用户回答:变性人
当然带有一定的调侃,这时候是直接认怂,走兜底策略承认自己听不懂;
还是继续进行追问,追问的话要追问多少次;
或是有一些特殊的设置,比如针对这问题:我统计了跟你同职能的职场人士,职业路径发展的top3是:职能1,职能2,职能3,你对哪个职能比较感兴趣?
用户对提供的这些选项都不感兴趣,他可能会回复:这些我都不感兴趣
针对这一类回复,可以新设置一类意图:用户对BOT问题明显表示拒绝或否定
识别到这个意图以后,进入对应的状态,再配置对应的话术和动作,就可以覆盖这种情况了
以上,是我举的一个例子,说明了在每一个选择型问题下面,都需要对用户可能的回复进行预判,并抽象出通用的用户意图并进行对应的处理。
是否类的问题在这个场景下比较单一,主要集中在BOT问是否要再推荐一些课程的时候,或是BOT通过前面的反馈行为理解了用户偏好后,主动发问是否要推荐类似课程的时候。
这时候只要识别用户肯定/否定的意图,在肯定意图的时候,配置话术,并根据用户画像进行推荐;在否定意图的时候,可以给出合适的话术;其他情况下,认怂走兜底话术就好了。
每种问题下,是可配置多种不同问法的,可以设置每次随机抽取一种问法进行提问。具体问法的话术就要涉及到语感层面,怎么问会让人比较舒适,且人格整体是一致的
这个问题的提出,主要是经历了前后的两个版本。一开始设计问题的时候,将问题分成了:开场后的固定问题,根据用户反馈后必出的问题,还有学习一段时间对话以后根据用户画像偏好生成的问题。固定问题是事先设置的,并且在开场后就会出来,无非是问性别、年龄、职业、爱好等等,先收集一波用户画像。
试验了一个版本之后,感觉效果并不好,遂将这些预设的问题切换成了随机问题,只在开头问一两个问题,接下来每次顺利完成一个推荐过程无话可聊以后,会随机生成这些问题提问,也就是“找话聊”,继续对话流。
如何做到在没话聊的时候自动找话聊呢?具体的方案是给每一个动作设置一个优先级,比如类似这些问题优先级就比较低,正常推荐反馈再推荐的流程中的动作优先级就比较高。
在随机问题中,还可以设置每个问题是否能被重复触发。因为有些比如性别、岗位,不可能问了一次以后继续重复问,会显得很傻;而像爱好、想学的技能这种,可以设置问多次。
总结固定问题和随机问题两者的区别,主要是:
固定问题:具体的问题,用户会感到压力,有种被审问的感觉
随机问题:具有随机性,在没话聊的时候出现,顺利推动对话的进行,可能给人惊喜感
对于这两者的看法,可能也是见仁见智。笔者有同事体验以后,发现随机出问题反而会对他产生困扰,导致他感觉很乱,没有一条清晰的主线,反而是起了副作用。这也带出了下面这个话题:对话的整体节奏。
交互式推荐主打的就是交互式的对话体验,肯定需要考虑整体节奏如何更合理,让人更舒服。主要有两个点:
目前版本的设定是,交互式对话应该在掌握整体节奏的情况下,更多地去引导用户,理解用户,推动对话的进行,因此每一轮对话结束后,必定会出现回复、推荐、提问的行为。
这里有一个值得探讨的场景,就是当每轮推荐课程后,BOT会让用户去点赞点睬,一旦进行了这个操作,下面就会针对评分进行互动,比如问一些反馈理由等等,方便更精准地推荐。但是评价的行为不是强制进行的,因此没有互动的时候,BOT会默认认为用户不感兴趣,或是用户本身的习惯就不喜欢操作,为了推进对话进程,接下来会切换问其他话题的问题,就是上文提到的随机问题。
针对这种设定,采访发现两拨人有不同看法,赞成的人认为对话推进较好,如果还在看推荐的课程,那直接忽略下面的提问就好了;不赞成的会觉得我还沉浸在上面推荐的课程中,这时候出问题,会打断我之前的进程。
这两种想法都能理解,个人其实比较偏向不赞成,更希望通过前端的交互体验来改善,比如通过记录用户的操作和浏览,或设置一定时间以后,推测用户对推荐内容不感兴趣,已经完成了浏览以后,再继续问问题,这样在浏览过程中不至于打破用户的进程。
关于BOT主动多一点 ,还是用户主动多一点这个问题,在交互式对话中也是很关键的一个问题,因为这个度很难把握。一旦把握不好,BOT太主动,用户会感觉丧失了主动权,被你牵着鼻子走;而BOT如果太不主动,又没办法推进对话的进程,很多时候一旦一轮对话结束以后,用户会不知道接下来可以干嘛,从而疯狂地尝试输入对话,很可能一下子就走入了死穴。
要想达到最佳的效果,个人认为还是需要有很有趣的话术引导,通过NLU的能力理解用户跟你说什么,并且在适当的时机随机出一些功能,带来惊喜感。同时,也要给用户足够的自主权利,比如用户可能已经有了很明确的方向了,根本不想听你这么多引导,那就要明确告诉用户有哪些意图是直接可以支持的,用户可以直接说,简单高效,直达最终目标。
交互式推荐如果能给人带来很好的体验,核心一定是底层NLU的理解能力,理解得好了,我会觉得你做什么都对,再加一点小惊喜就很完美了;理解得不好,所有的主动引导就变成了累赘,越说我越烦。这是我深切的体会。
回复行为每回合可以无限多个,且出现在提问行为之前。因为每轮回复的优先级肯定是最高的,接下里没话说了才会进行提问或推荐。
推荐行为是每轮对话最后的基石,前面的所有对话都是为了引导到最后推荐的行为,可谓是最重要的行为。有别于传统推荐,BOT推荐场景,有以下几点需要着重考虑。
什么时候算是一个最好的推荐时机?用户有明确意图的时候,可以直接推荐;相反如果用户不清楚要看什么课程的时候,要通过各种引导,在对话的过程中,让用户找到欠缺的知识点,或者激发潜在的兴趣,一旦get到有用的信息点以后,就可以直接推荐。
要注意的是,在对话整个过程中,大部分画像推荐之前,需要向用户确认是否需要推荐,除非是用户很明确的意图来推荐,或是BOT在问的时候,已经提前预告过需要根据用户的回答来做相应推荐了,那就可以直接推荐。
请求确认,这是对用户的一种尊重。
推荐的类别一共分为三种:
A)搜索推荐:抽取用户话语中的槽位,根据职能/技能/爱好/讲师等单维度直接推荐课程
B)画像推荐:根据对话历史中积累的用户画像和偏好,结合上下文信息,推荐课程,主要涉及到合理的推荐课程排序呈现
C)相似推荐:针对推荐出来的每一门课,都可以推荐跟这门课相似的课程
搜索推荐和画像推荐的区别,可以从用户来使用这个BOT的动机出发。说白了,用户如果来这里就是有很明确的目标和需求,那就是直接走搜索,如果推荐得好,一轮就可以解决问题;
完全没有目标,纯粹靠用户行为反馈,就变成了信息流推荐;
如果推荐效果不满意,可能会有很多因素,可能课程确实是相关,但是某些力度不够匹配,或者仅仅是不喜欢讲师风格等等。通过多次的反馈,理解用户的目标,最终反馈到推荐结果上面,这就实现了一个小闭环。
用户满意了以后,是否还需要继续推荐?或是问用户是否要推荐类似课程?
不喜欢评论的用户心态是什么样子的?如果每轮推荐课程后都不反馈,便会一直切换话题,不停地进行推荐,这样是否合理?但如果不切换话题,对话流就不会继续,用户会知道如何继续对话么?也许有一部分用户会希望主动问BOT,大部分用户可能会不知道如何继续对话。
如果每次以用户满意为一个小目标小闭环,为了继续推动对话,接下来还会针对其他话题进行提问,但下一次的话题可能与上一次话题偏差较大,此时当前的画像更新后,根据画像推荐的课程中,如何平衡历史对话中所有涉及的画像维度?如果在toC场景下,采用传统信息流的样式,推荐课程的数量一定不是个问题,但BOT由于受到样式的限制,导致设定每轮只推荐三门课程,不可能覆盖全部的历史画像维度,此时如何展示,让人体验更好?
以上的问题,我也一直在思考,但到底什么样的方式是最好的,我还没有一个特别明确的答案。
可能出现的推荐场景如下:
所有状态正常退出时,默认先回复用户,动作为reply_xxx
凡是带await的状态都是等待用户对上一轮bot问出的问题的回复, 不带的都是主动识别到的意图
下表罗列了所有的当前状态、对应含义:
对话策略模块,主要的流程为:
识别用户意图——判断系统进入什么状态(考虑用户状态+系统全局状态+BOT当前状态)——根据当前状态下成功/失败/拒绝的情况决定下一步动作——有下一步动作的根据每个动作对应话术,走话术+action;没有明确动作的进入随机提问状态,根据提问优先级出随机问题。
对话生成模块,主要需要厘清所有可能的BOT动作,在每个动作下需要生成对应的话术。如何根据BOT动作生成对应的话术?是这个模块主要考察的点。
生成话术一些基本考虑的点在对话设计中基本已经覆盖,在此不做赘述。
通过BOT的不同问法,限定用户的回答范围,使之不至于偏差太多
一旦获取到某个标签,比如性别、技能、职能等用户画像字段,每一个维度都会预设一些话术生成的模板。笔者所在公司深耕于人力资源领域,所以底层具有丰富的知识图谱资源,利用职能与技能关系、职业路径发展等,可以生成一些模板,并融入到话术中,如下例:
我掐指一算,80%的{职能名称}都对这些专业技能和优秀素质感兴趣:{技能列表}<br />你对哪个比较感兴趣?我可以给你推荐相关课程哦
我统计了跟你同职能的职场人士,职业路径发展的top3是:{职能名1,职能名2,职能名3}<br />你对哪个职能比较感兴趣?
这样子确保了每个生成的问题都是动态随机的,不会死板。
BOT会根据对话状态来选择反馈行为,动作行为一共分为三种:推荐reco、提问ask、回复reply。
每次BOT说话必会出至少一个提问/推荐行为来推动对话流进行,回复行为每回合可以无数个,且出现在提问行为前。
每个动作可以设置触发条件,比如一些依赖槽位成功获取以后才会触发。
注意:首次和非首次的话术可以有所区分
推荐模块会在下一个章节详细介绍。这里主要介绍动作中包含的几个功能:
根据用户的历史对话记录和反馈行为,发现用户偏好,生成问题,在无话可聊的时候提问:
根据历史对话记录,我发现你对{like}相关内容较感兴趣,需要我再为你推荐些这方面的课程吗
1、在用户反馈喜欢/不喜欢理由的文本中,判断用户喜欢或不喜欢的情感
2、全局判断用户是否抱怨的意图,如:别再给我推这些课了。一旦识别到该意图,BOT会说:
好的, 看出来你不喜欢关于{标签名}的内容, 以后的推荐中为你避免这些内容
设置第二个功能,主要是考虑到很多人可能不适应交互式主动对话的场景,且当推荐效果不尽如人意的时候,很容易产生负面情绪,需要这样一个全局意图来解决
这个功能是情感分类的下一步,从用户反馈的文本中,抽取出具体喜欢或不喜欢的标签,这个需要一波语料进行训练,在这个场景下可能的回复大致如下,截取了其中一些片段:
我更喜欢like老师的课
相比较dislike老师,我觉得like老师在这方面讲得更好
我(觉得/认为)like老师的课讲得很精彩
我不太需要掌握dislike相关的技能
这门课讲的内容比较偏重dislike,但我想要跟like更相关一些的内容
我喜欢like,不喜欢dislike
我喜欢like相关的内容,但是不太想要dislike的内容
我觉得这门课比较适合dislike行业或领域,不太适合我
抽取到喜欢/不喜欢标签后,会针对不同情况回复不同模板:
我明白了, 你可能喜欢{like_vals}相关的内容, 不喜欢{dislike_vals}
我明白了, 你可能喜欢{like_vals}相关的内容
我明白了, 你可能不喜欢{dislike_vals}相关的内容
好的,收到您的反馈
共情的功能第一个是体现在话术上面,当每个状态失败、拒绝或服务异常的时候,会配置相应的话术。
下面举一些例子:
第二个是,当用户回复兴趣爱好后,利用小样本多分类模型,将标签分类到事先定义的某一个兴趣类别标签,并配置不同的呈现后缀,比如当用户说喜欢网球时,回复:看出来你是个运动健将呀
第三个是,用户面对获取画像的一些问题回复后,针对每个回答中的关键词,会生成对应的问题,并给出相应的解释,也可能直接回复关键词对应的解释。主要是基于丰富的问答语料和百度百科info box来进行训练,生成答案。下面举一些问答的例子:
用户针对每个标签进行提问,触发QA模块后回复
主要在用户针对推荐课程的一些专有名词不清楚时,进行提问,会实时从百科抓取词条对应的解释。
-什么是人工智能?
-认真搜索了知识库, 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
未完待续:
四、推荐:包括搜索推荐,画像推荐,相似推荐
五、测试&评价
六、落地应用场景
七、可优化方向
-END-
以上内容,来自饭团“AI产品经理大本营”,点击这里可关注:http://fantuan.guokr.net/groups/219/ (如果遇到支付问题,请先关注饭团的官方微信服务号“fantuan-app”)
---------------------
作者:黄钊hanniman,图灵机器人-人才战略官,前腾讯产品经理,7年AI实战经验,10年互联网背景,微信公众号/知乎/在行ID“hanniman”,饭团“AI产品经理大本营”,分享人工智能相关原创干货,200页PPT《人工智能产品经理的新起点》被业内广泛好评,下载量1万+。