对话式推荐系统(Conversational Recommender Systems,CRS)本身并不是一个新的东西,比较有名的综述,早在21年就已经有了,众所周知,当一个领域开始有综述,说明该领域已经有一定研究基础,甚至开始成熟了,但时至今日,借着大模型的东风,对话系统被包装为各种产品,CRS也有开始被拿出来尝试的迹象,因此,本文借助这篇综述,给大家介绍一下CRS吧。
此处也给大家推荐这种学习方法,要了解一个领域,从综述下手是非常高效的,不仅了解了基本概念,也了解具体的研究现状,甚至可能是研究方向, 另一个比较好的材料就是学位论文的相关知识这块,要是想入门,这两个材料可以帮助你快速了解。
综述论文:Advances and Challenges in Conversational Recommender Systems: A Survey。参考材料:
-
完整论文看这个:https://www.sciencedirect.com/science/article/pii/S2666651021000164 -
https://blog.csdn.net/weixin_40423032/article/details/118230434 -
https://zhuanlan.zhihu.com/p/455851322 -
https://www.jianshu.com/p/5520dbfa39d4
另外,要真正理解CRS,是需要对推荐系统以及对话系统都有一定了解的,推荐系统本身并非我之擅长,但对话系统是有一定了解的,有兴趣大家可以看看我这篇文章,希望能帮大家建立起对对话系统的基本概念(前沿重器[21-25] | 合集:两万字聊对话系统)。
本文不会严格按照论文来进行讨论,本文更倾向于讨论CRS的概念以及关键的技术点。
懒人目录:
-
概念 -
CRS的组成和常用方法 -
最简CRS在线流程
概念
我们先从常规的推荐系统开始,例如知乎的文章推荐、淘宝的商品推荐等,这些推荐系统是基于用户的行为,为用户推荐可能合适的物料,这个领域想必大家也知道,已经有了大量的研究工作,同时借助业界应用的经验,有了大量的成果。
而CRS,是在这种常规推荐系统下,演化而来的一种更特别的推荐系统,通过对话交互了解用户的偏好而进行产品推荐就可以被称为对话式推荐系统了,来看看论文的定义:
A recommendation system that can elicit the dynamic preferences of users and take actions based on their current needs through real-time multiturn interactions using natural language.
————————————————
一种推荐系统,可以通过使用自然语言的实时多轮交互,从而激发用户的动态偏好,并根据用户的当前需求采取行动。
先来看看例子:
从这个例子分析,CRS从产品形态上,相比常规推荐系统具有的最大的优势,就是具备可交互性,这种可交互性,能为推荐系统如下非常重要的信息:
-
直接获取用户的显性需求,以便进行更加精准的推荐。 -
交互意味着还能够获取反馈,反馈能为目前对话推荐以及未来的推荐提供信息支持。 -
用户体验的提升,对话过程中能更敏感地更新需求,精准获取结果。 -
一般的推荐系统可能只能获取用户的选择,然而CRS借助对话能力,可以深入挖掘需求或者兴趣的原因,例如好看的封面和精彩摘要、生活需求等,都可以挖掘,还能反向挖掘出对某些物料感兴趣的关键点。
CRS的组成和常用方法
CRS本身的结构非常好理解,其实就是C-对话和R-推荐,在论文中,是把C-对话这个模块又拆了一层,拆成了NLP部分和对话策略部分,最终形成了3个组件:
-
user interface:负责理解用户会话和生成回复,即NLU和NLG的部分,是面向用户的第一步和最后一步,所以被称为用户接口。 -
conversation strategy module:负责对话策略部分,例如进行挖掘挖掘用户兴趣还是推荐的决策等。 -
recommendation engine:负责筛选产品进行推荐,论文强调还指出了Exploration and Exploitation (E&E)的问题。
用户接口
首先是NLP部分,即负责用户会话和生成回复的部分。
理解这块,这块方案上其实并不算难,都是传统NLP这一套,理解用户会话的任务其实就是意图识别和槽位抽取,意图识别主要识别的是用户想要做的事,这个是直接影响对话策略的,常规的意图可以考虑这些(来源于一篇论文,不过一时找不到了,有找到的小伙伴欢迎在评论区补充):
-
开场白-开始一场对话 -
闲聊-和推荐目标无关的话术 -
提供偏好-和系统分享自己的偏好 -
修改偏好-修改开始或之前提及的偏好 -
索要推荐-希望从系统中获取推荐结果 -
获取解释-希望知道推荐理由 -
获取详情-获取推荐物料的详情 -
推荐反馈-对推荐结果进行反馈 -
重启-重新开始对话 -
接受推荐-结果某一个推荐结果 -
结束语-结束一场对话
而槽位提取,更多是捕捉用户兴趣,这个做的糙一点其实就直接提取标签(关键词抽取)就行,复杂的就需要做命名实体识别了。当然也有隐式的向量化来整,这个方法也是有的。
至于生成这块,需要配合对话策略决策和推荐模块的返回结果,进行组装和生成,一般而言需要考虑如下信息输入:
-
语言回复话术:例如打招呼之类的,那肯定是需要有对应的回复的。 -
推荐结果:物料的结构化信息。 -
其他对话策略,例如追问、道歉等的指令。
把这些内容梳理整理完,就是生成了,此处需要注意,这里不只是模型生成,很多内容其实是可以配置化甚至写死的,一般而言,文本是会有两个来源:
-
模型生成:特定的话术,通过模型生成,例如道歉、追问、推荐理由等回复,这块非常适合用大模型了。 -
配置话术和话术模板:例如物料的解释,再例如开场白回复等,其实完全可以直接拼接或者配置,就完全可用了。
对话策略模块
其实我个人更想把这一步叫做对话管理,这一步确实是对话系统,尤其是多轮对话的关键模块了。
-
DST(Dialogue State Tracer)记录历史对话内容,例如关键的槽位意图,在CRS里面就是用户提及的兴趣偏好,以及各种反馈和推荐信息。 -
DP(Dialogue Policy)根据DST,给出对话决策,即下一句应该回什么话,例如该追问、安抚还是给推荐结果,甚至是组合,基本都是由这一步来做的。
而在CRS里面,会有特殊的一步,就是将NLU中提取的槽位、意图转化为用户的兴趣特征,这种信息可能是用户直接对兴趣的描述,例如“我喜欢周杰伦的音乐”,亦或者是用户的显式选择反馈,例如直接点击了“稻香”,这块内容我的观点和作者一致,就是放在DST里面做,当然也可以放在NLU里,这个问题不大。
特别地,这块论文中提及了一些兴趣抽取与挖掘的方案,这块大家有兴趣可以直接看论文了解。
推荐模块
这里独立出来的推荐模块,其实和常规的推荐系统整套就比较类似了,论文里面着重提及了EE(exploration-exploitation)问题,常规推荐系统中有个重要的权衡,即探索还是利用,一方面,我们需要时刻捕捉用户的兴趣,另一方面还要给用户推荐合适的产品,没有前者,我们无法知道用户兴趣,没有后者推荐系统就没有意义,但是推荐的位置是固定的,所以此时需要权衡。这是推荐系统的问题之一吧,不过肯定不是全部,此处大家有兴趣可以看看论文,尤其是在加入对话系统之后这个问题本身性质的变化和解决方案的变化,都挺有意思的。但因为本身和CRS的架构关系不大,所以我就不赘述了。
最简CRS的在线流程
这里给出一个基于个人理解的最简单的对话式推荐系统的在线推理流程吧,即要建设一个CRS,最简单的版本需要哪些处理模块。
-
用户输入 -
NLU模块: -
意图识别、槽位提取。 -
对话管理模块: -
记录对话内容。 -
对话决策: -
通用回复,如打招呼、再见。
-
追问信息(索要偏好)
-
提供推荐(给出推荐结果)
-
推荐系统: -
兴趣梳理和特征工程。 -
对话决策为【提供推荐】时: -
召回:基于用户兴趣,从多个渠道路径进行多路召回。
-
排序:多路召回的合并和排序。
-
对话决策为【追问信息】时: -
确认需要追问的内容
-
NLG模块: -
对话决策为【提供推荐】: -
梳理推荐结果,结构化返回。 -
对话决策为【追问信息】: -
根据需要追问的内容构造回复话术。 -
对话决策为【通用回复】: -
查询通用话术回复。
系统架构上,可以参考这个服务推理流程。
-
Center是中控模块,负责管理整个推理流程。 -
首先请求NLU,负责做query理解。 -
然后请求DM模块,DM模块需要结合历史信息和本轮信息,一方面梳理对话内容,形成对话记录,这个需要重新写回DST,另一方面把对话决策返回到center中。 -
RECOMMEND则开始进行推荐,此处还依赖之前有的用户画像以及物料画像。 -
NLG则根据对话决策和推荐结果返回回复话术。
补充说一下,这里可能会有人问到是否可以把DM抽出来做center来控制整轮流程,其实前期服务比较简单的时候可以这么做,但是后期逐渐复杂后还是需要形成这样的结构,看时间阶段吧,后期毕竟DM模块内其实有很多业务逻辑,尤其是对话决策这块,可能涉及模型的分类、排序啥的。