推荐系统通识 · 讲义与学习笔记
搞懂推荐系统为什么越来越懂你——从数据收集、用户画像到内容匹配与反馈循环的完整逻辑。
整理:问学·科技
第 1 关 · 推荐系统通览与三类经典范式
能用三句话讲清推荐系统的本质、与搜索的区别,以及「基于内容」「协同过滤」「混合」三种范式的核心直觉。
信息过载与推荐系统的存在理由
**从一个生活场景说起**
想象你走进一个图书馆。20 年前,这个图书馆有 10 万本书,馆员会告诉你:「想看什么类型的,我帮你找。」你能轻松逛完几个书架,挑到满意的书。
今天,假设有一个「全球图书馆」,里面放着 10 亿本书、100 亿条短视频、几万亿条商品信息——而且每分钟还在新增。这个图书馆没有馆员。你想找点什么,只能靠自己——但问题是,你根本不知道里面有什么。这就是我们今天面对的**信息过载**。
什么是信息过载
信息过载不是「内容比 20 年前多一点」,而是量级跳了几个数量级。抖音每天上传视频超过 1 亿条,淘宝商品超百亿,公众号每天新增文章几百万。人类大脑处理信息的带宽是有限的——你每分钟能认真看的内容,可能就几十条,但供给端是几亿条。**这中间的鸿沟,靠「自己找」是填不上的。**
为什么「让用户自己找」行不通
20 年前互联网的口号是「人找信息」。用户打开百度,输入关键词,搜索引擎把相关网页列出来。这个模式有效,是因为三个前提都成立:
- 内容总量不大,搜索引擎能爬完、索引得过来
- 用户知道自己要什么,能用准确的关键词表达
- 看完结果,用户有能力自己判断哪个有用
**但这三个前提今天都塌了**:
- 内容太多,根本爬不完
- 很多时候用户自己也不知道想看什么(「杀时间」场景)
- 即便列出来,用户面对海量结果依然无从选择
这就是为什么「自己找」这套逻辑在今天失灵了。**不是用户变懒了,是环境变了。**
推荐系统做了什么:把选择权接回平台
推荐系统的核心动作很简单:**平台替你做一部分选择**。
你打开抖音,没输入任何关键词,首页直接开始播放——你大概率会看到感兴趣的内容。你打开淘宝,没搜任何东西,首页就是你想买的。这背后是一套系统在做判断:你可能对什么感兴趣、现在给你看这个合不合适。
**对比一下两种模式**:
flowchart LR
A[用户] -->|输入关键词| B[搜索引擎]
B -->|返回结果列表| A
C[用户历史行为] --> D[推荐系统]
E[内容池] --> D
D -->|主动推送| F[用户]
F -->|新行为反馈| C
左边是搜索:用户主动表达,系统被动响应。 右边是推荐:系统主动判断,用户被动接受。
**关键差异是主动权的转移**。搜索里,意图由用户表达;推荐里,意图由系统猜测。
一个具体例子:抖音的首页
打开抖音,你没搜任何东西。系统怎么决定给你看什么?
它会立刻调用你的**历史行为**:你昨晚点赞过健身视频、停留过猫咪视频、划过美妆视频。这些行为构成了一张「你是谁」的画像。然后它从几亿条视频里挑出几十条你最可能看完的,依次推给你。
你每划一条——点赞、停留、划过、评论、关注、收藏——这些信号又立刻回流到系统里,系统实时更新对你的理解,下一条推送更准。
**这构成了一个数据闭环:行为 → 画像 → 推送 → 新行为 → 更新的画像 → 更准的推送**。系统就是这样「越用越懂你」的。这一块的细节我们后面会专门讲。
推荐系统存在的三个前提
到这里可以总结一下:推荐系统之所以在今天成立,需要三个条件同时具备:
- **内容供给过剩**——多到用户自己选不过来
- **行为数据可获取**——平台能记录你点点划划的痕迹
- **系统有计算能力**——能从几亿条内容里实时挑出最匹配的几十条
三个条件缺一个,推荐系统都跑不起来。这也是为什么推荐系统是 2010 年之后才大规模出现的——不是因为算法突然变聪明了,而是因为**数据、算力、内容这三件事在那时候同时到齐了**。
**要点:** 内容爆炸让「自己找」的成本高到无法承担,推荐系统的本质是把「找什么」这件事从用户手里接过来,由平台根据你的行为数据主动判断并推送——这标志着一个根本性的转变:用户从「主动表达」变成「被动接受」,意图由系统猜测。

