推荐系统与搜索系统架构

news2024/11/11 5:50:01

一、推荐系统逻辑

推荐的本质就是为了解决信息过载造成的“选择困难症”,便于用户能够在自己选物之前,系统已经帮用户筛选到了最想要的信息。

以下是我按照用户打开APP进入推荐页面时,推荐系统返回给该用户推荐列表的整体流程:

 

整个流程的重点逻辑主要在召回、排序、重排三层,这一节专门讲这一块,至于AB实验平台上的逻辑,后面会有专门的一节进行AB实验的详解。


1. 召回

什么是召回?大多数人都会很快解释:召回是从物料库中获取一小部分物料,这一小部分物料会在后续的环节被模型用来进行打分排序。

这里我们再直白一点理解吧,召回就是捞,给用户推荐的时候,不可能把平台上所有的item都拿出来走模型排序,这样的话计算时间会很长,且资源消耗很大、不合理。这个时候就需要去平台内容库里把最适合用户的item捞出来,这就是我们说的召回。

通常都是从亿万级数据或千万级数据中捞出千百级别的item。召回这一步主要是处理数据量大,需要步骤速度够快、模型不能太复杂且使用特征相对排序少。

当然,召回也是决定个性化推荐的基础,目前来看,召回多数是多路召回(这里可以理解为通过不同限制条件去捞)。

多路召回的好处:

  • 提高召回率和准确率,这里不对这2个名词作解释,可以找相关文章自行查询;
  • 个性化推荐的基础,用户多样性兴趣探索,多元化召回;
  • 保证线上事故发生时还有存余召回兜底,避免推荐接口没有返回的数据;
  • 贴近业务,各业务需求不一样,需要进行融合(广告召回、强插、item冷启动等)。

常见的召回路径(策略都是需要数据支持且与场景强相关的):

1)协同过滤

基于用户的协同过滤,基于item的协同过滤;简单来说就是喜欢A内容的用户,还喜欢B游戏(这种召回方式比较老,现在很少有公司会用)。

协同过滤和用户及游戏都有关,矩阵,玩过就是1,没玩就是0,没玩过的游戏很多,很多都是0,所以会做矩阵分解:用户矩阵和商品矩阵,每一列就是用户向量或商品向量。

2)word2vec(词向量)

(最早用于NLP中)需要拿到用户的玩游戏序列,每个游戏做one-hot编码,会有一个神经网络模型,输入是A→B→?→D→E,输出是C,或A→B→C→D去预测E。

模型中间的隐藏层就叫词向量,和游戏有关,和用户没关,拿数据的时候和用户有关(向量用法:用户和游戏算相似度:用户A和游戏B向量做相似度计算;用户和用户、游戏和游戏)。

3)内容匹配召回

这一块主要和标签(类别)召回有关,比如:用户玩了王者荣耀,那么可以尝试召回推荐类似王者荣耀的吃鸡游戏,这是基于内容标签的召回;又或者用户玩了植物大战僵尸1,那么也可以尝试推荐植物大战僵尸2/3等,这是基于知识储备的匹配。

4)高热召回(热门召回)

这一路召回主要是新用户用的比较多,新用户刚来APP,拿不到过多的用户信息且没有行为,这种情况下,平台高热召回就起了大作用,用来做新用户冷启动;用户冷启动这里不做过多结束,后面会有专门的一节做介绍。

5)基于上下文的召回

这个和用户在APP发生行为的时间、地点等场景有关系,例如游戏推荐在白天碎片休息时间推荐小游戏,在晚上休息时间推荐大游戏、游戏时长较长的游戏等;在其他垂类上体现的话,就像打车垂类对于用户位置信息的敏感,用户刷新闻的时间等等。

6)级联召回

一般的召回是用户点击做正样本,级联是用精排排在前面的游戏做正样本,排在后面的做负样本,做召回模型的正负样本。

7)其他召回

根据业务需求,还会有其他召回,且每路召回的数量也有差异,例如为了让新用户快速留下来,新用户高热召回占比较大,但老用户的话,为了挖掘用户兴趣多样化,高热召回占比会相对小一点。

召回层也是有模型的,尤其是做电商业务,召回的模型会更复杂。


2. 排序——粗排/精排

粗排和精排,都是排序,一个需要快速排序尽量去掉错误召回,一个需要贴合用户和业务需求精细准确排序。

粗排在召回和精排之间,一般需求从召回回来的万/千级别item集合中选择出千/百级别更符合业务需求的item送到精排层。平台内容少时,几乎很少会做粗排这一步,因为粗排最大的作用就是快速计算并截断召回量,使召回数据更准更适合推给用户,一般粗排需要在20ms内完成打分。

