专业书籍精读 · ML System Design Interview · 第 1 章
Machine Learning System Design Interview · Ch 1 · Ali Aminian & Alex Xu · 2023
你刷短视频时,它总能接着推下一条你想看的;你的邮箱会自动把垃圾邮件挡在门外。这些背后都是一个会「学」的系统——没人一条条告诉它规则,它是从海量例子里自己总结出来的。这一章不教你造某一个具体的这种系统,而是先给一张顺序表:要造它,该按什么顺序想问题,哪一步最容易翻车。
一般人以为,做这类系统最难的是「挑一个厉害的模型」。但真到了公司里,模型那部分往往只占整个系统的一小块——外面还围着一大圈:数据从哪来、怎么洗、怎么存、怎么送到模型嘴边、上线后怎么知道它是不是悄悄变笨了。工程师大部分时间花在这一圈上,而不是模型本身。
普通软件是「你定规则」:满 200 减 30,写死在代码里,错了能一行行查。会学习的系统是「它从例子里自己找规律」:你给它一百万条历史记录,它总结出一套谁也没法逐条读懂的判断方式。这带来一个很别扭的后果——它变坏的时候不会报错。服务器没宕机,接口照常返回,只是推荐越来越不准、判断越来越离谱。普通软件的那套排错办法,在这儿基本失灵。
这一章把造这样一个系统拆成七步,每一步都在回答一个很具体的问题:
最要紧的是:这七步不是一条直线,是个圈。第七步盯出来的问题,会把你退回第三步重新准备数据、重新训练。
它很慢:光是把需求翻译清楚、把数据管道搭起来,常常比训练模型本身多花好几倍时间,而这部分工作对外几乎看不见。
造一个会学习的系统,难的从来不是挑模型,而是把模糊的业务愿望翻译成一道能算分的题、把数据喂到位、再证明它在真人身上真的有用——而且上线之后它会自己变坏,得有人一直盯着。
想进到具体机制、记号和示意图? → 切到精读版
全书总纲:把「设计一个带模型的系统」拆成七步——澄清需求、翻译成 ML 问题、数据准备、模型开发、评估、部署与服务、监控与基础设施。核心洞见是模型只是系统的一小块:决定成败的是它两端——前端「业务目标怎么翻译成 ML 目标」,后端「线上怎么证明它有用、怎么发现它变坏」。
这是 Aminian & Xu《Machine Learning System Design Interview》(2023)Part I 唯一的一章,也是后面 Ch2–11 十道真题共用的模板——每道题都严格按这七步走一遍。它上承 Xu 前两卷的「四步法」,但换了战场:那两卷的对象是确定性系统(写进去什么读出来什么),这一卷是统计系统(输出是概率、正确性只在统计意义上成立)。对应现实中的推荐、搜索排序、广告、风控、内容审核这一整类业务。
ML 设计题的开放度比纯系统设计题更高,新手最常见的失败模式只有一种:一上来就谈模型——「我会用一个 Transformer 做双塔召回」。技术上可能没错,却跳过了真正决定成败的环节:业务目标是什么、正负样本怎么定义、特征从哪来、离线涨了线上涨不涨、上线三个月后怎么知道它还灵。
更根本的痛点是:ML 系统的失败是静默的。传统服务坏了会 5xx、会超时、会告警;一个漂移的排序模型不会——延迟正常、错误率为零,只是推荐质量在几周内慢慢滑坡,直到业务周报上才被发现。不解决这件事的后果是:你会造出一个跑得很好、却在悄悄亏钱的系统。七步框架就是把这些「模型之外」的环节逐个钉在纸面上。
「设计一个视频推荐系统」这句话里,几乎每个词都待定。要问清:业务目标(提升观看时长还是新用户留存?两者最优解不同)、要支持哪些功能(能不能点「不感兴趣」)、数据(有哪些数据源、有没有标注、能否用行为当隐式标签)、约束与规模(算力预算、多少用户、多少条内容、每天多少请求)、性能要求(推理延迟上限、实时性)。
产出不是设计,是一张把题目边界钉死的清单。量级差一个数量级方案就完全不同:候选集是 1 万条还是 10 亿条,决定要不要引入近似最近邻检索;延迟预算是 500 毫秒还是 30 毫秒,决定模型能多大。
这是全章最有价值、也最多人跳过的一步,包含三件事。
(一)定义 ML 目标。业务目标是人话,ML 目标必须是模型能优化的量。书里用一张表把两者并排:视频平台「提升用户参与度」→「最大化用户观看时长」;有害内容检测「让平台更安全」→「准确预测一段内容是否有害」;好友推荐「让用户更快建立社交关系」→「最大化成功建立的连接数」。翻译得越糙,系统跑得越偏——把「参与度」粗暴翻成「最大化点击率」,模型就学会推标题党。
(二)指定输入与输出。同一需求,定义不同就是两套系统。书里的例子最清楚:有害内容检测可以做成一个多标签模型(输入一段内容,同时输出「暴力 / 裸露 / 仇恨言论」各自的概率),也可以做成每类一个二分类模型。前者省算力、共享表示,但加新类别要重训整个模型;后者每类可独立迭代、独立调阈值,代价是训练与服务成本乘以类别数。
(三)选择任务类别。监督 / 无监督 / 强化学习;监督之下再分分类与回归。最常被误判的是排序类问题:推荐、搜索、信息流看着像分类,真正要的却是一个可排序的分数,所以通常建模成学习排序(learning to rank)或表示学习(representation learning)——用户和物品各编码成一个嵌入、用向量相似度当分数,十亿级候选才能靠近似最近邻先粗筛。
分两半。数据工程:数据源(用户产生、系统产生、第三方)、存储选型、ETL 管道,以及数据类型——结构化(数值型、类别型)与非结构化(文本、图像、音视频)。特征工程:把原始数据变成模型吃得下的形式,四个常规动作——
[0,1])、标准化(均值 0、方差 1)、对数变换(治「粉丝数」这类跨几个数量级的长尾特征)。难点不在算法,而在训练与服务的一致性:离线用 SQL 算的特征和线上用另一套代码算的特征,只要口径差一点(时间窗口对不齐、缺失值填法不同),线上效果就会莫名其妙地掉——这就是训练-服务偏斜(training-serving skew)。
模型选型权衡的不止准确率:训练数据量、特征数、训练速度、超参数个数、算力需求、可解释性。书里给的路径很朴素——从简单基线(baseline)起步:先用启发式规则或逻辑回归跑通全链路,再逐步换复杂模型,每一步都跟基线比。理由是:一个跑通了数据管道、评估与上线流程的笨模型,比只活在 notebook 里的好模型有用得多。
模型训练要处理:构造数据集(定义特征与标签、采样策略、划分训练 / 验证 / 测试集、处理类别不平衡——CTR 场景正样本常只占千分之几,靠重采样或调损失权重)、选损失函数、从头训练还是微调预训练模型,以及规模上去后的分布式训练(数据并行:每张卡一份模型各算一批数据;模型并行:模型本身切开放到多张卡上)。
离线评估用留出的历史数据打分,指标按任务类型走:分类看精确率 / 召回率、F1、ROC-AUC 与 PR-AUC;回归看 MSE / MAE / RMSE;排序看 precision@k、MRR、nDCG(@k 指「只看最前面 k 个」——用户不会翻到第 50 条);生成任务看 BLEU / ROUGE / FID。
在线评估看的是另一套:业务指标——点击率、观看时长、下单转化、留存、营收。两者没有稳定的对应关系,这是本章最该记住的反直觉结论:离线 AUC 涨了 2 个点,上线一测业务指标纹丝不动甚至倒退。原因通常是离线数据带着旧系统的曝光偏差(你只有「被推荐过的内容」的反馈,没推过的根本没标签),或者 ML 目标和业务目标本就没对齐。
部署要决定三件事:放哪儿(云端还是端上)、怎么压小(蒸馏:小模型学大模型的输出;剪枝:去掉贡献小的参数;量化:32 位浮点降到 8 位整数)、怎么上(影子、A/B、金丝雀、交错实验、赌博机——见下节的表),以及预测管道选批量还是在线。
监控回答一个问题:模型为什么会在生产环境里变坏?头号原因是数据分布漂移——用户行为变了、内容生态变了、上游某个数据源悄悄改了口径。所以要盯两类指标:运维指标(延迟、吞吐、资源利用率、可用性)与 ML 专有指标(输入特征与输出预测的分布有没有偏移、有真值回流时准确率随时间的曲线、线上跑的是哪个模型版本)。
表 1 · 云端部署 vs 端上部署
| 云端部署 | 端上部署(手机 / 边缘设备) | |
|---|---|---|
| 延迟 | 要走一次网络往返,跨区可达 100ms+ | 无网络往返,几十毫秒内响应 |
| 模型规模 | 几乎不受限,可上大模型、用 GPU | 被内存与电量钉死,通常需蒸馏 / 剪枝 / 量化 |
| 隐私 | 用户数据必须上传 | 数据不出设备,合规压力小得多 |
| 更新 | 改一次服务端,全量用户立刻生效 | 要发版、用户还不一定升级,版本碎片化 |
| 成本 | 推理算力成本随请求量线性涨 | 算力由用户设备承担,边际成本近零 |
| 适用 | 模型大、要频繁迭代 | 实时交互、离线可用、隐私敏感(输入法补全、相册人脸) |
表 2 · 批量预测 vs 在线预测
| 批量预测 batch | 在线预测 online | |
|---|---|---|
| 做法 | 定时任务提前算好所有结果,写进 KV 存储 | 请求到达时现取特征、现推理 |
| 请求延迟 | 一次查表,毫秒级 | 特征拉取 + 推理都在关键路径上 |
| 新鲜度 | 结果可能是几小时前的,用户刚才的行为反映不进去 | 能用上「此刻」的上下文(刚点了什么、现在在哪) |
| 算力 | 对全量用户都算,大部分结果没人看,纯浪费 | 只为真实请求付费,但要扛住峰值 QPS |
| 适用 | 候选集稳定、行为变化慢(每日推荐邮件、离线画像) | 强上下文依赖(搜索排序、信息流、广告竞价) |
表 3 · 怎么在生产环境里测一个新模型
| 方式 | 怎么做 | 换来什么 / 代价 |
|---|---|---|
| 影子部署 shadow | 新旧模型收同一份流量,新模型输出不返给用户,只记录下来比对 | 对用户零风险;代价是推理成本翻倍,且拿不到业务指标(没人对它的结果做反应) |
| A/B 测试 | 用户随机分流,两组分别走新旧模型,比业务指标 | 唯一能给出因果结论的方法;代价是要跑够样本量才显著,小改动可能要跑一两周 |
| 金丝雀 canary | 先放 1% 流量给新模型,无异常再逐步放大 | 爆炸半径可控、能快速回滚;但小流量下噪声大,不适合下结论 |
| 交错实验 interleaving | 把新旧两个排序结果交叉混进同一个列表,看用户点哪边来的 | 排序场景下比 A/B 省一个数量级样本量(消除了用户间差异);只适用于排序问题 |
| 多臂赌博机 bandit | 按实时表现动态调整各版本的流量比例 | 边测边赚,减少把流量浪费在差版本上的损失;代价是统计推断更复杂 |
三张表是同一条主线:每个选择都在拿「更准」换「更慢、更贵或更难改」。面试真正考的不是你认识多少种方案,而是能否在给定量级与延迟预算下说清为什么选这一种。
这套框架的价值不止在面试。它对应业界通称的 MLOps:特征平台、实验平台、模型注册表与版本管理、漂移监控。Google、Meta、Netflix、Airbnb 的内部 ML 平台,拆开看基本就是这七步的工程化。
在面试里,它给你的是节奏:45 分钟,前 5 分钟澄清需求、5 分钟翻译 ML 目标并定死输入输出,中间 20 分钟压在数据特征与模型选型,最后 10 分钟讲评估与上线监控。跳过第 2 步直接讲模型,是这类面试最常见的失分方式。
① 全书总纲:ML 系统设计 = 七步——澄清需求 → 翻译成 ML 问题 → 数据准备 → 模型开发 → 评估 → 部署与服务 → 监控。
② 核心立论:模型代码只是系统的一小块,数据、特征、服务、实验与监控才是工作量主体。
③ 第 2 步最关键:业务目标要翻译成可优化的 ML 目标,输入输出必须定死——同一需求定法不同就是两套系统;排序类问题通常建模成学习排序或表示学习。
④ 特征工程四件事:缺失值、特征缩放、离散化、类别编码(高基数用学习嵌入);工程难点是训练-服务一致性。
⑤ 模型开发先立基线再谈复杂;训练侧要处理类别不平衡、损失函数、微调与分布式训练。
⑥ 评估分两层且常常打架:离线指标涨,线上业务指标不一定涨——曝光偏差与目标错配是主因。
⑦ 上线方式各有代价:影子零风险但拿不到业务指标,A/B 给因果但慢,金丝雀控爆炸半径,交错实验在排序场景省一个数量级样本。
⑧ ML 系统会静默地变坏:漂移是头号原因,监控必须同时覆盖运维指标与输入输出分布——七步是闭环不是直线。