
要说清楚“ai-engineering-from-scratch”这件事得先回到我经常被问到的一个问题为什么很多朋友刷完了深度学习的课跑通了网上的教程代码一回到自己的真实场景——不管是工作中的需求还是自己想做的产品——就完全不知道从哪下手答案其实不是“你学得不够多”而是我们大多数时候学的都是“模型怎么训练”很少有人告诉你“模型之外的那一整套工程链路怎么搭”。从零开始做AI工程真正的难点从来不是那个模型的参数量有多大而是从拿到一个业务问题开始到最后把这个模型变成别人能稳定使用的服务这中间隔着数据、代码、部署、监控、迭代一大堆事情。今天这篇文章我就想以自己这几年从零把一个AI项目推到线上的实际经历为蓝本把那条完整的路径拆开讲一讲。适合准备入行、或已经在做模型但想往工程侧走的朋友参考。1. 先搞清楚AI工程师和“训练模型的人”到底差在哪很多想转AI工程的人最初的理解就是把模型训出来就完事了。我见过不止一个朋友兴致勃勃地跑通了某个图像分类的Notebook准确率刷到了很高的水准然后问我接下来是不是就可以去面试了我的回答通常是这只是万里长征第一步。AI工程之所以叫“工程”是因为它和写玩具Demo有本质区别。1.1 模型训练只是整条链路里的一个环节我们可以把AI项目想象成造一辆车。训练模型这件事相当于你在车库里把发动机调得非常猛马力数据很好看的。但用户真正要的是一辆能开着上路的车——发动机得装进车身里得配上变速箱、悬挂、刹车、仪表盘还得经过各种路况的测试。放到AI项目里发动机就是模型而车身和所有其他部件合在一起就是数据管道、特征服务、模型部署、推理优化、监控告警、版本迭代这一整套东西。一个只懂调发动机的人造不出一台能卖的车。这里我列一下AI工程全链路的典型组成大家对照一下自己目前只会哪一段业务需求拆解与问题定义也就是搞清楚到底要解决什么、用什么指标衡量“解决好了”数据获取、清洗、质量校验以及数据版本的记录特征工程和样本管理训练集/验证集/测试集的科学划分模型训练、实验追踪、超参数调优模型评估与可解释性分析给业务方讲清楚模型为什么这么做决定把模型封装成API或批处理任务加上性能优化上线之后的监控包括推理延迟、资源占用、数据漂移和模型效果衰减持续迭代和模型再训练的全流程管理1.2 和算法研究员、数据工程师的分工边界很多人还会混淆几个岗位的职责。我自己的经验是算法研究员更关注“模型结构怎么改、Loss怎么设计、效果能不能再涨一个点”他们的产出物通常是实验报告和一组最优参数数据工程师更关注“数据怎么稳定高效地从A流到B、怎么保证质量和时效性”而AI工程师站在两者之间核心职责是保证整个系统持续、稳定、高效地产生价值。这意味着你需要有足够的广度你要看得懂数据管道的逻辑知道哪天特征缺失了会有什么后果你要能亲手把一个训练好的模型用合理的接口暴露出去你还要理解线上推理的硬件限制知道多大的QPS下模型会扛不住。我常打一个比方算法研究员解决的是“模型在验证集上准不准”的问题AI工程师解决的是“模型在真实环境里一直好不好用”的问题。把心态从前者调整为后者是开始做AI工程前最重要的一次思想转变。2. 从零起步的三个地基代码功底、数据感觉、环境工具链既然叫“from-scratch”那我们就从最底层开始讲。下面这三样东西是我认为无论你未来做视觉、NLP还是推荐系统都必须先打扎实的地基。2.1 代码功底目标是“能独立实现而不只是能看懂”很多教程让你复制粘贴跑通就完了但工程实践里没有人会把每一步都写好等你来抄。你要有能力把一篇论文里的公式、或者一个含糊的业务需求自己转化成可运行的代码。我建议的训练方式是每学一个新的模型结构手写一遍它的前向传播和训练循环不要直接用封装好的接口。比如你学Transformer那就用PyTorch从多头注意力的代码开始搭而不是直接调用TransformerEncoder。这样做的目的不是让你重复造轮子而是让你在模型报错、维度对不上、输出异常的时候知道应该去检查哪里。代码规范方面Python项目要尽早养成用类型注解的习惯函数和变量命名要让人一看就懂。我在Code Review别人的项目时最头疼的就是一堆叫a、b、tmp的变量名这种代码跑通了是运气维护三个月之后连原作者自己都看不懂。2.2 数据感觉拿到一堆原始数据先嗅出问题数据质量决定模型上限这句话在工程里从不过时。我在实践中总结了一个“数据四查法”现在基本每次拿到新数据集都会过一遍查缺失哪些字段有缺失、缺失率多高、缺失是否随机。比如用户年龄字段大面积缺失你就得考虑用“未知”作为一个合法取值还是用其他特征去推断查分布数值型字段看均值、方差、分位数特征是否长尾类别型字段看频次是否存在超级稀疏的类别查时间如果数据带时间戳训练集和测试集的时间范围是否连续。很多项目在这一点上翻车——用未来的数据训练用过去的数据预测线上效果惨不忍睹查泄露有没有哪个特征“偷看”了目标值。比如预测用户会不会续费结果你用了“用户是否已续费”作为特征这种错误在数据字段一多的时候特别容易发生这四步做完你会比直接拿去训练的人多一份把握也能提前发现很多靠模型调参解决不了的问题。2.3 环境与工具链从第一天就按正规军的姿态做事这可能是最容易被忽略、但后期受益最大的一点。我强烈建议你从第一个项目开始就养成下面这些习惯用虚拟环境管理依赖项目里放一份requirements.txt或pyproject.toml保证换台机器还能跑所有代码纳入Git管理每次实验至少提交一次提交信息写清楚“改了哪里、为什么改”Docker不必一开始就用得很深但至少要理解“容器封装环境”这件事的意义后面部署阶段绕不开用dvc这类工具管理数据版本模型和代码版本一一对应出了问题能回滚到具体的某次实验我走过的弯路是早期做了好几个项目都没用版本管理后来线上模型效果突然下跌想查是数据变了、代码变了还是参数变了结果一团乱麻只能全部重训排查。工具链的习惯一旦前三个月养成了后面会替你省下无数个焦头烂额的深夜。3. 把第一个端到端项目完整走一遍从问题定义到服务上线地基打得差不多了接下来是最关键的部分——完整地走通一个项目。我以“公开电商数据集的销量预测服务”为例一步一步带大家过一遍你可以把这个流程迁移到任何你感兴趣的数据集上。3.1 第一步把业务问题翻译成技术问题这一步很多人会跳过直接开始写代码但它恰恰决定项目的生死。我拿到一个需求时会先问自己几个问题这个预测结果给谁用用于补货决策、还是用于营销活动策划决定了它对准确率和时效性的要求预测失败的成本是什么缺货损失和库存积压两种错误的代价不一样模型设计也会不同用什么指标衡量好坏MAE平均绝对误差还是MAPE百分比误差如果你的销量有很强的季节性MAPE可能更直观在这个示例项目里我们定义问题为基于过去45天的历史订单数据预测未来1周内商品每天的销量。评估指标选用MAPE因为业务方希望了解的是“预测值偏离实际值的比例”而不是绝对值。目标用户是运营团队他们需要低延迟的预测结果来调整备货计划。3.2 第二步数据管道搭建与特征设计明确问题后开始数据工作。我会先写一个数据清洗脚本处理缺失时间点、剔除退货订单、把异常大的订单量标记出来单独核实。特征工程上除了最基本的时间特征星期几、是否月初、是否临近节假日我还会重点构造滞后特征也就是过去7天、14天、28天的销量统计值。对时间序列预测来说滞后特征是模型最主要的“信息源”它们的构造方式直接决定模型能学到什么。这里有一个工程细节构造特征时要特别注意避免时间泄露。比如你要预测第30天的值那么只能用前29天及更早的数据来算特征绝不可以用第30天当天的数据。3.3 第三步训练、记录实验、选型与调优我习惯先搭一个简单的基线模型比如用线性回归或者直接拿“过去一周日均销量”做一期预测先确认整个代码链路是通的得到一个不吓人的参考值。然后在这个基线上逐步尝试更复杂的模型——树模型XGBoost、LightGBM或深度学习模型简单的时间序列网络都可以。这个过程里关键是用MLflow之类的工具把每次实验的参数、指标、模型文件都记录下来。我自己的习惯是一个实验版本只改一个变量要么换模型、要么改特征、要么调参数然后和上一个版本严格对比。如果同时改好几个东西效果变好了你也不知道该归功于谁。调参我建议从最重要的几个参数入手。以XGBoost为例我的优先级是learning_rate和n_estimators决定模型学习的“步幅”和容量max_depth和min_child_weight控制模型复杂度防止过拟合subsample和colsample_bytree对训练数据做采样提升泛化能力3.4 第四步部署为可用的服务模型训完评估达标接下来的部署才是工程属性的重头戏。对销量预测这种场景业务方通常希望每天固定时间拿到一份预测结果所以批处理就够了不一定要在线API。我会写一个定时任务每天凌晨拉取最新的历史数据重新预测未来7天的销量把结果写入数据库运营团队直接在报表里查看。如果场景改为“用户在线输入序列实时返回预测结果”呢那就要把模型封装成API服务。我的标准做法是用FastAPI写一个服务把推理逻辑单独抽成一个函数然后通过Docker打包挂载到容器服务上对外提供一个HTTP接口。Dockerfile里有一个细节我踩过坑模型文件较大时应该用单独的命令复制进镜像并考虑使用多阶段构建来缩小镜像体积否则每次发布都又大又慢。如果后续推理延迟要求高可以引入ONNX Runtime或TensorRT做加速但起步阶段先把流程跑通更重要。4. 生产环境里的工程化思维准确率不是唯一的追求模型上了线“工程”这两个字才真正开始展现它的分量。如果你只是在自己的电脑上跑通了一个模型那你体验到的始终是“玩具环境”生产环境里有一批全新的问题等着你。4.1 重新审视评估标准当准确率和延迟打架做研究的时候我们一心追求准确率最大化。但在线服务里如果模型推理慢了300毫秒用户体验就已经有明显感知了慢一秒钟用户流失率可能直线上升。这时候你会发现0.1个百分点的准确率提升远不如把推理延迟从200毫秒压到50毫秒有价值。针对这个问题我的优化思路依次是换更小的模型结构或者用知识蒸馏用大模型教小模型效果损失极小但速度提升明显模型量化把权重从32位浮点压到16位或8位整型推理速度和内存占用都能大幅改善推理服务设置合理的批处理把多个请求攒到一起并行推理吞吐量能明显提高4.2 三个“不一定”打破常见的工程认知误区和刚接触生产环境的朋友交流时我常总结出三个“不一定”帮大家少走弯路模型不一定越复杂越好线上推理要考虑硬件成本和运维复杂度。很多业务场景下特征工程做得好的逻辑回归/树模型效果已经足够好且部署极其稳定延迟不一定越低越好关键看产品需求。后台定时跑批的任务延迟一分钟没人管用户在线交互可就不能容忍两秒钟。定好SLO服务等级目标再倒推优化方案服务器不一定越多越好盲目扩容只会增加成本先看瓶颈在哪。很多情况下是数据管道卡住了而不是模型推理卡住了4.3 监控与告警让问题在影响用户之前先暴露模型上线之后并不是一劳永逸的。真实世界的数据分布会发生漂移用户行为会变化模型效果注定随时间衰减。我上线一个模型后会重点盯这几类指标延迟和QPS服务本身健康度的基础指标延迟突增往往预示着资源不足或代码有问题输入数据分布当输入特征的分布与训练集差异越来越大时说明数据漂移已经发生模型可能正在“被迫”面对一个它没见过的世界预测结果合理性比如预测销量突然变成前一天的十倍可能不是真有那么大需求而是月份字段解析出了bug监控告警的原则是“少而准”我不赞成事无巨细全都告警那样只会让团队对警报麻木。我会聚焦在三到五个真正能反映系统异常的指标上设置合理的阈值预留出人工判断的时间窗口。5. 持续学习的路线与作品呈现让你的工程能力被看见最后聊一聊“从零开始”之后如何持续进化以及如何让别人面试官、合作者、客户快速认可你的能力。5.1 输入保持高质量的信息来源学AI工程信息输入非常重要但我不建议光靠刷短视频和公众号碎片文章。我自己的主要来源是一线团队的工程博客里面经常有避坑实录、性能优化实战技术细节非常扎实经典开源项目的源代码和Issue区看别人是怎么组织工程结构的尤其是处理异常和边界条件的思路系统性的技术书比如围绕MLOps、机器学习工程实践的专题书更适合搭建整体框架自己复盘项目的笔记每做完一个项目或踩完一个坑把它写成文档长期积累下来就是一笔非常珍贵的资产5.2 输出作品集是工程能力最硬的名片很多人以为GitHub上Stars多、项目多就代表能力强我作为面试官实际看得更多是这几点README是否清晰能不能在一分钟之内看懂项目解决什么问题、怎么跑起来代码结构是否整洁训练代码、数据处理、部署配置是否分目录管理有没有写测试是否考虑了工程化要素有没有Docker部署文件有没有实验记录有没有模型评估的详细报告Issue处理的态度别人反馈问题后是否认真回复和迭代这比代码本身更能看出工程师的靠谱程度我会建议大家不要追求做一个大而全的“超级项目”而是把一个垂直场景的小项目做得足够完整。比如只做一个“个性化新闻推荐”的Demo但把用户画像特征、模型训练、线上API、效果监控全链路做扎实比摊五个半成品有价值得多。关于面试和合作沟通我一直坚持一个观点AI工程能力的证明不是“我会训模型”而是“我做的模型在真实环境里被多少人稳定地用着”。这个思路会反过来指导你学习时的取舍——你自然会更关注如何保证稳定性、可观测性和迭代效率而不是只盯着验证集上那零点几个百分点。从我个人的经验来看从零开始构建AI工程能力其实没有太多捷径本质上是用一个个具体的项目“喂”出来的。过程中你会不断发现原来环境配置比模型调参更耗时间原来数据清洗比网络结构更能决定效果原来部署监控和算法同等重要。这些认知都会在完整做完两三个端到端项目后内化成你自己的判断力。如果你现在正准备开始我的建议很直接挑一个你感兴趣的场景找一个公开数据集今天就动手把数据管道搭起来然后一步步走向模型部署和线上监控。这条路上的每个坑都会成为你未来工程判断力的一部分。