系统设计面试常考题,详解候选生成→排序→嵌入→反馈循环全链路,涵盖embedding、冷启动、延迟优化等工程难点,是准备面试和理解推荐架构的好材料。
你有没有过这样的经历:打开 Netflix 时完全不知道想看什么,结果几秒钟内就找到了感兴趣的内容?
这并非偶然。
这背后是一套精密的推荐系统,它要回答一个根本性问题:
此刻应该向这位用户展示什么内容,才能最大化他观看的概率?
这个问题使得推荐系统成为机器学习系统设计中最有趣的问题之一。
同时这也是一道很好的面试题,因为解决它需要的远不止选择一种 ML 算法。
你需要考虑数据、用户行为、候选生成、排序、Embedding、反馈循环、可扩展性、延迟、实验以及业务目标。
假设你遇到这道 ML 系统设计面试题:
设计一个 Netflix 风格的电影和电视节目推荐系统。
一种 naive 的理解可能是:
推荐用户会喜欢的电影。
但"喜欢"很难定义。
喜欢一部电影意味着:
看完另一集?
给它一个正面评分?
我们可以将目标表述为:
根据用户观看或参与的概率,对可用内容进行排序。
现在我们有了一个可衡量的东西。
推荐问题就变成了排序问题。
面对数万条潜在内容:
我们希望 ML 模型能估算类似这样的东西:
P(观看 | 用户, 内容, 上下文)
然后根据预测的相关性对候选进行排序。
想象构建一个最简单的推荐引擎。
我们可以选取 20 部最受欢迎的节目,展示给所有人。
用户打开应用
↓
查找热门内容
↓
按热度排序
↓
展示前 20 部
这在最初会相当有效。
但有一个主要问题:
所有用户得到的推荐几乎相同。
科幻
惊悚
科技
悬疑
爱情
喜剧
剧情
家庭
向两位用户展示相同的推荐,会浪费关于他们偏好的有价值信息。
这就是个性化变得重要的地方。
让我们改进系统。
假设某人经常看科幻电影。
我们的推荐引擎可以简单地推荐:
更多科幻电影。
但还有另一个问题。
推荐系统可能会被困在用户的历史偏好中。
这就形成了我们所说的推荐泡泡。
用户不断看到:
科幻
科幻
科幻
科幻
科幻
但也许他们会非常喜欢一部心理惊悚片。
他们只是还没有发现而已。
因此,一个强大的推荐系统需要平衡两个概念:
推荐我们有把握用户会喜欢的内容。
引入用户明显历史偏好之外可能有兴趣的内容。
这是设计推荐系统时的一个重要概念。
发现这些隐藏兴趣的一种方式是通过协同过滤。
想象以下情形。
怪奇物语
暗黑
黑镜
怪奇物语
暗黑
黑镜
心理猎人
他们的观看模式高度重叠。
因此,系统可以推断:
如果用户 B 喜欢《心理猎人》,用户 A 也有相当大的概率会喜欢它。
注意一个有趣的现象。
推荐不一定基于类型。
它是基于用户之间的行为相似性。
在规模化情况下,这些关系变得极其强大。
数百万用户创造了如下模式:
用户 → 内容 → 交互
ML 模型可以发现这些交互中的关系,而这些东西是人类难以手动定义的。
推荐系统可以从两种主要类型的反馈中学习。
显式反馈
用户主动告诉你他们的偏好。
⭐⭐⭐⭐⭐ 评分
👍 喜欢
👎 不喜欢
这些信息非常有价值。
但有一个问题。
大多数用户不会对他们看过的每一部内容进行评分。
这就是为什么现代推荐系统大量依赖隐式反馈。
隐式反馈来自观察行为。
电影点击
观看时长
完成百分比
剧集完成
重看行为
浏览历史
搜索行为
跳过行为
浏览时长
用户 A 给一部电影:
⭐⭐⭐⭐⭐
用户 B 把整部电影看了两遍。
哪个信号表示更强的参与度?
这就是为什么行为数据变得非常有价值。
一旦我们收集了交互数据,就需要将其转化为有意义的特征。
我们可以将特征大致分为三类。
用户特征:
观看历史
偏好类型
平均观看时长
完成率
语言偏好
近期交互
历史参与度
内容特征:
类型
演员
导演
上映年份
语言
热度
时长
内容分级
上下文特征经常被忽视。
同一个人在不同情境下可能有不同行为。
一天中的时间
星期几
设备
会话历史
近期搜索
近期观看
例如,一个人在:
周末晚上
的工作日晚上
的偏好可能非常不同。
现在我们面临一个重要的可扩展性问题。
想象目录包含:
100,000+ 部电影和节目
每次有人打开应用时都使用昂贵的 ML 模型对每条内容进行排序,是低效的。
相反,推荐系统通常会引入候选生成阶段。
目标很简单:
将数千种可能的推荐缩减为较小的有潜力候选集合。
100,000 条内容
↓
候选生成
↓
500 个候选
↓
排序模型
↓
50 个候选
↓
过滤 + 重新排序
↓
最终推荐
这大大减少了计算量。
现代推荐系统经常使用 Embedding 来表示用户和内容。
不用成千上万条手动创建的规则来表示一部电影,我们可以将其表示为一个向量。
电影 A
[0.12, 0.81, 0.34, 0.72, ...]
用户也可以有 Embedding:
用户 A
[0.15, 0.79, 0.31, 0.69, ...]
现在推荐可以涉及找到接近用户偏好向量的内容向量。
用户 Embedding
↓
向量相似度搜索
↓
相似内容 Embedding
↓
候选电影
近似最近邻技术可以使这种检索在超大目录规模下依然高效。
候选生成回答:
这个用户可能会喜欢什么?
在这些候选中,哪些应该优先展示?
假设候选生成产生了:
500 部电影
排序模型使用用户、内容和上下文信号来评估这些候选。
从概念上讲,我们想要:
分数 = 模型(用户, 电影, 上下文)
生成类似这样的结果:
电影 A → 0.94
电影 B → 0.89
电影 C → 0.84
电影 D → 0.76
更高的分数代表根据我们所选目标更强的预测相关性或参与度。
排名最高的候选成为推荐。
仅靠排序仍然不够。
假设模型生成了:
电影 1 → 动作
电影 2 → 动作
电影 3 → 动作
电影 4 → 动作
电影 5 → 动作
从技术上讲,这些推荐的预测分数可能都很高。
但体验不一定好。
因此,另一个层级可以引入约束,例如:
多样性
新鲜度
内容可用性
已观看内容
地区可用性
年龄限制
业务规则
最终推荐列表既相关又有用。
综合以上,我们的 Netflix 风格推荐管道可能长这样:
用户交互
↓
数据收集层
↓
特征管道
↓
用户 / 内容 Embedding
↓
候选生成
↓
排序模型
↓
过滤 + 重新排序
↓
个性化推荐
↓
用户交互
↓
反馈循环
↺
每次交互都会生成新信息。
这些信息可以改进未来的推荐。
这就形成了一个持续的 ML 反馈循环。
构建模型是不够的。
离线 ML 指标可能包括:
Precision@K
Recall@K
NDCG
Mean Reciprocal Rank
但生产推荐系统也应该关注业务和行为指标。
观看时长
推荐 CTR
完成率
会话时长
留存
内容发现
归根结底,推荐系统应该改善用户体验——而非仅仅最大化某个离线 ML 分数。
假设我们创建了一个新的排序模型。
现有模型产生:
CTR = 7.2%
我们的离线实验表明新模型更好。
我们应该立即替换生产模型吗?
我们可以进行 A/B 测试。
A 组
↓
现有推荐模型
B 组
↓
新推荐模型
然后比较如下指标:
CTR
观看时长
完成率
留存
如果 B 组持续表现更好,且没有损害其他重要指标,新模型可以逐步推广。
这个问题最重要的教训不是协同过滤。
也不是排序模型。
机器学习系统设计始于定义我们实际在优化什么。
在选择算法之前,先问:
我们在解决什么问题?
成功的定义是什么?
我们有哪些信号?
应该收集什么数据?
存在哪些约束?
如何提供预测?
如何衡量成功?
系统如何从反馈中学习?
只有在回答了这些问题之后,我们才应该开始讨论模型。
我们的简化架构变成:
用户行为
↓
数据收集
↓
特征工程
↓
用户 + 内容 Embedding
↓
候选生成
↓
排序
↓
过滤
↓
多样性 / 探索
↓
推荐
↓
A/B 测试
↓
反馈循环
这就是一个可扩展推荐平台的基础。
同样的架构不限于电影。

类似的原则可以驱动各类推荐:
🛒 电商产品
📱 社交媒体信息流
底层的 ML 系统设计原则高度相似。
如果面试官问:
"你会如何设计 Netflix 的推荐系统?"
不要立即回答:
"我会使用协同过滤。"
"首先,让我们定义我们要预测什么行为,以及我们要优化什么业务结果。"
这一个区别就把对话从讨论 ML 算法转变为设计 ML 系统。
这就是从:
软件工程师 → ML 工程师 → AI/ML 架构师 所需的心态。🚀
如果你对机器学习系统设计、推荐系统、RAG、Agentic AI、LLM 架构和 AI 系统设计感兴趣,请持续关注。
我会逐一拆解这些系统。🚀