推荐与搜索的根本区别
打开 App 的两种姿势
你有没有注意过,自己和两个 App 打交道的方式完全不同?
打开百度,你得**先想好要输入什么**。没想好?搜索框就是空的,你什么也得不到。搜索引擎的整个设计都建立在一个假设上:你知道自己要什么,并且能用一段文字把这件事说清楚。
打开抖音,你什么都没输入,首页就开始播。你也不知道下一秒会出现什么——但神奇的是,往往还挺想看。**推荐系统的整个设计假设的恰好是相反的事:你不需要知道自己要什么,我来帮你选。**
这就是两种产品背后,两种完全不同的意图流动方式。
意图的方向是反的
把两者的数据流向画出来,会特别直观:
flowchart LR
subgraph 搜索
A1[用户输入关键词] --> B1[搜索引擎]
B1 --> C1[结果列表]
C1 --> A1
end
subgraph 推荐
A2[用户历史行为] --> B2[推荐系统]
D2[海量内容池] --> B2
B2 --> C2[主动推送]
C2 --> A2
end
**搜索的流程是:人表达 → 系统匹配 → 给人看**。意图的发起者是用户,方向是「人 → 系统」。
**推荐的流程是:系统猜测 → 直接推给人 → 人消费并产生新行为**。意图的发起者是系统,方向是「系统 → 人」。
**这两种方向上的差别,决定了产品的一切细节**——从界面布局到算法设计,从数据需求到评估指标,全都不一样。
四个维度的对比
把两者的差异拆开看会更清楚:
| 维度 | 搜索 | 推荐 | |---|---|---| | 意图来源 | 用户主动表达 | 系统主动猜测 | | 触发动作 | 输入关键词 | 打开 App、刷新页面 | | 用户状态 | 目标明确 | 常常没目标 | | 输出形态 | 一份结果列表 | 单条连续推送 |
**「用户状态」这一栏最关键**。搜索是「我想买红色连衣裙」——意图清楚到可以写下来。推荐是「我睡前没事干刷一刷」——意图根本不存在,或者用户自己也说不清。
这两种状态对系统的要求截然不同。搜索只要按字面意思找就行,推荐却得在用户**什么都没说**的情况下,依然能猜对。
一个具体例子:同一个需求,两条路径
假设你周末想吃顿好的。
**走搜索路径**:你打开大众点评,输入「附近川菜 人均100」——这是搜索。结果出来一串店,你挨个看评分、翻评论、做对比。整个过程你在**自己做决定**,系统只负责把候选列出来。
**走推荐路径**:你打开抖音,什么都没说,划着划着刷到一条本地探店视频,博主在试吃一家川菜馆,看着挺诱人——这是推荐。**你没有主动表达过任何对川菜的兴趣**,但系统已经把这条内容送到你面前了。点不点过去、是不是真的去吃,就是系统猜对没有的标准。
注意到没?**搜索里你没有「中午吃川菜」这个意图,就什么都不会发生**。推荐里你哪怕没这个意图,系统依然可能在你的信息流里「造出」这个意图。
这两种模式今天怎么共处
搜索和推荐从来不是非此即彼,而是经常出现在同一个 App 里:
- **淘宝、京东**:首页是推荐瀑布流(你打开就看到商品),顶部有搜索框(明确想找什么时用)
- **抖音**:绝大多数时间靠推荐,搜索框藏在右上角(真要找一个具体视频时才用)
- **美团、点评**:搜索偏强,但首页也越来越多推荐内容
- **ChatGPT**:本质上接近推荐——你没问问题时它不会主动出现,但一开口,它就要根据对话历史「猜你想要什么样的回答」
**搜索擅长解决「我明确知道我要什么」,推荐擅长解决「我不知道我要什么,但我愿意被引导」**。一个成熟的 App 会同时拥有两套机制,按场景切换。
从更大的尺度看,**这是互联网二十年最大的范式转移**——从「人找信息」到「信息找人」。每一个大流量入口,都在从搜索的逻辑,转向推荐的逻辑。
**要点:** 搜索和推荐的根本差异在「意图的发起者」——搜索是用户主动表达、系统被动响应;推荐是系统主动猜测、用户被动接受。这一差异决定了两种产品对用户状态、数据需求、算法设计的全部不同。
三类经典范式:基于内容、协同过滤、混合
开场:三个朋友给你推荐餐厅
想象你下周想找家新餐厅,三个朋友分别给你出了主意:
- **朋友甲**翻了翻你过去一年的打卡记录,发现你十次有八次吃的是川菜和粤菜,然后他查了查新餐厅的菜单——「这家也是川菜!」——他推荐的理由是**内容本身像**你过去喜欢过的。
- **朋友乙**根本不看餐厅长什么样,只是说:「你和小李口味一直很像,他昨天去的那家你应该也会喜欢。」——他推荐的理由是**人像**你。
- **朋友丙**两条都看了——内容确实像,他认识的人里也有人说不错——他给了一个综合判断。
这三种思路,恰好就是推荐系统最经典的三种范式。
基于内容:看东西像不像
**核心逻辑**:用户过去喜欢的内容有什么特征 → 推荐新内容时挑有相似特征的那批。
这里的关键能力是**给内容打标签**。一部电影要有「动作、科幻、2024 年、诺兰」这些维度,一篇公众号要有「职场、跳槽、35 岁」这些关键词,一条抖音要有「美食、教程、成都」等标签。
抖音会根据你过去完播、点赞的视频提取出你的兴趣画像(爱看美食、爱看旅行、爱看 3 分钟以内的),然后拿这个画像去匹配新视频的特征。
**优点**:能推荐完全没人看过的冷门内容(新内容只要特征对就可能被推);不依赖其他用户的行为。
**缺点**:会陷入「信息茧房」——你过去喜欢川菜,它就永远推川菜,你很难发现原来你也喜欢湘菜。系统永远在强化你过去的口味,**不擅长制造惊喜**。
协同过滤:看人像不像
**核心逻辑**:不用理解内容长什么样,只看「谁和谁行为像」。
最经典的口号有两句:
- 「**和你相似的人也喜欢这个**」(基于用户相似度)
- 「**喜欢这个的人也喜欢那个**」(基于物品相似度)
比如,你和用户 B 都喜欢了视频 1、3、5,系统判断你俩很像,于是把 B 喜欢而你没看过的视频 7 推荐给你。
**这种方法的妙处在于:你不需要知道视频在讲什么**。系统对内容一无所知,只看数字——谁看过谁、谁点赞了谁——就能做出推荐。
**优点**:能制造惊喜(我从来没看过这类,但和我相似的人在看——这恰恰是新口味被发现的方式);不需要对内容做深度理解。
**缺点**:**冷启动很糟糕**。一个新用户进来没有任何行为数据,系统不知道他像谁;一个新视频上传没人看过,系统不知道谁会喜欢它。这就是为什么抖音会强制让你刚注册时选几个兴趣标签——那是在**用内容特征补协同过滤的冷启动漏洞**。
混合:两条腿走路
现实中的推荐系统几乎**没有只用一种范式的**。
flowchart TD
A[内容特征信号] --> E[综合打分模型]
B[协同过滤信号] --> E
C[社交关系信号] --> E
D[时效与热度信号] --> E
E --> F[最终推荐结果]
内容特征、协同信号、社交关系、时效热度、用户反馈……全部加权融合。
**为什么会这样?** 因为每种范式都有它解决不了的问题。混合就是把几个范式各取所长、补其所短。
一个走一遍的例子
假设你平时只看「美食」和「旅行」两类内容。今天抖音给你推了一条「街舞教学」——你从来没看过这类。
- 基于内容的逻辑会**拒绝**推它(它和你过去喜欢的不像)。
- 协同过滤的逻辑**可能**推它——系统发现一群和你行为很像的人,最近都在看街舞,于是猜测你也会喜欢。
- 混合系统则会综合判断:是只靠协同信号、还是需要加点其他信号一起权衡。
这就是为什么你**偶尔能在抖音发现「原来我也喜欢这个」**——背后是协同过滤的功劳。
要点
三种范式的核心差异是**比较的是什么**:基于内容比较内容像不像、协同过滤比较人像不像、混合则是把多路信号加权融合。真实世界的推荐系统,几乎都是混合范式。
协同过滤的两种直觉:UserCF 与 ItemCF
开场:同一句「协同过滤」,两条不同的路
上一节我们讲了协同过滤的总体思路——「不靠内容理解,只看行为关系」。但同样四个字「协同过滤」,内部其实有两条截然不同的路径。
你今天在淘宝买了副无线耳机,淘宝立刻给你推了手机壳、充电器。背后能走两条路:
- **A 路**:找一群「和你行为像」的人,看他们都买了啥 → **UserCF**
- **B 路**:看「和你买过的东西」经常被一起买的是啥 → **ItemCF**
它们都能解释这次推荐,但底层逻辑完全不同。这一节就讲清这两条路的差异。
UserCF:「人以群分」
**完整口号**:**和你相似的人也喜欢这个**。
思路一句话:先找「和你口味相投的人」,再看他们最近喜欢啥。
举个例子。假设你是用户 A,过去喜欢过视频 1、3、5、7。系统里还有用户 B、C、D:
- B 喜欢过 1、3、5、8、9 → 跟你的重合度很高(1、3、5 全对上)
- C 喜欢过 2、4、6 → 跟你几乎没重合
- D 喜欢过 1、3、10、11 → 跟你部分重合
系统判断:**B 跟你最像**。于是把 B 喜欢、而你没看过的 8 和 9 推荐给你。
**关键特征:人是中心。** 计算发生在「用户×用户」的相似度矩阵里。
**优点**:能制造惊喜——B 喜欢的东西你可能完全没接触过,但因为你俩像,命中率反而高。这也是抖音偶尔能把你「带出信息茧房」的功臣之一。
**缺点**:每来一个新用户、新物品,都要重新算相似度;用户多了计算量爆炸;用户兴趣一旦变化,整个相似网络都得跟着变。
ItemCF:「物以类聚」
**完整口号**:**喜欢这个的人也喜欢那个**。
思路一句话:先看你过去喜欢过啥,再找「和这些东西经常被一起喜欢」的其他东西。
同一个例子。你喜欢过视频 1、3、5、7。系统里有这样的统计:
- 看过 1 的人大多也看过 9 和 10
- 看过 3 的人大多也看过 8
- 看过 5 的人大多也看过 8 和 10
- 看过 7 的人大多也看过 11
系统发现:**8、9、10、11 是和你喜欢的内容经常被一起消费的「邻居」**。于是把这几个推给你。
**关键特征:物品是中心。** 计算发生在「物品×物品」的相似度矩阵里。
**优点**:物品之间的关系比用户之间的关系稳定得多——电影就是电影、书就是书,相似度可以提前算好缓存起来,查询极快。
**缺点**:很难给你真正意外的东西——因为你过去喜欢的是科幻,推荐来的也大概率是科幻。
一个图看清差异
flowchart LR
subgraph UC[UserCF 人以群分]
U1[你] -- 找相似用户 --> B[用户B 跟你最像]
B -- 他喜欢 --> I1[物品8]
B -- 他喜欢 --> I2[物品9]
end
subgraph IC[ItemCF 物以类聚]
U2[你] -- 你喜欢过 --> I3[物品1]
I3 -- 经常一起 --> I4[物品8]
I3 -- 经常一起 --> I5[物品10]
end
UserCF 在中间拐了一道「人」;ItemCF 直接在「物品」之间连线。**两者都在回答「下一步推什么」,但找邻居的维度完全不同。**
一个具体例子:网易云 vs 抖音
- **网易云音乐「相似歌曲」**:你听了一首周杰伦的《晴天》,系统推同曲风、同歌手的歌。这是典型的 **ItemCF**——歌曲之间的关系相对固定(歌本身不会变),可以预计算。
- **抖音「你可能也喜欢」**:背后是 **UserCF + ItemCF 混合**——既有「和你相似的人最近在刷啥」,也有「和你看过的视频相似的视频」。短视频更新太快、单个视频太碎,单靠一种往往效果不够。
什么时候用哪个?
简单记:
- **物品多、用户少、用户兴趣相对稳定** → UserCF
- **物品少、用户多、物品本身相对稳定** → ItemCF
- **物品经常变(新闻、短视频)** → UserCF 更合适,因为物品关系算不过来
- **物品稳定(电影、书、商品)** → ItemCF 更合适,因为可以预计算省成本
亚马逊、Netflix、网易云音乐这种**物品库相对固定**的平台,几乎都押宝 ItemCF。今日头条这种**内容日新月异**的平台,更偏向 UserCF 或更复杂的混合模型。
要点
UserCF 是「人以群分」(先找人,再看人喜欢啥),ItemCF 是「物以类聚」(先看物,再找物的邻居)。两者都属于协同过滤(不依赖内容理解),但**计算中心不同**:UserCF 算用户之间的关系,ItemCF 算物品之间的关系。
矩阵分解:用一组数字表示一个人
开场:你的口味「DNA」
你在奶茶店点单时说「燕麦拿铁、半糖、热」,店员其实已经对你有了个画像——不太甜、不喝冷的、接受新潮口味。
**推荐系统也需要给每个用户一个「口味描述」,但要比「半糖热」复杂得多。** 这一节讲的「矩阵分解」,干的就是这件事:给每个用户、每个内容都生成一组数字,用这组数字精准描述它的「气质」。
原始数据长什么样
我们先看「原始推荐系统」长啥样。假设有 100 万用户、10 万部电影。最直觉的做法是建一张大表:100 万行 × 10 万列,每个格子记录某个用户对某部电影的评分(1-5 分)。
但这张表有两个问题:
- **极其稀疏**:一部电影 100 万人里可能只有几百人评分,其余格子全是空的
- **无法预测**:张三没看过《盗梦空间》,格子是空的,系统就不知道他会不会喜欢
协同过滤已经能解决一部分问题,但它依赖「共同评分过的人」——对完全没人同时评过的冷门电影就抓瞎了。
矩阵分解的核心想法
矩阵分解问了一个天才的问题:
> **这张大表里其实藏着一个「隐藏结构」——能不能把人和电影,都用几个数字表示出来?**
打比方:你虽然没填过一份"电影口味测评表",但你过去看过的电影、给的评分,已经在悄悄「暴露」你的偏好维度。系统可以**反推**出你的偏好由哪几个维度决定。
具体怎么压
假设系统决定用 **4 个数字**描述每个用户、每部电影。这 4 个数字不是随机选的,而是系统通过「看历史打分」自己学出来的——每个数字代表一个隐藏维度。
举几个**人话版的维度例子**(系统实际学到的不一定叫这名,但含义类似):
| 维度 | 含义 | 张三的分数 | 《盗梦空间》分数 | |---|---|---|---| | 维度1 | 喜欢深度剧情 vs 轻松娱乐 | 0.8(爱深度)| 0.9(深度剧情)| | 维度2 | 偏科幻 vs 偏现实 | 0.7(爱科幻)| 0.95(很科幻)| | 维度3 | 偏经典 vs 偏新潮 | 0.5(中立)| 0.4(较老派)| | 维度4 | 节奏快 vs 节奏慢 | 0.6(偏快)| 0.5(中等)|
**预测张三对《盗梦空间》的评分?** 把两组数字对应相乘再加起来:
0.8×0.9 + 0.7×0.95 + 0.5×0.4 + 0.6×0.5 ≈ **1.89**(归一化到 5 分制大约 4.3 分)
系统就知道:推给张三,《盗梦空间》很可能会被喜欢。
一个图看清流程
flowchart LR
A[巨大的稀疏打分表] --> B[矩阵分解]
B --> C[每个用户的一组数字]
B --> D[每个内容的一组数字]
C --> E[两组数字相乘相加]
D --> E
E --> F[预测分数]
F --> G[推荐给用户]
**输入**:稀疏大表。**输出**:每个用户、每部内容都得到一组精炼的「气质数字」。**预测**就是把两组数字「对得上」的程度算出来。
为什么要懂这个?因为它和大模型是一回事
如果你听过「Embedding(嵌入)」这个词——**矩阵分解就是 Embedding 思想在推荐系统里的鼻祖**。
把每个用户、每个内容都压成一组数字,让「意义相近」的东西在数字空间里距离近——这个思路,**和大模型把「猫」「狗」「哺乳动物」压成数字向量的思路完全一致**。
所以推荐系统里管这种「气质数字」叫**用户向量**和**内容向量**(或者直接就叫 embedding)。这套范式一统江湖,从 Netflix 百万美元挑战赛,一直打到今天抖音和淘宝的召回阶段。
一个具体场景
小红书要给你推笔记。
- 你过去点赞的笔记里,「露营」「vlog」「小众咖啡」出现得多
- 系统反推出你的 **3 个核心偏好维度**:户外感、生活化、不从众
- 每篇新笔记也用同一套 3 个数字描述
- 系统算你和每篇笔记的「匹配度」(就是两组数字相乘),挑最高的推给你
**好处**:就算你是小红书的新用户、那篇笔记也是新发的,没有任何「共同行为」记录——只要有各自的那组数字,就能预测。
要点
矩阵分解把巨大稀疏的「用户-内容」打分表,**压缩成每个人、每个内容都对应的一组数字**(向量)。预测推荐分数 = 把这两组数字对应相乘再相加。这套「用数字表示含义」的思路,**本质上和大模型的 Embedding 是一回事**——理解了这个,你就抓住了今天所有「用 AI 做匹配」系统的底层逻辑。
学习笔记
推荐系统通览与三类经典范式
一、信息过载与推荐系统存在理由
**量级跃迁**
- 20年前图书馆10万本书;今日「全球图书馆」10亿本书、100亿条短视频、几万亿条商品
- 供给端速度:抖音每天上传超1亿条视频、淘宝商品超百亿、公众号每天新增文章几百万
- 人类处理带宽有限:每分钟能认真看的内容可能就几十条
**「人找信息」为何失灵**
- 搜索引擎的三个前提今日全塌:内容爬不完、用户常不知道想看什么、海量结果无从选择
- 不是用户变懒,是环境变了
**推荐系统的核心动作**
- 平台替用户做一部分选择
- 关键差异:主动权从用户转移到系统
- 搜索:用户输入关键词→系统返回结果(人主动,系统被动)
- 推荐:系统综合历史行为与内容池→主动推送→新行为回流
**抖音案例:数据闭环**
- 行为→画像→推送→新行为→更新的画像→更准的推送
**成立三前提**
- 内容供给过剩
- 行为数据可获取
- 系统有计算能力
- 三者缺一不可,2010年后同时到齐
二、推荐与搜索:意图方向相反
**两种相反的产品假设**
- 搜索:你知道自己要什么并能用文字说清
- 推荐:你不需要知道自己要什么,系统帮你选
**意图流向**
- 搜索:人表达→系统匹配→给人看(方向:人→系统)
- 推荐:系统猜测→推给人→人消费并产生新行为(方向:系统→人)
**四维对比**
| 维度 | 搜索 | 推荐 | |---|---|---| | 意图来源 | 用户主动表达 | 系统主动猜测 | | 触发动作 | 输入关键词 | 打开App、刷新页面 | | 用户状态 | 目标明确 | 常常没目标 | | 输出形态 | 结果列表 | 单条连续推送 |
「用户状态」最关键:搜索意图清楚到可写下来(「想买红色连衣裙」),推荐意图根本不存在或说不清(「睡前刷一刷」)。
**现实中共处**
- 淘宝、京东:首页推荐瀑布流+顶部搜索框
- 抖音:主靠推荐,搜索框藏右上角
- 美团、点评:搜索偏强但首页推荐越来越多
- ChatGPT:本质接近推荐
三、三类经典范式
**比喻:三个朋友推荐餐厅**
- 朋友甲:看你过去爱吃川菜粤菜+查新菜单像→基于内容(内容像)
- 朋友乙:你和小李口味像,他去的那家你也会喜欢→协同过滤(人像)
- 朋友丙:内容像+认识的人也推荐→混合
基于内容推荐
- 核心逻辑:用户过去喜欢的内容的特征→挑相似特征的新内容
- 关键能力:给内容打标签(电影/文章/视频的关键词、维度)
- 优点:能推冷门内容;不依赖其他用户行为
- 缺点:信息茧房;永远强化过去口味,不擅长制造惊喜
协同过滤
- 核心逻辑:不理解内容,只看行为关系
- 两句口号:
- 「和你相似的人也喜欢这个」(基于用户相似度)
- 「喜欢这个的人也喜欢那个」(基于物品相似度)
- 优点:能制造惊喜;不需要深度内容理解
- 缺点:冷启动糟糕(新用户没行为、新视频没人看)
- 抖音强制新用户选兴趣标签:是用内容特征补协同过滤冷启动漏洞
混合
- 现实系统几乎都混合:内容特征+协同信号+社交关系+时效热度+用户反馈→综合打分模型
- 原因:每种范式都有解决不了的问题,混合各取所长
**例子:发现新口味**
- 你只看「美食」「旅行」,抖音推「街舞教学」
- 基于内容会拒绝(不像你过去喜欢)
- 协同过滤可能推(和你行为像的人最近都在看)
- 混合系统综合判断
- 偶尔发现「原来我也喜欢这个」是协同过滤功劳
四、协同过滤的两条路径:UserCF 与 ItemCF
**同一术语下两条路**
- A路:找和你行为像的人→UserCF
- B路:看你买过的东西经常被一起买的是啥→ItemCF
UserCF:人以群分
- 口号:「和你相似的人也喜欢这个」
- 思路:先找和你口味相投的人,再看他们最近喜欢啥
- 计算中心:人(用户×用户相似度矩阵)
- 优点:能制造惊喜(偶尔带出信息茧房)
- 缺点:新用户新物品都要重算;用户多了计算量爆炸;兴趣变化整个网络都得变
ItemCF:物以类聚
- 口号:「喜欢这个的人也喜欢那个」
- 思路:看你过去喜欢过啥,再找「和这些经常被一起喜欢」的其他东西
- 计算中心:物品(物品×物品相似度矩阵)
- 优点:物品关系比用户关系稳定,可提前算好缓存,查询极快
- 缺点:难给真正意外的东西(过去喜欢科幻,推荐也大概率科幻)
**现实例子**
- 网易云「相似歌曲」= ItemCF(歌曲关系固定,可预计算)
- 抖音「你可能也喜欢」= UserCF + ItemCF
五、矩阵分解:用一组数字表示一个人
**为什么需要数字描述**
- 店员听到「燕麦拿铁、半糖、热」就形成画像(不太甜、不喝冷的、接受新潮口味)
- 推荐系统需要给每个用户/内容更复杂的「口味描述」
**原始数据的问题**
- 最直觉做法:100万用户×10万电影的大表,每格记1-5分评分
- 问题一:极其稀疏(一部电影100万人里可能只有几百人评分)
- 问题二:无法预测(用户没看过的格子是空的)
- 协同过滤依赖共同评分过的人,对无人同时评过的冷门电影抓瞎
**矩阵分解的核心想法**
- 讲义原文在此处被截断:把人和电影都用几个数字表示
第 2 关 · 端到端架构、数据闭环与评估指标
能用「数据流」视角讲清一次推荐请求的工程链路,并说出 CTR、AUC、NDCG 等核心评估指标各自在衡量什么。
五层架构:数据层→召回→粗排→精排→展示
想象你是一个餐厅经理,几万道候选菜摆在后厨,但客人坐下后只有几分钟,你得迅速决定先上哪几道。真实做法是分轮筛:先把明显不合适的筛掉(不吃辣的客人筛掉川菜),再精细评判剩下的候选,最后摆盘上桌。抖音每天给你推视频,思路一样——分轮漏斗。
为什么是漏斗,不是一次算完
抖音的候选池可能有上千万条视频,而从你下拉刷新到内容加载出来,往往只有几百毫秒。在这个时间窗里,平台不可能对每条视频都跑一遍最贵的深度模型,否则用户早就划走了。所以推荐系统把决策拆成五层,像漏斗一样层层筛下来——越往下候选越少,算法越精细。
flowchart TD
A[数据层<br/>行为日志 内容特征 用户画像] --> B[召回<br/>百万缩到约一千]
B --> C[粗排<br/>约一千缩到约一百]
C --> D[精排<br/>约一百缩到约十]
D --> E[展示与重排<br/>业务规则 多样性 去重]
五层各自在做什么
**1. 数据层:仓库,不是决策者**
这一层不参与「选哪条」,只负责「原料备齐」。它储存三类东西:
- 你的行为日志:看过哪些视频、看了多久、点赞、评论、关注、跳过
- 内容特征:视频的标签、封面、作者、热度、嵌入向量
- 用户画像:你的兴趣分布、年龄、性别、设备等
这三类原料会被上面所有层反复调用。数据层不挑内容,但缺了它,上面四层全趴窝。
**2. 召回:快而广**
任务:几十毫秒内,从几百万甚至上千万的池子里,拉出**约 500–2000 条**候选。
方法必须简单粗暴:标签匹配(你爱看篮球就拉篮球类)、协同过滤(爱看 A 的人也爱看 B)、向量相似度搜索。召回的核心指标是「召回率」——宁可多捞不可漏掉好内容,错了没关系,后面还有三道关。
**3. 粗排:快而稍准**
任务:从约一千缩到约一百。
这一层开始用机器学习模型打分,但仍是轻量级——逻辑回归、小规模神经网络,特征数也有限。它的目标是在「准」和「快」之间找平衡:准过召回,便宜过精排。
**4. 精排:准而慢**
任务:从约一百缩到最终的 10–20 条。
这一层用上了平台最贵的家当:深度神经网络、多任务学习(同时预估点击、完播、点赞、评论)。特征也是最丰富的——你近期的行为序列、当前时段、所在城市、甚至手机型号。它的目标是对每一条候选精确预估「用户会不会产生我们想要的行为」。
**5. 展示与重排:规则的最后一公里**
任务:把精排的 10–20 条加工成最终给你看的那 5–8 条。
这一步**不算分数,而是加规则**:
- 多样性:不能连推三条同类内容
- 新鲜度:给新发布的视频一定扶持
- 去重:你已看过的不能再推
- 广告位:把赞助内容塞进合适的位置
抖音下拉一次的真实数字
| 层级 | 候选规模 | 耗时量级 | 模型复杂度 | |---|---|---|---| | 数据层 | 整个用户/内容库 | 毫秒级查询 | 无模型 | | 召回 | 千万 → 约 1000 | 10–30 毫秒 | 简单规则/向量检索 | | 粗排 | 1000 → 约 100 | 10–20 毫秒 | 轻量模型 | | 精排 | 100 → 约 10 | 20–50 毫秒 | 深度模型 | | 重排 | 10 → 最终 5–8 条 | <10 毫秒 | 规则为主 |
为什么不能省掉中间几层
一个常见误解是:既然精排最准,为什么不让它直接处理所有候选?答案很简单——算力不允许。假设候选池是一千万条,精排单条耗时 5 毫秒,那一次刷新就要 50000 秒,相当于 14 小时。漏斗结构的本质是「**用便宜模型做粗筛,把贵模型留给最后几十条**」,让总计算成本可控。
**要点:** 推荐系统是一个分层漏斗,越往上处理量越大但模型越简单,越往下处理量越小但模型越精细,每一层只解决「粗筛」或「精排」中的一种问题。
一次推荐的「一生」:你刷新时系统做了什么
想象你点了一次外卖:从按下「下单」那一刻,到骑手把餐送到、吃一口、再给个五星好评——这是一条完整链路,每一步都为下一步铺垫。一次下拉刷新也是这样的「一生」:从手指落下,到内容显示、你看视频、你的反应被记录——它在几百毫秒里走完一圈,又把数据埋进土壤,等下一次发芽。
用一次具体刷新串起来
工作日中午 12:30,你躺在沙发上刷抖音,首页刷完了,下拉刷新——我们跟着这条请求走完它的「一生」。
**T=0ms:你手指落下**
客户端立刻捕捉到这个手势,知道「要拉新内容了」。屏幕还没动,客户端已经在准备给服务器发的「包裹」。
**T=20ms:打包请求**
这个「包裹」里塞着:你的用户 ID、最近 50 条行为序列(看了什么、看了多久、是否点赞)、设备型号、网络环境、当前时间、地理位置。所有这些上下文都是精排模型的「配料」。
**T=50ms:服务器收到,数据层备料**
服务器拿到请求后,第一件事不是算分,而是去数据层查你的用户画像:最近 7 天的兴趣分布、关注列表、敏感词过滤设置等。这一步是「读」,不是「算」。
**T=80ms:召回层开闸**
召回像撒网——同时启动 5-6 种策略(标签匹配、协同过滤、向量相似度搜索等),并行从不同候选池里捞视频。约 80 毫秒后,桌上摆着 1000 多条候选。注意:这时还没有任何「准不准」的概念,召回只管「会不会漏掉好内容」。
**T=110ms:粗排快速过一遍**
一个轻量模型给这 1000 条打分,按分数砍到 100 条。这一步要兼顾速度和准确——用错了就可能把好内容送走。
**T=150ms:精排精细打分**
最贵的模型上场。它对 100 条候选逐一精评,结合你最近的行为序列、当前时段、所在地点——把所有线索都用上。这一步的预估维度也最多:点击、完播、点赞、评论、关注,每个行为一个分数。
**T=170ms:重排与规则介入**
精排的 20 条被打分后,重排层加规则:不能连续两条同类(多样性)、不能推你刚看过的(去重)、要给新视频留位置(新创作者扶持)、广告位塞在哪里。这些不是机器学习,是产品决策。
**T=200ms:响应发回客户端**
最终 8 条视频(封面、视频 ID、作者信息、跳转链接)被打包返回。整个「决策过程」用时不到 200 毫秒。
**T=300ms:第一屏显示**
客户端拿到响应,开始下载封面、解析元数据、渲染缩略图。300 毫秒左右,第一条视频封面出现。
**T=400ms+:行为采集开始**
但这条推荐的「一生」还没结束。从第一条视频开始显示的那一刻,客户端就在默默记录:你看了几秒、是否滑走、是否点赞、是否点开评论区。这些行为事件被实时回传给服务器。
**分钟级:画像更新**
你的这次完播、这次跳过,会在分钟级被合进你的用户画像。等你下次再下拉刷新——刚才那些数据已经在数据层里被读到了。
sequenceDiagram
participant U as 你
participant C as 客户端
participant S as 推荐服务器
participant D as 数据层
participant R as 召回
participant Cr as 粗排
participant Fr as 精排
participant Rr as 重排
U->>C: 下拉刷新
C->>S: 请求 用户ID 行为序列 上下文
S->>D: 查用户画像
D-->>S: 画像数据
S->>R: 多路召回
R-->>S: 约1000条
S->>Cr: 粗排打分
Cr-->>S: 约100条
S->>Fr: 精排打分
Fr-->>S: 约20条
S->>Rr: 多样性 去重 规则
Rr-->>S: 最终8条
S-->>C: 返回视频列表
C-->>U: 视频显示
U->>C: 观看 点赞 跳过
C->>S: 行为事件回传
S->>D: 写入日志
为什么这个「一生」重要
- **请求是「单次的」,链路是「连续的」**:你这次看到的视频,依赖你过去所有的行为;你这次的行为,又会影响下次看到的视频。整条链路环环相扣——过去的你 → 现在的你 → 未来的你。
- **响应是「百毫秒」的,影响是「分钟级」的**:你刚划过的内容,几分钟后你的画像就更新了。系统的「反应速度」,是它能「越用越懂你」的物理基础。
- **算法和规则是「交替」的**:精排是数学,重排是产品决策。一条好推荐不是纯算出来的,是「算 + 选」共同决定的。
**要点:** 一次下拉刷新是一条「请求 → 计算 → 响应 → 行为回传 → 画像更新」的小型闭环,从手指落到画像更新不到 1 分钟;它的「一生」不是结束于内容显示,而是结束于你新的行为数据被记入系统。
数据闭环的工程视角:单次循环
用「私人造型师」建立直觉
想象你去商场,身边跟着一位造型师。他不会先问你「你想要什么」,而是先给你搭一身让你试——你试穿一下,他看你表情:满意地点点头、皱着眉递回去、还是压根没照镜子就走。他的笔记本飞快记下:这件你看了 3 秒,那件你看了 30 秒,那件你直接说「买了」。下次再见面,他不再给你昨天你直接放下的那件,而会从你认真试穿过的那件里找类似的款式。
推荐系统在做一模一样的事——只不过「造型师」是算法,「你」是几亿用户之一,「笔记本」是数据仓库。
一次循环的四个环节
**第一步:展示(Impression)**
精排完成后,系统把 8 条视频打包返回,客户端把它们铺到你面前。这一步叫「曝光」——系统**已经决定**给你看什么了。但曝光本身也是数据:哪条排在第 1 位、哪条排在第 8 位、你到底看到第几条才停下。
**第二步:行为(Behavior)**
你开始刷。看 3 秒就划走,是「快速跳过」;看到一半退出,是「不感兴趣」;看完全程还点赞,是「强正反馈」;点进评论区,是「深度互动」;点开作者头像,是「被作者本人吸引」。
系统能感知到的行为远不止「点赞/不喜欢」两个按钮——它看你**停多久**、**怎么滑**、**是否循环播放**、**何时退出**。抖音一天采集几百亿条这样的行为事件。
**第三步:行为回流(Feedback Logging)**
你刚划走一条视频,客户端就把这条行为打包(用户 ID、视频 ID、行为类型、停留时长、时间戳)发回服务器,服务器写入日志系统——这叫「埋点」。
「回流」是工程上**最容易被低估**的一步。它有四个硬要求:
- **量大**:抖音每天产生 PB 级别的行为日志
- **实时**:用户在刷,必须趁热打铁
- **不丢**:行为数据是模型的「粮食」,丢一条就少一条信号
- **可关联**:这条行为必须能正确挂回那个用户、那条视频、那个时刻
任何一步出 bug——客户端没埋点、网络断了、服务器重复写入——都会让推荐「学错」。这一步才是闭环能不能真正「闭」上的关键。
**第四步:模型更新(Model Update)**
行为数据进入数据仓库后,并不会立刻改变你今天看到的内容。它们被聚合成训练样本:你过去看过什么、当时系统推了什么、最后你做了哪个动作。
每天凌晨(或更频繁),数据团队用这些样本重新训练模型,把「新学到的规律」压进参数里。第二天上线后,你看到的推荐就是新模型算出来的。
flowchart LR
A[展示] --> B[行为]
B --> C[回流]
C --> D[模型更新]
D -.次日再次展示.-> A
单次循环的「工程」视角
注意几个**时间尺度**的差异——这是工程视角的核心:
- 展示 → 行为:秒级
- 行为 → 回流:毫秒级
- 回流 → 模型更新:小时到天级
- 模型更新 → 下次展示:下一刷
「闭环」之所以是个**工程**问题,不是个**算法**问题,核心就在于这条链能不能稳定跑通:客户端埋点不能漏、网络传输不能断、日志系统不能挂、训练流水线不能崩、模型上线不能翻车。算法可以不是最优的,但数据回不来,系统就永远学不会。
一个具体例子
下午 3 点,你刷到 8 条视频:
- 第 1 条(搞笑):看了 8 秒,跳过
- 第 2 条(萌宠):看完,点赞
- 第 3 条(美食):看到 25 秒,关注了作者
- 第 4 条(新闻):0.5 秒划过
这 4 条行为在 3 秒内全部回传到服务器。凌晨,模型用今天所有用户的行为重新训练。明天再刷时,美食类概率上调、萌宠类保持、新闻类下调——一次单循环的「结果」。
单次 vs 多轮:本节的视角边界
今天讲的是**一次完整的循环**:从「系统展示」到「模型被更新」,链条走完一遍。这是物理结构上的事实——数据走了、模型变了。
但循环走完一圈**不等于故事结束**。你反复看美食,系统推更多美食,你继续看更多美食——这种「越推越窄」的现象是循环的副产品,**多轮**叠加后才会显现。这一块我们会留到后面专门讲,今天不展开。
**要点:** 数据闭环是「展示→行为→回流→更新」的物理链条;单次循环走完一圈,系统就「学」到一次;这条链的关键不在算法,而在数据能不能**完整、及时、不出错**地流回来。
评估指标:CTR、AUC、NDCG、留存
评估指标:CTR、AUC、NDCG、留存
用「教练看成绩」做类比
你请了一位私教,每节课后都让小孩做一张卷子。但你真正想知道的不是「这张卷子几分」,而是「小孩下个月大考能考几分」。
推荐系统的评估指标,就在「卷子分数」和「最终成绩」之间做平衡。CTR、AUC、NDCG 是各种「卷子分数」,留存才是「最终成绩」。
为什么必须有指标
你已经学完数据闭环了——展示、行为、回流、模型更新。但有个根本问题没解决:你怎么知道「模型变好了」?
不可能每天让全公司员工去刷产品看「感觉准不准」。必须用数字说话。**评估指标**就是把「推荐得好不好」翻译成可测量的数字。
离线 vs 在线:两个考场
评估分两个地方:
- **离线考场**:拿历史数据「做卷子」。模型上线前,用过去的数据回测——昨天推得对不对?AUC、NDCG 在这里算。
- **在线考场**:上线后给真实用户用,看真实行为——CTR、留存在这里看。
离线便宜、快、能反复做;在线贵、慢,但最真实。再准的离线指标,也代替不了在线。
---
CTR(点击率):最基础、最容易骗人
**衡量什么**:一条内容被推出去后,多少人点了。 直觉公式:CTR = 点击数 ÷ 展示数。
比如一条视频推给 1000 人,120 人点进去,CTR = 12%。
**优点**:简单、好统计、秒级反馈。
**致命缺陷**:CTR 只看「点不点」,不看你点完之后什么反应。结果——
- 标题党刷 CTR:写「震惊!XXX 居然这样」骗你点,进去看完想骂人
- 擦边球刷 CTR:开头放个争议画面骗你点
- 位置作弊:CTR 高的内容被反复推,热门越来越热
**关键洞察:CTR 高 ≠ 推荐好**。CTR 只在「点击前」测量,完全不关心你点完之后的体验。
---
AUC:模型「排序能力」的体检表
**衡量什么**:模型把「好内容排在坏内容前面」的能力。
举例:精排给用户算了 8 条视频的预估分数。AUC 关心的是——真正该推的那条(用户最终看了/喜欢的那条),有没有排在不该推的前面?
- AUC = 1.0:完美排序(推的每条都比没推的好)
- AUC = 0.5:瞎蒙(推和不推差不多)
- AUC = 0.6-0.7:刚及格
- AUC > 0.8:非常能打
**和 CTR 的区别**:CTR 看「整体点得多不多」,AUC 看「**该点的有没有排在前面**」。
**适合场景**:纯离线评估,模型训练完打一次分。
---
NDCG:位置有高低,奖赏要分级
**衡量什么**:好内容**排得越靠前**,分越高。
AUC 已经能区分「好/坏」,但对位置不敏感——把第 1 条和第 8 条对换,AUC 几乎不变。
但现实里,第 1 条和第 8 条差距巨大!第 1 条是黄金位,曝光率、第 1 印象都完全不同。
NDCG 的核心思想:**位置就是权重**。好内容出现在第 1 位,得满分;出现在第 8 位,扣掉一大半分。
**举例**:精排推了 8 条,前 3 条都贴用户喜好,但「最贴」的那条在第 3 位。CTR 看「前 3 条总点击」,NDCG 看「最贴的在不在第 1 位」。
**适合场景**:离线评估精排模型时最重要的一项。
---
留存:唯一能「长期打假」的指标
**衡量什么**:明天/下周/下个月,用户还来不来。
其他三个指标都死在「一次推荐」里——只看这一次推得准不准。但推荐系统的最终目的不是「一次推得准」,是「让用户留下来」。
**CTR 高但留存崩盘**的场景:
- 系统学到了「猎奇内容 CTR 高」→ 疯狂推 → 用户审美疲劳 → 卸载
- 系统学到了「擦边球 CTR 高」→ 推 → 用户被恶心到 → 离开
- 短期 CTR 涨 20%,30 天留存跌 15%——这是大灾难
**留存的「孤独权威」**:
- CTR 涨了,可能是模型变好,也可能是标题党变多
- AUC 涨了,可能是离线数据没漏,但也可能跟线上真实感受脱节
- NDCG 涨了,可能是排序更准,但用户不一定感觉到
- **留存跌了,就是真的出问题了**——没人能在卸载/不打开这件事上撒谎
---
一个具体例子
某内容平台做了一次模型升级,所有离线指标都涨了:
| 指标 | 升级前 | 升级后 | 状态 | |------|--------|--------|------| | CTR | 8% | 11% | ↑ | | AUC | 0.78 | 0.81 | ↑ | | NDCG | 0.65 | 0.71 | ↑ | | 7日留存 | 42% | 38% | ↓ |
上线一周后紧急回滚——所有离线指标都「好」了,但用户跑得更多。这就是**为什么留存是最终裁判**。
---
四个指标的关系
flowchart LR
A[CTR 点击率<br/>在线·短期] --> B[AUC 排序能力<br/>离线] --> C[NDCG 位置加权<br/>离线] --> D[留存 用户回访<br/>在线·长期]
从左到右:看的视野越来越长。CTR 看「这一刻点没点」,AUC/NDCG 看「这次排得好不好」,留存看「用户还来不来」。
**要点:** CTR 测点击、AUC 测排序、NDCG 测位置加权排序,三者都死在「一次推荐」里;留存测「用户明天还来不来」,是唯一能反映长期价值、也是唯一能识破「短期指标全涨但体验崩盘」的硬指标。
学习笔记
端到端架构、数据闭环与评估指标
一、五层漏斗架构
候选池可能上千万条
候选池可能上千万条,但下拉刷新只有几百毫秒,对每条都跑最贵模型不现实。因此拆成五层漏斗层层筛——越往下候选越少,算法越精细。本质是「用便宜模型做粗筛,把贵模型留给最后几十条」,让总计算成本可控。
flowchart TD
A[数据层] --> B[召回]
B --> C[粗排]
C --> D[精排]
D --> E[展示与重排]
数据层:不参与决策,只备原料
**数据层**:不参与决策,只备原料。储存行为日志(看过什么、看了多久、点赞评论关注跳过)、内容特征(标签、封面、作者、嵌入向量)、用户画像(兴趣分布、年龄性别设备)。被上面四层反复调用,缺了它四层全趴窝。
**召回**:几十毫秒内从数百万/上千万拉到约 500–2000 条。方法必须简单粗暴:标签匹配、协同过滤、向量相似度搜索。核心指标是召回率——宁可多捞不可漏,错了没关系,后面还有三道关。
**粗排**:从约 1000 缩到约 100。开始用机器学习模型打分,但仍轻量(逻辑回归、小规模神经网络),特征数有限。在「准」和「快」之间找平衡:准过召回,便宜过精排。
**精排**:从约 100 缩到最终 10–20 条。用上平台最贵家当:深度神经网络、多任务学习(同时预估点击、完播、点赞、评论)。特征最丰富(近期行为序列、当前时段、城市、手机型号)。
**展示与重排**:把 10–20 条加工成最终 5–8 条。**不算分数,而是加规则**:多样性(不能连推三条同类)、新鲜度(新视频扶持)、去重(已看过的不再推)、广告位。
数字对照
| 层级 | 候选规模 | 耗时 | 模型复杂度 | |---|---|---|---| | 数据层 | 整个用户/内容库 | 毫秒级查询 | 无模型 | | 召回 | 千万 → 约 1000 | 10–30 ms | 简单规则/向量检索 | | 粗排 | 1000 → 约 100 | 10–20 ms | 轻量模型 | | 精排 | 100 → 约 10 | 20–50 ms | 深度模型 | | 重排 | 10 → 最终 5–8 条 | <10 ms | 规则为主 |
假设候选池一千万条
假设候选池一千万条,精排单条 5 ms,一次刷新需 50000 秒(≈14 小时)。漏斗结构让总计算成本可控。
---
二、一次推荐的完整链路
关键时间点
- **T=0 ms**:手指落下,客户端准备请求
- **T=20 ms**:打包请求(用户ID、最近50条行为序列、设备、网络、时间、地理位置)
- **T=50 ms**:服务器查数据层(用户画像、敏感词设置)
- **T=80 ms**:召回启动 5–6 种策略并行,约 1000 条候选
- **T=110 ms**:粗排打分砍到 100 条
- **T=150 ms**:精排精细打分,预估点击/完播/点赞/评论/关注
- **T=170 ms**:重排加规则(多样性/去重/新视频扶持/广告位)
- **T=200 ms**:响应返回客户端(8 条)
- **T=300 ms**:第一屏显示
- **T=400 ms+**:行为采集开始
- **分钟级**:行为合入用户画像,下次刷新时已被读到
整个决策过程不到 200 ms
整个决策过程不到 200 ms;推荐的「一生」不止响应——响应后还要采集行为、回流、模型更新,闭环才完整。
---
三、数据闭环(单次循环)
四个环节
- **展示(Impression)**:曝光本身也是数据(排第几位、你看到第几条才停下)
- **行为(Behavior)**:远不止点赞/不喜欢两个按钮——还看停留多久、怎么滑、是否循环播放、何时退出
- **行为回流(Feedback Logging)**:客户端打包(用户ID、视频ID、行为类型、停留时长、时间戳)发回服务器写入日志,即「埋点」
- **模型更新(Model Update)**:行为聚合成训练样本,每天凌晨(或更频繁)重新训练,第二天上线后新模型生效
flowchart LR
A[展示] --> B[行为]
B --> C[回流]
C --> D[模型更新]
D -.次日再次展示.-> A
回流的四个硬要求
- **量大**:PB 级别行为日志
- **实时**:趁热打铁
- **不丢**:少一条就少一条信号
- **可关联**:正确挂回用户、视频、时刻
时间尺度
- 展示 → 行为:秒级
- 行为 → 回流:毫秒级
- 回流 → 模型更新:小时到天级
- 模型更新 → 下次展示:下一刷
闭环是工程问题,不是算法问题
闭环是工程问题,不是算法问题。关键在链能不能稳定跑通:客户端埋点不能漏、网络不能断、日志系统不能挂、训练流水线不能崩、模型上线不能翻车。算法可以不是最优的,但数据回不来,系统就永远学不会。
---
四、评估指标
离线 vs 在线
- **离线考场**:拿历史数据做卷子,算 AUC、NDCG
- **在线考场**:真实用户真实行为,看 CTR、留存
- 离线便宜快能反复做;在线贵慢但最真实。再准的离线指标也代替不了在线。
CTR(点击率)
- 公式:点击数 ÷ 展示数
- 优点:简单、秒级反馈
- **致命缺陷**:只看「点不点」,不关心点完后什么反应。标题党、擦边球、位置作弊都能刷高 CTR。关键洞察:CTR 高 ≠ 推荐好。
AUC
- 衡量模型把好内容排在坏内容前面的能力
- AUC = 1.0 完美;0.5 瞎蒙;0.6–0.7 及格;> 0.8 能打
- 与 CTR 区别:CTR 看整体点得多不多,AUC 看该点的有没有排在前面
- 适合:纯离线评估
NDCG
- 核心思想:**位置就是权重**——好内容在第 1 位得满分,在第 8 位扣一大半分
- 与 AUC 区别:AUC 对位置不敏感,NDCG 对位置敏感
- 适合:离线评估精排模型最重要的一项
留存
- 衡量明天/下周/下月用户还来不来
- 唯一能「长期打假」的指标
- 其他三个都死在「一次推荐」里,只看这一次推得准不准;但推荐系统最终目的不是「一次推得准」而是「让用户留下来」
指标对比
| 指标 | 衡量什么 | 关键局限/特点 | |---|---|---| | CTR | 点了多少 | 只测点击前,可被标题党刷高 | | AUC | 好内容能否排在坏内容前 | 纯离线,对位置不敏感 | | NDCG | 好内容是否排在前面 | 位置即权重,最看重排 | | 留存 | 用户是否长期回来 | 唯一长期指标,最真实也最慢 |
第 3 关 · 行为数据如何变成用户画像
能讲清系统如何从你的一举一动中「读出」你的兴趣,并把抽象的用户画像拆成标签、Embedding、长短期意图三个层次。
行为数据的类型与信号强度
行为数据的类型与信号强度
开场:系统是个「暗中观察」的服务员
想象你走进一家餐厅。服务员其实一直在默默观察你:点了什么菜、吃了几口、表情如何、最后剩多少、还拍了照发朋友圈——他比你「嘴上说的」更知道你的真实口味。
推荐系统也是这样一个「暗中观察」的服务员。你没告诉它你喜欢什么,但你的每一个动作——划过的速度、停留的秒数、是否看完、是否点赞——都在它心里变成了一笔「账」。本节要回答的核心问题是:**这些动作在系统眼里「分量」一样吗?如果不一样,谁更重?**
一、两大维度:正向信号 vs 负向信号
推荐系统收集的行为,先按「喜欢还是不喜欢」分成两类:
**正向信号(系统读出「你可能感兴趣」)**
- 显式:点赞、收藏、评论、转发、关注作者
- 隐式:完播、长时间停留、多次重播、进入作者主页
**负向信号(系统读出「你可能不感兴趣」)**
- 显式:点「不感兴趣」、举报、屏蔽作者
- 隐式:快速划走、停留极短(<2秒)、看到一半退出、点开立刻关闭
记住这两个维度很关键——推荐系统不仅要知道「你喜欢什么」,更要快速识别「你讨厌什么」,二者权重往往相当。
二、信号强度排序:从「礼貌性动作」到「真爱证据」
同样是正向信号,分量差很多。可以粗略这么排(**注意排序不是死的,不同公司会调**):
**强信号(真爱证据)**
- 完播 + 重播:尤其是短视频,看完甚至看两遍,几乎只能解释为「被内容吸引」
- 收藏:暗示「我想以后再回来看」,是带未来意图的强信号
- 关注作者:表达长期兴趣
**中等信号(明确肯定)**
- 评论:愿意花时间打字,但有可能是来骂的
- 转发:愿意把内容带去自己的社交圈
**弱信号(可能只是礼貌)**
- 点赞:操作成本极低(一次点击),可能出于「朋友发的、支持一下」等社交压力
- 进入主页:只是好奇,不一定转化为兴趣
**负向信号** 里,**快速划过**虽然单次信号弱,但**量大**——用户每天划几百条,划走是绝大多数动作,系统必须认真对待。
flowchart TD
A[用户对一条内容的所有行为] --> B{方向}
B -->|正向| C[强: 完播 / 收藏 / 关注]
B -->|正向| D[中: 评论 / 转发]
B -->|正向| E[弱: 点赞 / 访问主页]
B -->|负向| F[强负: 举报 / 不感兴趣]
B -->|负向| G[弱负但量大: 快速划走 / 短停留]
三、为什么「隐式信号」反而更准
这里有一个反直觉的洞察:**你嘴上做的(点赞)比身体做的(看完)更容易骗人。**
点赞可能是因为:
- 朋友发的,给个面子
- 视频只有 15 秒,看完顺便点一下
- 当时手滑
但**完播率和停留时长是骗不了系统也骗不了自己的**——你没看完就是没看完,没停留就是没停留。算法圈有句玩笑话:「用户嘴上说的偏好,和他实际点的赞之间,差着 100 个收藏夹。」
这也是抖音早期把完播率定为头号指标的原因:完播 + 点赞 + 评论的组合打分,远比单一的「点赞数」更能预测一条视频的长期表现。
四、负向信号容易被低估
还有一个常被忽略的点:**用户主动说「不感兴趣」是极少数,大多数不喜欢是用「沉默的划走」表达的。**
如果系统只听显式负反馈(点「不感兴趣」按钮),会误以为用户喜欢所有没被举报的内容——这显然错得离谱。所以现代推荐系统会把「短停留 + 快速划走」建模成一种**集体性的负向信号**:当一条视频被 80% 的用户在 2 秒内划走,那这条视频大概率就是没吸引力。
一个具体例子
你在抖音刷到一条烧烤视频:
- 看完了 → 系统记:+完播(强正)
- 没点赞但收藏了 → 系统记:+收藏(强正,**比点赞更值钱**)
- 退出前看了一眼作者主页 → 系统记:+主页访问(弱正)
- 第二天又刷到烧烤,你 2 秒就划走 → 系统记:- 快速划走(弱负,会下调烧烤类权重)
这套打分每天发生几十亿次,构成了「用户画像」的原始素材——下一节我们就看,这些零散的信号怎么聚合成「90后 / 数码控 / 深夜美食爱好者」这样的标签。
**要点:** 推荐系统看的不是「用户做了什么动作」,而是「每个动作背后的信号强度」——完播和收藏 > 评论和转发 > 点赞和停留 > 沉默划过;隐式信号(看完没看完)往往比显式信号(点赞没点赞)更能反映真实兴趣。
从行为到标签:显式标签与隐式标签
开场:你以为的「用户画像」 vs 系统心里的「用户画像」
你是市场运营,对「用户画像」这个词肯定不熟——你脑子里想到的,多半是一份 PPT 上的「典型用户档案」:姓名张三、女、28岁、白领、月入1.5万、爱旅游、爱健身。
这是**营销画像**:静态、可读、写完就锁进抽屉。
但推荐系统心里的画像不是这样的。它更像一个**实时刷新的数据仪表盘**:每刷过一条视频、每停留一秒钟,仪表盘上的指针就跳一格。本节要讲清:系统怎么从你的一举一动中「读出」你到底是谁、这些标签和你以为的标签有什么不同。
一、两大类标签:你自己说的 vs 系统看出来的
**显式标签(你告诉系统的)**
这是最直觉的「标签」——你在注册、填写资料、点过「我的兴趣」时主动留下的信息:
- 人口属性:性别、年龄段、所在城市(抖音会引导你选「年龄段」)
- 主动声明的兴趣:注册时勾选「我对美妆/科技/游戏感兴趣」
- 手动设置:「不要给我看这类内容」「多给我看这类内容」
这种标签像**你亲手填的简历**:清晰、可解释、能直接拿去做广告投放。但有三个致命问题:
- **很多人不填**——嫌麻烦,30% 以上的用户关键信息是空的
- **填了也可能是假话**——勾选「金融」显得高大上,实际一窍不通
- **填完就过时**——你三年前勾的「数码」,现在已经是钓鱼佬
**隐式标签(系统从你行为里挖出来的)**
这是更大量、更真实的标签。系统观察你上百次行为后,用统计或模型推断出来:
- 你过去一周看了 30 条美食视频 → 系统给你贴上「**高频美食消费者**」
- 你每天晚上 11 点后最活跃 → 系统给你贴上「**深夜活跃用户**」
- 你点赞的内容 80% 在 50 元以上 → 系统给你贴上「**中高消费力**」
这些标签**你没说过**,但系统非常确信。这种标签像**别人对你的印象**:可能不全面,但更接近真实。
flowchart LR
A[用户行为日志] --> B{标签来源}
B -->|用户主动填写| C[显式标签]
B -->|系统行为推断| D[隐式标签]
C --> E[人口属性<br/>声明兴趣<br/>手动设置]
D --> F[行为统计标签<br/>时间模式标签<br/>消费力标签]
E --> G[用户画像<br/>实时仪表盘]
F --> G
二、四个最常见的误解
讲到这儿,必须澄清你可能已经有的几个误解,否则后面理解会偏:
**误解 1:「我没填年龄,系统怎么知道我 90 后?」** 不是猜的,是从**其他数据侧写**出来的:你用的手机型号、你活跃的时间段、你的社交关系链、你点赞的内容类型……这些特征叠加后,「90 后」这个标签的置信度可以从 30% 升到 95%。这就是隐式标签的能力。
**误解 2:「标签就是'90 后/数码控/一线城市'这几个词吧?」** 完全低估了。真实系统里一个用户的标签库可能有**几千个**——从「养猫」「iPhone 用户」「考研党」「追剧到深夜」到「反感土味视频」「已为人父」,密度远超你想象。
**误解 3:「标签贴上就一辈子跟着我」** 错。标签是有**生命周期**的:你最近 7 天看了 50 条美食,「美食」标签权重会飙升;一个月不点,权重会自动衰减。所谓「画像」是动态的,不是纹身,是水印。
**误解 4:「标签就是我」** 这是最危险的一个误解。**标签是对你的有损压缩**——几千个标签装不下一个真实的人。系统也知道这一点,所以单靠标签做推荐有上限。这也是为什么现在大厂越来越转向 **Embedding**(下一节讲):用一串高维数字来表示你,比几百个标签信息密度高得多。
三、显式与隐式冲突时,谁说了算?
一个关键的工程问题:如果你**说**喜欢美妆(显式),但**做**出来的行为全是健身(隐式),系统信谁?
**信隐式**。这是推荐系统铁律:行为 > 声明。原因很简单——你嘴上说的可能为了应付问卷、可能三年前随口一说,但你**当下的每一次点击、每一秒停留**都是真实成本下的选择。
不过系统不是粗暴地「删除」显式标签,而是给它**降权**:美妆标签还在,但权重被压到很低,健身类内容获得更多曝光机会。
一个具体例子
你给抖音填了「我对摄影感兴趣」这个显式标签。注册后第一周:
- 系统推了 10 条摄影内容 → 你**0 条看完**,平均停留 1.2 秒就划走
- 同时夹杂的 5 条萌宠内容 → 你**5 条全看完**,其中 2 条点赞,1 条收藏
两周后,你的标签库已经发生剧变:
- 「摄影」标签:**权重从 0.8 降到 0.2**(保留但低优先)
- 「萌宠/猫狗」标签:**权重从 0 升到 0.75**(新增的隐式标签)
- 「凌晨活跃」「短视频耐受度高」等行为模式标签也加了进来
**这才是真实的「用户画像」**——不是你入职时填的那张三页纸,而是一张被无数次行为不断重写的活地图。
**要点:** 显式标签是用户主动告诉系统的(人口属性、声明兴趣),清晰但易过时、可能是假话;隐式标签是系统从行为里推断的,量大、动态、更接近真实;用户画像不是一张写死的档案,而是一份**随行为持续更新的概率分布**;当两者冲突时,系统**信行为不信声明**。
用户 Embedding:你的数字指纹
开场:你不是张三,你是 256 个数字
你印象中的「自己」是什么?名字、年龄、工作、爱好……但推荐系统要的不是这些**人类能读**的描述,它要的是一串**机器能算**的数字。
这一节讲一个新概念:Embedding。不要被这个词吓到——它的本质是**把你过去所有的行为历史压缩成一串固定长度的数字**(比如 256 个),然后用这串数字代表「你」。
这串数字就是你的**数字指纹**。两个相似的人,他们的指纹会非常接近;两个完全不同的人,指纹会离得很远。
什么是 Embedding:人话版解释
想象一个超级复杂的空间,里面有 256 条隐形的轴(你不需要知道每条轴代表什么,系统也说不清)。每个用户是空间里的一个**点**。点的位置由这 256 个数字共同决定。
你刷过 50 条美食视频、20 条健身视频、5 条萌宠视频、3 条数码视频——这些行为被加权后,最终输出一个类似这样的一串数字:
[0.23, -0.87, 0.45, 0.12, -0.56, 0.78, ... 共 256 个]
**每一个数字都没有具体含义**——你不能指着第 47 个数说「这代表你爱猫」。它是一个整体的「方向」,和地理坐标一样:没人问「北京的经度 116.4° 是什么意思」,但这个坐标确实能定位北京。
flowchart LR
A[你过去 1000 条行为] --> B[Embedding 模型<br/>看不见的转化器]
B --> C[256 个数字<br/>你的数字指纹]
C --> D[在多维空间里的一个点]
D --> E[和你相近的用户<br/>聚集在这附近]
标签做不到的事,Embedding 做到了
上一节我们讲了标签系统:把你贴上「美食」「健身」「90后」等几百个标签。但标签有个根本问题:**它要求系统事先定义好所有可能的标签**。如果系统没有「撸猫视频爱好者」这个标签,你就永远不会被归到这一类。
Embedding 没有这个限制:
- **标签是有限的、离散的**——只能在已有的标签里选,标签之间没有「过渡状态」
- **Embedding 是连续的、稠密的**——可以在任意位置,可以是「60% 美食 + 30% 健身 + 10% 摄影」的中间态
用一个生活例子:
- 标签系统里:你是个「爱美食、爱健身、不爱数码」的人,三个明确的开关
- Embedding 里:你是空间里的一个独特位置,可能和「爱美食爱健身」的那个用户距离很近,但又不完全重合,因为你们刷的内容在细节上有差异(你爱川菜,他爱粤菜)
Embedding 能表达**「既不A也不B,但在AB之间某个位置」**——这是标签永远做不到的。
Embedding 是怎么来的?系统不需要你告诉它
这是 Embedding 最神奇的地方:**它不需要任何人事先定义**。
你不需要告诉系统「我喜欢川菜」,你只需要看 30 条川菜视频。系统在你看视频的时候,悄悄调整你那 256 位数字——让这串数字越来越指向「川菜爱好者」那个方向。
这个过程类似小孩学说话:没人教他「川菜」的概念,他只是听大人说了一万次「中午吃火锅」,下次他自己就知道「火锅是辣的、热闹的、和家人一起吃」。Embedding 模型也是:看过足够多的用户行为,它自己就学会了「这种行为模式的人,他们的指纹应该长什么样」。
所以 Embedding 比标签强在三件事:
- **不需要人工定义**——没有「撸猫爱好者」这个标签也不怕
- **信息密度高**——256 个数字能表达的「人」,比 500 个标签还细
- **能表达中间状态**——你「有点喜欢又不太喜欢」,标签系统表示不了,Embedding 可以
标签 vs Embedding:一张表看清
| 维度 | 标签系统 | Embedding | |---|---|---| | 数量 | 几百到几千个标签 | 通常 128~256 个数字 | | 表达力 | 离散、稀疏 | 连续、稠密 | | 构建方式 | 人工定义 + 行为匹配 | 模型从行为里自动学 | | 解释性 | 能说清每个标签含义 | 不可解释(说不出每个数代表啥) |
**最大的代价是:不可解释**。这是 Embedding 的硬伤——你没法对老板说「因为这个用户的第 47 位数字是 0.3,所以我们推给他这条视频」。但工程上有一种间接解释:**「和你类似的用户都看了这条」**——这句话的背后就是 Embedding 在算距离。
一个具体场景
抖音为你建好了一个 256 位的 Embedding。系统要决定给不给你推一条新视频时,它会:
- 把这条视频也转成一个 256 位的数字(视频也有自己的 Embedding)
- 算你俩的「距离」——数字越像,距离越近
- 距离近就推给你,因为系统判断你们的「兴趣指纹」匹配
所以你刷到的每一条视频,背后都是一次**你和它的指纹比对**。和你指纹最像的视频会优先曝光。
**要点:** Embedding 是把一个人过去所有行为压缩成一串固定长度的数字(比如 256 位),作为「数字指纹」代表这个人;它和标签的最大区别是——标签是离散、有限、靠人定义,Embedding 是连续、稠密、从行为中自动学到;Embedding 能表达「既A又B的中间状态」,这是标签做不到的;代价是不可解释,但可以用「和你相似的人都看了」来间接说明。
长期兴趣与短期意图
长期兴趣 vs 短期意图:你有两个「你」
推荐系统眼里你不是「一个人」,而是「两个人」同时存在:
- **长期兴趣**(你是个什么样的人):你过去 6 个月反复表现出来的偏好。它告诉你「你一直爱看什么」
- **短期意图**(你这会儿想看什么):你最近几小时到几天内的临时信号。它告诉你「你当下想看什么」
为什么需要两个?因为只看你或者只看你当下,推荐都会很糟。
长期兴趣:你的「人格底色」
长期兴趣有几个特征:
- **稳定**:你是个数码爱好者,不会今天爱明天就烦——系统观察你 3-6 个月甚至更久才定型
- **缓慢变化**:你可能最近半年从爱看吃播转向爱看健身,这个过程是渐变的
- **由 Embedding 主导承载**:上一节讲的那 256 位数字,主要表达的就是你的长期兴趣。它是你无数行为的「重心」
长期兴趣负责做**基础推荐**:你一打开 App,系统先按这个底色给你备好内容。
短期意图:你最近的「心事儿」
短期意图完全相反:
- **临时**:可能只持续几小时到几天
- **强触发**:通常由一个具体事件引起——一次搜索、一次点击、一次购买、一个突发热点
- **明确**:你搜「烧烤」时,系统不需要猜——你就是想吃烧烤
短期意图负责做**实时调整**:在你长期兴趣的基础上,根据你「最近想看什么」临时加码或减码某些内容。
烧烤那个例子,到底怎么发生的
假设你是一个平时爱看美食和健身的用户。某天晚上你突然搜了「北京望京烧烤」。
**第 1 步:短期意图被点燃** 系统立刻把你的短期意图向量加上一个强权重:「用户现在想看烧烤」。接下来几小时,推送里会密集出现烧烤内容。
**第 2 步:长期兴趣做背景** 但它不会只推烧烤——因为你的长期兴趣是「美食+健身」,所以你会看到:烧烤做法(短期命中 + 长期命中)、北京美食探店(短期 + 长期)、健身餐(长期为主)。这种「短期意图 × 长期兴趣」的交集,是你感觉「系统懂我」的核心来源。
**第 3 步:时间衰减,意图消失** 这是关键!3-5 天后,如果你对烧烤内容没有任何互动(没点赞没收藏没完播),系统就会判定:「这个意图已经过期了」。烧烤内容的权重逐步降回 0。
flowchart TD
A[触发事件<br/>搜索烧烤] --> B[短期意图突跃到高点]
B --> C[系统推烧烤内容]
C --> D{你看了吗<br/>3-5天观察期}
D -- 看了或互动了 --> E[短期意图维持<br/>持续推烧烤]
D -- 没看也没互动 --> F[时间衰减<br/>短期意图归零]
F --> G[回到长期兴趣主导<br/>推送恢复常态]
长期 vs 短期:一张表
| 维度 | 长期兴趣 | 短期意图 | |---|---|---| | 时间跨度 | 几个月到一年 | 几小时到几天 | | 变化速度 | 慢,渐变 | 快,可能突跃 | | 典型来源 | 长期 Embedding | 搜索、刚点的视频、时间地点 | | 作用 | 基础底色 | 实时调整 | | 过期处理 | 不需要,会自然漂移 | 必须衰减,否则推荐会跑偏 |
一个反直觉的真相
很多人以为「推荐系统越用越懂我」是因为它学会了我的长期兴趣——其实只是**一半**。另一半是它**越来越会读我最近的意图**。你今天搜了什么、点进哪个视频没划走、最近打开 App 的时间点变化——这些短期信号共同构成了「系统懂我」的另一半感受。
一个成熟的推荐系统,长期和短期各占一个比例(典型是 7:3 或 8:2),实时动态调整。新用户长期信号弱,系统会更偏短期;老用户短期意图弱,系统会更偏长期。
**要点:** 推荐系统同时维护两个「你」——长期兴趣(你是什么人,几个月稳定)和短期意图(你现在想什么,几小时到几天);短期意图会随时间衰减,不互动就消失;好的推荐是「长期兴趣 × 短期意图」两个向量的交集,不是任意一个单独作用;「系统越用越懂你」一半来自学会你的长期偏好,一半来自越来越会读你最近的临时意图。
学习笔记
行为数据如何变成用户画像
推荐系统是个「暗中观察」的服务员
推荐系统是个「暗中观察」的服务员:用户嘴上说的偏好,和身体做的动作之间,差着大量真实信号。
两大维度:正向 vs 负向
- **正向信号**:显式(点赞、收藏、评论、转发、关注);隐式(完播、长时间停留、多次重播、进入作者主页)
- **负向信号**:显式(点「不感兴趣」、举报、屏蔽作者);隐式(快速划走、停留极短、看到一半退出、点开立刻关闭)
识别「用户讨厌什么」与识别「喜欢什么」权重往往相当。
信号强度排序(不同公司会调)
- **强信号(真爱证据)**:完播 + 重播;收藏(带未来意图);关注作者
- **中等信号**:评论(可能来骂);转发(带社交圈)
- **弱信号**:点赞(成本极低,可能出于社交压力);进入主页(只是好奇)
- **负向中**:快速划过单次信号弱,但用户每天划几百次,量大必须认真对待
点赞可能因为朋友面子、视频短、手滑
点赞可能因为朋友面子、视频短、手滑;但完播率与停留时长骗不了系统也骗不了自己。抖音早期将完播率定为头号指标,「完播 + 点赞 + 评论」组合打分比单一「点赞数」更能预测长期表现。
负向信号容易被低估
用户主动点「不感兴趣」是极少数,大多数不喜欢用「沉默的划走」表达。若只听显式负反馈,会误以为用户喜欢所有没被举报的内容。现代系统把「短停留 + 快速划走」建模成集体性负向信号(如一条视频被 80% 用户在 2 秒内划走)。
二、从行为到标签:显式标签与隐式标签
显式标签(用户主动填)
- 来源:注册资料、引导勾选、手动设置(「不要给我看」「多给我看」)
- 三个致命问题:很多人不填(30% 以上关键信息为空);填了可能是假话;填完会过时
隐式标签(系统从行为推断)
- 来源:行为统计(如一周 30 条美食视频→「高频美食消费者」)、时间模式(晚 11 点后活跃→「深夜活跃用户」)、消费力(点赞内容价位→「中高消费力」)
- 用户没说过,但系统非常确信
四个常见误解
- 「我没填年龄系统怎么知道」:通过手机型号、活跃时段、社交关系链、内容类型叠加,置信度可从 30% 升到 95%
- 「标签就几个词」:真实系统一个用户的标签库可能有几千个,远超「90 后/数码控」这类粗粒度
- 「标签贴上就一辈子跟着」:标签有生命周期,最近 7 天密集互动权重飙升,一个月不点自动衰减——画像是水印不是纹身
- 「标签就是我」:标签是对人的有损压缩,单靠标签有上限,大厂因此转向 Embedding
三、用户 Embedding:你的数字指纹
什么是 Embedding
本质是把用户所有行为历史压缩成一串固定长度数字(如 256 个),用这串数字代表「你」。两个相似的人指纹接近,两个完全不同的人指纹相距远。每个数字没有具体含义,不能指着第 47 个数说代表什么,但整体方向有意义。
标签 vs Embedding
- 标签:有限、离散,只能在已有标签里选,标签间没有过渡
- Embedding:连续、稠密,可以是「60% 美食 + 30% 健身 + 10% 摄影」的中间态
- Embedding 能表达「既不 A 也不 B,但在 AB 之间某个位置」,这是标签永远做不到的
Embedding 的三个优势
- 不需要人工定义:没有「撸猫爱好者」这个标签也不怕
- 信息密度高:256 个数字能表达的「人」比 500 个标签还细
- 能表达中间状态:「有点喜欢又不太喜欢」也能编码
推荐系统眼里,用户是「两个人」同时存在
推荐系统眼里,用户是「两个人」同时存在。
长期兴趣(人格底色)
- 时间跨度:几个月到一年;变化慢、渐变;由长期 Embedding 主导承载
- 作用:基础推荐,打开 App 时先按底色备好内容
短期意图(最近的心事)
- 时间跨度:几小时到几天;可能突跃;强触发(搜索、点击、购买、热点)
- 作用:在长期兴趣基础上实时加码或减码
典型流程(烧烤例子)
- 用户搜「北京望京烧烤」→ 短期意图向量加权重,密集推烧烤
- 长期兴趣是「美食+健身」→ 推送交集为烧烤做法、北京美食探店、健身餐
- 3-5 天内无互动 → 系统判定意图过期,烧烤内容权重逐步归零,回到长期兴趣主导
长期 vs 短期对比
- 长期:稳定、慢、Embedding 承载、做底色、不需要主动过期处理(会自然漂移)
- 短期:临时、快、搜索/点击/时间地点触发、做实时调整、必须衰减否则推荐跑偏
「推荐系统越用越懂我」只一半来自学会长期兴趣
「推荐系统越用越懂我」只一半来自学会长期兴趣,另一半来自越来越会读最近的短期意图。成熟系统长期与短期按典型 7:3 或 8:2 动态调整:新用户长期信号弱偏短期,老用户短期意图弱偏长期。
第 4 关 · 内容理解与经典匹配范式
能讲清系统如何「读懂」一段视频或一篇文章,并说出基于标签匹配与基于向量匹配两种内容侧范式的本质区别。
内容标签:分类、关键词、实体
内容标签:分类、关键词、实体
开场:超市的货架
你走进一家大型超市,每件商品都挂着一个标签:饮料区、洗护区、零食区,每件商品下还贴着一张价格牌和配料表。这是超市让你(和补货员)能「看懂」商品的最低成本方式——把成千上万种商品归到有限的分类里,再用关键词快速描述。
推荐系统理解内容的第一步,做的事几乎一样。
什么是内容标签
内容标签(Tag)就是给一段视频、一篇文章、一个商品,贴上一组有限的、可枚举的「词」或「类目」。系统用这些标签代替原始内容去匹配用户兴趣,效率高、解释性强、出问题容易排查。
工业界把内容标签分成三大类。
1. 分类(Category):最高层的「它属于哪一类」
**分类**是层级化的类目体系,类似生物分类学。
抖音的例子:
- 一级:娱乐、知识、生活、美食、游戏……
- 二级:娱乐 → 搞笑、明星、剧情;知识 → 科普、职场、育儿……
- 三级:知识 → 职场 → 求职面试、简历技巧、职场沟通……
**怎么生成?**
- 早期:人工运营打标(编辑看视频选类目)
- 现在:图像分类模型(封面 + 视频帧)+ 文本分类模型(标题、ASR 字幕)→ 多模态分类器输出
- 分类器输出的是概率分布:「这个视频 87% 是美食,9% 是生活记录,3% 是亲子」
**特点**:粒度粗、覆盖有限、但用户侧最常用——运营、审核、推荐召回的「兜底」通路几乎都靠分类。
2. 关键词(Keyword):中层的「它在讲什么」
**关键词**是从文本里抽取出来的、描述内容主题的词或短语。
来源:标题、描述、ASR(语音转文字)出来的字幕、OCR 识别出的字幕文字。
**怎么生成?**
- 传统方法:TF-IDF、TextRank、关键词权重算法
- 现在:用一个文本理解模型(如 BERT 系、LLM)读完整段文本,抽取出最能代表主题的若干词
- 还会做标准化:「红烧肉」和「红烧猪肉」会归到同一个词
例子:一条教你做红烧肉的 60 秒视频,关键词可能是:`红烧肉 / 家常菜 / 做法 / 中餐 / 厨房`。
**特点**:比分类更细,能回答「它具体在讲什么」,但仍是离散词、不带语义。
3. 实体(Entity):细粒度的「它提到了谁/什么」
**实体**是文本中的具体名词对象:人名、地名、品牌、作品名、机构、产品名等。
例子:同一条红烧肉视频
- 实体:`王刚 / 美食作家王刚 / 四川 / 酱油`
例子:一条数码评测视频
- 实体:`iPhone 17 / 苹果 / A19 芯片 / 灵动岛`
**怎么生成?**
- 用 NER(命名实体识别)模型从标题、字幕、描述里抽
- 还要和「实体库」对齐:「王刚」是「美食作家王刚」还是「历史老师王刚」?→ 实体消歧
- 品牌方会主动维护自己的实体词表(百度百科、维基百科的实体库非常关键)
**特点**:最细粒度,是「内容侧」与「用户侧」最精准的桥——一个用户搜过「iPhone 17」,就能匹配到任何提到这个实体的内容。
三类标签的协同
实际系统里,三类标签不是互斥的,而是**层层嵌套**:
- 分类告诉你它属于哪个「货架」
- 关键词告诉你它「在讲什么主题」
- 实体告诉你它「提到了什么具体的东西」
flowchart TD
A[一条视频] --> B[分类: 美食/家常菜]
A --> C[关键词: 红烧肉/做法/中餐]
A --> D[实体: 王刚/四川/酱油]
B --> E[内容画像: 组合标签]
C --> E
D --> E
三者一起,构成这条视频的「内容画像」,后面召回和匹配环节都会反复调用。
纯标签方案的根本局限
听起来很完美——但**纯标签方案在工业级推荐系统里从来不够用**。三个最致命的局限:
**1. 词表有边界,世界无限** 新概念、新梗、新品牌每天都在冒。「栓 Q」「City Walk」「谷子经济」「多巴胺穿搭」——这些词在标签词表更新前,根本没法被匹配。冷启动永远是标签系统的痛。
**2. 标签是离散的,内容是连续的** 「美女」「颜值」「神仙姐姐」三个词,意思几乎一样,但在标签体系里是三个独立的字符串。两个视频可能标签一字不差,但讲的是完全相反的事;两个视频可能标签完全不同,但讲的是同一件事。
**3. 标签丢失了语义关系** 看「篮球」的人可能也喜欢「NBA」「姚明」「篮球教学」「球鞋评测」——这些词在标签体系里是平铺的,没有远近亲疏。系统分不清哪个是核心兴趣、哪个是边缘兴趣,只能一视同仁。
**根本原因**:标签是**人定义的有限集合**,而内容的含义是**连续的、上下文相关的、用语言无法穷举的**。这就是为什么 2010 年代之后,推荐系统必须从「标签匹配」走向「向量匹配」——下一节我们先看一条视频是如何被同时「看画面、听声音、读标题」综合理解的,再引入 Item Embedding 这个更强大的表达。
要点
**内容标签 = 分类(货架)+ 关键词(主题)+ 实体(具体名词),是推荐系统「读懂」内容的第一步;但因为词表有界、标签离散、关系缺失,它无法独立支撑现代推荐系统。**
多模态内容理解:文字、图片、视频、音频
开场:你看一条视频时,大脑已经在做多模态融合
你刷到一条 60 秒的美食视频——你「看懂」它用了多少种感官?至少四种:
- 看到画面(锅里翻炒的肉、灶台、博主的手)
- 听到声音(油滋滋的响、博主口播的步骤、BGM 节奏)
- 读懂标题和字幕(「红烧肉的家常做法」「先焯水去腥」)
- 感受到剪辑节奏(卡点切换、特效)
你从来不是「只看画面」或者「只听声音」就下结论的,而是把这四种信号**自动拼在一起**才形成理解:这是一条教做红烧肉的短视频。
系统也是这么做的——只不过它把这件事拆给了多个 AI 模型,每种模型管一个「感官」,最后再综合起来。
什么是「多模态内容理解」
**模态(Modality)**就是信息的来源渠道。一条短视频里至少藏着四种:
- **文字模态**:标题、描述、话题标签、ASR 字幕、评论区高频词
- **图片模态**:封面图、视频中抽出来的关键帧
- **视频模态**:动作、场景、人物、物品的动态过程
- **音频模态**:人声、BGM、音效、背景环境声
「多模态」就是把这几种渠道**同时**喂给系统,让它综合起来理解内容。
一条抖音视频的处理流水线
一条视频上传之后,大致会走这条流水线:
flowchart LR
A[原始视频] --> B[抽帧]
A --> C[ASR语音转文字]
A --> D[音频分类]
A --> E[封面与关键帧]
B --> F[视频理解模型]
C --> G[文本理解模型]
D --> H[音频理解模型]
E --> I[图像理解模型]
F --> J[融合层]
G --> J
H --> J
I --> J
J --> K[统一内容表示]
每条分支具体干什么:
- **抽帧 + 视频理解模型**:每隔几秒抓一帧画面,用图像识别模型看「画面里有什么、发生了什么动作」
- **ASR(自动语音识别)**:把博主口播的人声转成文字
- **音频分类**:区分人声、BGM、音效、背景声;识别是不是热门音乐、是不是爆款原声
- **封面与关键帧**:选 1-3 张代表性画面,用图像模型做一次分类
- **文本理解模型**:吃下标题 + 描述 + ASR 字幕 + 评论热词,输出主题和关键词
最后通过一个**融合层(Fusion Layer)**,把所有结果按时间线对齐、加权汇总成「这条视频在讲什么」的统一表示。
一个具体例子:红烧肉视频
假设上传了一条 60 秒的红烧肉做法视频:
| 模态 | 实际内容 | 模型读出了什么 | |------|---------|---------------| | 标题 | 「红烧肉的家常做法」 | 关键词:红烧肉、家常菜 | | ASR 字幕 | 「先焯水,然后炒糖色……」 | 实体:糖色、焯水;动作:炒 | | 画面 | 锅、灶台、红亮的肉块 | 物体:锅、肉;场景:厨房 | | 音频 | 油声 + 翻锅声 + 无人声 BGM | 音效应:烹饪;无配乐 |
**只靠任何一种模态**都判断不准:
- 只看标题:「红烧肉的做法」可能是教学、可能是科普、也可能是探店测评
- 只看画面:油锅 + 肉可能是教学,也可能只是某个吃饭的镜头
- 只听声音:可能误判为美食探店或单纯 vlog
**四种模态一起**,系统才能很确定地判断:这是一条烹饪教学视频。
模态之间能互相纠错
多模态最实用的价值,是**互相纠错**——避免被单一信号带偏。
一个反面例子:标题写「震惊!这种东西千万别吃」,画面是一个博主夸张地表情崩溃。如果只看标题,会被分到「社会新闻 / 警示」类;如果只看画面,会被分到「搞笑 / 剧情」类。但声音是人声吐槽、BGM 是搞笑配乐、字幕写着「吃播翻车」——三模态合起来,结论是「搞笑吃播」,完全不是新闻。
这件事在推荐里非常关键:一个被错误归类到「社会新闻」的视频,会被推给根本不想看新闻的人,体验灾难。多模态融合就是用来防这种「单一模态看走眼」的事故的。
「融合」到底怎么融
四种模态的输出格式都不一样(一段文字、一组向量、一段音频标签),融合层要做的事有两件:
- **时间对齐**:视频第 5 秒的画面 + 视频第 5 秒的音频 + 视频第 5 秒的字幕,三者讲的是同一件事,要对齐
- **加权打分**:不同模态可信度不同——ASR 字幕如果识别错了,后面的文本理解就全错,所以这条路径权重会低一点;图像识别比较稳定,权重就高一点
通俗理解:四个 AI 各自投票,融合层按「谁更可信」做加权投票,得出统一结论。
工业上也有「先合再算」和「先算再合」的差别(早期融合 vs 晚期融合),但对外都是「综合判断」的效果,先记住这个画面就够了。
要点
**多模态内容理解 = 文字 + 图片 + 视频 + 音频四条流水线并行处理,再融合成一个统一结论;它让系统能像人一样「眼耳并用」理解视频,也是单一模态判断不准时最有效的纠错机制。**
内容 Embedding:内容的 DNA
内容 Embedding:内容的 DNA
开场:从「两条标签完全一样的视频」说起
上一节我们讲到,多模态融合能让系统知道一条视频「是教做红烧肉」还是「探店吃火锅」——但这一步的产物,依然是把它归到**几个标签**里。
设想一下:
- 视频 A:60 秒教你在家三步做红烧肉
- 视频 B:60 秒博主在店里吃红烧肉、边吃边评价
- 视频 A 和 B 的标签,都是「美食」「家常菜」「红烧肉」
「美食、家常菜、红烧肉」这三个关键词,**对这两条视频完全没区别**——但你一眼就知道,它们是两类完全不同的内容:一个是教学、一个是测评。
标签太粗了,撑不起「细粒度区分」。这时候轮到 **Embedding** 登场。
类比:标签是「名片上的几个字」,Embedding 是「完整 DNA 序列」
每个商品有条形码,每个员工有工号——这些编号**唯一**,但不包含「信息」。条形码「6901234567892」和「6909876543210」之间没有「像不像」的关系,谁也不比谁更像谁。
**Embedding 完全不同**。它给每条内容生成一串「有意义的数字」——这串数字里**编码了这条内容的所有特征**:
- 题材(美食、剧情、知识……)
- 风格(教学、吐槽、测评、记录……)
- 节奏、长度、情绪、对象人群……
- 实体、动作、场景……
怎么生成?由深度学习模型从内容里「学」出来。模型把这条视频「嚼」一遍之后,吐出一串几百维的数字。
用 DNA 类比最贴切:
- **标签 = 你的「族谱简介」**:河南人、汉族、男、90 后——4 个关键词,街上几千万人跟你这 4 个标签一模一样
- **Embedding = 你的「完整 DNA 序列」**:几十亿个碱基对,**全世界只有你一个人是这个组合**(除非同卵双胞胎)
标签是「关键词清单」,embedding 是「完整基因图谱」。「细粒度」的来源就在这里——它不是 4 个标签,是几百维数字。
关键性质:相似的内容,数字也相似
Embedding 最神奇的性质:**两条内容越像,它们对应的数字串在数学上也越接近**。
flowchart LR
subgraph T[「红烧肉教学」簇]
A1[视频A: 三步做红烧肉]
A2[视频C: 红烧肉技巧]
A3[视频E: 不焯水版红烧肉]
end
subgraph S[「红烧肉探店」簇]
B1[视频B: 测评店里的红烧肉]
B2[视频D: 5家红烧肉横评]
end
A1 -.很近.-> A2
A2 -.很近.-> A3
B1 -.很近.-> B2
A1 -.很远.-> B1
A2 -.很远.-> B2
虽然视频 A 和视频 B 标签一字不差,但 A 的 embedding 跟 C、E 是一伙的,跟 B、D 是另一伙的——因为模型「看到」了教学 vs 探店的本质差异。
怎么算「像不像」:向量距离
数字串有了,怎么判断「像不像」?在数学上叫**向量距离**(你不用会算,只需知道这个概念):
- 两个 embedding 数字串很接近 → 距离近 → 内容像
- 数字串差很远 → 距离远 → 内容不像
就像地图上的两个地点:经纬度越接近,两个地方越近。Embedding 就是把每条内容「钉」在一个高维地图上,**相似的钉在一起、不同的离得远**。
为什么 embedding 比标签「细」
直接对比:
| 维度 | 标签 | Embedding | |------|------|-----------| | 颗粒度 | 几个关键词 | 几百维数字 | | 区分度 | 都打「美食」就分不开 | 教学和探店自然分开 | | 产出方式 | 部分需要人工打 | 模型自动生成 | | 覆盖范围 | 标签表里有的才能打 | 任何内容都有 embedding | | 相似度可量化 | 只能看有没有共同标签 | 可以算「距离」精确排序 |
**最关键的是最后一行**:标签只能告诉你「有没有共同词」,embedding 能告诉你「像到几分、几分像谁」。
一个具体例子:相似度排序
假设系统已经算出 4 条视频的 embedding(这里简化为 3 维方便理解):
| 视频 | 维度1 | 维度2 | 维度3 | 含义 | |------|------|------|------|------| | A:教做红烧肉 | 0.9 | 0.8 | 0.2 | 教学 + 美食 + 低娱乐 | | B:探店吃红烧肉 | 0.8 | 0.1 | 0.9 | 美食 + 低教学 + 高娱乐 | | C:教做糖醋排骨 | 0.9 | 0.7 | 0.2 | 教学 + 美食 + 低娱乐 | | D:搞笑段子 | 0.1 | 0.2 | 0.9 | 低教学 + 低美食 + 高娱乐 |
问:和 A 最像的是哪条?
- A vs C:维度差 (0, 0.1, 0),距离 ≈ 0.1 → **非常像**
- A vs B:维度差 (0.1, 0.7, 0.7),距离 ≈ 1.0 → 不太像
- A vs D:完全相反 → 完全不像
标签看不出来(都打了「美食」),embedding 一眼分辨:A 和 C 都是「教学」类内容,远比 A 和 B 像。
要点
**Embedding = 把每条内容转成一串有意义的数字,相似内容在数字上也相似;它用几百维数字替代几个关键词,所以能比标签更细粒度地表达和区分内容——这就是「内容 DNA」这个类比的来源。**
经典匹配:基于标签 vs 基于向量
经典匹配:基于标签 vs 基于向量
开场:现在,两边都「读懂」了
到这里,我们已经攒齐了推荐系统「内容侧」的所有零件:
- 第 1 节:内容可以被**贴标签**(美食、教学、红烧肉……)
- 第 2 节:多模态让系统**看画面、听声音、读标题**,标签打得准
- 第 3 节:内容还能被算成**一串数字(embedding)**,比标签更细
但「读懂内容」只是半场——另一半是「读懂用户」。用户那边也会有「用户标签」(看过美食、点赞过教学、25-30 岁女性……)或者「用户 embedding」。
现在问题来了:**一个用户和一条视频,怎么「配对」?**
这一节讲的就是这个:两种最经典、最根本的配对思路——**基于标签的匹配**和**基于向量的匹配**。
类比:相亲的两种方式
- **A 阿姨式匹配**:手里一张清单——「男、30 岁以下、本科、月入 2 万、北京有房、爱做饭」。拿这张清单去人海里**逐条对**候选人资料,对上就介绍。
- **凭感觉匹配**:让你闺蜜跟你**一起喝杯咖啡、聊聊**,气质、三观、谈吐合不合,**整体感觉**对了就成。
A 阿姨严丝合缝,但**漏掉所有「清单外但人特别好」的人**。凭感觉模糊,但**抓得到真实的化学反应**。
推荐系统里,「标签匹配」就是 A 阿姨,「向量匹配」就是凭感觉。
方式一:基于标签的匹配(关键词匹配)
最朴素的思路:**用户标签 ∩ 内容标签,重合度越高,越相关**。
flowchart LR
U1[用户标签: 美食, 教学, 居家] --> M{标签重合?}
V1[视频标签: 美食, 教学, 红烧肉] --> M
V2[视频标签: 美食, 探店, 火锅] --> M
V3[视频标签: 搞笑, 综艺] --> M
M -->|3/3 重合| R1[强推荐]
M -->|1/3 重合| R2[弱推荐]
M -->|0/3 重合| R3[不推]
具体例子:你最近点赞了 5 条「美食 + 教学」视频,系统给你推新视频:
- 候选 A:「美食 / 教学 / 红烧肉」→ 标签重合度 100%,强推 ✓
- 候选 B:「美食 / 探店 / 火锅」→ 只重合「美食」一个,推给你(但你可能并不喜欢探店)
- 候选 C:「搞笑 / 综艺」→ 一个都不重合,不推
**优点**:简单、可解释、计算快。 **缺点**:粒度太粗。两个视频标签完全一样,匹配结果也一样——但它们可能是完全不同的内容。
方式二:基于向量的匹配(距离匹配)
思路完全不同:**用户 embedding 和内容 embedding 在高维空间里「距离近」就相关**。
flowchart LR
U[用户向量: 喜欢教学类美食] --> D{算距离}
A[视频A向量: 教学红烧肉] --> D
B[视频B向量: 探店火锅] --> D
C[视频C向量: 教学蛋糕] --> D
D -->|很近| R1[强推: A]
D -->|中等| R2[中推: C]
D -->|很远| R3[弱推: B]
「距离」是什么意思?直观上,两条 embedding 数字串越像,在高维地图上越靠近,相似度就越高。
还是上面那个例子——但用向量来推:
- 视频 A「教做红烧肉」的 embedding 和你「喜欢教学类美食」的 embedding 距离最近 → 强推 ✓
- 视频 C「教做蛋糕」和你教学类美食兴趣距离中等 → 推(虽然标签是「烘焙」不是「家常菜」,但模型「知道」教学类是相似的)
- 视频 B「探店火锅」即使打「美食」标签,距离也远 → 不推 ✗
**神奇之处**:视频 C 的标签是「烘焙、教学」,**没有任何一个词直接命中**你的标签——但 embedding 知道,它们都是「教学类」内容。
标签 vs 向量:直接对比
| 维度 | 标签匹配 | 向量匹配 | |------|----------|----------| | 怎么算 | 看标签重合几个 | 算 embedding 距离 | | 粒度 | 几个关键词 | 几百维数字 | | 能不能发现「长得像」 | 只能发现「长得一样」 | 能发现「感觉像」 | | 可解释性 | 一眼能看懂 | 偏黑盒 | | 冷启动 | 新内容没标签就推不出去 | 新内容只要能算 embedding 就能推 | | 计算成本 | 极低 | 较高 |
**最关键的一行**:标签匹配看的是**有没有共同词**,向量匹配看的是**整体气质像不像**。
一个对比鲜明的例子
你刚搜了「新手在家做菜」。
| 候选视频 | 标签 | embedding 距离 | |---------|------|---------------| | 视频 X:5 分钟教西红柿炒蛋 | 美食 / 教学 / 家常 | **0.15(很近)** | | 视频 Y:教做蛋糕(新手向) | 烘焙 / 教学 / 甜品 | 0.32(中等) | | 视频 Z:测评网红餐厅 | 美食 / 探店 | 0.85(很远) |
标签匹配下,X 和 Y 都打「教学」标签,权重差不多——系统分不清该主推哪个。向量匹配能看出 X 才是「教学 + 家常 + 新手」三件套完美命中,Y 是「教学 + 但不是家常菜」。
桥接:双塔的雏形
标签匹配和向量匹配,看起来像二选一——但**真实系统会两者都用、各取所长**。工业界最经典的玩法叫「**双塔**」:一边把用户变成向量(用户塔),一边把内容变成向量(内容塔),两边的向量算距离匹配。
它既保留了向量匹配的细粒度,又比「全量算每对用户和内容的距离」省力得多——这是工业级推荐系统的基础设施。
要点
**「基于标签」是关键词重合的匹配——简单可解释但粒度粗;「基于向量」是距离匹配的思路——能抓「气质像」的内容、更细粒度;真实工业系统往往两者结合(标签做粗筛、向量做精排),这正是「双塔」模型的核心思路。**
学习笔记
内容理解与经典匹配范式
一、内容标签:分类、关键词、实体
内容标签(Tag)就是给一段视频、一篇文章、一个商品贴上一组有限的、可枚举的「词」或「类目」,代替原始内容去匹配用户兴趣。
分类(Category):最高层的类目
层级化类目体系,类似生物分类学。抖音例子:一级(娱乐/知识/生活/美食/游戏)→ 二级(知识→科普/职场/育儿)→ 三级(职场→求职面试/简历技巧/职场沟通)。
- **生成方式**:早期人工运营打标;现在用图像分类模型(封面+视频帧)+ 文本分类模型(标题、ASR字幕)→ 多模态分类器
- **输出形式**:概率分布,如「这个视频 87% 是美食,9% 是生活记录,3% 是亲子」
- **特点**:粒度粗、覆盖有限;是运营、审核、推荐召回的「兜底」通路
关键词(Keyword):中层的主题描述
从文本里抽取出来的、描述内容主题的词或短语。
- **来源**:标题、描述、ASR 字幕、OCR 识别出的字幕文字
- **生成方式**:传统方法(TF-IDF、TextRank、关键词权重算法);现在用文本理解模型(BERT 系、LLM)
- **标准化**:「红烧肉」和「红烧猪肉」会归到同一个词
- **例子**:红烧肉视频→`红烧肉 / 家常菜 / 做法 / 中餐 / 厨房`
- **特点**:比分类更细,能回答「它具体在讲什么」;仍是离散词、不带语义
实体(Entity):细粒度的具体名词
文本中的具体名词对象:人名、地名、品牌、作品名、机构、产品名等。
- **例子**:红烧肉视频→`王刚 / 美食作家王刚 / 四川 / 酱油`;数码评测→`iPhone 17 / 苹果 / A19 芯片 / 灵动岛`
- **生成方式**:用 NER(命名实体识别)模型从标题、字幕、描述里抽;与「实体库」对齐;实体消歧(「王刚」是「美食作家王刚」还是「历史老师王刚」)
- **实体库来源**:百度百科、维基百科(品牌方主动维护)
- **特点**:最细粒度;是「内容侧」与「用户侧」最精准的桥——用户搜过「iPhone 17」就能匹配到任何提到该实体的内容
三类标签的协同
三者层层嵌套、不是互斥:
- 分类:它属于哪个「货架」
- 关键词:它在讲什么主题
- 实体:它提到了什么具体的东西
三者一起构成视频的「内容画像」,召回和匹配环节会反复调用。
二、多模态内容理解
模态(Modality)定义
模态即信息的来源渠道。一条短视频里至少藏着四种:
- **文字模态**:标题、描述、话题标签、ASR 字幕、评论区高频词
- **图片模态**:封面图、视频中抽出来的关键帧
- **视频模态**:动作、场景、人物、物品的动态过程
- **音频模态**:人声、BGM、音效、背景环境声
「多模态」就是把这几种渠道同时喂给系统综合理解。
一条视频的处理流水线
flowchart LR
A[原始视频] --> B[抽帧]
A --> C[ASR语音转文字]
A --> D[音频分类]
A --> E[封面与关键帧]
B --> F[视频理解模型]
C --> G[文本理解模型]
D --> H[音频理解模型]
E --> I[图像理解模型]
F --> J[融合层]
G --> J
H --> J
I --> J
J --> K[统一内容表示]
每条分支:
- **抽帧+视频理解模型**:每隔几秒抓一帧画面,识别「画面里有什么、发生了什么动作」
- **ASR(自动语音识别)**:把博主口播的人声转成文字
- **音频分类**:区分人声、BGM、音效、背景声;识别是否热门音乐、爆款原声
- **封面与关键帧**:选 1-3 张代表性画面,用图像模型做一次分类
- **文本理解模型**:吃下标题+描述+ASR 字幕+评论热词,输出主题和关键词
- **融合层(Fusion Layer)**:所有结果按时间线对齐、加权汇总成「这条视频在讲什么」的统一表示
模态互补与互相纠错
只靠任何一种模态都判断不准:
- 只看标题:「红烧肉的做法」可能是教学、科普、探店测评
- 只看画面:油锅+肉可能是教学,也可能只是吃饭镜头
- 只听声音:可能误判为美食探店或单纯 vlog
只有四种模态一起,系统才能很确定地判断:这是一条烹饪教学视频。多模态最实用的价值是**互相纠错**,避免被单一信号带偏。
三、内容 Embedding
标签撑不起细粒度区分
视频 A(60 秒教你在家三步做红烧肉)和视频 B(60 秒博主在店里吃红烧肉、边吃边评价)的标签都是「美食」「家常菜」「红烧肉」——但本质不同。标签太粗,撑不起「细粒度区分」。
Embedding 的定义与 DNA 类比
Embedding 给每条内容生成一串「有意义的数字」,编码了内容的所有特征:题材、风格、节奏、长度、情绪、对象人群、实体、动作、场景等。由深度学习模型从内容里「学」出来,吐出一串几百维的数字。
类比 DNA:
- **标签 = 族谱简介**:河南人、汉族、男、90 后——4 个关键词,街上几千万人同款
- **Embedding = 完整 DNA 序列**:几百维数字,全世界只有这一个组合
两条内容越像,对应数字串在数学上也越接近
两条内容越像,对应数字串在数学上也越接近。视频 A(教做红烧肉)的 embedding 跟其他教学类是一伙的,跟探店类是另一伙的——即便标签一字不差,embedding 也能区分「教学 vs 探店」的本质差异。
判断「像不像」的数学方法
判断「像不像」的数学方法。数字串很接近→距离近→内容像;差很远→距离远→内容不像。Embedding 把每条内容「钉」在一个高维地图上,相似的钉在一起、不同的离得远。
四、经典匹配:基于标签 vs 基于向量
配对问题的提出
内容侧已「读懂」(标签+embedding),用户侧也有「用户标签」和「用户 embedding」。关键问题:一个用户和一条视频,怎么「配对」?两种最经典、最根本的思路:基于标签的匹配、基于向量的匹配。
两种范式的类比:相亲的两种方式
- **A 阿姨式匹配**:清单逐条对(男、30 岁以下、本科、月入 2 万、北京有房、爱做饭)→ 严丝合缝但漏掉所有「清单外但人特别好」的人
- **凭感觉匹配**:一起喝杯咖啡聊聊,整体感觉对了就成 → 模糊但抓得到真实化学反应
推荐系统里:标签匹配 = A 阿姨;向量匹配 = 凭感觉。
基于标签的匹配(关键词匹配)
思路:用户标签 ∩ 内容标签,重合度越高越相关。
- 候选 A「美食/教学/红烧肉」→ 重合度 100%,强推
- 候选 B「美食/探店/火锅」→ 只重合「美食」一个,推给你(但用户可能并不喜欢探店)
- 候选 C「搞笑/综艺」→ 一个都不重合,不推
**优点**:简单、可解释、计算快。**缺点**:粒度太粗——两个视频标签完全一样,匹配结果也一样,但它们可能是完全不同的内容。
基于向量的匹配(距离匹配)
思路:用户 embedding 和内容 embedding 在高维空间里「距离近」就相关。
- 视频 A「教做红烧肉」→ 距离最近 → 强推
- 视频 C「教做蛋糕」→ 距离中等 → 推(虽然标签是「烘焙」不是「家常菜」,但模型「知道」教学类是相似的)
- 视频 B「探店火锅」→ 即使打「美食」标签,embedding 距离远,匹配不上
| 维度 | 标签匹配 | 向量匹配 |
| 维度 | 标签匹配 | 向量匹配 | |------|---------|---------| | 思路 | 清单逐条对 | 整体距离判 | | 颗粒度 | 粗(几个词) | 细(几百维数字) | | 优点 | 简单、可解释、计算快 | 能区分「标签相同但本质不同」的内容 | | 缺点 | 漏掉清单外的相似内容 | 相对黑盒、解释性弱 |
第 5 关 · 双塔召回、排序与冷启动
能用「两阶段筛选」讲清人向量与内容向量的相遇过程,并说清冷启动这一推荐系统的核心工程难题。
双塔模型直觉:人向量与内容向量
从相亲说起
想象朋友要给你介绍对象,桌上摆着 100 个人的资料卡,每张卡上有几十项:年龄、身高、学历、兴趣、职业、籍贯……朋友怎么帮你找出「最合适」的那个人?
最笨的办法是:拿你的资料和 100 张卡一一比对,看每张「像不像」。但「像不像」怎么量化?身高差几厘米算像?兴趣重合几条算像?学历差几级算像?每条规则都要人去拍脑袋定权重,越加越乱。
更聪明的办法:先想办法把**每个人**(包括你自己)都「压缩」成一小串数字——比如 [0.7, 0.3, 0.8, 0.5, ...] 这种几十到几百位的小数。这串数字就叫「**向量**」,它把一个人的所有特征信息编码进了一组数里。
压缩有一个关键要求:**越像的人,向量越接近**。两个都爱猫、都做运营、都是 90 后的人,数字串会很像;一个爱登山一个爱宅家的人,数字串会差很远。
这样,原本「看几十个标签比对」的事,就简化成了「算两串数字的距离」——你只需要算你的数字串和 100 个候选人的数字串之间的「远近」,离你最近的那几个就是最匹配的。
这就是双塔模型的灵魂:**把人变成点,把内容变成点,距离近就匹配**。
什么是「塔」?为什么叫「双塔」?
推荐系统里,**一边是用户(人)**,**一边是物品(视频、商品、文章)**。我们用两套独立的「压缩机器」分别处理这两边:
- **用户塔**(User Tower):吃进你的历史行为(看过什么、停留多久、点赞过谁、关注了谁),吐出一个代表「你是什么样的人」的数字串
- **内容塔**(Item Tower):吃进一条视频/商品的描述信息(封面、标签、ASR 文本、作者、历史表现),吐出一个代表「这条内容是什么样」的数字串
flowchart LR
A[用户行为<br>历史兴趣画像] --> B[用户塔]
B --> C[用户向量<br>一串数字]
D[内容特征<br>标签作者主题] --> E[内容塔]
E --> F[内容向量<br>一串数字]
C --> G[算距离]
F --> G
G --> H[距离近则匹配]
两套塔**各自独立工作**,最后只在「算距离」这一步相遇——所以叫**双塔**。
一个具体例子:抖音的双塔
- **用户塔**输入:你最近 100 条完播视频的标签、停留时长分布、关注列表、点赞模式
- **用户塔**输出:一个 256 维的向量,比如 [0.12, -0.87, 0.45, 0.23, ...]
- **内容塔**输入:候选视频的封面、ASR 文本、标签、作者风格
- **内容塔**输出:每个候选视频也对应一个 256 维向量
- **匹配**:计算你的向量和每个候选视频向量的距离(业内常用「余弦距离」),最近的 N 个就推给你
整个过程里,用户塔和内容塔互相「看不到」对方——它们各算各的,最后在向量空间里相遇。这带来一个工程上的巨大好处:**内容向量可以提前算好存起来**,用户发来一次请求,只需现算一次用户向量,然后从库里快速查「和这个用户向量最近的内容向量」即可。
双塔为什么能工作?
关键在两件事:
- **「像」和「不像」被压进了数字里**:训练时,系统会反复把「用户喜欢过」的内容拉得近、把没互动的拉得远。训练好之后,相似兴趣的用户和相似属性的内容自然就聚在一起。
- **距离计算极快**:两个几百维向量的距离,一行公式就出来,几毫秒能算完上百万对。
正是这套机制让「从百万候选里捞几百条」成为可能——下一节要讲的「召回」正是依赖于此。
**要点:** 双塔模型把人和内容分别压缩成空间中的两个「点」,通过训练让「用户会喜欢」的内容与用户向量的距离近、不喜欢的距离远;匹配就变成「在空间里找最近的点」。
召回:从百万到几百
从交友场景接着聊
上一节我们学会了「把人和内容都压成点,距离近就匹配」。但你打开抖音时,**库里可能有几千万条视频**——你的「数字分身」要和几千万个点挨个算距离吗?就算每个距离只需要 0.1 毫秒,几千万次也要几百秒,你早就划走换别的 App 了。
所以双塔向量召回只是「召回」这条流水线的一部分。召回的真正工作,是**在用户每一次「下拉刷新」的几百毫秒里,从几千万候选里捞出几百到一千条「可能喜欢」的,送进下一关排序**。
召回的关键词:广撒网
召回(Recall)的本质是**广撒网**——宁可捞多、捞杂,也绝不能漏掉真正想看的那条。
为什么这么设计?两个原因:
- **速度是硬指标**。用户的下一次滑动可能就在 0.5 秒后发生,整条推荐链路(召回+排序+展示)必须在这个窗口内跑完。
- **漏掉的代价太大**。排序环节再聪明,也只能在召回给它的「几百条候选」里挑。如果召回阶段就漏了用户真正爱看的那条,排序再精准也救不回来——好内容根本没进「决赛圈」。
所以召回宁可**捞多、捞杂、允许有错**,也不能「捞少、捞准、错过好货」。这是它和排序最大的不同——召回**牺牲精度换速度与覆盖率**。
多通道召回:多条腿走路
那怎么「广撒网」?答案是**多通道同时捞**,每条通道用不同的逻辑去理解「用户可能喜欢什么」。
flowchart TD
A[用户发起请求] --> B{多通道召回}
B --> C1[双塔向量召回<br>算综合相似度]
B --> C2[协同过滤召回<br>看过A的人也看过B]
B --> C3[标签召回<br>你历史喜欢过的内容标签]
B --> C4[关注召回<br>你关注的人新发]
B --> C5[热门兜底<br>当下全网爆款]
B --> C6[探索召回<br>试探你可能的新兴趣]
C1 --> D[合并去重]
C2 --> D
C3 --> D
C4 --> D
C5 --> D
C6 --> D
D --> E[约 500-1000 条候选]
E --> F[进入排序环节<br>精挑细选]
简单介绍几个常见通道:
- **双塔向量召回**:上一节学的,把你的向量和内容向量算距离,捞最近的 N 条——抓的是「综合相似度」。
- **协同过滤召回**:找「和你看过类似内容的人还看过什么」——你不一定明确知道自己喜欢这个,但「和你口味相近的人」替你探了路。抓的是「群体行为规律」。
- **标签召回**:直接拿你历史喜欢过的视频标签,去库里捞带这些标签的新内容——简单粗暴但有效。
- **关注召回**:你关注的人发了新内容,优先捞过来——社交关系本身就是强信号。
- **热门兜底**:当下全网爆款,作为「不会错」的安全网,尤其对新用户特别重要。
- **探索召回**:故意捞一些「你没明确表现出喜欢、但和你的兴趣有一点点沾边」的内容——避免你被困在「信息茧房」里,也让系统能发现你的新兴趣。
每条通道单独看都不完美——双塔可能漏掉没被向量准确表达的小众内容,协同过滤可能漏掉刚发布还没人看的冷门视频,标签召回可能太死板……但**多条通道合在一起,漏网之鱼就少很多**。这就是「广撒网」的工程实现方式。
召回和排序的关系
记住一个比喻:
- **召回**像 HR 筛简历——从一万份简历里捞出 200 份进面试(快、量大、不求精准)
- **排序**像面试官——从 200 人里挑出最后录用的 5 个(精挑细选、可以慢一点、目标多元)
召回和排序的边界就是「几百到一千条」这个候选集。下一节要学的排序,就在这个候选集上做精细打分——它会同时考虑点击率、停留时长、点赞、关注、商业化等多个目标,挑出最该推给你的那几十条。
**要点:** 召回是「广撒网」式的初筛,从百万级候选中快速捞出几百到一千条送入排序;它牺牲精度换速度与覆盖率,宁可捞多捞杂也不能漏;实际系统通过「多通道召回」(双塔、协同过滤、标签、关注、热门、探索等并行)来降低漏网率。
排序:从几百到几十的多目标权衡
从面试官开始
上一节我们说到,召回像 HR 筛简历——从几千万候选里捞出几百到一千份进「面试」。那排序(Rank)就是真正的面试官:从这几百到一千条里,挑出最后要展示给你的那几十条。
但排序要做的事,远比「挑最可能点击的」复杂得多。
单目标的诱惑:点击率陷阱
如果排序只优化一个目标——比如「用户点击概率」——会发生什么?
短期内,点击率会涨。模型会发现「标题党」「封面图惊悚」「封面用反差大字」的视频更容易被点开,于是疯狂推这类内容。
但很快你就会发现:这类视频点开两秒就划走。停留时长暴跌。广告主看到你平台的「有效观看时长」在跌,广告报价也跟着降。用户虽然点得多,但越刷越烦,最终卸载。
**单目标优化的灾难:用短期点击换长期生态。** 这就是为什么排序环节必须多目标权衡。
排序要看哪些目标
一个成熟的推荐系统,排序阶段通常会同时盯住五到八个目标。常见的有:
- **点击率(CTR)**:用户会不会点开这条——基础的「吸引力」信号
- **完播率 / 停留时长**:点开后会不会看完、看了多久——「内容质量」信号
- **互动率**:点赞、评论、收藏、转发——「共鸣度」信号
- **关注转化**:看完后会不会关注这个作者——「长期价值」信号(平台希望你和作者建立长期关系,这样你以后会主动来看)
- **负反馈率**:点「不感兴趣」「举报」的比例——「反感度」信号
- **商业化指标**:广告的预估收益、电商的预估 GMV——平台要赚钱
每个目标背后,都是平台、用户、创作者、广告主中某一方的利益。排序系统本质上是在**替多方利益做权衡**。
头条的经典案例:三个目标同时打分
今日头条是国内最早大规模把「多目标排序」工程化的产品。公开资料里讲过,他们的排序模型在某个阶段,**同时给三条核心目标打分**:
- **点击概率**:用户会不会点
- **点赞概率**:点了之后会不会点赞
- **完播概率**:会不会看完
然后把这三个分数按一定权重合成一个「综合分」,按综合分排序。
flowchart LR
A[每条候选视频] --> B1[点击概率模型]
A --> B2[点赞概率模型]
A --> B3[完播概率模型]
B1 --> C[综合打分]
B2 --> C
B3 --> C
C --> D[按综合分排序]
D --> E[取 Top 几十条]
E --> F[展示给用户]
为什么这三个目标放一起会有效?
- 只优化点击:标题党会爆,但完播会崩。
- 只优化完播:可能只推长视频,互动会跌。
- 只优化点赞:会偏向「煽情内容」,点击反而掉。
**三个目标相互制衡,模型被迫学会「点开不会失望、看完会点赞」的内容——这才是平台真正想要的。**
权重不是死的:场景和阶段会变
更巧妙的是,这三个目标的权重**不是固定的**。平台会根据不同场景动态调整:
- **新用户前 3 次刷**:完播和点赞权重拉高,避免一上来就被标题党劝退
- **工作日午休时段**:停留时长权重拉高(用户有时间看完一段长内容)
- **广告位附近**:商业化目标权重临时提升
- **你刚关注了某作者**:关注转化权重临时提升
权重会变,模型也会跟着学——这意味着排序系统是在**一个不断漂移的「目标函数」上**工作的。
排序回到流水线
到这里,双塔召回+多通道召回+多目标排序,构成了推荐系统最经典的两阶段筛选:
- **召回**:从百万级 → 几百到一千条,广撒网、不求精准
- **排序**:从几百条 → 几十条展示,多目标权衡、求的是「整体最优」
flowchart LR
A[百万级候选库] -->|多通道召回| B[500-1000 条]
B -->|多目标排序| C[几十条]
C -->|展示| D[用户]
D -->|行为反馈| E[用户画像更新]
E -->|下次推荐| A
注意右下方那个箭头——用户的行为(点没点、看完没看完、有没有点赞)会**回流到用户画像**里,下一次召回时,你的向量就更准了。这条闭环正是「系统越用越懂你」的工程基础——下一节要讲的冷启动,恰恰是这条闭环在「没有数据」时如何启动。
**要点:** 排序不是「挑点击率最高的」,而是「在点击、停留、互动、关注、商业化等多个目标间做权衡」;头条经典的「点击+点赞+完播」三目标打分是这一思路的代表;多目标权重还会随场景和用户阶段动态变化。
冷启动:新用户、新内容、新平台
开场:三个「从零开始」的难题
想象你开了一家新餐厅。开张第一天,你就被三个「冷启动」难题包围了:
- **新顾客进门**:你完全不知道这个人的口味偏好——他吃辣还是吃甜、喜欢清淡还是重口。
- **新菜上架**:你研发了一道新菜,但没人点过,没有评价,没有历史数据证明它好卖。
- **新店开张**:你的店名都没人听过,没有回头客,没有点评网站的分数。
**冷启动(cold start)就是「从零开始」的难题。** 推荐系统里,这三个难题分别对应:用户冷启动、内容冷启动、系统冷启动。它们的核心矛盾都一样——**系统需要数据才能工作,但你偏偏没数据。**
用户冷启动:新顾客不会自己点单
**难题**:新用户刚下载 App,行为历史是空白——没点过赞、没看过视频、没关注任何人。但你总不能什么都不推荐吧?
**常见应对**:
- **注册信息打底**:让用户选几个兴趣标签(抖音第一次打开会让你勾选「美食/搞笑/科技…」),用这些作为初始画像
- **环境信息补充**:手机型号、活跃时段、所在城市——粗但有用。比如深夜活跃的用户更可能喜欢某些内容类型
- **借力相似人群**:找不到「这个用户」的偏好,就找「和这个人背景相似的群体」的偏好——这就是「协同过滤」的朴素版本
- **先用热门顶上**:先推全平台公认的爆款,至少不会太差
- **快速试探**:故意混入几类不同内容,看用户最先点哪类——像面试时问几个不同方向的问题,试探对方的真实兴趣
抖音早期的做法是:让你在首次启动时勾选 5-10 个兴趣标签,然后混合推送这些标签的热门内容,从你前 3-5 次滑动的反应中快速校准你的画像。
内容冷启动:刚上架的新菜——抖音案例
**难题**:创作者刚上传一条新视频——零播放、零点赞、零评论。这条视频连「被谁看过」都没有,系统凭什么判断它值不值得推?
抖音的处理思路堪称行业典范,叫**「阶梯式流量池曝光」**:
flowchart TD
A[创作者上传新视频] --> B[系统分析内容特征]
B --> C[标签 + 画面 + 音频]
C --> D[匹配潜在兴趣人群]
D --> E[第一级流量池 200-500 人]
E --> F{完播率 点赞率达标?}
F -->|是| G[第二级流量池 1000-2000 人]
F -->|否| H[停止扩大曝光]
G --> I{指标持续达标?}
I -->|是| J[第三级 1万-10万]
I -->|否| H
J --> K{继续爆?}
K -->|是| L[百万级 爆款]
K -->|否| H
核心机制有四步:
- **冷启内容分析**:视频刚上传,系统还没人看,但能立刻拿到内容本身的特征——标题、话题、画面里的物体(如出现火锅、出现猫)、音频(是 BGM 还是人声)。这些是「不要历史也能拿到」的特征
- **小流量试探**:把这条视频推给 200-500 个**最可能感兴趣的人**(基于内容特征匹配的兴趣人群)
- **关键指标考核**:看这 200-500 人里,**完播率、点赞率、评论率、转发率**怎么样。抖音内部对这些指标有阈值
- **阶梯放大**:指标达标 → 进入下一级更大流量池(1000-2000 人),再考核;不达标 → 停止放大,让它自然消亡
**这套机制的精妙之处**:每一条新视频都被「公平地」给过一次机会,但只有真正好的内容才能爬坡上去。这同时解决了「让金子发光」和「不浪费流量在烂内容上」两个目标。
系统冷启动:刚开张的店
**难题**:最极端的冷启动——平台本身是新的。没有用户、没有内容、没有数据。三个维度都是零。
**典型应对**:
- **外部引入**:让用户用微信/手机号登录,带过来一部分基础人口属性;让创作者从其他平台迁入,带过来内容和初始粉丝
- **人工冷启**:编辑团队人工筛选一批高质量内容作为「种子库」
- **头部策略**:重金邀请明星/KOL 入驻,他们的粉丝会跟着来(小红书早期重押明星、抖音早期签走微博 KOL,都是这个套路)
- **补贴创作者**:花钱买内容(抖音的「全民任务」、B 站的创作激励)
抖音 2017 年后的快速崛起,背后很大一部分是系统冷启动的胜利——他们从今日头条继承了推荐算法的底子,又用「明星引流 + 创作者补贴 + 算法分发」三板斧快速填满了内容池。
把整个模块串起来
到这里,这一关的四块拼成了完整的图:
- **双塔召回**:把人和内容都压成「点」,距离近就匹配
- **多通道召回**:从百万候选里捞出几百条
- **多目标排序**:从几百条里挑出几十条,多目标权衡
- **冷启动**:解决「没数据」时这套系统怎么启动
这四块回答的是一个连贯的问题:**「推荐系统为什么越用越懂你?」**——答案是:召回和排序负责日常精准匹配,闭环(你的行为回流成画像)让它越来越准,冷启动负责在「没数据」的极端情况下也能起步。
**要点:** 冷启动分三类——用户冷启动(没行为)、内容冷启动(没曝光)、系统冷启动(没一切);用户冷启动靠注册信息+试探、内容冷启动靠内容特征+阶梯式流量池试探、系统冷启动靠外部引入+人工种子;抖音新视频的「200→2000→20000」阶梯式曝光是内容冷启动的经典工程方案。
学习笔记
双塔召回、排序与冷启动 学习笔记
一、双塔模型:把人/内容压成「点」
**核心思想**:把用户和内容都压缩成向量(一串数字),距离近=匹配。
- **用户塔**:吃进历史行为(点赞、停留、关注、完播),吐出代表「这个人是什么样」的用户向量
- **内容塔**:吃进内容描述(封面、标签、ASR 文本、作者、历史表现),吐出代表「内容是什么样」的内容向量
- 两塔**各自独立工作**,仅在「算距离」时相遇——所以叫「双塔」
- 训练目标:让「用户喜欢过的内容」与用户向量距离近,「没互动的」距离远
**抖音案例**:256 维向量,匹配时算余弦距离。最近的 N 条推给用户。
**两个关键优势**:
- 「像/不像」被编码进了数字里
- 距离计算极快,几毫秒能算完上百万对
**工程红利**:内容向量可**提前算好存起来**,用户请求时只需现算一次用户向量,然后从库里快速查最近的内容向量。
二、召回:从百万到几百——「广撒网」
**本质**:从几千万候选里捞出几百到一千条可能喜欢的,送进排序。**牺牲精度换速度与覆盖率**。
- **速度是硬指标**:整条推荐链路必须在几百毫秒内跑完
- **漏掉代价太大**:排序再精准也救不回没进候选集的好内容
- 所以宁可捞多、捞杂、允许有错,也不能捞少、捞准、错过好货
**多通道召回**(多条腿走路,合在一起减少漏网):
- **双塔向量召回**:算综合相似度
- **协同过滤召回**:「看过 A 的人也看过 B」,抓群体行为规律
- **标签召回**:拿历史喜欢过的标签去捞新内容
- **关注召回**:关注的人新发内容优先
- **热门兜底**:全网爆款,对新用户特别重要
- **探索召回**:故意捞沾边内容,避免信息茧房,也用于发现新兴趣
**召回 vs 排序的比喻**:
- 召回 = HR 筛简历(从一万份里捞 200 份进面试:快、量大、不求精准)
- 排序 = 面试官(从 200 人里挑最后录用的 5 个:精挑细选、目标多元)
三、排序:从几百到几十——多目标权衡
**单目标的灾难**:只优化点击率 → 标题党泛滥 → 完播暴跌 → 用户越刷越烦 → 平台生态恶化。**用短期点击换长期生态**。
**常见的多目标**(一个成熟系统通常同时盯住 5-8 个):
- 点击率(CTR):吸引力信号
- 完播率 / 停留时长:内容质量信号
- 互动率:点赞、评论、收藏、转发——共鸣度信号
- 关注转化:长期价值信号
- 负反馈率:反感度信号
- 商业化指标:广告收益、预估 GMV
每个目标背后都站着平台、用户、创作者、广告主中的某一方。排序本质上是在**替多方利益做权衡**。
**头条经典案例**:同时给三个核心目标打分
- 点击概率 + 点赞概率 + 完播概率 → 按权重综合打分 → 排序
- 三个目标相互制衡,逼模型学会「点开不失望、看完会点赞」
**权重不是死的**:根据场景和阶段动态调整
- 新用户前 3 次刷:完播/点赞权重拉高,避免一上来就被标题党劝退
- 工作日午休:停留时长权重拉高(用户有时间看完长内容)
- 广告位附近:商业化目标权重临时提升
- 刚关注了某作者:关注转化权重临时提升
→ 排序系统是在**一个不断漂移的目标函数**上工作的。
核心矛盾:系统需要数据才能工作,但你偏偏没数据
**核心矛盾**:系统需要数据才能工作,但你偏偏没数据。
用户冷启动
应对策略:
- **注册信息打底**:首次启动勾选兴趣标签(如抖音让你勾「美食/搞笑/科技…」)
- **环境信息补充**:手机型号、活跃时段、所在城市——粗但有用
- **借力相似人群**:用「和这个人背景相似的群体」的偏好
- **先用热门兜底**:推全平台公认的爆款,至少不会太差
- **快速试探**:混入几类不同内容,从前 3-5 次滑动的反应中校准画像
内容冷启动——抖音「阶梯式流量池曝光」
四步机制:
- **冷启内容分析**:视频刚上传就提取内容特征(标题、话题、画面物体、音频),**不需要历史数据**
- **小流量试探**:推给 200-500 个最可能感兴趣的人(基于内容特征匹配)
- **关键指标考核**:看完播率、点赞率、评论率、转发率是否达标
- **阶梯放大**:达标 → 进入下一级更大流量池(1000-2000 人 → 1 万-10 万 → 百万级爆款);不达标 → 停止放大
**精妙之处**:每条新视频都被「公平地」给过一次机会,但只有真正好的内容能爬坡上去——同时解决「让金子发光」和「不浪费流量在烂内容上」。
讲义此节被截断,未给出具体内容
讲义此节被截断,未给出具体内容。
五、整体流水线回顾
flowchart LR
A[用户请求] --> B[多通道召回]
B --> C[约 500-1000 条候选]
C --> D[多目标排序]
D --> E[Top 几十条展示]
- **召回**:百万级 → 几百到一千条,广撒网、不求精准
- **排序**:几百条 → 几十条展示,多目标权衡、求整体最优
第 6 关 · 反馈循环、系统风险与平台对比
能讲清「越用越准」背后的正反馈机制、信息茧房与偏差累积两类风险,并对比内容平台与生成式 AI 产品在反馈循环上的关键差异。
反馈循环的正反馈机制
反馈循环的正反馈机制
用一个类比开场:越来越懂你的咖啡师
想象你每天早上都去同一家咖啡店。第一天,新来的咖啡师小心翼翼问你『您要什么?』。一周后,你进门他就直接问『老样子?』。一个月后,他开始主动调整——周一你开完会进来,他多给你一份浓缩;天冷直接换成热拿铁;天热做冰的。三个月后,你还没开口,他已经做好了一杯你今天最想喝的。
他怎么做到的?不是『提前知道』你今天的状态,而是**他把你过去三个月每天的行为信号一点点拼起来**:你点什么、什么时间点、加什么配料、是否皱眉、是否喝完、外面天气、你进门时的状态——这些信号积累得越多,对你『今天想喝什么』的预测就越准。
推荐系统做的事,本质完全一样。
从「单次闭环」到「多轮正反馈」
第一模块我们讲过「数据闭环」:行为 → 画像 → 推送 → 新行为 → 更新的画像。但那只是一次『循环』。真实的推荐系统,是**成千上万次这样的循环层层叠加**,每一圈都在前一圈的基础上往前走。
flowchart LR
A[第1轮 粗画像 只能猜大类] --> B[第2轮 细分画像 开始猜子类]
B --> C[第3轮 精准画像 敢推小众内容]
C --> D[第N轮 高度个性化 比你自己还了解你]
A -.行为信号.-> B
B -.行为信号.-> C
C -.行为信号.-> D
关键不是『循环』本身——**而是每一圈都比上一圈更精准**。这就是『正反馈』里『正』字的核心:每一轮的结果都成为下一轮更好的输入,越滚越大,越滚越准。
三个机制让「越用越准」
1. 信号积累:噪声变成画像
单次点击是噪声——你可能手滑、朋友让你看的、只是打发时间。但 1000 次点击的统计模式就很难骗人:
- 你 70% 的完播视频在 8–15 秒之间 → 系统知道你看短视频
- 收藏的视频里 60% 是做菜类 → 系统知道你对美食有『未来想看』的强需求
- 凌晨看的内容和白天差异大 → 系统把你分成『日间』和『夜间』两套画像
信号从『一两个孤立的点』变成『成百上千条带权重的证据』,**画面的清晰度是指数级提升的**。
2. 特征细化:从「喜欢美食」到「喜欢成都街边小馆」
第一天的画像可能是『这个人喜欢美食』——粒度很粗,推荐只能推美食大类。一周后细化到『川菜和日料』。一个月后是『成都街边小馆 > 精致日料 > 轻食』。三个月后是『川渝方言 + 路边摊 + 老板亲自下厨』这种**人自己都说不清**的细分偏好。
这种细化是双向的:系统把你的行为往更细的标签上靠,**你自己反思时也说不清『我为什么喜欢这种』**——但行为数据替你说了。
3. 置信度提升:敢推「小众但精准」的内容
前几次循环系统不敢冒险,只敢推『大众热门 + 你的大类兴趣』——保守策略,怕推错让你划走。
随着置信度提升,系统开始『敢推』:小众作者、长尾兴趣、还没火的内容、跨边界但有信号的内容。这正是为什么你刷到后面会发现『这条视频播放量才几百但就是戳中我』——系统已经敢为你冒一点险了。
一个具体对比:第 1 天 vs 第 30 天 vs 第 300 天
假设你刚装抖音,三天前点赞了一条成都街边小吃的视频,完播了:
- **第 1 天**:你刷到的还是『全国热门 + 大类混合』——美食、旅行、萌宠、新闻都出现在流里。系统对你一无所知,只能给大众化的池子。
- **第 30 天**:你刷到的 80% 是『美食探店 + 地方小吃 + 同城内容』。系统已经把你牢牢划在『美食兴趣 + 成都本地』的画像里。
- **第 300 天**:你的 Feed 流里出现『全国小众美食博主 + 食材科普 + 深夜放毒 + 复刻家常菜』这种**只有深度用户才会看到**的内容。你的朋友刷抖音和你看到的可能完全两个世界。
**『越用越准』不是神秘现象,而是 9000 多次循环累积出来的效果**。
一个隐藏的副作用:你也在被塑造
最后留一个伏笔——今天不展开讲。
正反馈不只让系统『更懂你』,**反过来也在塑造你**。你看到什么、被什么打动、关注什么新领域、视野往哪倾斜,都在被推荐流悄悄『训练』。
这正是下一节『信息茧房』要讲的事。今天先记下这个直觉:正反馈是一把双刃剑——越精准也意味着越狭窄。
要点
**「正反馈」不是循环本身,而是循环的每一圈都比上一圈更精准——信号积累、特征细化、置信度提升三者叠加,让系统从『瞎猜』到『稳准』再到『敢推小众』。**

