推荐系统通识 · 讲义与学习笔记

搞懂推荐系统为什么越来越懂你——从数据收集、用户画像到内容匹配与反馈循环的完整逻辑。

整理:问学·科技

第 1 关 · 推荐系统通览与三类经典范式

能用三句话讲清推荐系统的本质、与搜索的区别,以及「基于内容」「协同过滤」「混合」三种范式的核心直觉。

信息过载与推荐系统的存在理由

**从一个生活场景说起**

想象你走进一个图书馆。20 年前,这个图书馆有 10 万本书,馆员会告诉你:「想看什么类型的,我帮你找。」你能轻松逛完几个书架,挑到满意的书。

今天,假设有一个「全球图书馆」,里面放着 10 亿本书、100 亿条短视频、几万亿条商品信息——而且每分钟还在新增。这个图书馆没有馆员。你想找点什么,只能靠自己——但问题是,你根本不知道里面有什么。这就是我们今天面对的**信息过载**。

什么是信息过载

信息过载不是「内容比 20 年前多一点」,而是量级跳了几个数量级。抖音每天上传视频超过 1 亿条,淘宝商品超百亿,公众号每天新增文章几百万。人类大脑处理信息的带宽是有限的——你每分钟能认真看的内容,可能就几十条,但供给端是几亿条。**这中间的鸿沟,靠「自己找」是填不上的。**

为什么「让用户自己找」行不通

20 年前互联网的口号是「人找信息」。用户打开百度,输入关键词,搜索引擎把相关网页列出来。这个模式有效,是因为三个前提都成立:

**但这三个前提今天都塌了**:

这就是为什么「自己找」这套逻辑在今天失灵了。**不是用户变懒了,是环境变了。**

推荐系统做了什么:把选择权接回平台

推荐系统的核心动作很简单:**平台替你做一部分选择**。

你打开抖音,没输入任何关键词,首页直接开始播放——你大概率会看到感兴趣的内容。你打开淘宝,没搜任何东西,首页就是你想买的。这背后是一套系统在做判断:你可能对什么感兴趣、现在给你看这个合不合适。

**对比一下两种模式**:

flowchart LR
    A[用户] -->|输入关键词| B[搜索引擎]
    B -->|返回结果列表| A
    
    C[用户历史行为] --> D[推荐系统]
    E[内容池] --> D
    D -->|主动推送| F[用户]
    F -->|新行为反馈| C

左边是搜索:用户主动表达,系统被动响应。 右边是推荐:系统主动判断,用户被动接受。

**关键差异是主动权的转移**。搜索里,意图由用户表达;推荐里,意图由系统猜测。

一个具体例子:抖音的首页

打开抖音,你没搜任何东西。系统怎么决定给你看什么?

它会立刻调用你的**历史行为**:你昨晚点赞过健身视频、停留过猫咪视频、划过美妆视频。这些行为构成了一张「你是谁」的画像。然后它从几亿条视频里挑出几十条你最可能看完的,依次推给你。

你每划一条——点赞、停留、划过、评论、关注、收藏——这些信号又立刻回流到系统里,系统实时更新对你的理解,下一条推送更准。

**这构成了一个数据闭环:行为 → 画像 → 推送 → 新行为 → 更新的画像 → 更准的推送**。系统就是这样「越用越懂你」的。这一块的细节我们后面会专门讲。

推荐系统存在的三个前提

到这里可以总结一下:推荐系统之所以在今天成立,需要三个条件同时具备:

  1. **内容供给过剩**——多到用户自己选不过来
  2. **行为数据可获取**——平台能记录你点点划划的痕迹
  3. **系统有计算能力**——能从几亿条内容里实时挑出最匹配的几十条

三个条件缺一个,推荐系统都跑不起来。这也是为什么推荐系统是 2010 年之后才大规模出现的——不是因为算法突然变聪明了,而是因为**数据、算力、内容这三件事在那时候同时到齐了**。

**要点:** 内容爆炸让「自己找」的成本高到无法承担,推荐系统的本质是把「找什么」这件事从用户手里接过来,由平台根据你的行为数据主动判断并推送——这标志着一个根本性的转变:用户从「主动表达」变成「被动接受」,意图由系统猜测。

![信息洪流中,平台替你挑出想看的](https://tma-media.oss-cn-beijing.aliyuncs.com/tma/illustrations/b55e47c0-4187-4a71-ba27-562fb85c5b5d.jpg)

推荐与搜索的根本区别

打开 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 里:

**搜索擅长解决「我明确知道我要什么」,推荐擅长解决「我不知道我要什么,但我愿意被引导」**。一个成熟的 App 会同时拥有两套机制,按场景切换。

从更大的尺度看,**这是互联网二十年最大的范式转移**——从「人找信息」到「信息找人」。每一个大流量入口,都在从搜索的逻辑,转向推荐的逻辑。

**要点:** 搜索和推荐的根本差异在「意图的发起者」——搜索是用户主动表达、系统被动响应;推荐是系统主动猜测、用户被动接受。这一差异决定了两种产品对用户状态、数据需求、算法设计的全部不同。

三类经典范式:基于内容、协同过滤、混合

开场:三个朋友给你推荐餐厅

想象你下周想找家新餐厅,三个朋友分别给你出了主意:

这三种思路,恰好就是推荐系统最经典的三种范式。

基于内容:看东西像不像

**核心逻辑**:用户过去喜欢的内容有什么特征 → 推荐新内容时挑有相似特征的那批。

这里的关键能力是**给内容打标签**。一部电影要有「动作、科幻、2024 年、诺兰」这些维度,一篇公众号要有「职场、跳槽、35 岁」这些关键词,一条抖音要有「美食、教程、成都」等标签。

抖音会根据你过去完播、点赞的视频提取出你的兴趣画像(爱看美食、爱看旅行、爱看 3 分钟以内的),然后拿这个画像去匹配新视频的特征。

**优点**:能推荐完全没人看过的冷门内容(新内容只要特征对就可能被推);不依赖其他用户的行为。

**缺点**:会陷入「信息茧房」——你过去喜欢川菜,它就永远推川菜,你很难发现原来你也喜欢湘菜。系统永远在强化你过去的口味,**不擅长制造惊喜**。

协同过滤:看人像不像

**核心逻辑**:不用理解内容长什么样,只看「谁和谁行为像」。

最经典的口号有两句:

比如,你和用户 B 都喜欢了视频 1、3、5,系统判断你俩很像,于是把 B 喜欢而你没看过的视频 7 推荐给你。

**这种方法的妙处在于:你不需要知道视频在讲什么**。系统对内容一无所知,只看数字——谁看过谁、谁点赞了谁——就能做出推荐。

**优点**:能制造惊喜(我从来没看过这类,但和我相似的人在看——这恰恰是新口味被发现的方式);不需要对内容做深度理解。

**缺点**:**冷启动很糟糕**。一个新用户进来没有任何行为数据,系统不知道他像谁;一个新视频上传没人看过,系统不知道谁会喜欢它。这就是为什么抖音会强制让你刚注册时选几个兴趣标签——那是在**用内容特征补协同过滤的冷启动漏洞**。

混合:两条腿走路

现实中的推荐系统几乎**没有只用一种范式的**。

flowchart TD
    A[内容特征信号] --> E[综合打分模型]
    B[协同过滤信号] --> E
    C[社交关系信号] --> E
    D[时效与热度信号] --> E
    E --> F[最终推荐结果]

内容特征、协同信号、社交关系、时效热度、用户反馈……全部加权融合。

**为什么会这样?** 因为每种范式都有它解决不了的问题。混合就是把几个范式各取所长、补其所短。

一个走一遍的例子

假设你平时只看「美食」和「旅行」两类内容。今天抖音给你推了一条「街舞教学」——你从来没看过这类。

这就是为什么你**偶尔能在抖音发现「原来我也喜欢这个」**——背后是协同过滤的功劳。

要点

三种范式的核心差异是**比较的是什么**:基于内容比较内容像不像、协同过滤比较人像不像、混合则是把多路信号加权融合。真实世界的推荐系统,几乎都是混合范式。

协同过滤的两种直觉:UserCF 与 ItemCF

开场:同一句「协同过滤」,两条不同的路

上一节我们讲了协同过滤的总体思路——「不靠内容理解,只看行为关系」。但同样四个字「协同过滤」,内部其实有两条截然不同的路径。

你今天在淘宝买了副无线耳机,淘宝立刻给你推了手机壳、充电器。背后能走两条路:

它们都能解释这次推荐,但底层逻辑完全不同。这一节就讲清这两条路的差异。

UserCF:「人以群分」

**完整口号**:**和你相似的人也喜欢这个**。

思路一句话:先找「和你口味相投的人」,再看他们最近喜欢啥。

举个例子。假设你是用户 A,过去喜欢过视频 1、3、5、7。系统里还有用户 B、C、D:

系统判断:**B 跟你最像**。于是把 B 喜欢、而你没看过的 8 和 9 推荐给你。

**关键特征:人是中心。** 计算发生在「用户×用户」的相似度矩阵里。

**优点**:能制造惊喜——B 喜欢的东西你可能完全没接触过,但因为你俩像,命中率反而高。这也是抖音偶尔能把你「带出信息茧房」的功臣之一。

**缺点**:每来一个新用户、新物品,都要重新算相似度;用户多了计算量爆炸;用户兴趣一旦变化,整个相似网络都得跟着变。

ItemCF:「物以类聚」

**完整口号**:**喜欢这个的人也喜欢那个**。

思路一句话:先看你过去喜欢过啥,再找「和这些东西经常被一起喜欢」的其他东西。

同一个例子。你喜欢过视频 1、3、5、7。系统里有这样的统计:

系统发现:**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 抖音

什么时候用哪个?

简单记:

亚马逊、Netflix、网易云音乐这种**物品库相对固定**的平台,几乎都押宝 ItemCF。今日头条这种**内容日新月异**的平台,更偏向 UserCF 或更复杂的混合模型。

要点

UserCF 是「人以群分」(先找人,再看人喜欢啥),ItemCF 是「物以类聚」(先看物,再找物的邻居)。两者都属于协同过滤(不依赖内容理解),但**计算中心不同**:UserCF 算用户之间的关系,ItemCF 算物品之间的关系。

矩阵分解:用一组数字表示一个人

开场:你的口味「DNA」

你在奶茶店点单时说「燕麦拿铁、半糖、热」,店员其实已经对你有了个画像——不太甜、不喝冷的、接受新潮口味。

**推荐系统也需要给每个用户一个「口味描述」,但要比「半糖热」复杂得多。** 这一节讲的「矩阵分解」,干的就是这件事:给每个用户、每个内容都生成一组数字,用这组数字精准描述它的「气质」。

原始数据长什么样

我们先看「原始推荐系统」长啥样。假设有 100 万用户、10 万部电影。最直觉的做法是建一张大表:100 万行 × 10 万列,每个格子记录某个用户对某部电影的评分(1-5 分)。

但这张表有两个问题:

协同过滤已经能解决一部分问题,但它依赖「共同评分过的人」——对完全没人同时评过的冷门电影就抓瞎了。

矩阵分解的核心想法

矩阵分解问了一个天才的问题:

> **这张大表里其实藏着一个「隐藏结构」——能不能把人和电影,都用几个数字表示出来?**

打比方:你虽然没填过一份"电影口味测评表",但你过去看过的电影、给的评分,已经在悄悄「暴露」你的偏好维度。系统可以**反推**出你的偏好由哪几个维度决定。

具体怎么压

假设系统决定用 **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 百万美元挑战赛,一直打到今天抖音和淘宝的召回阶段。

一个具体场景

小红书要给你推笔记。

**好处**:就算你是小红书的新用户、那篇笔记也是新发的,没有任何「共同行为」记录——只要有各自的那组数字,就能预测。

要点

矩阵分解把巨大稀疏的「用户-内容」打分表,**压缩成每个人、每个内容都对应的一组数字**(向量)。预测推荐分数 = 把这两组数字对应相乘再相加。这套「用数字表示含义」的思路,**本质上和大模型的 Embedding 是一回事**——理解了这个,你就抓住了今天所有「用 AI 做匹配」系统的底层逻辑。

学习笔记

推荐系统通览与三类经典范式

一、信息过载与推荐系统存在理由

**量级跃迁**

**「人找信息」为何失灵**

**推荐系统的核心动作**

**抖音案例:数据闭环**

**成立三前提**

  1. 内容供给过剩
  2. 行为数据可获取
  3. 系统有计算能力

二、推荐与搜索:意图方向相反

**两种相反的产品假设**

**意图流向**

**四维对比**

| 维度 | 搜索 | 推荐 | |---|---|---| | 意图来源 | 用户主动表达 | 系统主动猜测 | | 触发动作 | 输入关键词 | 打开App、刷新页面 | | 用户状态 | 目标明确 | 常常没目标 | | 输出形态 | 结果列表 | 单条连续推送 |

「用户状态」最关键:搜索意图清楚到可写下来(「想买红色连衣裙」),推荐意图根本不存在或说不清(「睡前刷一刷」)。

**现实中共处**

三、三类经典范式

**比喻:三个朋友推荐餐厅**

基于内容推荐
协同过滤
混合

**例子:发现新口味**

四、协同过滤的两条路径:UserCF 与 ItemCF

**同一术语下两条路**

UserCF:人以群分
ItemCF:物以类聚

**现实例子**

五、矩阵分解:用一组数字表示一个人

**为什么需要数字描述**

**原始数据的问题**

**矩阵分解的核心想法**

第 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、行为类型、停留时长、时间戳)发回服务器,服务器写入日志系统——这叫「埋点」。

