机器学习系统设计面试指南:从需求澄清到上线监控的完整框架

· 约 6 分钟 ·
本文目录(12 节)

拿到“设计一个推荐系统”这样的题目,先别急着画模型结构。需要确定服务对象、反馈信号、响应时间和评估目标,再判断应该做分类、排序还是检索。下面按这个顺序组织面试回答,让每个组件都能对应一个明确需求。

这篇给一套可复用的六步框架,配两个完整案例。目标:下次遇到任何 ML 设计题,你都有稳定的输出节奏。

前置阅读:建议先读 推荐系统入门、机器学习基础与 Scikit-learn、A/B 测试。

六步框架总览

1. 澄清需求(5min)→ 2. 框定 ML 问题(5min)→ 3. 数据与特征(10min)
→ 4. 模型设计(10min)→ 5. 评估体系(5min)→ 6. 上线与监控(5min)

时间分配是信号:前两步和后两步合计占一半——面试官通过它们判断你是不是只会调包。黄金法则:每一步说出口之前,先讲「为什么」。

第一步:澄清需求——别急着答题

拿到「设计短视频推荐系统」就埋头画架构图是新手标志。先问清楚:

  • 业务目标:优化什么?观看时长?完播率?留存?广告收入?——不同目标导出完全不同的建模。追问一句「如果只能选一个北极星指标」通常有惊喜。
  • 规模:DAU 千万级和十万级,方案天差地别(前者必须召回-排序漏斗,后者一个模型打分全量都行)。
  • 延迟约束:推荐请求 100ms 内返回?这决定了模型大小和特征能不能实时。
  • 数据现状:有什么日志?冷启动多严重?新用户/新视频占比?
  • 公平性/合规:有没有内容安全、多样性、创作者扶持等约束?

面试官往往故意给模糊题目,提问质量本身就是评分项。我建议把问题分四类列在白板角落,边问边写,展示结构化思维。

第二步:框定 ML 问题——最有技术含量的一步

把业务语言翻译成 ML 语言。常见映射:

业务说法ML 框定
「推荐用户可能喜欢的」排序问题:预估 P(点击|用户, 物品, 上下文),按分排序
「找出欺诈交易」二分类(极度不平衡)或异常检测
「自动回复用户咨询」检索 + 生成(RAG),不是纯生成
「预测明天销量」时序回归

关键追问三连:标签从哪来(点击是隐式标签,欺诈靠人工标注有延迟)、正负样本怎么定义(曝光了没点是负样本,那没曝光的呢?)、线上线下目标是否一致(线上优化时长,但离线只能测 AUC——gap 怎么弥合)。

这一步要能说出「也可以框定成 X,但我选 Y 因为……」。展示你考虑过替代方案,比直接给答案加分多。

第三步:数据与特征——面试官闻经验的地方

以短视频推荐为例,特征分四组讲:

  • 用户侧:历史行为序列(最近 50 次观看/点赞)、统计画像(活跃时段、品类偏好分布)、人口属性。
  • 物品侧:内容特征(CV/NLP 模型打的 embedding、标签)、统计特征(历史 CTR、完播率——注意用时间窗平滑防抖动)。
  • 交叉/上下文:用户品类偏好 × 视频品类、时刻、星期、设备、网络环境。
  • 序列特征:重点讲——行为序列是推荐模型的灵魂,DIN(对目标物品做 attention 加权历史序列)是标配知识点。

必须主动提的两个坑,一提就显得做过:特征穿越(用了请求时刻之后才产生的统计量,离线指标虚高线上翻车)和样本偏差(训练数据全是「被旧系统推荐出来的」,模型学的是旧系统的偏好——position bias 和 selection bias)。

第四步:模型设计——讲 trade-off,不讲名词串

架构层面(推荐系统标准漏斗,万字面试答案的核心图):

百万级候选 → 召回(多路:协同过滤/双塔向量/热门/关注)→ 千级
→ 粗排(轻量模型)→ 百级
→ 精排(深度模型:DIN/DIEN/MMoE)→ 十级
→ 重排(多样性/业务规则/打散)→ 输出

讲每一层时说清「为什么这层用这个」:召回要覆盖多路因为单路有偏;精排用大模型因为 candidates 只剩几百、算力花得起;重排存在因为模型不懂业务约束(同作者视频不能连出三条)。

模型选型对比是必考追问,背这张表:

方案优势局限适用
逻辑回归 + 人工特征快、可解释、好维护特征工程重、表达力有限冷启动期、小数据
GBDT(XGBoost)表格数据强、特征重要性白送不擅长序列和 ID 类高维稀疏中等规模、表格特征为主
双塔向量可离线建索引、线上快用户物品特征无法深度交叉召回层
DIN/DeepFM特征交叉充分线上推理贵精排层

别忘了讲冷启动:新用户(热门 + 探索)、新物品(内容特征 + 探索流量扶持)分别怎么处理,这是没有标准答案但必须有思路的部分。

第五步:评估体系——离线在线两张皮

离线指标:AUC(排序能力)、GAUC(按用户分组的 AUC,更贴近个性化)、NDCG(考虑位置的列表质量)、覆盖率/多样性(防信息茧房)。