如果没有粗排模型,也可以在召回层和精排层用一些策略进行数量截断进精排,也是一种粗排手段,例如用点击转化率进行截断。

精排处理数据量少,需要模型做到更准确,通常会上一些复杂模型以及使用较多特征。

粗排和精排层可以是一个模型打分,也可以是多个模型打分融合再进行排序,多数业务需求情况下多数都是多个模型,根据业务需求,模型的目标不一样,但基本上都会有点击模型(ctr)。

下面就单独就点击模型来讲一下模型是怎么打分排序的,讲排序之前需要先知道2个概念——label和features,这2个数据,是ctr模型的主要训练数据。

label:用ctr模型举例,每个模型都有label(模型的预测目标),ctr模型的label就是用户对当下曝光的item有没有点击行为,有曝光点击就为正样本,label=1,有曝光无点击则为负样本,label=0。

features:就是特征。特征主要分为3类:用户特征、item特征、用户和item的交叉特征。

  • 用户特征:用户本身的特征,例如年龄、性别、地理位置等、登录设备(iOS/Android);
  • item特征:item本身的特征,例如标签、物品ID、天级点击次数、评论量、热门排名等;
  • 用户特征和item的交叉特征:例如item天级的点击次数、周级点击人数、天级曝光次数等。

可以看出,features是我们在推荐系统都能够收集到的数据,其中有离散型特征(例如男女、分类、整数等),也有连续型特征(例如点击率、自然数)。

在计算机只能处理数字编码的前提下,将这些信息进行编码转化,大多数推荐系统对于离散型特征多使用one-hot或embedding,对于连续性特征可以不用处理,或者先分段离散化,再使用one-hot编码。

(大多数公司使用离散型特征的较多,连续型特征使用较少,有时连续型特征也会做分桶处理——分段,其实就是变相地处理成离散型数据。)

*注,one-hot编码会将特征处理为[0 0 0 0 1],embedding会将特征处理为[0.2 0.4 0.6 0.8]

在明确了 features 和 label 的定义之后,会构造对应的训练样本:

  • 负样本 (曝光不点击):([**0,0,0,1,0,0,**0.12,0.13,0.05, …, ], 0)
  • 正样本 (曝光点击):(**[0,0,1,0,0,0,**0.02,0.08,0.13, …, ], 1)

所以训练时 CTR 模型输入即为:特征向量和其对应的 0、 1 标签。

预测时,输入只有特征向量,模型输出一个 0~1 之间的数字,代表预估的 CTR 值,可以用来做排序。所以,建模之后,本质上 CTR 预估问题是一个二分类问题。

这就是其中一个模型的打分逻辑,有多模型打分融合的精排层,会将多个模型的分数进行打分,每个模型的重要性不一样,因此分数都会有权重,将每个模型的分数进行权重计算后相乘在一起,就是这个item的排序分数,每个item按照分数进行从高到底排序,就会得到精排打分列表。


3. 重排(混排/rerank)

这一步是推荐的最后一步,每个公司的叫法可能存在差异,有的叫重排,有的叫混排,学术一点叫rerank;虽然也是排序,但重排和粗排或精排最大的区别还是在于这一步更贴近业务需求,产品经理发挥的空间也相对多一些。

做一些强插业务的时候,需要召回配合重排层做,例如做新内容冷启动时,需要给到没有数据的内容一个曝光的机会,这个时候就需要用到重排强插;或者做一些打散逻辑时,例如连续的7个内容中不能有相似内容,或连续的10个内容中最多有2个相似内容等等。

二、搜索系统逻辑

当你在搜索框中输入一串搜索词后,页面展示出你想要的结果,但其中的逻辑却是很复杂,这里我认为搜索是比推荐相对复杂的业务:

 

整个流程的重点逻辑也包含了召回、排序、重排,但更为重要的是query处理部分,因为上面详细讲了 召回——排序——重排部分,因此这里不过多讲解,只将重点放在query处理上。

query主要由query预处理、意图识别、query分词、query改写4个部分组成,各公司会依照搜索业务的复杂程度进行部分简化;(query:用户搜索词,例如用户在搜索框输入“秋冬连衣裙女”并点击搜索,那么用户query就是“秋冬连衣裙女”)。

1)query预处理

这一步主要是针对用户在搜索框中输入的搜索词,进行数据清洗。

搜索词基本上都会有长度限制,一种是输入框限制搜索词长度,一种是query预处理的时候进行搜索词截断,例如超过20个字长度的搜索词只截取前20个字。

因为用户输入搜索词的不规范,且不同的用户对同一种诉求的表达往往会存在地域、文化程度以及清晰度的差异,因此会对搜索词进行转化:大小写转换,例如“太空狼人杀3d版”转换为“太空狼人杀3D版”;简繁体转换,例如“太空狼人殺”转换为“太空狼人杀”;还有全半角转换,这里就不再展开过多说明。

