如何实现一套推荐系统?

我们经常说大数据比你还懂你,无论在刷抖音,听音乐,看剧还是购物时,都会看到一些我们很喜欢的东西,让我们忍不住的去看一看。

那么我们和“它”是如何相遇的呢? 这背后的原因是,各个系统的推荐引擎在不断的学习你的喜好,给你推送你喜欢的内容。

这里我们就聊一聊,推荐引擎是如何给我们推荐内容的。

推荐的核心思路

所谓推荐,就是根据用户的喜好,推荐给用户一些用户不知道的内容(商品、书籍、音乐、视频等),将人与内容联系起来。

这里涉及到两个概念:

  • 用户喜好:一般用户是不会将自己的喜欢什么告诉别人的,甚至用户可能自己都不知道自己喜欢什么,这里主要是通过用户在网站里所有的行为记录来进行综合分析,比如下面的用户行为
    • 购买记录:用户买了什么,就能分析出很多东西。比如用户需求、价格、品牌接受度等。
    • 点赞、分享等一切正向行为:分析用户的喜好
    • 点踩、举报等一切负向行为:分享用户的不喜欢
    • 评论、搜索记录等主动行为:用户的主观意愿表达,无论是文字,还是语音,都可以通过分词技术、自然语言处理技术,得到一些关键词,这些关键词就是用户的好恶。
    • 点击、浏览时长:最直观的,喜欢、好奇才会点击;感兴趣,看的时间越长。
    • 收藏:强烈喜欢意志的一种表现。
    • 等等
  • 推荐内容: 抖音的视频,淘宝的商品,广告,QQ的音乐,以及好友,网上展示的一切,都可以算是内容,而每个内容也可以挖掘出一些特征,比如:
    • 作者、商家、品牌
    • 价格
    • 风格、主题
    • 内容
    • 语言
    • 地域
    • 等等

通过分析用户行为,将内容的熟悉与用户的喜好联系起来的过程,就实现了平台对用户的内容推荐了,这也就是所谓“大数据比你给了解你”的原因。

推荐引擎的实现

推荐引擎的指导思想有了,我们接下来要做的就是在技术层面实现这个推荐引擎如何实现,按照不同的实现思路,大致可以分为以下几个方面:

协同过滤时代

协同过滤算法,可以说是最古老的推荐算法了,这个算法诞生于1992年,甚至可以说,这个算法的诞生,才有了推荐系统的出现。

这个算法的核心思想很简单:

  • 基于用户的协同过滤算法:一个用户对一个内容很喜欢,那么相似的用户可能也会喜欢这个内容。
  • 基于内容的协同过滤算法:一个内容被很多用户喜欢,那么相似的内容可能也会被这些人喜欢。

基于用户的协同过滤算法

无论是视频网站,还是购物网站,此时已经收集到了相当多维度的用户行为数据,比如 购买记录、点赞、收藏等。

这个时候,我们可以通过简单的集合近似度算法,比如jaccard算法(核心逻辑:交集/并集)来寻找相似的用户。

比如,通过将用户的购买记录,收藏记录的内容组成一个集合,然后通过jaccard算法,两两比较,找到相似度比较高的用户集合,然后把彼此购买、收藏内容推荐给对方,一个最简单的基于用户的协同内容推荐就完成了。

基于内容的协同过滤算法

基于用户的协同过滤算法一样, 基于内容的协同过滤算法是以内容为判断依据,来寻找会喜欢这个内容的人。

如果说基于用户的协同过滤算法还需要记录用户行为的化,那么基于内容的协同过滤算法只需要分析内容相似度就可以了,而内容的所有信息,网站是全部都掌握的,比如风格、价格、商户等,而且还能通过基本元素组合的方式,整合出更多的信息。

我们可以通过将有类似的风格、价格等组成一个个集合,最后根据用户的点击、收藏等习惯,直接推荐集合里的相关内容即可。

这里内容的最终选择,可以直接从相关集合里随机选择,也可以进一步,通过类似jaccard算法,将用户点击内容的组成的集合与相关内容集合进行相似度比较,将相似度最高的内容推荐给用户。

综合使用

任何推荐算法都不是万能的,正常来说,可以将各种算法综合来使用,比如通过基于用户的协同过滤算法找到相似用户,然后再根据相似用户的内容,通过基于内容的协同过滤算法进一步筛选出相似内容,推荐给这些用户。

标签时代

协同过滤算法时代,主要还是通过用户的行为,和商品的原始信息,来推荐内容。

但如何想要更精确的去挖掘用户的喜欢,实现内容得更精准推荐,这个时候就引入了标签的概念。

所谓标签,就是在原先的用户属性,内容属性外,从另一个垂直维度,来对所有的用户、内容打标签,这个标签是很灵活的,如用户、内容完全无关的。

举个极端的例子:我们完全可以给一本书,打上“苹果”的标签,这个规则上是允许的。