「回流」是工程上**最容易被低估**的一步。它有四个硬要求:

任何一步出 bug——客户端没埋点、网络断了、服务器重复写入——都会让推荐「学错」。这一步才是闭环能不能真正「闭」上的关键。

**第四步:模型更新(Model Update)**

行为数据进入数据仓库后,并不会立刻改变你今天看到的内容。它们被聚合成训练样本:你过去看过什么、当时系统推了什么、最后你做了哪个动作。

每天凌晨(或更频繁),数据团队用这些样本重新训练模型,把「新学到的规律」压进参数里。第二天上线后,你看到的推荐就是新模型算出来的。

flowchart LR
    A[展示] --> B[行为]
    B --> C[回流]
    C --> D[模型更新]
    D -.次日再次展示.-> A

单次循环的「工程」视角

注意几个**时间尺度**的差异——这是工程视角的核心:

「闭环」之所以是个**工程**问题,不是个**算法**问题,核心就在于这条链能不能稳定跑通:客户端埋点不能漏、网络传输不能断、日志系统不能挂、训练流水线不能崩、模型上线不能翻车。算法可以不是最优的,但数据回不来,系统就永远学不会。

一个具体例子

下午 3 点,你刷到 8 条视频:

这 4 条行为在 3 秒内全部回传到服务器。凌晨,模型用今天所有用户的行为重新训练。明天再刷时,美食类概率上调、萌宠类保持、新闻类下调——一次单循环的「结果」。

单次 vs 多轮:本节的视角边界

今天讲的是**一次完整的循环**:从「系统展示」到「模型被更新」,链条走完一遍。这是物理结构上的事实——数据走了、模型变了。

但循环走完一圈**不等于故事结束**。你反复看美食,系统推更多美食,你继续看更多美食——这种「越推越窄」的现象是循环的副产品,**多轮**叠加后才会显现。这一块我们会留到后面专门讲,今天不展开。

**要点:** 数据闭环是「展示→行为→回流→更新」的物理链条;单次循环走完一圈,系统就「学」到一次;这条链的关键不在算法,而在数据能不能**完整、及时、不出错**地流回来。

评估指标:CTR、AUC、NDCG、留存

评估指标:CTR、AUC、NDCG、留存

用「教练看成绩」做类比

你请了一位私教,每节课后都让小孩做一张卷子。但你真正想知道的不是「这张卷子几分」,而是「小孩下个月大考能考几分」。

推荐系统的评估指标,就在「卷子分数」和「最终成绩」之间做平衡。CTR、AUC、NDCG 是各种「卷子分数」,留存才是「最终成绩」。

为什么必须有指标

你已经学完数据闭环了——展示、行为、回流、模型更新。但有个根本问题没解决:你怎么知道「模型变好了」?

不可能每天让全公司员工去刷产品看「感觉准不准」。必须用数字说话。**评估指标**就是把「推荐得好不好」翻译成可测量的数字。

离线 vs 在线:两个考场

评估分两个地方:

离线便宜、快、能反复做;在线贵、慢,但最真实。再准的离线指标,也代替不了在线。

---

CTR(点击率):最基础、最容易骗人

**衡量什么**:一条内容被推出去后,多少人点了。 直觉公式:CTR = 点击数 ÷ 展示数。

比如一条视频推给 1000 人,120 人点进去,CTR = 12%。

**优点**:简单、好统计、秒级反馈。

**致命缺陷**:CTR 只看「点不点」,不看你点完之后什么反应。结果——

**关键洞察:CTR 高 ≠ 推荐好**。CTR 只在「点击前」测量,完全不关心你点完之后的体验。

---

AUC:模型「排序能力」的体检表

**衡量什么**:模型把「好内容排在坏内容前面」的能力。

举例:精排给用户算了 8 条视频的预估分数。AUC 关心的是——真正该推的那条(用户最终看了/喜欢的那条),有没有排在不该推的前面?

**和 CTR 的区别**:CTR 看「整体点得多不多」,AUC 看「**该点的有没有排在前面**」。

**适合场景**:纯离线评估,模型训练完打一次分。

---

NDCG:位置有高低,奖赏要分级

**衡量什么**:好内容**排得越靠前**,分越高。

AUC 已经能区分「好/坏」,但对位置不敏感——把第 1 条和第 8 条对换,AUC 几乎不变。

但现实里,第 1 条和第 8 条差距巨大!第 1 条是黄金位,曝光率、第 1 印象都完全不同。

NDCG 的核心思想:**位置就是权重**。好内容出现在第 1 位,得满分;出现在第 8 位,扣掉一大半分。

**举例**:精排推了 8 条,前 3 条都贴用户喜好,但「最贴」的那条在第 3 位。CTR 看「前 3 条总点击」,NDCG 看「最贴的在不在第 1 位」。

**适合场景**:离线评估精排模型时最重要的一项。

---

留存:唯一能「长期打假」的指标

**衡量什么**:明天/下周/下个月,用户还来不来。

其他三个指标都死在「一次推荐」里——只看这一次推得准不准。但推荐系统的最终目的不是「一次推得准」,是「让用户留下来」。

**CTR 高但留存崩盘**的场景:

**留存的「孤独权威」**:

---

一个具体例子

某内容平台做了一次模型升级,所有离线指标都涨了:

| 指标 | 升级前 | 升级后 | 状态 | |------|--------|--------|------| | 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 小时)。漏斗结构让总计算成本可控。

---

二、一次推荐的完整链路

关键时间点
整个决策过程不到 200 ms

整个决策过程不到 200 ms;推荐的「一生」不止响应——响应后还要采集行为、回流、模型更新,闭环才完整。

---

三、数据闭环(单次循环)

四个环节
  1. **展示(Impression)**:曝光本身也是数据(排第几位、你看到第几条才停下)
  2. **行为(Behavior)**:远不止点赞/不喜欢两个按钮——还看停留多久、怎么滑、是否循环播放、何时退出
  3. **行为回流(Feedback Logging)**:客户端打包(用户ID、视频ID、行为类型、停留时长、时间戳)发回服务器写入日志,即「埋点」
  4. **模型更新(Model Update)**:行为聚合成训练样本,每天凌晨(或更频繁)重新训练,第二天上线后新模型生效
flowchart LR
    A[展示] --> B[行为]
    B --> C[回流]
    C --> D[模型更新]
    D -.次日再次展示.-> A
回流的四个硬要求
时间尺度
闭环是工程问题,不是算法问题

闭环是工程问题,不是算法问题。关键在链能不能稳定跑通:客户端埋点不能漏、网络不能断、日志系统不能挂、训练流水线不能崩、模型上线不能翻车。算法可以不是最优的,但数据回不来,系统就永远学不会。

---

四、评估指标

离线 vs 在线
CTR(点击率)
AUC
NDCG
留存
指标对比

| 指标 | 衡量什么 | 关键局限/特点 | |---|---|---| | CTR | 点了多少 | 只测点击前,可被标题党刷高 | | AUC | 好内容能否排在坏内容前 | 纯离线,对位置不敏感 | | NDCG | 好内容是否排在前面 | 位置即权重,最看重排 | | 留存 | 用户是否长期回来 | 唯一长期指标,最真实也最慢 |

第 3 关 · 行为数据如何变成用户画像

能讲清系统如何从你的一举一动中「读出」你的兴趣,并把抽象的用户画像拆成标签、Embedding、长短期意图三个层次。

行为数据的类型与信号强度

行为数据的类型与信号强度

开场:系统是个「暗中观察」的服务员

想象你走进一家餐厅。服务员其实一直在默默观察你:点了什么菜、吃了几口、表情如何、最后剩多少、还拍了照发朋友圈——他比你「嘴上说的」更知道你的真实口味。

推荐系统也是这样一个「暗中观察」的服务员。你没告诉它你喜欢什么,但你的每一个动作——划过的速度、停留的秒数、是否看完、是否点赞——都在它心里变成了一笔「账」。本节要回答的核心问题是:**这些动作在系统眼里「分量」一样吗?如果不一样,谁更重?**

一、两大维度:正向信号 vs 负向信号

推荐系统收集的行为,先按「喜欢还是不喜欢」分成两类:

**正向信号(系统读出「你可能感兴趣」)**

**负向信号(系统读出「你可能不感兴趣」)**

记住这两个维度很关键——推荐系统不仅要知道「你喜欢什么」,更要快速识别「你讨厌什么」,二者权重往往相当。

二、信号强度排序:从「礼貌性动作」到「真爱证据」

同样是正向信号,分量差很多。可以粗略这么排(**注意排序不是死的,不同公司会调**):

**强信号(真爱证据)**

**中等信号(明确肯定)**

**弱信号(可能只是礼貌)**

**负向信号** 里,**快速划过**虽然单次信号弱,但**量大**——用户每天划几百条,划走是绝大多数动作,系统必须认真对待。

flowchart TD
    A[用户对一条内容的所有行为] --> B{方向}
    B -->|正向| C[强: 完播 / 收藏 / 关注]
    B -->|正向| D[中: 评论 / 转发]
    B -->|正向| E[弱: 点赞 / 访问主页]
    B -->|负向| F[强负: 举报 / 不感兴趣]
    B -->|负向| G[弱负但量大: 快速划走 / 短停留]

三、为什么「隐式信号」反而更准

这里有一个反直觉的洞察:**你嘴上做的(点赞)比身体做的(看完)更容易骗人。**

点赞可能是因为:

但**完播率和停留时长是骗不了系统也骗不了自己的**——你没看完就是没看完,没停留就是没停留。算法圈有句玩笑话:「用户嘴上说的偏好,和他实际点的赞之间,差着 100 个收藏夹。」

这也是抖音早期把完播率定为头号指标的原因:完播 + 点赞 + 评论的组合打分,远比单一的「点赞数」更能预测一条视频的长期表现。

四、负向信号容易被低估

还有一个常被忽略的点:**用户主动说「不感兴趣」是极少数,大多数不喜欢是用「沉默的划走」表达的。**

如果系统只听显式负反馈(点「不感兴趣」按钮),会误以为用户喜欢所有没被举报的内容——这显然错得离谱。所以现代推荐系统会把「短停留 + 快速划走」建模成一种**集体性的负向信号**:当一条视频被 80% 的用户在 2 秒内划走,那这条视频大概率就是没吸引力。

一个具体例子

你在抖音刷到一条烧烤视频:

这套打分每天发生几十亿次,构成了「用户画像」的原始素材——下一节我们就看,这些零散的信号怎么聚合成「90后 / 数码控 / 深夜美食爱好者」这样的标签。

**要点:** 推荐系统看的不是「用户做了什么动作」,而是「每个动作背后的信号强度」——完播和收藏 > 评论和转发 > 点赞和停留 > 沉默划过;隐式信号(看完没看完)往往比显式信号(点赞没点赞)更能反映真实兴趣。

从行为到标签:显式标签与隐式标签

开场:你以为的「用户画像」 vs 系统心里的「用户画像」

你是市场运营,对「用户画像」这个词肯定不熟——你脑子里想到的,多半是一份 PPT 上的「典型用户档案」:姓名张三、女、28岁、白领、月入1.5万、爱旅游、爱健身。

这是**营销画像**:静态、可读、写完就锁进抽屉。

但推荐系统心里的画像不是这样的。它更像一个**实时刷新的数据仪表盘**:每刷过一条视频、每停留一秒钟,仪表盘上的指针就跳一格。本节要讲清:系统怎么从你的一举一动中「读出」你到底是谁、这些标签和你以为的标签有什么不同。

一、两大类标签:你自己说的 vs 系统看出来的

**显式标签(你告诉系统的)**

这是最直觉的「标签」——你在注册、填写资料、点过「我的兴趣」时主动留下的信息:

这种标签像**你亲手填的简历**:清晰、可解释、能直接拿去做广告投放。但有三个致命问题:

  1. **很多人不填**——嫌麻烦,30% 以上的用户关键信息是空的
  2. **填了也可能是假话**——勾选「金融」显得高大上,实际一窍不通
  3. **填完就过时**——你三年前勾的「数码」,现在已经是钓鱼佬

**隐式标签(系统从你行为里挖出来的)**

这是更大量、更真实的标签。系统观察你上百次行为后,用统计或模型推断出来:

这些标签**你没说过**,但系统非常确信。这种标签像**别人对你的印象**:可能不全面,但更接近真实。

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**(下一节讲):用一串高维数字来表示你,比几百个标签信息密度高得多。

三、显式与隐式冲突时,谁说了算?

一个关键的工程问题:如果你**说**喜欢美妆(显式),但**做**出来的行为全是健身(隐式),系统信谁?

**信隐式**。这是推荐系统铁律:行为 > 声明。原因很简单——你嘴上说的可能为了应付问卷、可能三年前随口一说,但你**当下的每一次点击、每一秒停留**都是真实成本下的选择。

不过系统不是粗暴地「删除」显式标签,而是给它**降权**:美妆标签还在,但权重被压到很低,健身类内容获得更多曝光机会。

一个具体例子

你给抖音填了「我对摄影感兴趣」这个显式标签。注册后第一周:

两周后,你的标签库已经发生剧变:

**这才是真实的「用户画像」**——不是你入职时填的那张三页纸,而是一张被无数次行为不断重写的活地图。

**要点:** 显式标签是用户主动告诉系统的(人口属性、声明兴趣),清晰但易过时、可能是假话;隐式标签是系统从行为里推断的,量大、动态、更接近真实;用户画像不是一张写死的档案,而是一份**随行为持续更新的概率分布**;当两者冲突时,系统**信行为不信声明**。

用户 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 能表达**「既不A也不B,但在AB之间某个位置」**——这是标签永远做不到的。

Embedding 是怎么来的?系统不需要你告诉它

这是 Embedding 最神奇的地方:**它不需要任何人事先定义**。

你不需要告诉系统「我喜欢川菜」,你只需要看 30 条川菜视频。系统在你看视频的时候,悄悄调整你那 256 位数字——让这串数字越来越指向「川菜爱好者」那个方向。

这个过程类似小孩学说话:没人教他「川菜」的概念,他只是听大人说了一万次「中午吃火锅」,下次他自己就知道「火锅是辣的、热闹的、和家人一起吃」。Embedding 模型也是:看过足够多的用户行为,它自己就学会了「这种行为模式的人,他们的指纹应该长什么样」。