信息茧房与回音壁
信息茧房与回音壁
一个类比:只会回声的山谷
想象你站在一个圆形山谷里喊「今天天气真好」。声音撞到四周的山壁,一遍遍反弹回来,最终你听到的全部是「今天天气真好」「今天天气真好」「今天天气真好」——每一个回声都和自己一模一样。
但山谷外面,可能正在下雨、可能正在下雪、有人正在为堵车发愁。你完全不知道。
**推荐系统给每个人造的,就是这样一个山谷**。你每点一次赞,系统就回你一个「类似的东西」;每一次完播,又回一个;每一次跳过,避开。三个月后,你的 Feed 流里只剩下「和你声音高度相似」的回声——外面的世界被山谷的墙挡得严严实实。
什么是「信息茧房」和「回音壁」
这两个词经常被混用,侧重点其实略有不同:
- **信息茧房**:关注的是**信息范围**——你的推荐流被锁在一类内容里,接触不到其他领域。形成原因正是上一节讲的「正反馈」:每一次循环都强化已有的偏好,候选池里其他领域的内容被系统性淘汰。
- **回音壁**:关注的是**观点极化**——你看什么观点,就反复看到类似观点;你以为「全世界都这么想」,其实只是你的「山谷」在回响。形成原因:算法不区分信息的真伪和立场,只区分「你可能爱看」。
两者常常一起发生:信息范围变窄 → 接触的观点变窄 → 观点越来越极端 → 更难接受对立信息 → 茧房越织越厚。
为什么反馈循环天然导致「越推越窄」
上一节我们讲了正反馈让系统「越用越准」。但「越用越准」有个**隐藏的代价**:
flowchart TD
A[你的偏好: 美食探店] --> B[推成都街边小吃]
B --> C[你点赞 完播]
C --> D[画像强化: 成都+街边+小吃]
D --> E[推更小众的成都街边小吃]
E --> F[你继续点赞 继续看]
F --> G[画像继续细化: 某条街+某家店+某种口味]
G --> H[几乎不再有别的内容能进入流]
每一轮循环都在**收敛**——不是你变了,是算法的「目标函数」在系统性地把候选池里和你的画像不太匹配的内容淘汰掉。
听起来很合理对吧?**但这正是问题所在**:一个「精准」的系统,会**主动放弃让你发现新兴趣的机会**。
举个具体例子:假设你最近对「成都美食」信号很强,系统推给你的内容 100% 都是这个。有一条内容是「成都房价」,你也可能感兴趣(毕竟你在成都生活),但因为和你「美食」的画像不匹配,**被算法主动放弃了**——哪怕你点击率可能不低,但系统根本不会让你看到。
这就是「茧房」的本质:**算法替你的视野划了边界,而且不告诉你边界在哪。**
平台都在用哪些手段「破茧」?
行业里基本都意识到了这个问题,所以主流平台都做了一些「破茧」尝试。我们从机制层面把它们归为三类:
1. 主动打散:在主 Feed 里强制插入「跨类」内容
抖音、快手、小红书都在推荐流里插入一定比例的「多样性内容」——比如你 80% 看到美食,剩下 20% 是平台随机选的别的领域。技术上叫「多样性注入」(diversity injection)。
**问题**:用户经常立刻划过这些「不相关」内容,行为信号又告诉系统「用户不喜欢」,于是下一次系统会自动减少这种「破茧」内容。结果——**破茧机制被自己的反馈信号反噬了**。
2. 探索模式:让用户主动选择「不看个性化」
B 站的「推荐模式 vs 热门模式」、YouTube 的「稍后观看 vs 探索」、Twitter 的「Following vs For You」——本质都是把选择权交给你。
**问题**:绝大多数用户**根本不会切**。用惯了精准推荐的人,切换到「无个性化」会立刻觉得「内容质量差、不想看」——这恰恰是茧房效应的证据,但也是它自我加固的方式。
3. 「不感兴趣」按钮:把控制权交回用户
抖音的「不感兴趣」、YouTube 的「Not interested」——理论上让你主动拒绝某类内容。
**问题**:这个按钮管的是**当前不喜欢的**(你明确划过的),但**管不到你根本看不到的东西**。你不可能对一个「你根本不知道存在」的内容点「不感兴趣」——这正是茧房的核心悖论。
这些「破茧」手段到底有没有用?
**直说:目前的破茧手段大多是「象征性大于实际性」。**
原因有三:
- **优化目标对立**:平台的核心 KPI 是「用户停留时长 / 互动率」——这是一个**让用户越看越爽**的指标。任何让人跳出舒适区的内容,KPI 上都是负贡献。从商业上,平台没有动力真正破茧。
- **反馈信号会反噬**:上面提到,破茧内容被划过的概率更高,系统会进一步减少——这是**结构性困境**,不是工程问题。
- **用户没有意识到**:绝大多数用户**不知道自己的 Feed 是窄的**——因为窄的算法推送的内容质量更高、更爽,所以用户主观感受是「抖音越来越懂我」,而不是「抖音让我变窄了」。
**真正有效的破茧**需要满足两个条件之一,但目前都很难做到:
- 用户主动意识到问题并切换行为(难,因为茧房本身让人「感觉良好」)
- 平台把「破茧」做成核心 KPI(难,因为这与商业目标冲突)
要点
**信息茧房是正反馈机制的必然副产品——每一次循环都在收敛,最终系统替你的视野画了一个你看不到的圈;平台现有的破茧手段在反馈循环下大多会被反噬,真正破茧需要用户意识到问题或平台改变 KPI,但两者目前都很难发生。**
偏差累积与缓解思路
偏差累积与缓解思路
一个类比:越点菜越被「宠」的餐厅
想象你每周都去同一家餐厅。第一次,服务员按菜单顺序介绍;几次之后,服务员开始「贴心地」只端你点过的菜——比如你爱吃辣的,他就只端辣菜。
半年后,你开始抱怨:「怎么天天都是这几道?」服务员很委屈:「**你不是每次都点这几道吗?**」
更糟的是——你压根不知道菜单上其实还有一道不辣的招牌菜(可能是店里的隐藏招牌),因为服务员**从来没问过你**。这道菜就这么永远消失在你的视野里。
**推荐系统的偏差累积,本质上就是这个故事的工程化版本。** 它不是「算法不好」,而是「算法太好」了——好到只听你过去的话,不给你尝试新东西的机会,久而久之,你以为「我只爱吃辣」,其实是菜单被悄悄剪掉了。
偏差累积:反馈循环的「暗面」
上一节讲了「信息茧房」——反馈循环让推荐**范围**变窄。**但茧房只是偏差累积的一个表象**。更结构性的问题,是算法会让一些**本应随机分布的东西,变得高度不均衡**——而且这种不均衡会越滚越大。
1. 内容侧:「赢家通吃」
抖音一天上传几千万条视频,但行业公开数据显示,80% 的播放量集中在不到 5% 的头部内容上。这**不是自然规律**,而是算法的杰作:
flowchart TD
A[新视频上传] --> B[初始小流量池:1000 曝光]
B --> C{点击率高于均值?}
C -->|是| D[进入更大流量池:10万曝光]
C -->|否| E[基本停更,沉入长尾]
D --> F{继续表现好?}
F -->|是| G[进入百万级流量池]
F -->|否| E
G --> H[头部内容:千万级曝光]
这条「晋级链」听起来很公平——表现好就上。但它有个**致命问题**:初始的 1000 个曝光里,哪怕有 5% 的随机噪声,都会决定这条视频后续的命运。一条潜在的好视频,因为标题不够吸引人、第一帧不好看,在前 1000 次曝光里没拿到高点击率,就**永远没机会再被算法看到**——哪怕它本来比爆款更优质。
**这种「一次没抓住,永远没机会」的机制,业界叫「曝光的马太效应」**——强的越强,弱的越弱,而且是**指数级**的。
2. 用户侧:「沉默的大多数」
类似的逻辑也发生在用户身上。一个高活跃用户(每天刷 2 小时)产生的行为数据,可能是低活跃用户(偶尔刷一次)的几百倍。算法对前者的「画像」极其精细,对后者几乎只有模糊印象。
结果:越活跃的用户,推送越精准;越沉默的用户,推送越随意——**算法在系统性地「偏心」,偏心那些数据多的人**。
3. 创作者侧:「头部博主的护城河」
粉丝 100 万的博主发一条新内容,初始流量池里的 1000 个曝光中,至少有 200 是老粉——这些人**几乎必定点击**,立刻把数据顶起来。新人博主同样发一条,初始 1000 曝光全是「陌生人」,数据要冷启动得多。
**头部博主不是赢在内容,是赢在系统结构**。
为什么偏差会「累积」而不是「收敛」?
直觉上,跑得越久应该越「稳」对吧?偏差累积恰恰相反——**它会越滚越大**,有三个原因:
- **指数放大**:一次曝光带来的微小优势(比如头部博主的 20% 老粉)会被晋到下一级,再放大,再晋到下一级……N 级之后,差距是指数级的。
- **数据污染训练数据**:算法的下一次模型更新,是**用这一轮被系统筛选过的数据**训练的——但这些数据本身就是「有偏差的」(爆款比例被系统性抬高)。**偏差进了模型,模型再生产偏差**,形成自循环。
- **用户行为本身被改变**:当你习惯了算法推荐,你的「点击」不再反映真实偏好,而是「最容易被推送到眼前的东西」——反馈信号本身被污染了。
这就是为什么「**数据越多 ≠ 越准**」——关键看数据是干净的,还是已经被自己的反馈循环污染过的。
缓解思路:业界都在做什么?
既然偏差累积是反馈循环的结构性产物,缓解也得是**结构性**的工程,而不是调几个参数那么简单:
1. 探索机制(Exploration)
最经典的思路是**主动给「不确定」的内容一次机会**。类比:餐厅服务员**每隔几周主动端一道你没点过的菜**给你试——不是为了这顿饭好吃,而是为了更新他对你口味的认知。
技术上,算法会刻意保留 5%-15% 的流量给「**没怎么给你推过的内容**」,而不是全部塞给「历史最可能点击」的内容。这部分内容转化率通常偏低,短期内会拉低 KPI,但长期看是**防止画像僵化**的关键。
2. 多样性 / 随机打散
上一节讲过,平台会在你的 Feed 里强制插入「跨类内容」。本质是用**工程强制力**对抗反馈循环的收敛性——哪怕你划过 9 次,第 10 次可能就有你真正喜欢的新领域。
3. 冷启动保护
新用户 / 新内容 / 新博主,平台会**单独给一段「保护期流量」**,不完全按表现排名。YouTube 给新视频的初始曝光不依赖历史表现,小红书会给新笔记一个「观察期」流量池。
本质上,是承认「**初始信号噪声太大,不能让它决定生死**」。
4. 长尾内容专项
很多平台(豆瓣、知乎、B 站)都有「冷门内容」「小众推荐」专门板块——这部分的流量**不参与主推荐流的优化目标**,而是单独分配。相当于给「长尾」一个不被赢家通吃压死的庇护所。
5. 反馈信号降噪
不是所有「行为」都代表「喜欢」:
- 完播 0.5 秒划过 = 噪声
- 反复看 3 次 = 强信号
- 点赞后立刻取关 = 矛盾信号
- 主动搜索某关键词 = 极强信号
现代系统会用「**加权反馈**」——给不同行为不同的权重,而不简单地把所有点击都当成「喜欢」。这是缓解「信号污染」的工程手段。
缓解手段的结构性局限
但说实话——**这些缓解手段大多是在「夹缝里求生存」**:
flowchart LR
A[商业目标:停留时长] -->|推动| B[推荐最可能点击的内容]
C[系统健康:多样性] -->|推动| D[推荐不确定性内容]
B <-.矛盾.-> D
A -.商业压力.-> C
平台的核心 KPI 是「用户停留时长」,这天然奖励「**越准越好**」;任何让你跳出舒适区的内容,在 KPI 上都是负贡献。**多样性、探索、长尾——在商业上,都是平台「为了让系统更健康而主动牺牲的部分短期收益」**。
这就是为什么「破茧」「抗偏差」始终推不动——**不是技术做不到,而是商业上,平台没有动力**。
要点
**反馈循环的暗面是偏差累积——内容、用户、创作者三个维度都被结构性放大;业界缓解手段有效但有限,根本原因是它们在和平台的核心 KPI「抢资源」,这是一场注定不对等的较量。**
抖音 vs ChatGPT:两类范式的关键差异
抖音 vs ChatGPT:两类范式的关键差异
一个类比:自助餐厅 vs 现做大厨
你今天想「吃点好吃的」,面对两家店:
**A 店是自助餐厅**:100 道菜全做好摆台上,服务员根据你过去点过的菜,帮你端来最合口味的——你点过的菜,他可能再端一次(换个盘子摆)。
**B 店是现做大厨**:你说「想吃辣的」,他看着你过去点过的辣度、忌口、当天心情,**现场给你炒一盘**。这道菜以前从不存在,是为你这一刻专门做的。
**抖音是 A 店,ChatGPT 是 B 店。**
这个看似简单的差别,是两类产品「推荐」逻辑的全部起点。所有的反馈循环、冷启动、评估方式差异,都可以从这个差别倒推出来。
核心差异:候选池是「挑」还是「做」
抖音的候选池是**预先存在的固定库**——全网创作者上传的几十亿条视频就在那儿,算法的工作是从中「挑」出你可能喜欢的那 10 条(从全库到千人千面的筛选,是经典的「召回→粗排→精排→重排」漏斗)。
ChatGPT 没有这个库——它给你的每一个回答,都是大模型**即时生成**的。你问「推荐一本小说」,它不调用一个「小说候选库」,而是逐字写出整段回答。**每一次对话的内容都是新的、独一无二的。**
| 维度 | 抖音(内容平台) | ChatGPT(生成式 AI) | |------|----------------|------------------| | 候选池 | 固定的:几十亿条预存内容 | 动态的:每次现场生成 | | 核心动作 | 检索 + 排序 | 生成 | | 一次「推荐」的本质 | 选 10 条已有视频 | 写一段新文字 |
这个差异如何决定反馈闭环
抖音:闭环围绕「画像」旋转
抖音的反馈循环我们前面几节讲过:用户行为 → 更新用户画像 → 重新挑内容 → 继续观察行为。**关键是:内容本身不参与循环。** 一个视频在第一次被推给张三时是什么样,以后再被推给任何人还是什么样。闭环只改变「谁会看到它」,不改变「它是什么」。
ChatGPT:闭环围绕「记忆」与「风格」旋转
ChatGPT 的反馈循环不太一样。你给它的点赞、点踩、对话历史,会被存在「记忆」里,影响它**下次生成的风格和内容**。但因为每次回答都是新生成的,闭环不是在「挑」——而是在「调教一个越来越贴你的口吻」。
你可以做一组对比实验:
- 在抖音上对同一类内容点 10 个赞 → 系统会**反复给你推同一类**
- 在 ChatGPT 里连续 10 次让它的回答「更短一点」→ 它会**学着变短**,但具体生成的内容每次都不同
**前者是「挑更对的菜」,后者是「养一个更懂你的厨子」。**
冷启动:起点完全不同的两道难题
抖音:内容不冷,用户冷
一个新用户打开抖音,**算法不知道他喜欢什么**。所以抖音给你推「热门内容」作为冷启动的兜底——这是「内容库」的优势:哪怕不知道你喜欢什么,从已有的爆款里随便挑,至少不会太差。
**内容本身不冷启动**——一个视频上传后,它的存在不依赖用户数据;它能不能火,取决于被推给多少人和那些人怎么反应。
ChatGPT:用户不冷,但「问题」无限冷
新用户打开 ChatGPT,他**可能问任何问题**——「写代码」「翻译论文」「讲个笑话」「扮演我奶奶」。没有任何「热门问题」可以兜底,因为问题空间是**开放的、无限的**。
但 ChatGPT 本身有个巨大的「预训练知识库」——大模型在训练阶段见过海量文本,所以**它有知识基础,不需要内容冷启动**。
这构成一个有意思的对照:
- 抖音 = **内容冷启动优势 + 用户冷启动劣势**(有库可选,但不知道选给谁)
- ChatGPT = **用户冷启动优势 + 内容冷启动劣势**(不用懂你也能开聊,但每句话都得现想)
评估方式:可量化 vs 难量化
这是最体现「范式差异」的一环。
抖音:行为即答案
抖音的评估非常直接——A/B 测试两个推荐算法,看**点击率、停留时长、完播率**等指标哪个高。**用户的实际行为就是答案**,因为「用户喜不喜欢」这个事,用户是主动表达出来的(点/划/看多久)。
ChatGPT:没有标准答案
ChatGPT 的评估**没有天然指标**。同一个问题「如何准备面试」,可以给出无数合理回答——A 回答全面但啰嗦,B 回答精炼但漏点,C 回答有趣但不专业。**哪个更好?没有客观答案。**
业界目前用三种近似方法:
- **人类偏好对比**:让标注员判断「A 回答 vs B 回答哪个更好」(ChatGPT 早期 RLHF 就是这么做的)
- **LLM 当裁判**:用 GPT-4 给其他模型的回答打分——但裁判本身也有偏见
- **专门 benchmark**:MMLU、HumanEval 等考试题——只能测「知识」和「能力」,测不了「对你这个具体人合不合适」
**所以 ChatGPT 的评估,本质上是在用「间接的、近似的」指标去测一个没有标准答案的事**——这是生成式 AI 时代整个行业还在摸索的难题。
用一张图看清两条路径
flowchart LR
subgraph 抖音 [内容平台——挑]
A1[用户行为] --> B1[更新画像]
B1 --> C1[从固定候选池检索]
C1 --> D1[排序选出 10 条]
D1 --> E1[观察新行为]
E1 --> A1
end
subgraph ChatGPT [生成式 AI——做]
A2[用户对话] --> B2[更新记忆与风格]
B2 --> C2[模型现场生成回复]
C2 --> D2[展示给用户]
D2 --> E2[用户反馈或继续对话]
E2 --> A2
end
**两条路径看起来对称,本质完全不同**:
- 抖音的 C1 是「从已有库中挑」——快、稳、可缓存
- ChatGPT 的 C2 是「现场生成」——慢、灵活、每次都不一样
要点
**抖音的「推荐」是从固定候选池里挑,ChatGPT 的「推荐」是即时生成内容——这一个差异决定了:前者闭环围绕画像旋转、内容不参与循环、行为即答案;后者闭环围绕记忆旋转、每次回答都是新内容、评估没有标准答案。**
生成式 AI 与传统推荐的融合趋势
生成式 AI 与传统推荐的融合趋势
一个类比:自助餐厅的「升级三件套」
回想上一节那个自助餐厅(A 店)的类比——100 道菜全做好摆台上,算法从里面挑。
如果这家餐厅要升级,有三种思路:
- **让后厨多出新品**——生成式 AI 帮你做菜
- **每道菜配个精致的小卡片**——生成式 AI 帮你写推荐理由
- **让大厨直接跟你聊天点菜**——生成式 AI 变成对话界面
这就是当前推荐系统被生成式 AI 重塑的**三个最显眼的方向**。它们不是替代原来的推荐算法,而是在算法之上、之前、之后**长出新的一层**。
方向一:生成式 AI 作为「内容生产工具」
传统推荐系统最头疼的问题之一是**「库存不够」**——尤其是小众兴趣、新发布的内容、冷门话题,因为候选池里没货,算法再聪明也推不出来。
生成式 AI 直接改变这一点:
- **抖音的 AI 数字人主播**:用大模型生成口播文案+数字人配音,自动产出大量短视频。原来需要真人团队拍的内容,现在 AIGC(AI 生成内容)能批量化生产。
- **小红书的 AI 试穿、AI 模特图**:用户上传自己照片,AI 生成「穿上某件衣服」的效果图。这本身就是一种**新的可推荐素材**——它既是内容,也是推荐位。
- **淘宝的 AI 商品图**:商家用 AI 一键生成商品的场景化展示图。
**关键变化**:候选池从「人类创作者上传的有限内容」,变成「AI 可以无限量生成的新内容」。这从根上缓解了推荐系统的「内容荒」。
但这里有个新风险——**AI 生成内容被推荐给用户,用户的反馈又训练了推荐系统,形成新的反馈循环**。如果 AI 内容本身带有偏差(比如总是生成某种审美),整个系统的「茧房」可能更深。
方向二:生成式 AI 作为「解释生成器」
你有没有这种体验:抖音给你推了一条视频,你划过去——但心里嘀咕「为什么给我推这个?」
以前推荐系统是**黑盒**:算法算出来你可能喜欢,但说不出为什么。现在大模型可以**生成自然语言解释**:
> 你最近经常看 Python 教程和爬虫实战,这条视频讲的是用 Python 自动化处理 Excel,是你关心的方向。
这种「解释生成」的价值有三层:
- **用户侧**:提高信任感——你理解了推荐逻辑,就不会觉得「被监视」那么恐怖
- **商家/创作者侧**:知道自己的内容为什么被推/没被推,可以针对性优化
- **平台侧**:当出现推荐事故时,解释能帮助快速定位问题(比如发现某条解释提到「用户最近搜索了什么敏感词」——这是个系统 bug)
**这并不是大模型在替你做推荐决定**——推荐本身还是那个传统算法(挑菜的还是那个服务员),大模型只是在旁边**写了一段「为什么给你端这道菜」的小卡片**。
方向三:对话式推荐——从「划」到「聊」
这是最颠覆的方向。**推荐系统不再是一份「今日 10 条」的清单,而是一段对话。**
例子:
- 你:「我想看个短剧,不要太狗血的,要有点反转」→ AI:「给你推荐《XXX》,核心是 X 反转,全程无误会」→ 你:「有没有更短的,10 分钟以内的」→ AI 重新生成
- 你:给淘宝 AI 助手发个截图说「我想要这种风格的沙发」→ AI 理解图片风格,召回相似商品
**传统推荐 vs 对话式推荐的本质区别**:
| 维度 | 传统推荐 | 对话式推荐 | |------|---------|-----------| | 交互方式 | 被动接收+划卡 | 主动表达需求+追问 | | 需求表达 | 只能从行为中「猜」 | 可以用自然语言「说」 | | 单次结果 | 一次性 10 条 | 持续精化,越来越准 | | 反馈方式 | 点/划/停留 | 文字调整、追问 |
**注意**:对话式推荐背后**仍然需要传统的召回-排序算法**——AI 不会真的「想」出哪条视频好,它把自然语言转化为搜索/筛选条件,再调用老系统。
所以更准确的说法是:**生成式 AI 是用户和传统推荐系统之间的「翻译官」**。
三层叠加的完整图景
flowchart TD
U[用户] -->|表达需求或反馈| L1
L1[生成式AI对话界面] -->|翻译为筛选条件| L2
L2[传统召回+排序算法] -->|候选集| L3
L3[生成式AI解释生成] -->|带解释的推荐结果| L1
L2 -->|从内容池中选| P1[人类创作者内容]
L2 -->|从内容池中选| P2[AIGC生成内容]
**底层是不变的传统推荐漏斗**,三层生成式 AI 分别在:
- **入口**(对话界面——把用户模糊需求翻译成结构化条件)
- **出口**(解释生成——把算法结果翻译成用户听得懂的话)
- **素材端**(AIGC——让候选池的内容不再只靠人类生产)
一个具体场景:AI 购物助手
你在淘宝看到一件大衣,想找同款但更便宜的:
- 你发个截图给 AI 助手 → 大模型理解图片,提取「风格、颜色、版型」特征
- AI 把这些特征转化为商品检索条件 → 触发传统商品召回
- 传统算法从商品库挑出 50 个候选 → 排序出 Top 10
- 大模型再为 Top 10 各写一句「为什么推荐给你」→ 给你看
- 你说「想要羊毛的,预算 500 以内」→ 大模型理解,调整筛选条件,重复 2-4 步
**传统推荐算法没换一根头发**——它仍然是那个「挑菜的」;但**用户体验被彻底重塑**了。这就是「融合」的精髓:AI 没取代推荐系统,而是把它包了起来。
要点
**生成式 AI 正在从「内容生产」「解释生成」「对话界面」三个方向改造传统推荐系统——但它不是替代者,而是叠加在传统召回排序漏斗之上、之前、之后的新一层。理解这一点,就看懂了未来 3-5 年推荐产品形态的核心走向。**
学习笔记
反馈循环的正反馈机制
推荐系统靠多轮正反馈循环让「越用越准」。
**「正」的核心**:每一轮的结果成为下一轮更好的输入,每一圈都比上一圈更精准。
**三个机制**:
- **信号积累**:单次点击是噪声,但成百上千次点击的统计模式很难骗人。信号从孤立点变成带权重的证据,画像清晰度指数级提升。
- **特征细化**:画像从粗粒度(如「喜欢美食」)细化到细粒度(如「川渝方言 + 路边摊 + 老板亲自下厨」),最终细到人自己都说不清。
- **置信度提升**:前几次只敢推「大众热门 + 大类兴趣」的保守策略;置信度提升后敢推小众作者、长尾兴趣、还没火的内容。
信息茧房与回音壁
- **信息茧房**:关注信息范围——推荐流被锁在一类内容里,接触不到其他领域。
- **回音壁**:关注观点极化——只看得到相似观点,以为「全世界都这么想」。
两者常一起发生:信息范围变窄 → 接触的观点变窄 → 观点越来越极端 → 更难接受对立信息 → 茧房越织越厚。
**形成机制**:每一次循环都强化已有偏好,候选池里其他领域的内容被系统性淘汰。一个「精准」的系统会主动放弃让你发现新兴趣的机会——算法替视野划了边界,而且不告诉你边界在哪。
**平台破茧手段**:
- **主动打散(多样性注入)**:在主 Feed 强制插入跨类内容。但用户常立刻划过,行为信号又告诉系统「不喜欢」,破茧机制被自己的反馈信号反噬。
- **探索模式**:让用户主动选择「不看个性化」(如 B 站推荐/热门、YouTube 探索、Twitter Following/For You)。问题是绝大多数用户根本不会切。
偏差累积与缓解思路
**三方偏差**:
- **内容侧:赢家通吃**——行业公开数据显示 80% 播放量集中在不到 5% 头部内容。算法用晋级链:1000 曝光 → 10万 → 百万 → 千万。初始小流量池里的随机噪声决定后续命运。这叫「曝光的马太效应」:强的越强、弱的越弱,指数级。
- **用户侧:沉默的大多数**——高活跃用户(每天 2 小时)数据是低活跃用户(偶尔刷一次)的几百倍,算法系统性「偏心」数据多的人。
- **创作者侧:头部博主护城河**——粉丝 100 万的博主初始 1000 曝光里至少 200 是老粉,几乎必定点击;新人同样发一条,初始 1000 曝光全是陌生人。头部博主赢在系统结构,不是内容。
**偏差累积的三原因**:
- **指数放大**:微小优势在晋级链中层层放大,N 级后差距指数级。
- **数据污染训练数据**:模型更新用的是本轮被系统筛选过的数据,而数据本身就有偏差(爆款比例被系统性抬高),偏差进模型,模型再生产偏差。
- **用户行为本身被改变**:当你习惯了算法推荐,你的「点击」不再反映真实偏好,而是「最容易被推……
抖音 vs ChatGPT:两类范式的关键差异
| 维度 | 抖音 | ChatGPT | |------|------|---------| | 候选池 | 固定的:几十亿条预存内容 | 动态的:每次现场生成 | | 核心动作 | 检索 + 排序 | 生成 | | 一次「推荐」本质 | 选 10 条已有视频 | 写一段新文字 |
**类比**:抖音是自助餐厅(从摆好的菜里挑,端来你点过的菜),ChatGPT 是现做大厨(现场炒一盘以前不存在的菜)。
**闭环差异**:
- **抖音**:闭环围绕「画像」旋转。内容本身不参与循环——一个视频对任何人都一样,闭环只改变「谁会看到它」。
- **ChatGPT**:闭环围绕「记忆」与「风格」旋转。点赞、点踩、对话历史存在「记忆」里影响下次生成的风格——闭环在「调教一个越来越贴你的口吻」。
**冷启动对照**:
- **抖音** = 内容冷启动优势 + 用户冷启动劣势(有库可选,但不知道选给谁)。
- **ChatGPT** = 用户冷启动优势 + 内容冷启动劣势——问题空间开放无限,没有「热门问题」可以兜底;但预训练知识库让它有知识基础,不需要内容冷启动。
生成式 AI 与传统推荐的融合趋势
**升级三个方向**(自助餐厅类比的延伸):
- **生成式 AI 作为「内容生产工具」**——解决传统推荐「库存不够」的问题(小众兴趣、新发布、冷门话题)。例:抖音 AI 数字人主播用大模型生成口播文案 + 数字人配音批量化生产短视频;小红书 AI 试穿、AI 模特图。
- **每道菜配精致小卡片**——生成式 AI 帮你写推荐理由。
- **让大厨直接跟你聊天点菜**——生成式 AI 变成对话界面。
**本质**:生成式 AI 不是替代原推荐算法,而是在算法之上、之前、之后长出新一层。