而标签的来源,整体上可以分为两种:

  • 主动标签:用户主动给内容的标记行为
    • 比如豆瓣电影评价的时候,会要求提供印象标签
    • 我们第一次登录微博是,会让我们选择喜欢的领域,这就是给自己打标签。
    • 等等
  • 被动标签
    • 基于内容的协同过滤算法里物品的原始属性都可以当做标签来使用,比如作者是“金庸”,内容是“美女跳舞”等
    • 基于自然语言技术的发展,我们还可以对内容进行分析,提取内容的关键词进行打标
    • 类似搜索引擎这样的,我们的搜索关键词也是天然的标签。
    • 等等

哪吒电影的标签

通过上面的主动标签、被动标签,我们就得到了我们需要的标签,这些标签可能是一维的,比如“书籍”;也可以是二维的,比如“作者:金庸”;还可以是多维的,完全看我们的设计。

有了标签,特别是主动标签的加入,我们的内容在各个维度上的特征(这些特征也开启了后面机器学习的原始养料)也就更加的精准。

内容精细化了,上面的协同过滤算法计算出来的结果也就更加的精准了。

向量推荐

不仅仅如此,标签的出现,还允许我们在协同过滤算法外,还可以使用一种更高效的推荐算法:基于向量的余弦相似度算法,来进行内容的整合、推荐。

向量推荐 和之前的 jaccard等集合算法,在实现上有着根本的差异。

一个是基于集合的算法,基于集合的算法,无论如何优化,粒度都不过精细,也就是我们常说的推荐不准。

另一个是基于向量的算法,向量算法脱离了集合元素匹配的限制,而是通过不同的元素组成的向量,通过向量的方向来判断内容是否相似。
而且向量的特性是有方向的。 [a,b][b,a]是完全不同的向量。 这样,我们不仅可以更加细粒度的量化各种 内容特征,还可以通过一些行为发生的先后的顺序来判断内容是否相似。

比如用户a,给电影b,打了c的标签,这样我们就可以得到一个三维标签[a,b,c],这种带有很明确方向性行为的数据,用集合是很难处理的,但是如果当做向量,就很好处理了。

所以,向量推荐算法的出现,不仅可能让我们对内容实现更细粒度的划分和推荐,还能更加精准的识别用户的意图,挖掘内容的隐式语义相似性,为以后的AI时代的千人千面打下了基础。

而且,更进一步,我们还可以对不同的标签添加不同的权重,用来标识标签的质量。比如用户评价里,喜欢=100分,一般=50分,不喜欢=-100分。

这样,有了权重的加持,就更可以从浩如烟海的内容中,匹配到用户最喜欢的内容了,还可以同时把用户的雷区规避掉。

有了向量,有了权重,在加上内容当作点,有没有想到些什么?

通过这些要素,我们就可以组成一个

我们完全可以把所有的内容向量,导入图数据库中,形成一个庞大的关系图,只要在一定距离内,能够彼此到达的节点,都是具有相似性的。

这样,我们要寻找的推荐的内容,就可以转换成在图中,点和点之间距离的相似度 问题了。

图

如图中,我们研究左右两侧节点的点距离

  • u1->A : [u1,甲,天,A] , [u1,乙,天,A] , [u1,乙,地,A]
  • u1->B : [u1,甲,天,B] , [u1,乙,天,B]
  • u1->C : [u1,乙,天,C]
  • u2->A : [u2,乙,天,A] , [u2,乙,地,A]
  • u2->B : [u2,乙,天,B]
  • u2->C : [u2,乙,地,C] , [u2,丙,玄,C]
  • u3->A : []
  • u3->B : []
  • u3->C : [u3,丙,玄,C]

通过路径,我们可以找到与u1->A相似度最高的是u2->A乙->地->A), 然后可以通过u2的这条路径,把C推荐给A。

当然这是最简单的例子,我们还没有讨论权重的影响,图论中,与很多找最优路径的算法,和基于距离的相似度算法。

但如果仅仅是用来做系统推荐的话,现在更多是使用向量数据库来存储向量,可以更方便的进行相似度查询和搜索。

AI 千人千面时代

随着大模型的开源与普及,我们完全可以把上面收集到的所有的用户特征,内容特征全服导入到大模型里,通过大模型的训练,来构建每个人的用户画像,以及内容倾向。

因为大模型的训练,是通过训练数据,来构建出模型的参数,这就脱离了某个算法的局限性,通过事实反推关系,再通过不断的奖励数据和惩罚数据,进行正负反馈,最终构建出来的模型会更“懂你”。

迭代进化

是的,任何一套推荐引擎都不是万能的,包括大模型。

因为人是随时都在变的,社会也在不断的变化,所以我们要不断的去迭代,不断的去观察用户对于我们推荐内容的喜欢程度,以此来更新我们的推荐引擎,来满足用户的需求。

简单来说,要做到以下两点:

  • 激励机制:总结推荐给用户的内容中,用户喜欢的部分的特征,作为改进方向添加到推荐引擎中。
  • 惩罚机制:总结推荐给用户的内容中,用户不喜欢的部分的特征,作为过滤方向添加到推荐引擎中。