所以 Embedding 比标签强在三件事:

  1. **不需要人工定义**——没有「撸猫爱好者」这个标签也不怕
  2. **信息密度高**——256 个数字能表达的「人」,比 500 个标签还细
  3. **能表达中间状态**——你「有点喜欢又不太喜欢」,标签系统表示不了,Embedding 可以

标签 vs Embedding:一张表看清

| 维度 | 标签系统 | Embedding | |---|---|---| | 数量 | 几百到几千个标签 | 通常 128~256 个数字 | | 表达力 | 离散、稀疏 | 连续、稠密 | | 构建方式 | 人工定义 + 行为匹配 | 模型从行为里自动学 | | 解释性 | 能说清每个标签含义 | 不可解释(说不出每个数代表啥) |

**最大的代价是:不可解释**。这是 Embedding 的硬伤——你没法对老板说「因为这个用户的第 47 位数字是 0.3,所以我们推给他这条视频」。但工程上有一种间接解释:**「和你类似的用户都看了这条」**——这句话的背后就是 Embedding 在算距离。

一个具体场景

抖音为你建好了一个 256 位的 Embedding。系统要决定给不给你推一条新视频时,它会:

  1. 把这条视频也转成一个 256 位的数字(视频也有自己的 Embedding)
  2. 算你俩的「距离」——数字越像,距离越近
  3. 距离近就推给你,因为系统判断你们的「兴趣指纹」匹配

所以你刷到的每一条视频,背后都是一次**你和它的指纹比对**。和你指纹最像的视频会优先曝光。

**要点:** Embedding 是把一个人过去所有行为压缩成一串固定长度的数字(比如 256 位),作为「数字指纹」代表这个人;它和标签的最大区别是——标签是离散、有限、靠人定义,Embedding 是连续、稠密、从行为中自动学到;Embedding 能表达「既A又B的中间状态」,这是标签做不到的;代价是不可解释,但可以用「和你相似的人都看了」来间接说明。

长期兴趣与短期意图

长期兴趣 vs 短期意图:你有两个「你」

推荐系统眼里你不是「一个人」,而是「两个人」同时存在:

为什么需要两个?因为只看你或者只看你当下,推荐都会很糟。

长期兴趣:你的「人格底色」

长期兴趣有几个特征:

长期兴趣负责做**基础推荐**:你一打开 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 秒内划走)。

二、从行为到标签:显式标签与隐式标签

显式标签(用户主动填)
隐式标签(系统从行为推断)
四个常见误解
  1. 「我没填年龄系统怎么知道」:通过手机型号、活跃时段、社交关系链、内容类型叠加,置信度可从 30% 升到 95%
  2. 「标签就几个词」:真实系统一个用户的标签库可能有几千个,远超「90 后/数码控」这类粗粒度
  3. 「标签贴上就一辈子跟着」:标签有生命周期,最近 7 天密集互动权重飙升,一个月不点自动衰减——画像是水印不是纹身
  4. 「标签就是我」:标签是对人的有损压缩,单靠标签有上限,大厂因此转向 Embedding

三、用户 Embedding:你的数字指纹

什么是 Embedding

本质是把用户所有行为历史压缩成一串固定长度数字(如 256 个),用这串数字代表「你」。两个相似的人指纹接近,两个完全不同的人指纹相距远。每个数字没有具体含义,不能指着第 47 个数说代表什么,但整体方向有意义。

标签 vs Embedding
Embedding 的三个优势
  1. 不需要人工定义:没有「撸猫爱好者」这个标签也不怕
  2. 信息密度高:256 个数字能表达的「人」比 500 个标签还细
  3. 能表达中间状态:「有点喜欢又不太喜欢」也能编码

推荐系统眼里,用户是「两个人」同时存在

推荐系统眼里,用户是「两个人」同时存在。

长期兴趣(人格底色)
短期意图(最近的心事)
典型流程(烧烤例子)
  1. 用户搜「北京望京烧烤」→ 短期意图向量加权重,密集推烧烤
  2. 长期兴趣是「美食+健身」→ 推送交集为烧烤做法、北京美食探店、健身餐
  3. 3-5 天内无互动 → 系统判定意图过期,烧烤内容权重逐步归零,回到长期兴趣主导
长期 vs 短期对比
「推荐系统越用越懂我」只一半来自学会长期兴趣

「推荐系统越用越懂我」只一半来自学会长期兴趣,另一半来自越来越会读最近的短期意图。成熟系统长期与短期按典型 7:3 或 8:2 动态调整:新用户长期信号弱偏短期,老用户短期意图弱偏长期。

第 4 关 · 内容理解与经典匹配范式

能讲清系统如何「读懂」一段视频或一篇文章,并说出基于标签匹配与基于向量匹配两种内容侧范式的本质区别。

内容标签:分类、关键词、实体

内容标签:分类、关键词、实体

开场:超市的货架

你走进一家大型超市,每件商品都挂着一个标签:饮料区、洗护区、零食区,每件商品下还贴着一张价格牌和配料表。这是超市让你(和补货员)能「看懂」商品的最低成本方式——把成千上万种商品归到有限的分类里,再用关键词快速描述。

推荐系统理解内容的第一步,做的事几乎一样。

什么是内容标签

内容标签(Tag)就是给一段视频、一篇文章、一个商品,贴上一组有限的、可枚举的「词」或「类目」。系统用这些标签代替原始内容去匹配用户兴趣,效率高、解释性强、出问题容易排查。

工业界把内容标签分成三大类。

1. 分类(Category):最高层的「它属于哪一类」

**分类**是层级化的类目体系,类似生物分类学。

抖音的例子:

**怎么生成?**

**特点**:粒度粗、覆盖有限、但用户侧最常用——运营、审核、推荐召回的「兜底」通路几乎都靠分类。

2. 关键词(Keyword):中层的「它在讲什么」

**关键词**是从文本里抽取出来的、描述内容主题的词或短语。

来源:标题、描述、ASR(语音转文字)出来的字幕、OCR 识别出的字幕文字。

**怎么生成?**

例子:一条教你做红烧肉的 60 秒视频,关键词可能是:`红烧肉 / 家常菜 / 做法 / 中餐 / 厨房`。

**特点**:比分类更细,能回答「它具体在讲什么」,但仍是离散词、不带语义。

3. 实体(Entity):细粒度的「它提到了谁/什么」

**实体**是文本中的具体名词对象:人名、地名、品牌、作品名、机构、产品名等。

例子:同一条红烧肉视频

例子:一条数码评测视频

**怎么生成?**

**特点**:最细粒度,是「内容侧」与「用户侧」最精准的桥——一个用户搜过「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 秒的美食视频——你「看懂」它用了多少种感官?至少四种:

你从来不是「只看画面」或者「只听声音」就下结论的,而是把这四种信号**自动拼在一起**才形成理解:这是一条教做红烧肉的短视频。

系统也是这么做的——只不过它把这件事拆给了多个 AI 模型,每种模型管一个「感官」,最后再综合起来。

什么是「多模态内容理解」

**模态(Modality)**就是信息的来源渠道。一条短视频里至少藏着四种:

「多模态」就是把这几种渠道**同时**喂给系统,让它综合起来理解内容。

一条抖音视频的处理流水线

一条视频上传之后,大致会走这条流水线:

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[统一内容表示]

每条分支具体干什么:

最后通过一个**融合层(Fusion Layer)**,把所有结果按时间线对齐、加权汇总成「这条视频在讲什么」的统一表示。

一个具体例子:红烧肉视频

假设上传了一条 60 秒的红烧肉做法视频:

| 模态 | 实际内容 | 模型读出了什么 | |------|---------|---------------| | 标题 | 「红烧肉的家常做法」 | 关键词:红烧肉、家常菜 | | ASR 字幕 | 「先焯水,然后炒糖色……」 | 实体:糖色、焯水;动作:炒 | | 画面 | 锅、灶台、红亮的肉块 | 物体:锅、肉;场景:厨房 | | 音频 | 油声 + 翻锅声 + 无人声 BGM | 音效应:烹饪;无配乐 |

**只靠任何一种模态**都判断不准:

**四种模态一起**,系统才能很确定地判断:这是一条烹饪教学视频。

模态之间能互相纠错

多模态最实用的价值,是**互相纠错**——避免被单一信号带偏。

一个反面例子:标题写「震惊!这种东西千万别吃」,画面是一个博主夸张地表情崩溃。如果只看标题,会被分到「社会新闻 / 警示」类;如果只看画面,会被分到「搞笑 / 剧情」类。但声音是人声吐槽、BGM 是搞笑配乐、字幕写着「吃播翻车」——三模态合起来,结论是「搞笑吃播」,完全不是新闻。

这件事在推荐里非常关键:一个被错误归类到「社会新闻」的视频,会被推给根本不想看新闻的人,体验灾难。多模态融合就是用来防这种「单一模态看走眼」的事故的。

「融合」到底怎么融

四种模态的输出格式都不一样(一段文字、一组向量、一段音频标签),融合层要做的事有两件:

通俗理解:四个 AI 各自投票,融合层按「谁更可信」做加权投票,得出统一结论。

工业上也有「先合再算」和「先算再合」的差别(早期融合 vs 晚期融合),但对外都是「综合判断」的效果,先记住这个画面就够了。

要点

**多模态内容理解 = 文字 + 图片 + 视频 + 音频四条流水线并行处理,再融合成一个统一结论;它让系统能像人一样「眼耳并用」理解视频,也是单一模态判断不准时最有效的纠错机制。**

