字节跳动系统设计面试真题:设计抖音推荐系统的完整思路
3年后端经验面试字节跳动系统设计,详细讲解设计抖音推荐系统的完整过程,包括召回层、排序层、重排层、实时特征更新、A/B实验和冷启动策略
字节跳动系统设计面试真题:设计抖音推荐系统的完整思路
背景介绍
我是在2024年3月面的字节跳动,岗位是后端开发工程师,3年经验。说实话,字节的系统设计面跟我想象的完全不一样——不是那种"画个架构图就完事"的套路,而是真的会追着你问细节,问到你答不上来为止。我面的这个组正好是抖音推荐方向,所以面试官直接让我设计抖音的推荐系统。当时我紧张得手心都在出汗,但好在之前准备过推荐系统的通用方案,所以还是硬着头皮撑下来了。下面是我对这次面试的完整复盘。
面试流程复盘
面试官是一位看起来三十出头的工程师,自我介绍说是抖音推荐架构组的。整个面试大概50分钟,节奏非常紧凑。
前5分钟:面试官简单介绍了面试流程,然后直接进入正题:"请你设计一个类似抖音的短视频推荐系统。"我按照之前准备的框架,先问了一堆需求澄清的问题。
5-15分钟:需求澄清阶段。我问了以下几个关键问题:
1. 用户规模?——面试官说"假设日活3亿"。
2. 推荐目标?——"最大化用户观看时长和互动率"。
3. 实时性要求?——"用户刚看完一个视频,下一个视频就要能反映这个行为"。
4. 冷启动怎么处理?——"新用户和新视频都要考虑"。
5. 内容安全?——"需要内容审核机制"。
面试官对我问的这些问题似乎比较满意,点了点头说"继续"。
15-35分钟:这是最核心的环节,我按照召回→排序→重排三层架构来讲解。面试官在每个环节都追加了深入的问题,比如"协同过滤的冷启动怎么解决?""精排模型用的什么?""怎么保证推荐多样性?"我逐一回答,有些回答得比较流畅,有些则磕磕绊绊。
35-45分钟:面试官开始追问工程实现细节,比如"特征怎么实时更新?""A/B实验怎么做?""怎么处理视频的embedding?"这部分我觉得自己回答得一般,有几个点确实没想清楚。
最后5分钟:面试官让我问问题,我问了团队的技术栈和推荐系统的迭代节奏。
真题汇总:设计抖音推荐系统
一、整体架构设计
我画了一个三层架构图:召回层(Recall)→排序层(Ranking)→重排层(Re-ranking)。面试官看了一眼说"基本框架没问题,展开讲讲每一层"。
二、召回层设计
召回层的目标是从数亿条视频中筛选出几千条候选集。我设计了四路并行召回:
1. 协同过滤召回:基于用户行为矩阵,用ItemCF找到相似视频。面试官追问"冷启动怎么办",我回答新视频先走内容召回,积累足够行为数据后再加入协同过滤池。
2. 内容召回:基于视频的标签、分类、embedding做相似推荐。这里我提到了用双塔模型分别提取用户特征和视频特征,然后做向量内积。面试官追问"向量检索用什么",我回答FAISS或HNSW,支持十亿级向量的毫秒级检索。
3. 热门召回:按地区、时段统计热门视频,保证新用户也能看到优质内容。面试官追问"怎么避免信息茧房",我回答热门召回只占候选集的一小部分(约10%),并且会加入随机探索机制。
4. 社交召回:关注的人看过的视频、好友点赞的视频。这个召回路径的点击率通常最高,但覆盖面有限。
面试官对召回层的设计基本认可,但指出了一个我遗漏的点:召回去重。用户看过的视频、不感兴趣的视频需要在召回阶段就过滤掉,否则会浪费排序层的计算资源。
三、排序层设计
排序层的目标是从几千条候选中精选出几百条。我分了粗排和精排两步:
1. 粗排:用轻量级模型(如双塔模型)快速打分,把几千条候选缩减到几百条。核心要求是低延迟,每个视频的打分时间控制在1ms以内。
2. 精排:用深度学习模型(如DIN、DIEN、MMOE)做多目标优化。我详细讲了精排的几个关键设计:
- 多目标优化:同时预测点击率(CTR)、完播率、点赞率、评论率、分享率,最终用加权公式融合。面试官追问"权重怎么定",我回答"通过线上A/B实验调优"。
- 特征工程:用户特征(历史行为序列、画像标签)、视频特征(时长、清晰度、标签embedding)、上下文特征(时间、网络、设备)。其中用户行为序列是最重要的特征,用Attention机制提取与当前候选视频相关的行为。
- 训练数据:用曝光未点击作为负样本,但要注意样本选择偏差问题。面试官追问"怎么解决",我回答用随机负采样补充未曝光样本。
四、重排层设计
重排层的目标是在精排结果上做业务规则调整和多样性保证:
1. 多样性控制:用MMR(Maximal Marginal Relevance)算法,在相关性和多样性之间取平衡。避免连续推荐同类视频。
2. 业务规则:广告插入位、运营活动视频保量、敏感内容过滤。这些规则会覆盖模型排序结果。
3. 上下文调整:根据当前时间段(如深夜推助眠内容)、网络状态(弱网推短视频)做动态调整。
五、实时特征更新
这是面试官重点追问的环节。抖音推荐系统的核心优势是实时反馈——用户刚看完一个搞笑视频,下一条就要推类似的。
我的设计方案:用户行为→Kafka→Flink流式处理→特征更新→模型推理。
具体来说,用户的每次播放、点赞、划走行为都实时写入Kafka,Flink消费后更新用户的实时特征(如最近10条观看记录、当前session兴趣标签),更新后的特征写入Redis,精排模型推理时从Redis读取。
面试官追问"实时特征的延迟要求",我回答"端到端延迟控制在500ms以内"。面试官又问"怎么保证这个延迟",我提到了几个优化点:Flink用滚动窗口而非事件时间窗口减少等待;Redis用Pipeline批量读写;模型推理用GPU推理服务。
六、A/B实验平台
面试官问"你怎么验证推荐算法的效果"。我讲了A/B实验的设计:
1. 分层实验:召回层、排序层、重排层各有一层实验,不同层的实验正交,互不影响。这样召回层实验A和排序层实验B可以同时运行。
2. 流量划分:按用户ID哈希分桶,保证同一用户始终在同一组。实验组通常占5%-10%流量。
3. 指标监控:核心指标(人均观看时长、互动率)+护栏指标(负反馈率、举报率)。护栏指标不能恶化,否则实验立即回滚。
七、冷启动策略
新用户冷启动:注册时选择兴趣标签→热门召回+兴趣标签召回混合→快速积累行为数据→逐步切换到个性化推荐。
新视频冷启动:新视频先进入探索流量池(约5%流量),根据初始反馈决定是否扩大推荐。表现好的视频会逐步进入更大的流量池,类似"赛马机制"。
心得建议
1. 推荐系统的面试一定要按"召回→排序→重排"三层来讲,这是业界标准框架,面试官一看就知道你懂行。
2. 不要只讲算法,要讲工程实现。面试官更关心你怎么把模型落地,而不是模型本身有多先进。实时特征更新、A/B实验、冷启动这些工程问题才是区分度。
3. 主动提trade-off。比如"粗排用简单模型牺牲精度换延迟,精排用复杂模型牺牲延迟换精度",这种表述非常加分。
4. 准备一些具体数字。比如"召回层从10亿筛选到5000,粗排从5000筛选到500,精排从500筛选到100"。有数字比纯文字更有说服力。
5. 字节的面评风格是"追到底",面试官会一直追问直到你答不上来。这是正常的,不要慌,能答到什么程度就答到什么程度。
FAQ
Q:字节系统设计面一般面几轮?
A:通常2-3轮系统设计面,第一轮偏通用架构,第二轮偏具体业务场景,第三轮可能是跨领域的综合题。
Q:推荐系统面试需要了解哪些论文?
A:Deep Interest Network(DIN)、Deep Interest Evolution Network(DIEN)、Deep & Cross Network、Wide & Deep Learning。不用每篇都精读,但核心思想要能讲清楚。
Q:没有推荐系统经验怎么办?
A:可以从通用系统设计角度出发,把推荐系统拆解为"数据采集→特征工程→模型训练→在线服务"四个模块来讲解。面试官更看重你的系统设计能力,而不是推荐算法的专业知识。