query预处理这一步都是根据用户主动输入的搜索词,进行高频query查询检索出的常见问题,针对问题进行本质问题本质解。

2)意图识别

意图识别的本质就是分类问题,主要是根据业务需求进行用户意图分类,分为几个大类,收集每种意图类别下的常用词进行模型训练,模型准确率越高,意图识别效果越好。意图识别在搜索系统中是必不可少的,意图识别在很大程度上决定了用户搜索质量的好坏。

*意图识别的难点:

  • 输入不规范;就像上面提到的,不同用户对同一个内容的认知存在差异,输入的搜索词也会存在不小的差异;
  • 数据冷启动,用户行为较少数据较少,意图获取会相对没那么准;
  • 多意图识别,无法定位精准意图,例如用户搜索“车”,无法知道是想要玩具车还是四轮真车,或者是摩托车;
  • 业界没有固定的评价标准,只有不同业务直接自己划分的分类进行的模型分类准确率计算,而一些业务指标例如ctr、cvr、pv等指标,都是评价整个搜索系统的,具体到意图识别上的量化指标却没有。

3)query分词

query分词主要是对用户搜索词进行切分,根据切分的词去进行改写以及后续的召回逻辑,不同业务的切词方式及自由切词库是有差异的。

4)query改写

这一步主要是针对用户搜索词进行纠错、以及同义词扩展召回等。需要做纠错词表或纠错模型,例如将“火才人”纠错为“火柴人”,将“超级猫丽奥”纠错为“超级马里奥”,将“校园”扩展为“学校”、“老师”、“教室”、“同桌”等等,同义词扩展里面会存在一些干扰词,需要根据实际业务对头部搜索词的同义词进行自定义切词表或自定义同义词表等。


三、推荐和搜索的区别

从上述对推荐系统和搜索系统的整体流程的讲述可以看出,推荐和搜索既有紧密联系,又有不小的差异。


1. 行为主动或被动

本质问题本质解,搜索和推荐都是为了解决信息过载问题,都是获取信息的方式之一,一个主动获取——搜索,一个被动获取——推荐:推荐行为是被动的,需求不是很明确,个性化和多样性会多一些,而搜索的需求是主动和相对明确的,且查询范围相对较小。


2. 使用场景目的

推荐的本质是需要留住用户在APP中,让用户使用的时间变长,并且第二天也能留住用户,逐渐产生广告收益和其他收益,让用户消费更多,需要通过分析用户的历史行为以及当前的实时行为场景等,推荐系统自发生成查询条件快速给出推荐列表的行为,是一种无声的搜索。

而搜索更像张小龙早期口中的微信,需要用完即走,搜索的本质是协助用户快速找到自己需要的结果并完成转化离开。我理解,好的搜索算法需要做的是让用户快速使用,高效查询并且停留时间更短。


3. 是互相成就

从流程来看,搜索就是限定了条件的推荐,推荐就是自发的主动搜索;从用户query中可以收集到大量个性化推荐的需求,推荐数据可以推荐用户搜索内容的相似内容,进行数据融合,而当用户搜索目的不明确时使用好的推荐,结合意图识别和推荐模型,实现类目下的更精准推荐,是提升用户体验的手段。

参考:推荐策略产品经理实操(三):推荐与搜索 | 人人都是产品经理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xshell安装图文

1.下载 通过百度网盘分享的文件:Xshell安装图文 链接:https://pan.baidu.com/s/1k4ShbhUVQmdxpM9H8UYOSQ 提取码:kdxz --来自百度网盘超级会员V3的分享 2.安装 3.连接与使用 见下载

vector 简单模拟实现

目录 一. vector成员变量 二. vector的构造函数和析构函数 三. vector的成员函数 1. 容量操作函数 扩容操作 (1). finish更新问题 (2). 扩容深浅拷贝问题 resize与尾插、尾删与判空 insert与erase与clear 2. 函数重载 (1). 赋值运算符重载 (2). [ ]重载进行访问 四. …

phpstudy搭建sqlilabs本地靶场

请先在网上解决好前置条件的下载和安装:phpstudy、vscode、navicat premium(非必要)、sqlilab的压缩包/文件夹 phpstudy--安装sqlilabs 1.打开phpstudy后,我们会用到MySQL5.7.26和Nginx1.15.11 #mysql5.7.26是因为sqlilabs靶场不支持高版本MySQL 2.在软…

练习实践 web中间件httpd-id:2-编译安装-web登录认证设置