内容 Embedding:内容的 DNA

内容 Embedding:内容的 DNA

开场:从「两条标签完全一样的视频」说起

上一节我们讲到,多模态融合能让系统知道一条视频「是教做红烧肉」还是「探店吃火锅」——但这一步的产物,依然是把它归到**几个标签**里。

设想一下:

「美食、家常菜、红烧肉」这三个关键词,**对这两条视频完全没区别**——但你一眼就知道,它们是两类完全不同的内容:一个是教学、一个是测评。

标签太粗了,撑不起「细粒度区分」。这时候轮到 **Embedding** 登场。

类比:标签是「名片上的几个字」,Embedding 是「完整 DNA 序列」

每个商品有条形码,每个员工有工号——这些编号**唯一**,但不包含「信息」。条形码「6901234567892」和「6909876543210」之间没有「像不像」的关系,谁也不比谁更像谁。

**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 能告诉你「像到几分、几分像谁」。

一个具体例子:相似度排序

假设系统已经算出 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 最像的是哪条?

标签看不出来(都打了「美食」),embedding 一眼分辨:A 和 C 都是「教学」类内容,远比 A 和 B 像。

要点

**Embedding = 把每条内容转成一串有意义的数字,相似内容在数字上也相似;它用几百维数字替代几个关键词,所以能比标签更细粒度地表达和区分内容——这就是「内容 DNA」这个类比的来源。**

经典匹配:基于标签 vs 基于向量

经典匹配:基于标签 vs 基于向量

开场:现在,两边都「读懂」了

到这里,我们已经攒齐了推荐系统「内容侧」的所有零件:

但「读懂内容」只是半场——另一半是「读懂用户」。用户那边也会有「用户标签」(看过美食、点赞过教学、25-30 岁女性……)或者「用户 embedding」。

现在问题来了:**一个用户和一条视频,怎么「配对」?**

这一节讲的就是这个:两种最经典、最根本的配对思路——**基于标签的匹配**和**基于向量的匹配**。

类比:相亲的两种方式

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 条「美食 + 教学」视频,系统给你推新视频:

**优点**:简单、可解释、计算快。 **缺点**:粒度太粗。两个视频标签完全一样,匹配结果也一样——但它们可能是完全不同的内容。

方式二:基于向量的匹配(距离匹配)

思路完全不同:**用户 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 数字串越像,在高维地图上越靠近,相似度就越高。

还是上面那个例子——但用向量来推:

**神奇之处**:视频 C 的标签是「烘焙、教学」,**没有任何一个词直接命中**你的标签——但 embedding 知道,它们都是「教学类」内容。

标签 vs 向量:直接对比

| 维度 | 标签匹配 | 向量匹配 | |------|----------|----------| | 怎么算 | 看标签重合几个 | 算 embedding 距离 | | 粒度 | 几个关键词 | 几百维数字 | | 能不能发现「长得像」 | 只能发现「长得一样」 | 能发现「感觉像」 | | 可解释性 | 一眼能看懂 | 偏黑盒 | | 冷启动 | 新内容没标签就推不出去 | 新内容只要能算 embedding 就能推 | | 计算成本 | 极低 | 较高 |

**最关键的一行**:标签匹配看的是**有没有共同词**,向量匹配看的是**整体气质像不像**。

一个对比鲜明的例子

你刚搜了「新手在家做菜」。

| 候选视频 | 标签 | embedding 距离 | |---------|------|---------------| | 视频 X:5 分钟教西红柿炒蛋 | 美食 / 教学 / 家常 | **0.15(很近)** | | 视频 Y:教做蛋糕(新手向) | 烘焙 / 教学 / 甜品 | 0.32(中等) | | 视频 Z:测评网红餐厅 | 美食 / 探店 | 0.85(很远) |

标签匹配下,X 和 Y 都打「教学」标签,权重差不多——系统分不清该主推哪个。向量匹配能看出 X 才是「教学 + 家常 + 新手」三件套完美命中,Y 是「教学 + 但不是家常菜」。

桥接:双塔的雏形

标签匹配和向量匹配,看起来像二选一——但**真实系统会两者都用、各取所长**。工业界最经典的玩法叫「**双塔**」:一边把用户变成向量(用户塔),一边把内容变成向量(内容塔),两边的向量算距离匹配。

它既保留了向量匹配的细粒度,又比「全量算每对用户和内容的距离」省力得多——这是工业级推荐系统的基础设施。

要点

**「基于标签」是关键词重合的匹配——简单可解释但粒度粗;「基于向量」是距离匹配的思路——能抓「气质像」的内容、更细粒度;真实工业系统往往两者结合(标签做粗筛、向量做精排),这正是「双塔」模型的核心思路。**

学习笔记

内容理解与经典匹配范式

一、内容标签:分类、关键词、实体

内容标签(Tag)就是给一段视频、一篇文章、一个商品贴上一组有限的、可枚举的「词」或「类目」,代替原始内容去匹配用户兴趣。

分类(Category):最高层的类目

层级化类目体系,类似生物分类学。抖音例子:一级(娱乐/知识/生活/美食/游戏)→ 二级(知识→科普/职场/育儿)→ 三级(职场→求职面试/简历技巧/职场沟通)。

关键词(Keyword):中层的主题描述

从文本里抽取出来的、描述内容主题的词或短语。

实体(Entity):细粒度的具体名词

文本中的具体名词对象:人名、地名、品牌、作品名、机构、产品名等。

三类标签的协同

三者层层嵌套、不是互斥:

三者一起构成视频的「内容画像」,召回和匹配环节会反复调用。

二、多模态内容理解

模态(Modality)定义

模态即信息的来源渠道。一条短视频里至少藏着四种:

「多模态」就是把这几种渠道同时喂给系统综合理解。

一条视频的处理流水线
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[统一内容表示]

每条分支:

模态互补与互相纠错

只靠任何一种模态都判断不准:

只有四种模态一起,系统才能很确定地判断:这是一条烹饪教学视频。多模态最实用的价值是**互相纠错**,避免被单一信号带偏。

三、内容 Embedding

标签撑不起细粒度区分

视频 A(60 秒教你在家三步做红烧肉)和视频 B(60 秒博主在店里吃红烧肉、边吃边评价)的标签都是「美食」「家常菜」「红烧肉」——但本质不同。标签太粗,撑不起「细粒度区分」。

Embedding 的定义与 DNA 类比

Embedding 给每条内容生成一串「有意义的数字」,编码了内容的所有特征:题材、风格、节奏、长度、情绪、对象人群、实体、动作、场景等。由深度学习模型从内容里「学」出来,吐出一串几百维的数字。

类比 DNA:

两条内容越像,对应数字串在数学上也越接近

两条内容越像,对应数字串在数学上也越接近。视频 A(教做红烧肉)的 embedding 跟其他教学类是一伙的,跟探店类是另一伙的——即便标签一字不差,embedding 也能区分「教学 vs 探店」的本质差异。

判断「像不像」的数学方法

判断「像不像」的数学方法。数字串很接近→距离近→内容像;差很远→距离远→内容不像。Embedding 把每条内容「钉」在一个高维地图上,相似的钉在一起、不同的离得远。

四、经典匹配:基于标签 vs 基于向量

配对问题的提出

内容侧已「读懂」(标签+embedding),用户侧也有「用户标签」和「用户 embedding」。关键问题:一个用户和一条视频,怎么「配对」?两种最经典、最根本的思路:基于标签的匹配、基于向量的匹配。

两种范式的类比:相亲的两种方式

推荐系统里:标签匹配 = A 阿姨;向量匹配 = 凭感觉。

基于标签的匹配(关键词匹配)

思路:用户标签 ∩ 内容标签,重合度越高越相关。

**优点**:简单、可解释、计算快。**缺点**:粒度太粗——两个视频标签完全一样,匹配结果也一样,但它们可能是完全不同的内容。

基于向量的匹配(距离匹配)

思路:用户 embedding 和内容 embedding 在高维空间里「距离近」就相关。

| 维度 | 标签匹配 | 向量匹配 |

| 维度 | 标签匹配 | 向量匹配 | |------|---------|---------| | 思路 | 清单逐条对 | 整体距离判 | | 颗粒度 | 粗(几个词) | 细(几百维数字) | | 优点 | 简单、可解释、计算快 | 能区分「标签相同但本质不同」的内容 | | 缺点 | 漏掉清单外的相似内容 | 相对黑盒、解释性弱 |

第 5 关 · 双塔召回、排序与冷启动

能用「两阶段筛选」讲清人向量与内容向量的相遇过程,并说清冷启动这一推荐系统的核心工程难题。

双塔模型直觉:人向量与内容向量

从相亲说起

想象朋友要给你介绍对象,桌上摆着 100 个人的资料卡,每张卡上有几十项:年龄、身高、学历、兴趣、职业、籍贯……朋友怎么帮你找出「最合适」的那个人?

最笨的办法是:拿你的资料和 100 张卡一一比对,看每张「像不像」。但「像不像」怎么量化?身高差几厘米算像?兴趣重合几条算像?学历差几级算像?每条规则都要人去拍脑袋定权重,越加越乱。

更聪明的办法:先想办法把**每个人**(包括你自己)都「压缩」成一小串数字——比如 [0.7, 0.3, 0.8, 0.5, ...] 这种几十到几百位的小数。这串数字就叫「**向量**」,它把一个人的所有特征信息编码进了一组数里。

