产品推荐系统架构初探
想象一下,站在推荐引擎面前的你被抽离出一个数字的躯体。你找到一面镜子,却惊诧的发现自己的身体被无数数据所填充,许是:科技10%、篮球4%、热火队2.3%、历史1%、自然0.3%。你仔细观察,甚至发现了很多连你自己都没有注意到的细节:虽然热爱旅游,但你喜欢博物馆远多过自然景观。当然,你也会发现自己的身体上仍然有一团团的迷雾,那是尚未被系统所发掘的兴趣点。
专门为你适配的内容如一群萤火虫般朝你涌来,你伸手点击了一条内容将它点亮。就在点击的那一瞬间、你身上的迷雾有一丝散去了,同时显示出了新的兴趣点:“极限运动:0.01%”,那些原本就存在的密密麻麻的数字也有一些发生了变化:有的权重上升、有的权重下降。每一次选择与反馈,你都在进化着自己的数字躯体。
现在,你生出了双翅、原地飞翔了起来,能够从高处俯瞰整个推荐系统。你看到了一个又一个数字拟态的人,在不同的信息流中畅游。每个人身边围绕着许许多多的信息光点、又同其他人之间有着若隐若现的连接。一个个信息被阅读的点亮、被忽略的变暗。每一个被点亮的光点就像被延续了生命一样,得以被分裂成更多光点、顺着人和人之间的连接,飞舞到更多的人身边。此起彼伏的光点明灭,共同照亮了整座系统,让它仿佛有生命一般慢慢扩张。
这个过程听起来或许科幻,但用来描绘推荐系统,怕是再恰当不过了。
推荐是一个协作与进化的过程:
- 对于内容而言,每一个用户既是消费者又是决策者,被认可的内容得以进一步扩散,不被认可的内容被纠偏、不至于影响更多的人。
- 对于用户而言,每一次行为反馈都在不断完善自己的用户画像;而系统的兴趣探索行为,也在进一步给这幅画像补充了更多维度。
大致了解推荐系统的架构,能够帮助我们认知到:信息是如何匹配给用户的,而用户的选择又是如何影响后续的信息分发的。
作为一个工程问题,推荐系统的架构与搜索系统的架构具有一定的相似度:都做的是信息与用户意图之间的匹配。
搜索系统是将海量内容与用户表意明确的查询相关联,推荐系统则是将海量内容与用户没有明确表达的偏好相关联。
如果我们将推荐问题极度简化:用户只有一个爱好“NBA”时,那么推荐引擎给用户的结果就可以近似搜索引擎在“NBA”这个搜索词下的结果。
那么,一个简化的搜索架构是什么?
离线部分,专注在内容的搜集和处理上。
搜索引擎的爬虫系统会从海量网站上抓取原始内容,针对搜索体系的不同要求建立索引体系。在上图中,为了新内容能够更好的被用户看到,就专门建立了时效性索引数据用于存储几个小时之内的新内容。这是一个基于关键词的倒排索引,每一个关键词对应一长串提及该关键字的文章。比如,“教育”这个词命中文章1、2、3;“NBA”命中了另外一批文章1、2、4。
在线部分,负责响应用户的搜索,完成文章的筛选、排序并最终返回给用户。
用户输入一个搜索词“NBA”,这个词汇会首先经过搜索词的处理(会经过分词、搜索词变换等步骤),例如“NBA”和“美职篮”是同义词,那么在两个词都可以应用在索引的查询。
经历完搜索词处理后,进入召回环节。系统会通过多种召回方式,从索引数据里获得候选集合。在图中,就分别查询了全量的索引数据和时效性索引数据,获得了8篇文章的集合。
在召回的候选集之上,会进行排序的步骤,通过进一步计算获得最终结果反馈给用户,如图中的文章10和文章1。
用户的点击反馈也会影响排序环节的模型。在上图中,用户在展示给他的两篇文章中只点击了文章10,这一特征会被模型记录以统计文章10和文章1在搜索词 “NBA”下的表现情况。
借由搜索系统为参考,可以更好的理解推荐系统。
离线部分,同样需要通过各种方式来获取待推荐的内容(用户提交、协议同步、数据库导入等)。并依据推荐引擎处理的不同维度对这些内容进行索引处理,如话题、类目、实体词等。在上图中展示了两个维度:分类维度和实体词维度。
在线部分,其理亦然:量化用户的请求,完成文章的筛选和排序。
推荐与搜索最大的差异,在于用户表意的不明确性,故而,需要尽可能的完善用户的长期画像(对哪些类目、实体词、话题感兴趣)和短期场景(时间、地点),以此获得用户的意图,从而进行意图和内容的匹配。
- 当用户打开内容推荐软件时,提交给系统的信息如:时间、地理位置、网络环境、手机设备型号、登陆用户ID等。
- 基于用户ID,推荐系统会取出用户的画像数据(User Profile)。在分类维度,用户对体育和科技的内容感兴趣;在实体词维度,对于NBA感兴趣。
- 根据用户的画像信息,发起不同的召回过程(类目查询和实体词查询),获取各种类型的内容构成候选集合。
- 按照特定预估目标(如点击导向、互动导向)对候选集统一排序,并反馈给用户。
值得注意的是:对于推荐系统而言,用户的行为不仅具有针对内容价值评估的群体投票意义(如:某篇关于NBA的文章,偏好NBA的用户都不点击,那么其在“NBA”这个实体词下应该权重降低)同样具有针对自身画像的个体进化意义(如:用户总是点击有关于热火队的NBA文章,那么这个用户的画像中会补充“热火”这个实体词,影响后续他自己的推荐内容流。)