参考来源: 用编译的方式安装apache httpd服务 编译安装过程记录 1.下载准备环境: yum -y install gcc gcc-c make pcre pcre-devel gd-devel openssl-devel zlib zlib-devel apr-*根据之前的操作文档和实际安装经验,提前将所需依赖项安装…

sqli-labs注入练习1,2关

sqli-labs第一关 判断是否存在sql注入 可见,根据输入数字的不同,结果也不同 判断sql语句是否是拼接,且是字符型还是数字型 由上可见,这关指定是字符型且存在sql注入漏洞 使用联合注入 第一步:首先知道表格有几列&…

PyCharm 2024.1 最新变化

文章目录 PyCharm 2024.1 最新变化一、新的 AI Assistant 功能 PyCharm Professional1、一键创建包含生成代码的文件2、生成架构感知型 SQL 查询 二、缩小整个 IDE 的选项三、新终端 Beta PyCharm 2024.1 最新变化 pycharm是什么 作为 JetBrains 旗下的一款专为 Python 开发者设…

SQL注入之sqli-labs靶场第二关

手工注入less-2 1.找注入点 通过 ?idsdfsdf 报错发现注入点 经过尝试没有闭合发现是数字型注入 2.猜解字段数量 发现字段数量为3 3.通过union联合查询判断回显点 发现回显点2,3, 4,进行信息收集 数据库版本号:5.7.26 数据库…

【MongoDB】1.MongoDB下载与安装

目录 一、下载 二、安装 三、安装MongoDB Compass 四、连接 一、下载 官网地址: https://www.mongodb.com/download-center/community 二、安装 详细的安装教程可参考: MongoDB安装(超详细)_安装mongodb-CSDN博客 注意事项1&…

亚马逊爬虫(Amazonbot)IP地址,真实采集数据

一、数据来源: 1、这批亚马逊爬虫(Amazonbot)IP来源于尚贤达猎头公司网站采集数据; ​ 2、数据采集时间段:2023年10月-2024年7月; 3、判断标准:主要根据用户代理是否包含“Amazonbot”和IP核…

C# Unity 面向对象补全计划 七大原则 之 依赖倒置原则 (DIP)难度:☆☆ 总结:多抽象,多接口,少耦合

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺 1.依赖倒置原则 (DIP) 这…

【算法题】无重复字符的最长子串(滑动窗口)

目录 一、题目描述 二、解题思路 1、什么是滑动窗口算法? 2、滑动窗口一般解题模板 三、参考答案 一、题目描述 无重复字符的最长子串 给定一个字符串s ,请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s "abcabcbb"…

【Linux】vim(工具篇)

文章目录 什么是vimvim的使用普通模式(Normal Mode) 命令模式(Command Mode)批量化注释/批量化去注释 vim的配置 什么是vim Vim 是一种高度可配置的文本编辑器,最初由 Bram Moolenaar 在 1991 年基于 vi 编辑器创建。V…

力扣——238.移动零

题目 思路 利用双指针,先找到第一个为0的地方指向,指针2指向下一个,指针1之前是已经处理好的数据,指针2进行遍历,遇到非零则与指针1数据交换,然后指针1。 代码 class Solution { public:void moveZeroes(…

OpenAI not returning a result?

题意:OpenAI 没有返回结果吗? 问题背景: Im trying to use the OpenAI beta but I cant seem to get a result. Im accessing the API via an NPM package (openai-api - npm). I have that setup and working but when I make a request th…

Unity强化工程 之 Mask SortingGroup

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.Mask 遮罩故名思意就是起到遮挡作用的罩子:精灵遮罩 - Unity 手册 如果我想让sprite与遮罩发生交互,那么我…

深入理解接口测试:实用指南与最佳实践(三)API文档解析及编写测试用例

​ ​ 您好,我是程序员小羊! 前言 这一阶段是接口测试的学习,我们接下来的讲解都是使用Postman这款工具,当然呢Postman是现在一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用…

人工智能大模型 | 通俗讲解AI基础概念

LLM LLM(Large Language Models)指的是大型语言模型。这些模型是自然语言处理(NLP)技术的一部分,使用深度学习训练来理解、生成、翻译文本,甚至执行特定的语言相关任务,如问答、文本摘要、编程…

技术方案、实施例和图纸应该怎么写?

技术方案、实施例和图纸应该怎么写?

【Vue3】组件通信之mitt

【Vue3】组件通信之mitt 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

【如何高效处理前端常见问题:策略与实践】

在快速发展的Web开发领域,前端作为用户与应用程序直接交互的界面,其重要性不言而喻。然而,随着技术的不断演进和项目的复杂化,前端开发者在日常工作中难免会遇到各种挑战和问题。本文旨在深入探讨前端开发中常见的问题类型&#x…