压缩有一个关键要求:**越像的人,向量越接近**。两个都爱猫、都做运营、都是 90 后的人,数字串会很像;一个爱登山一个爱宅家的人,数字串会差很远。

这样,原本「看几十个标签比对」的事,就简化成了「算两串数字的距离」——你只需要算你的数字串和 100 个候选人的数字串之间的「远近」,离你最近的那几个就是最匹配的。

这就是双塔模型的灵魂:**把人变成点,把内容变成点,距离近就匹配**。

什么是「塔」?为什么叫「双塔」?

推荐系统里,**一边是用户(人)**,**一边是物品(视频、商品、文章)**。我们用两套独立的「压缩机器」分别处理这两边:

flowchart LR
    A[用户行为<br>历史兴趣画像] --> B[用户塔]
    B --> C[用户向量<br>一串数字]
    D[内容特征<br>标签作者主题] --> E[内容塔]
    E --> F[内容向量<br>一串数字]
    C --> G[算距离]
    F --> G
    G --> H[距离近则匹配]

两套塔**各自独立工作**,最后只在「算距离」这一步相遇——所以叫**双塔**。

一个具体例子:抖音的双塔

整个过程里,用户塔和内容塔互相「看不到」对方——它们各算各的,最后在向量空间里相遇。这带来一个工程上的巨大好处:**内容向量可以提前算好存起来**,用户发来一次请求,只需现算一次用户向量,然后从库里快速查「和这个用户向量最近的内容向量」即可。

双塔为什么能工作?

关键在两件事:

  1. **「像」和「不像」被压进了数字里**:训练时,系统会反复把「用户喜欢过」的内容拉得近、把没互动的拉得远。训练好之后,相似兴趣的用户和相似属性的内容自然就聚在一起。
  2. **距离计算极快**:两个几百维向量的距离,一行公式就出来,几毫秒能算完上百万对。

正是这套机制让「从百万候选里捞几百条」成为可能——下一节要讲的「召回」正是依赖于此。

**要点:** 双塔模型把人和内容分别压缩成空间中的两个「点」,通过训练让「用户会喜欢」的内容与用户向量的距离近、不喜欢的距离远;匹配就变成「在空间里找最近的点」。

召回:从百万到几百

从交友场景接着聊

上一节我们学会了「把人和内容都压成点,距离近就匹配」。但你打开抖音时,**库里可能有几千万条视频**——你的「数字分身」要和几千万个点挨个算距离吗?就算每个距离只需要 0.1 毫秒,几千万次也要几百秒,你早就划走换别的 App 了。

所以双塔向量召回只是「召回」这条流水线的一部分。召回的真正工作,是**在用户每一次「下拉刷新」的几百毫秒里,从几千万候选里捞出几百到一千条「可能喜欢」的,送进下一关排序**。

召回的关键词:广撒网

召回(Recall)的本质是**广撒网**——宁可捞多、捞杂,也绝不能漏掉真正想看的那条。

为什么这么设计?两个原因:

  1. **速度是硬指标**。用户的下一次滑动可能就在 0.5 秒后发生,整条推荐链路(召回+排序+展示)必须在这个窗口内跑完。
  2. **漏掉的代价太大**。排序环节再聪明,也只能在召回给它的「几百条候选」里挑。如果召回阶段就漏了用户真正爱看的那条,排序再精准也救不回来——好内容根本没进「决赛圈」。

所以召回宁可**捞多、捞杂、允许有错**,也不能「捞少、捞准、错过好货」。这是它和排序最大的不同——召回**牺牲精度换速度与覆盖率**。

多通道召回:多条腿走路

那怎么「广撒网」?答案是**多通道同时捞**,每条通道用不同的逻辑去理解「用户可能喜欢什么」。

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>精挑细选]

简单介绍几个常见通道:

每条通道单独看都不完美——双塔可能漏掉没被向量准确表达的小众内容,协同过滤可能漏掉刚发布还没人看的冷门视频,标签召回可能太死板……但**多条通道合在一起,漏网之鱼就少很多**。这就是「广撒网」的工程实现方式。

召回和排序的关系

记住一个比喻:

召回和排序的边界就是「几百到一千条」这个候选集。下一节要学的排序,就在这个候选集上做精细打分——它会同时考虑点击率、停留时长、点赞、关注、商业化等多个目标,挑出最该推给你的那几十条。

**要点:** 召回是「广撒网」式的初筛,从百万级候选中快速捞出几百到一千条送入排序;它牺牲精度换速度与覆盖率,宁可捞多捞杂也不能漏;实际系统通过「多通道召回」(双塔、协同过滤、标签、关注、热门、探索等并行)来降低漏网率。

排序:从几百到几十的多目标权衡

从面试官开始

上一节我们说到,召回像 HR 筛简历——从几千万候选里捞出几百到一千份进「面试」。那排序(Rank)就是真正的面试官:从这几百到一千条里,挑出最后要展示给你的那几十条。

但排序要做的事,远比「挑最可能点击的」复杂得多。

单目标的诱惑:点击率陷阱

如果排序只优化一个目标——比如「用户点击概率」——会发生什么?

短期内,点击率会涨。模型会发现「标题党」「封面图惊悚」「封面用反差大字」的视频更容易被点开,于是疯狂推这类内容。

但很快你就会发现:这类视频点开两秒就划走。停留时长暴跌。广告主看到你平台的「有效观看时长」在跌,广告报价也跟着降。用户虽然点得多,但越刷越烦,最终卸载。

**单目标优化的灾难:用短期点击换长期生态。** 这就是为什么排序环节必须多目标权衡。

排序要看哪些目标

一个成熟的推荐系统,排序阶段通常会同时盯住五到八个目标。常见的有:

每个目标背后,都是平台、用户、创作者、广告主中某一方的利益。排序系统本质上是在**替多方利益做权衡**。

头条的经典案例:三个目标同时打分

今日头条是国内最早大规模把「多目标排序」工程化的产品。公开资料里讲过,他们的排序模型在某个阶段,**同时给三条核心目标打分**:

  1. **点击概率**:用户会不会点
  2. **点赞概率**:点了之后会不会点赞
  3. **完播概率**:会不会看完

然后把这三个分数按一定权重合成一个「综合分」,按综合分排序。

flowchart LR
    A[每条候选视频] --> B1[点击概率模型]
    A --> B2[点赞概率模型]
    A --> B3[完播概率模型]
    B1 --> C[综合打分]
    B2 --> C
    B3 --> C
    C --> D[按综合分排序]
    D --> E[取 Top 几十条]
    E --> F[展示给用户]

为什么这三个目标放一起会有效?

**三个目标相互制衡,模型被迫学会「点开不会失望、看完会点赞」的内容——这才是平台真正想要的。**

权重不是死的:场景和阶段会变

更巧妙的是,这三个目标的权重**不是固定的**。平台会根据不同场景动态调整:

权重会变,模型也会跟着学——这意味着排序系统是在**一个不断漂移的「目标函数」上**工作的。

排序回到流水线

到这里,双塔召回+多通道召回+多目标排序,构成了推荐系统最经典的两阶段筛选:

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

核心机制有四步:

  1. **冷启内容分析**:视频刚上传,系统还没人看,但能立刻拿到内容本身的特征——标题、话题、画面里的物体(如出现火锅、出现猫)、音频(是 BGM 还是人声)。这些是「不要历史也能拿到」的特征
  2. **小流量试探**:把这条视频推给 200-500 个**最可能感兴趣的人**(基于内容特征匹配的兴趣人群)
  3. **关键指标考核**:看这 200-500 人里,**完播率、点赞率、评论率、转发率**怎么样。抖音内部对这些指标有阈值
  4. **阶梯放大**:指标达标 → 进入下一级更大流量池(1000-2000 人),再考核;不达标 → 停止放大,让它自然消亡

**这套机制的精妙之处**:每一条新视频都被「公平地」给过一次机会,但只有真正好的内容才能爬坡上去。这同时解决了「让金子发光」和「不浪费流量在烂内容上」两个目标。

系统冷启动:刚开张的店

**难题**:最极端的冷启动——平台本身是新的。没有用户、没有内容、没有数据。三个维度都是零。

**典型应对**:

抖音 2017 年后的快速崛起,背后很大一部分是系统冷启动的胜利——他们从今日头条继承了推荐算法的底子,又用「明星引流 + 创作者补贴 + 算法分发」三板斧快速填满了内容池。

把整个模块串起来

到这里,这一关的四块拼成了完整的图:

这四块回答的是一个连贯的问题:**「推荐系统为什么越用越懂你?」**——答案是:召回和排序负责日常精准匹配,闭环(你的行为回流成画像)让它越来越准,冷启动负责在「没数据」的极端情况下也能起步。

**要点:** 冷启动分三类——用户冷启动(没行为)、内容冷启动(没曝光)、系统冷启动(没一切);用户冷启动靠注册信息+试探、内容冷启动靠内容特征+阶梯式流量池试探、系统冷启动靠外部引入+人工种子;抖音新视频的「200→2000→20000」阶梯式曝光是内容冷启动的经典工程方案。

学习笔记

双塔召回、排序与冷启动 学习笔记

一、双塔模型:把人/内容压成「点」

**核心思想**:把用户和内容都压缩成向量(一串数字),距离近=匹配。

**抖音案例**:256 维向量,匹配时算余弦距离。最近的 N 条推给用户。

**两个关键优势**:

**工程红利**:内容向量可**提前算好存起来**,用户请求时只需现算一次用户向量,然后从库里快速查最近的内容向量。

二、召回:从百万到几百——「广撒网」

**本质**:从几千万候选里捞出几百到一千条可能喜欢的,送进排序。**牺牲精度换速度与覆盖率**。

**多通道召回**(多条腿走路,合在一起减少漏网):

  1. **双塔向量召回**:算综合相似度
  2. **协同过滤召回**:「看过 A 的人也看过 B」,抓群体行为规律
  3. **标签召回**:拿历史喜欢过的标签去捞新内容
  4. **关注召回**:关注的人新发内容优先
  5. **热门兜底**:全网爆款,对新用户特别重要
  6. **探索召回**:故意捞沾边内容,避免信息茧房,也用于发现新兴趣

**召回 vs 排序的比喻**:

三、排序:从几百到几十——多目标权衡

**单目标的灾难**:只优化点击率 → 标题党泛滥 → 完播暴跌 → 用户越刷越烦 → 平台生态恶化。**用短期点击换长期生态**。

**常见的多目标**(一个成熟系统通常同时盯住 5-8 个):

每个目标背后都站着平台、用户、创作者、广告主中的某一方。排序本质上是在**替多方利益做权衡**。

**头条经典案例**:同时给三个核心目标打分

**权重不是死的**:根据场景和阶段动态调整

→ 排序系统是在**一个不断漂移的目标函数**上工作的。

核心矛盾:系统需要数据才能工作,但你偏偏没数据

**核心矛盾**:系统需要数据才能工作,但你偏偏没数据。

用户冷启动

应对策略:

内容冷启动——抖音「阶梯式流量池曝光」