这两个概念在大模型训练里常见到,但其实是在各种推荐算法里都适用,就是让正确的内容出现的概率更高,无效的内容出现的概率更低,不断的增强推荐内容的准确率的一个根本思路。

要做到不断的去迭代我们的推荐引擎,就需要有一些指标来衡量推荐引擎的推荐效果。

我们该如何衡量推荐的效果呢?可以通过以下几个指标来度量:

  • 准确率(Precision):推荐列表中用户真正感兴趣的内容占比,衡量推荐结果的精准性,避免“滥推荐”。例如,推荐10个商品中有6个被用户点击,则准确率为60%。

    Precision=推荐的正确内容数推荐的总内容数\text{Precision} = \frac{推荐的正确内容数}{推荐的总内容数}
  • 召回率(Recall):系统推荐的物品占用户所有可能感兴趣物品的比例,衡量是否能够把所有的用户喜欢的内容推荐给用户。例如,用户喜欢10个商品,系统推荐了其中6个,则召回率为60%。

    Recall=推荐的正确内容数用户实际喜欢的内容数\text{Recall} = \frac{推荐的正确内容数}{用户实际喜欢的内容数}
  • 覆盖率(Coverage):推荐系统能够覆盖的物品占全部物品的比例,衡量系统对长尾物品(冷门商品)的挖掘能力。

    Coverage=推荐的内容数系统拥有的内容总数\text{Coverage} = \frac{推荐的内容数}{系统拥有的内容总数}
  • 兴趣度(Interest):用户对推荐内容的偏好程度,通常通过隐式反馈(如点击率、停留时间)或显式评分(如5星评价)量化。

冷启动

所谓冷启动,就是在没有任何用户数据和内容数据的关系时,如何快速构建推荐引擎,让系统正向的跑起来。

按照不同的维度,又可以分为以下几种:用户冷启动,内容冷启动 和 系统冷启动。

用户冷启动

一个新注册的用户,系统没有他的任何行为数据,也没有历史交互数据,该如何给他推荐内容。

既然我们没有新用户的行为数据,那就尽量的去获取用户的一些静态标签数据,比如用户注册时,让用户填写性别、年龄、职业、兴趣方向等基本信息。

除此之外,我们还可以根据用户登录ip获取其大概地域信息,登录时间获取作息规律等。

甚至可以通过用户登录邮箱的服务商,来获取用户的一些静态标签数据。

这些静态标签就是用户的原始数据,将这些信息投放到推荐引擎里,我们就可以把其他类似用户的喜好内容,推荐给新用户,实现新用户的冷启动。

内容冷启动

一个新加入系统的内容,没有被任何人关注过,数据层面出于长尾部,该如何把它推荐给合适的用户。

这里主要要解决两部分内容:

  • 新内容,如何快速拆解其内容、特征等标签信息。
  • 长尾内容,新内容的数据一般很差,无法和热点内容竞争,该如何快速曝光的问题。

针对这两个问题,我们需要分别来解决:

  • 新内容的打标:
    • 让内容提供商尽可能全的去填写这个内容的特征信息
    • 通过内容提供商本身的信息,对内容进行打标。
    • 通过一些内容分析系统,获取内容本身的特性信息。
    • 人工分类推荐
  • 对长尾特征
    • 可以考虑将新内容增加权重基本,或者给新内容单独的流量池子,比如音乐软件里的新歌推荐等。
    • 打破推荐模型,增加纯粹按时间更新的内容模块
    • 使用一些反长尾的推荐算法

系统冷启动

一个新网站,没有用户或用户很少,该如何快速的收集用户行为数据,构建推荐引擎。

这里内容的方面可以参考内容冷启动部分,也暂不考虑用户的拓新问题,仅考虑在自然增长的用户体系内,尽快的收集用户的行为数据。

  • 排行榜,热门榜等榜单,吸引用户的点击,构建用户和兴趣关系。
  • 搜索,让用户在搜索框中输入内容,构建用户和关键词的关系。
  • 社交网络,如果用户是社交账号登录的,我们可以获得用户的社交关系(需授权)。
  • 随机,增加随机内容推荐,快速收集用户和内容的关系。

当然还有一些没有提到的其他方法,本身上都是尽可能的将全量的内容尽量全面的呈现在用户面前,尽可能全面的构建全量的用户和内容的关系,获取推荐引擎的训练数据。

总结

推荐系统是一个庞大且复杂的系统,其中涉及到推荐算法、产品设计、系统设计、数据分析、系统调优甚至大模型等各个方面。

知易行难,本文只是将自己了解到的推荐系统的一些基本概念和设计思路进行了一些整理,如果要深入的了解,还需要按图索骥,去各个方向深化学习。

希望对大家有所帮助。

参考文档

相似度算法在地址匹配中的应用

Recommender_systems_handbook

推荐系统实践


如何实现一套推荐系统?
https://www.hancher.top/2025/04/08/architecture-sys-recommendation/
作者
寒澈
发布于
2025年4月8日
许可协议