在线指标:CTR、人均时长、留存——通过 A/B 测试验证。这里主动提「离线涨线上不涨」的经典 gap:可能原因有特征穿越、离线数据分布 ≠ 线上(旧系统偏差)、指标代理失败(CTR 涨了但都是标题党,时长跌了)。

护栏指标:主动提一句「除了北极星,我会盯内容安全曝光量、创作者基尼系数」——展示业务成熟度。

第六步:上线与监控——收个漂亮的尾

  • 上线节奏:离线验证 → 小流量 A/B(5%)→ 灰度放大 → 全量 + 长期 holdout。
  • 监控:模型指标(预测分数分布漂移)、特征指标(PSI 分布偏移)、系统指标(延迟 P99、超时率)。
  • 迭代闭环:badcase 分析流程、定期重训策略(天级/周级)、在线学习的可能性与风险。
  • 降级预案:模型服务挂了怎么办——fallback 到热门榜单。这句一加,工程完整性就齐了。

案例二快放:设计欺诈检测系统

用同样框架跑一遍,重点说差异:

  1. 澄清:误杀成本 vs 漏放成本极不对称(误杀一个正常用户可能流失,漏放一笔欺诈损失钱)——这决定了阈值策略。
  2. 框定:极度不平衡二分类(欺诈率万分之一),主动提出「也可以框成异常检测,因为欺诈模式在变、标签滞后」。
  3. 数据:标签来自人工审核,延迟数周——训练样本的时间窗要小心;特征上「设备指纹、行为序列(注册后 10 分钟内连下三单)、图谱特征(同设备关联账户数)」。
  4. 模型:XGBoost 起步(表格场景强基线),类别不平衡用 scale_pos_weight + PR-AUC 评估(不准用 accuracy);阈值按「审核团队人力」定——每天能审 500 单,就取风险分 top 500。
  5. 评估:PR-AUC、Recall@固定误杀率、金额维度的拦截率。
  6. 上线:实时决策 <50ms(支付链路内)、规则引擎兜底、欺诈模式对抗性演变——模型月级重训 + 规则周级人工更新。

反模式清单:面试自杀行为

  • 上来就画架构图,一个澄清问题不问
  • 模型名词报菜名(Transformer!GNN!)但说不出为什么适合这个问题
  • 评估只说 AUC,不提线上指标和 A/B
  • 全程不提数据从哪来、标签怎么定义
  • 问「有什么 trade-off」时说「没有缺点」

练习

  1. 用六步框架写一份「设计外卖配送时长预估系统」的提纲,每步不超过 5 条要点。
  2. 找一篇大厂技术博客的推荐系统文章(美团/阿里技术团队),对照六步框架给它做「结构分解」,看工业界真实系统每步怎么落地。
  3. 模拟面试:让朋友出「设计一个垃圾评论过滤系统」,掐表 40 分钟讲一遍,录音回放找自己的口头禅和逻辑断点。
  4. 深度思考题:为什么推荐系统的训练-服务不一致(training-serving skew)这么常见?从特征生产链路的离在线两写角度给出至少两种工程解法(特征平台统一计算、离在线同源代码)。

面试常问

Q:召回为什么用多路?单路双塔不够吗? 双塔向量召回受限于训练目标(学的还是历史点击分布),会漏掉「没被曝光但合适」的物品;协同过滤捕获用户共现、热门兜底冷启动、关注关系满足订阅意图。多路互补提升覆盖率,代价是各路的分数不可比、需要去重融合。本质是 ensemble 思想在召回层的应用。

Q:特征穿越怎么防? 工程上:特征计算统一走特征平台,时间戳严格对齐 label 时间(point-in-time correctness);训练样本生成时用「事件发生时刻之前的快照」。流程上:离线在线指标定期对账,离线 AUC 异常高(>0.9)首先怀疑穿越。

Q:精排模型怎么平衡效果和延迟? 预算分配:100ms 总预算,召回 20ms、精排 50ms、重排 10ms、网络 20ms。手段:模型蒸馏(大模型教小模型)、量化与 TensorRT 加速、特征缓存(用户侧长周期特征离线算好)、候选集截断。核心思路:在候选数少的层才用贵模型。

Q:线上 A/B 涨了,但老板问「长期会不会伤害生态」怎么答? 设计长期指标并留 holdout:短期 CTR 可以靠标题党拉起来,长期看留存和创作者生态。留 5% 流量作为长期对照组跑数月,监控留存、内容多样性、创作者集中度(基尼系数)的边际变化。承认短期指标代理的不完美,用制度设计兜底。

Q:和纯后端系统设计题的本质区别? 后端设计是「确定性系统的容量与可用性问题」,答案有公认结构(缓存、分片、队列)。ML 设计多了三个不确定性维度:问题框定(业务到 ML 的翻译)、数据闭环(标签、特征、反馈)、评估的离线在线 gap。架构图只占 ML 设计题的三分之一。

相关阅读

ML 系统设计考察的不是你背了多少架构,而是你在不确定性下做决策的完整度。把六步框架内化成肌肉记忆,然后记住:最好的答案永远是「视情况,我是这样权衡的」。

💬 评论

这套方案在哪一步卡住了?也欢迎补充你的实现方式或踩坑经验。

正在连接评论服务,首次访问可能需要几秒…