四步机制:

  1. **冷启内容分析**:视频刚上传就提取内容特征(标题、话题、画面物体、音频),**不需要历史数据**
  2. **小流量试探**:推给 200-500 个最可能感兴趣的人(基于内容特征匹配)
  3. **关键指标考核**:看完播率、点赞率、评论率、转发率是否达标
  4. **阶梯放大**:达标 → 进入下一级更大流量池(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 次点击的统计模式就很难骗人:

信号从『一两个孤立的点』变成『成百上千条带权重的证据』,**画面的清晰度是指数级提升的**。

2. 特征细化:从「喜欢美食」到「喜欢成都街边小馆」

第一天的画像可能是『这个人喜欢美食』——粒度很粗,推荐只能推美食大类。一周后细化到『川菜和日料』。一个月后是『成都街边小馆 > 精致日料 > 轻食』。三个月后是『川渝方言 + 路边摊 + 老板亲自下厨』这种**人自己都说不清**的细分偏好。

这种细化是双向的:系统把你的行为往更细的标签上靠,**你自己反思时也说不清『我为什么喜欢这种』**——但行为数据替你说了。

3. 置信度提升:敢推「小众但精准」的内容

前几次循环系统不敢冒险,只敢推『大众热门 + 你的大类兴趣』——保守策略,怕推错让你划走。

随着置信度提升,系统开始『敢推』:小众作者、长尾兴趣、还没火的内容、跨边界但有信号的内容。这正是为什么你刷到后面会发现『这条视频播放量才几百但就是戳中我』——系统已经敢为你冒一点险了。

一个具体对比:第 1 天 vs 第 30 天 vs 第 300 天

假设你刚装抖音,三天前点赞了一条成都街边小吃的视频,完播了:

**『越用越准』不是神秘现象,而是 9000 多次循环累积出来的效果**。

一个隐藏的副作用:你也在被塑造

最后留一个伏笔——今天不展开讲。

正反馈不只让系统『更懂你』,**反过来也在塑造你**。你看到什么、被什么打动、关注什么新领域、视野往哪倾斜,都在被推荐流悄悄『训练』。

这正是下一节『信息茧房』要讲的事。今天先记下这个直觉:正反馈是一把双刃剑——越精准也意味着越狭窄。

要点

**「正反馈」不是循环本身,而是循环的每一圈都比上一圈更精准——信号积累、特征细化、置信度提升三者叠加,让系统从『瞎猜』到『稳准』再到『敢推小众』。**

![三个月里同一杯咖啡的变化——懂你不是一瞬间,而是每天一点点。](https://tma-media.oss-cn-beijing.aliyuncs.com/tma/illustrations/a8b7a2b9-7e7d-45f6-8746-54645491bd94.jpg)

信息茧房与回音壁

信息茧房与回音壁

一个类比:只会回声的山谷

想象你站在一个圆形山谷里喊「今天天气真好」。声音撞到四周的山壁,一遍遍反弹回来,最终你听到的全部是「今天天气真好」「今天天气真好」「今天天气真好」——每一个回声都和自己一模一样。

但山谷外面,可能正在下雨、可能正在下雪、有人正在为堵车发愁。你完全不知道。

**推荐系统给每个人造的,就是这样一个山谷**。你每点一次赞,系统就回你一个「类似的东西」;每一次完播,又回一个;每一次跳过,避开。三个月后,你的 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」——理论上让你主动拒绝某类内容。

**问题**:这个按钮管的是**当前不喜欢的**(你明确划过的),但**管不到你根本看不到的东西**。你不可能对一个「你根本不知道存在」的内容点「不感兴趣」——这正是茧房的核心悖论。

这些「破茧」手段到底有没有用?

**直说:目前的破茧手段大多是「象征性大于实际性」。**

原因有三:

  1. **优化目标对立**:平台的核心 KPI 是「用户停留时长 / 互动率」——这是一个**让用户越看越爽**的指标。任何让人跳出舒适区的内容,KPI 上都是负贡献。从商业上,平台没有动力真正破茧。
  2. **反馈信号会反噬**:上面提到,破茧内容被划过的概率更高,系统会进一步减少——这是**结构性困境**,不是工程问题。
  3. **用户没有意识到**:绝大多数用户**不知道自己的 Feed 是窄的**——因为窄的算法推送的内容质量更高、更爽,所以用户主观感受是「抖音越来越懂我」,而不是「抖音让我变窄了」。

**真正有效的破茧**需要满足两个条件之一,但目前都很难做到:

要点

**信息茧房是正反馈机制的必然副产品——每一次循环都在收敛,最终系统替你的视野画了一个你看不到的圈;平台现有的破茧手段在反馈循环下大多会被反噬,真正破茧需要用户意识到问题或平台改变 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 曝光全是「陌生人」,数据要冷启动得多。

**头部博主不是赢在内容,是赢在系统结构**。

为什么偏差会「累积」而不是「收敛」?

直觉上,跑得越久应该越「稳」对吧?偏差累积恰恰相反——**它会越滚越大**,有三个原因:

这就是为什么「**数据越多 ≠ 越准**」——关键看数据是干净的,还是已经被自己的反馈循环污染过的。

缓解思路:业界都在做什么?

既然偏差累积是反馈循环的结构性产物,缓解也得是**结构性**的工程,而不是调几个参数那么简单:

1. 探索机制(Exploration)

最经典的思路是**主动给「不确定」的内容一次机会**。类比:餐厅服务员**每隔几周主动端一道你没点过的菜**给你试——不是为了这顿饭好吃,而是为了更新他对你口味的认知。

技术上,算法会刻意保留 5%-15% 的流量给「**没怎么给你推过的内容**」,而不是全部塞给「历史最可能点击」的内容。这部分内容转化率通常偏低,短期内会拉低 KPI,但长期看是**防止画像僵化**的关键。

2. 多样性 / 随机打散

上一节讲过,平台会在你的 Feed 里强制插入「跨类内容」。本质是用**工程强制力**对抗反馈循环的收敛性——哪怕你划过 9 次,第 10 次可能就有你真正喜欢的新领域。

3. 冷启动保护

新用户 / 新内容 / 新博主,平台会**单独给一段「保护期流量」**,不完全按表现排名。YouTube 给新视频的初始曝光不依赖历史表现,小红书会给新笔记一个「观察期」流量池。

本质上,是承认「**初始信号噪声太大,不能让它决定生死**」。

4. 长尾内容专项

很多平台(豆瓣、知乎、B 站)都有「冷门内容」「小众推荐」专门板块——这部分的流量**不参与主推荐流的优化目标**,而是单独分配。相当于给「长尾」一个不被赢家通吃压死的庇护所。

5. 反馈信号降噪

不是所有「行为」都代表「喜欢」:

现代系统会用「**加权反馈**」——给不同行为不同的权重,而不简单地把所有点击都当成「喜欢」。这是缓解「信号污染」的工程手段。

缓解手段的结构性局限

但说实话——**这些缓解手段大多是在「夹缝里求生存」**:

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 的反馈循环不太一样。你给它的点赞、点踩、对话历史,会被存在「记忆」里,影响它**下次生成的风格和内容**。但因为每次回答都是新生成的,闭环不是在「挑」——而是在「调教一个越来越贴你的口吻」。

你可以做一组对比实验:

**前者是「挑更对的菜」,后者是「养一个更懂你的厨子」。**

冷启动:起点完全不同的两道难题

抖音:内容不冷,用户冷

一个新用户打开抖音,**算法不知道他喜欢什么**。所以抖音给你推「热门内容」作为冷启动的兜底——这是「内容库」的优势:哪怕不知道你喜欢什么,从已有的爆款里随便挑,至少不会太差。

**内容本身不冷启动**——一个视频上传后,它的存在不依赖用户数据;它能不能火,取决于被推给多少人和那些人怎么反应。

ChatGPT:用户不冷,但「问题」无限冷

新用户打开 ChatGPT,他**可能问任何问题**——「写代码」「翻译论文」「讲个笑话」「扮演我奶奶」。没有任何「热门问题」可以兜底,因为问题空间是**开放的、无限的**。

但 ChatGPT 本身有个巨大的「预训练知识库」——大模型在训练阶段见过海量文本,所以**它有知识基础,不需要内容冷启动**。

这构成一个有意思的对照:

评估方式:可量化 vs 难量化

这是最体现「范式差异」的一环。

抖音:行为即答案

抖音的评估非常直接——A/B 测试两个推荐算法,看**点击率、停留时长、完播率**等指标哪个高。**用户的实际行为就是答案**,因为「用户喜不喜欢」这个事,用户是主动表达出来的(点/划/看多久)。

ChatGPT:没有标准答案

ChatGPT 的评估**没有天然指标**。同一个问题「如何准备面试」,可以给出无数合理回答——A 回答全面但啰嗦,B 回答精炼但漏点,C 回答有趣但不专业。**哪个更好?没有客观答案。**

业界目前用三种近似方法:

**所以 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

**两条路径看起来对称,本质完全不同**:

要点

**抖音的「推荐」是从固定候选池里挑,ChatGPT 的「推荐」是即时生成内容——这一个差异决定了:前者闭环围绕画像旋转、内容不参与循环、行为即答案;后者闭环围绕记忆旋转、每次回答都是新内容、评估没有标准答案。**

生成式 AI 与传统推荐的融合趋势

生成式 AI 与传统推荐的融合趋势

一个类比:自助餐厅的「升级三件套」

回想上一节那个自助餐厅(A 店)的类比——100 道菜全做好摆台上,算法从里面挑。

如果这家餐厅要升级,有三种思路:

  1. **让后厨多出新品**——生成式 AI 帮你做菜
  2. **每道菜配个精致的小卡片**——生成式 AI 帮你写推荐理由
  3. **让大厨直接跟你聊天点菜**——生成式 AI 变成对话界面

这就是当前推荐系统被生成式 AI 重塑的**三个最显眼的方向**。它们不是替代原来的推荐算法,而是在算法之上、之前、之后**长出新的一层**。

方向一:生成式 AI 作为「内容生产工具」

传统推荐系统最头疼的问题之一是**「库存不够」**——尤其是小众兴趣、新发布的内容、冷门话题,因为候选池里没货,算法再聪明也推不出来。

生成式 AI 直接改变这一点:

**关键变化**:候选池从「人类创作者上传的有限内容」,变成「AI 可以无限量生成的新内容」。这从根上缓解了推荐系统的「内容荒」。

但这里有个新风险——**AI 生成内容被推荐给用户,用户的反馈又训练了推荐系统,形成新的反馈循环**。如果 AI 内容本身带有偏差(比如总是生成某种审美),整个系统的「茧房」可能更深。

方向二:生成式 AI 作为「解释生成器」

你有没有这种体验:抖音给你推了一条视频,你划过去——但心里嘀咕「为什么给我推这个?」

以前推荐系统是**黑盒**:算法算出来你可能喜欢,但说不出为什么。现在大模型可以**生成自然语言解释**:

> 你最近经常看 Python 教程和爬虫实战,这条视频讲的是用 Python 自动化处理 Excel,是你关心的方向。

这种「解释生成」的价值有三层:

**这并不是大模型在替你做推荐决定**——推荐本身还是那个传统算法(挑菜的还是那个服务员),大模型只是在旁边**写了一段「为什么给你端这道菜」的小卡片**。

方向三:对话式推荐——从「划」到「聊」

这是最颠覆的方向。**推荐系统不再是一份「今日 10 条」的清单,而是一段对话。**

例子:

**传统推荐 vs 对话式推荐的本质区别**:

| 维度 | 传统推荐 | 对话式推荐 | |------|---------|-----------| | 交互方式 | 被动接收+划卡 | 主动表达需求+追问 | | 需求表达 | 只能从行为中「猜」 | 可以用自然语言「说」 | | 单次结果 | 一次性 10 条 | 持续精化,越来越准 | | 反馈方式 | 点/划/停留 | 文字调整、追问 |

**注意**:对话式推荐背后**仍然需要传统的召回-排序算法**——AI 不会真的「想」出哪条视频好,它把自然语言转化为搜索/筛选条件,再调用老系统。

所以更准确的说法是:**生成式 AI 是用户和传统推荐系统之间的「翻译官」**。

三层叠加的完整图景

flowchart TD
    U[用户] -->|表达需求或反馈| L1
    L1[生成式AI对话界面] -->|翻译为筛选条件| L2
    L2[传统召回+排序算法] -->|候选集| L3
    L3[生成式AI解释生成] -->|带解释的推荐结果| L1
    L2 -->|从内容池中选| P1[人类创作者内容]
    L2 -->|从内容池中选| P2[AIGC生成内容]

**底层是不变的传统推荐漏斗**,三层生成式 AI 分别在:

一个具体场景:AI 购物助手

你在淘宝看到一件大衣,想找同款但更便宜的:

  1. 你发个截图给 AI 助手 → 大模型理解图片,提取「风格、颜色、版型」特征
  2. AI 把这些特征转化为商品检索条件 → 触发传统商品召回
  3. 传统算法从商品库挑出 50 个候选 → 排序出 Top 10
  4. 大模型再为 Top 10 各写一句「为什么推荐给你」→ 给你看
  5. 你说「想要羊毛的,预算 500 以内」→ 大模型理解,调整筛选条件,重复 2-4 步

**传统推荐算法没换一根头发**——它仍然是那个「挑菜的」;但**用户体验被彻底重塑**了。这就是「融合」的精髓:AI 没取代推荐系统,而是把它包了起来。

要点

**生成式 AI 正在从「内容生产」「解释生成」「对话界面」三个方向改造传统推荐系统——但它不是替代者,而是叠加在传统召回排序漏斗之上、之前、之后的新一层。理解这一点,就看懂了未来 3-5 年推荐产品形态的核心走向。**

学习笔记

反馈循环的正反馈机制

推荐系统靠多轮正反馈循环让「越用越准」。

**「正」的核心**:每一轮的结果成为下一轮更好的输入,每一圈都比上一圈更精准。

**三个机制**:

  1. **信号积累**:单次点击是噪声,但成百上千次点击的统计模式很难骗人。信号从孤立点变成带权重的证据,画像清晰度指数级提升。
  2. **特征细化**:画像从粗粒度(如「喜欢美食」)细化到细粒度(如「川渝方言 + 路边摊 + 老板亲自下厨」),最终细到人自己都说不清。
  3. **置信度提升**:前几次只敢推「大众热门 + 大类兴趣」的保守策略;置信度提升后敢推小众作者、长尾兴趣、还没火的内容。

信息茧房与回音壁

两者常一起发生:信息范围变窄 → 接触的观点变窄 → 观点越来越极端 → 更难接受对立信息 → 茧房越织越厚。

**形成机制**:每一次循环都强化已有偏好,候选池里其他领域的内容被系统性淘汰。一个「精准」的系统会主动放弃让你发现新兴趣的机会——算法替视野划了边界,而且不告诉你边界在哪。

**平台破茧手段**:

偏差累积与缓解思路

**三方偏差**:

  1. **内容侧:赢家通吃**——行业公开数据显示 80% 播放量集中在不到 5% 头部内容。算法用晋级链:1000 曝光 → 10万 → 百万 → 千万。初始小流量池里的随机噪声决定后续命运。这叫「曝光的马太效应」:强的越强、弱的越弱,指数级。
  2. **用户侧:沉默的大多数**——高活跃用户(每天 2 小时)数据是低活跃用户(偶尔刷一次)的几百倍,算法系统性「偏心」数据多的人。
  3. **创作者侧:头部博主护城河**——粉丝 100 万的博主初始 1000 曝光里至少 200 是老粉,几乎必定点击;新人同样发一条,初始 1000 曝光全是陌生人。头部博主赢在系统结构,不是内容。

**偏差累积的三原因**:

抖音 vs ChatGPT:两类范式的关键差异

| 维度 | 抖音 | ChatGPT | |------|------|---------| | 候选池 | 固定的:几十亿条预存内容 | 动态的:每次现场生成 | | 核心动作 | 检索 + 排序 | 生成 | | 一次「推荐」本质 | 选 10 条已有视频 | 写一段新文字 |

**类比**:抖音是自助餐厅(从摆好的菜里挑,端来你点过的菜),ChatGPT 是现做大厨(现场炒一盘以前不存在的菜)。

**闭环差异**:

**冷启动对照**:

生成式 AI 与传统推荐的融合趋势

**升级三个方向**(自助餐厅类比的延伸):

  1. **生成式 AI 作为「内容生产工具」**——解决传统推荐「库存不够」的问题(小众兴趣、新发布、冷门话题)。例:抖音 AI 数字人主播用大模型生成口播文案 + 数字人配音批量化生产短视频;小红书 AI 试穿、AI 模特图。
  2. **每道菜配精致小卡片**——生成式 AI 帮你写推荐理由。
  3. **让大厨直接跟你聊天点菜**——生成式 AI 变成对话界面。

**本质**:生成式 AI 不是替代原推荐算法,而是在算法之上、之前、之后长出新一层。