直接从零开始搭一套AI工程的架子,这活儿我干过不止一回。每次回头复盘,都会发现同一个问题:大多数人以为“AI工程”就是把模型训练完、能出个接口就完事,结果模型上线之后没人管、数据一变就崩、实验记录一塌糊涂。今天就想借着“ai-engineering-from-scratch”这个话题,把从零开始搭建AI工程能力这件事从头到尾拆一遍,包括你真正该关注的环节、我自己踩过的坑,以及一些实测有效的落地顺序。这套思路适合正在做算法想转工程、后端想转AI方向、以及小团队想搭基础设施的人,不管你是刚起步还是已经被线上模型虐过,都能找到点有用的东西。
1. 先想清楚:AI工程到底解决什么问题
1.1 机器学习研究和AI工程的分界线
很多项目死在第一步,不是因为代码写得不好,而是没搞明白自己做的到底是什么事。机器学习研究追求的是“在特定数据集上把指标刷高”,AI工程追求的是“在不确定的现实环境里稳定可靠地产生价值”。这是两种完全不同的思维方式。
研究阶段,你拿到一份固定的训练集,可以反复调整模型结构、调参、试错,迭代空间很大。但到了工程阶段,数据是流动的、分布是会变的、下游调用方是会把模型输出当真的,你的目标变成“在多方约束下维持系统的健康”。举个生活化的类比:研究阶段像是做一道拿手菜,食材固定、火候可以慢慢调;工程阶段是开一家餐厅,要面对食材供应波动、顾客口味变化、后厨出菜节奏,菜品能稳定端出来才是核心。
所以“ai-engineering-from-scratch”中的“from scratch”强调的并不是把神经网络从反向传播开始手写一遍,而是把“代码能跑”变成“系统能活”的整套能力。这包含数据管线的可靠性、实验的可复现性、模型服务的稳定性、线上指标的监控与反馈闭环。缺了任何一个环节,模型都只是实验室里的摆设。
1.2 从零搭建前必须先做的三个决策
动手之前,先花时间想清楚三件事,能省下后面大量返工时间。
第一件:模型的交付形态。你是要做实时在线推理,还是离线批量预测,还是边缘端部署?这个决定直接影响到服务架构、依赖管理、性能优化方向。我见过一个团队花了大力气把模型封装成高性能在线服务,结果业务场景根本不需要毫秒级响应,离线每天跑一次就够,白白增加了一堆复杂度。
第二件:基础设施的选型边界。团队有没有专门的运维?云平台能不能用托管的模型服务?数据量级到了什么程度?这些决定了你是用轻量方案快速跑通,还是一次性搭出生产级平台。我的建议是:从零开始不要追求“大而全”,先把最小闭环跑通,再逐步扩展,后面会详细说这个策略怎么落地。
第三件:团队的角色分工。AI工程不是一个人能包揽所有环节的,至少要覆盖数据、模型、服务三条线。小团队里可能一个人身兼数职,但职责边界要清楚:谁负责数据质量,谁负责模型迭代,谁负责线上稳定性。分工模糊是项目后期最痛苦的拖累,很多上线事故回头看都是因为“都以为对方管了”。
2. 从零搭建AI工程的地基:数据与特征管线
2.1 第一版数据管线避开这五种设计
数据管线是最容易被低估的部分,但它往往决定了工程的上限。第一次搭数据管线,我建议刻意避开下面五种设计,都是真实踩过的坑。
第一种是“一次性脚本流”。为了赶进度,用几个Python脚本串联起来跑数据清洗和特征工程,没有调度、没有依赖管理、没有失败重试。一开始没问题,但数据量上来或源数据Schema发生变化后,脚本跑挂了你根本不知道它挂在哪一步,也没法从断点续跑。第一版就引入一个简单的调度工具(哪怕是cron加日志),也比纯脚本强得多。
第二种是“全量重新计算”。每天把历史数据全部重新处理一遍,短期内没感觉,但数据量增长后计算成本急剧上升,而且处理时间越来越长,最终变成深夜作业都跑不完。更好的做法是引入增量更新机制:按时间分区、只处理新增和变更的数据,配合数据版本管理。
第三种是“训练集和线上特征逻辑不一致”。这是AI工程里最隐蔽、危害最大的问题。特征工程代码散落在训练脚本和推理服务里各写一份,很可能出现线上用的特征处理方式和训练时不一致。解决方案是建立单一特征处理代码库,训练和推理都调用同一份代码,后面小节我会详细讲。
第四种是“数据质量校验缺失”。源数据突然出现大量空值、范围异常、重复记录,这些情况如果没有在管线入口处拦截,模型输出就会悄悄变差,而你往往要等很久才能从业务指标上发现。第一版数据管线就应该包含数据校验规则,比如非空率、取值范围、枚举值合法性,让坏数据在源头就被拦住。
第五种是“没有数据版本的概念”。训练集被覆盖、预处理后的特征数据找不到对应版本,导致模型无法复现。哪怕只是用快照目录的方式给每批数据打上时间戳,也能解决绝大多数复现问题。
2.2 特征存储与训练-推理一致性
特征处理的一致性,值得单独拎出来说。我自己第一次做推荐系统模型时,就吃了大亏:训练时用Python pandas处理特征,上线时用Java重新实现了一遍,结果特征分布对不上,线上效果直接砍半。排查了两天才发现是某个特征在两种语言里的取整方式不同。
解决这个问题的标准做法是:用一套特征处理代码组件,在训练流程和推理服务中复用。比如把特征工程封装成独立的Python包,训练时直接调用,推理时通过一个轻量的特征服务暴露出来。这样可以保证特征值在训练和推理两条链路上走完全相同的逻辑。
另一个容易被忽略的点是特征快照。在线推理时,有些特征会随时间变化,比如用户最近浏览时长、商品实时库存。训练时用的特征值对应的是过去某个时间点的状态,线上推理时也要用“假设在同一个时间点”能拿到的特征。如果训练时使用了未来信息,在线服务根本拿不到的,模型就会虚高。这类特征工程里的Leakage问题,在工程落地时最容易暴露,需要特别留意时间戳对齐。
到这里你会明白,数据管线和特征层已经占了AI工程一半的工作量。没有稳定可靠的数据管线,后面所有的模型迭代都会像在流沙上盖楼。把这一层打好底子,再谈实验管理和模型服务才是有意义的。我自己在这个阶段花的时间占比接近一半,我认为是完全值得的。
3. 实验管理:没有实验追踪的AI工程等于盲飞
3.1 实验追踪工具选型与参数记录规范
两三个月后你回顾自己跑过的模型,如果说不清每个实验用了什么数据集、什么超参数、当时为什么这么调,那这个团队基本没有沉淀。做过AI工程的人都知道,实验追踪不是“记录一下”这么简单,它决定了你能不能高效迭代,也决定了你能否向业务方解释模型效果的变化。
工具层面,推荐从MLflow、W&B、Neptune这类成熟的实验管理工具里选一个开始。如果团队已经有使用习惯,不换也行,关键是统一。我自己用过几款,从实用性角度讲,MLflow因为开源、自部署方便、和Python生态契合度好,适合大多数从零起步的团队。W&B的交互界面更舒服,但部分功能在私有化场景有依赖。Neptune适合大型团队,团队不大的话可能比较重。核心指标只有一个:能不能把每个实验的参数、代码版本、数据集版本、模型文件这四样东西完整关联起来。
参数记录规范比工具选型更重要。我见过有人用MNIST跑通后又加了几个实验,参数记录全部散落在各处的笔记本里,一周之后就说不清哪个是当时效果最好的版本了。建议从第一天就定几条简单规矩:每个实验要有唯一的命名,命名里包含模型名和数据日期;每次运行记录完整超参数;训练结束后把最佳模型文件主动存档,不要只靠文件名识别。这些看起来琐碎,但在项目冲刺阶段能帮你省下大量时间。
3.2 模型可复现性的完整方案
实验追踪更底层的目标是模型可复现。所谓可复现,不是说代码能跑通就行,而是给定同一份数据、同一个代码版本、同一组参数,任何人任何时间都能还原出相近的结果。这个要求比很多人想得要苛刻,因为影响结果的因素太多了。
首先是随机性问题。深度学习训练里涉及随机初始化、数据Shuffle、Dropout等随机过程。要保证可复现,需要固定全局随机种子,并且对数据加载器的Shuffle顺序做控制。TensorFlow和PyTorch都提供了相关设置,但不能只设置一个seed就觉得万事大吉,还需要注意GPU算子本身可能引入不确定性,这可以通过设置相关环境变量来缓解,具体要看框架版本。
其次是代码版本和数据集版本的强关联。训练代码要从版本控制库里拉取,数据要从带版本标记的位置读取。最简单的方式是让实验追踪系统记录代码的Git提交哈希和数据集的校验值,比如记录数据文件的MD5。这样任何一个历史实验都能快速还原出当时的上下文。
第三是依赖环境的一致性。同一个代码在Python 3.8和3.10下可能运行结果就不一样,PyTorch版本升级也会引入数值差异。建议在训练项目里使用依赖锁定文件,把依赖库的精确版本固定下来。更进一步是整个训练环境用容器镜像来固化,这是最稳妥的方案,后面会详细说容器化的具体做法。
依赖环境的一致性对可复现性的帮助非常明显,这一点我现在特别强调——因为挺多做AI工程的朋友,一开始都容易忽略它。
4. 模型上线:把训练好的模型变成稳定服务
4.1 模型服务化的三种方式与选型
模型训练完只是万里长征走完一半,如何把模型高效、稳定地暴露给上层业务,是AI工程的核心交付环节。模型服务化主要有三种形态,我分别说下适用场景和要注意的点。
第一种是离线批量预测。适用于用户画像、风控名单、每日推荐候选池等对时效性要求不高的场景。实现方式通常是定时任务从数仓取数据,批量调用模型,预测结果写回存储。这种方式的优点是逻辑简单、容易重试、方便追溯,缺点是结果有延迟,实时性差。
第二种是在线实时推理服务。适用于搜索、推荐、实时风控等需要毫秒级响应的场景。一般通过REST或gRPC接口对外提供预测能力,服务内部完成特征拼接、模型推理、结果后处理。这里有个容易踩的坑:模型推理框架和Web服务框架的线程模型要协调好,否则并发一上来就出现大量超时。我通常会把模型推理和后端业务逻辑拆开,模型单独部署成推理实例,再在前面加一层网关,避免模型加载和请求处理互相干扰。实际测试下来这种方式更稳,扩展也灵活。
第三种是边缘端部署。把模型压缩后部署到手机、嵌入式设备上。这块涉及量化、剪枝、推理引擎选型等额外工作,如果只是从零起步,一般可以先不做边缘端,等业务验证跑通了再考虑。
选型时有一个很实际的标准:优先使用成熟的推理框架和部署方案,而不是自己写推理代码。Triton、TorchServe、TensorFlow Serving这类工具把模型加载、并发管理、动态批处理都封装好了,直接减少了自己实现时可能踩的坑,稳定性也更有保障。
4.2 灰度发布与回滚机制
模型上线最怕的事情是:你以为新模型效果好,结果线上表现很差,甚至影响核心业务。所以从第一次上线起,就必须建立灰度发布与快速回滚机制。
灰度发布的核心思路是“小流量验证”。先把新模型部署到独立的环境,用一小部分真实流量做对比测试。流量切分的比例可以从1%开始,逐步扩大到5%、10%、50%,每一步都要等业务指标稳定后再继续。如果发现异常,需要能一键切回旧模型。
这里有一个容易忽略的细节:模型服务的版本管理。同一个服务可能同时存在新旧两个模型版本,需要通过服务配置或路由规则来控制流量分配。如果用的是Triton这类推理框架,可以利用它的模型版本管理能力,直接通过配置切换版本,而不需要重新发布整个服务。如果是自研服务,建议在代码里保留多版本模型加载能力,避免切换模型需要重启进程。
另外,回滚机制不只要“切回旧模型”,还要考虑数据回放的问题。如果新模型在线上跑了几天,产生的结果已经写入业务库,那回滚后这些数据如何处理也要提前想好。否则会出现模型切回去了,但历史结果还是新模型产出的不一致状态。这块虽然没有标准答案,但在设计系统时留个心眼,能省去后续很多麻烦。
5. 模型监控与持续迭代:AI工程的验收标准
5.1 线上监控指标怎么定
模型一旦上了线,监控就成了头等大事。AI工程的验收标准不是“模型指标多高”,而是“线上系统是否一直健康”。如果一个模型线上使用了半年,你连它的效果什么时候开始下滑都不知道,那这个工程基本算是失败的。
监控指标分两类。第一类是系统层指标:推理延迟、吞吐量、错误率、服务可用性。这些和普通后端服务的监控一样,可以用Prometheus加Grafana这类工具来做,但必须针对每个模型单独区分,不能所有模型混在一起统计。
第二类是模型层指标,这部分更有AI工程的特色。最基础的是预测分布监控:比如模型输出的类别分布、分数均值、分数标准差是否发生明显变化。如果某个二分类模型历史平均分数一直稳定在0.3附近,突然连续多天跳到0.6,那说明线上输入分布可能变了,或是模型本身出了问题。
更直接的是业务反馈型指标,比如推荐系统的点击率、搜索的转化率。这类指标能反映模型效果,但存在延迟和噪声——用户行为需要时间积累,并受外部活动影响。所以比较好的监控方案是“系统指标兜底和模型指标预警分层结合”:系统指标保证服务有响应,分布指标提示变更发生,业务指标验证效果真伪。
5.2 数据漂移的完整处理流程
数据漂移是模型上线后最普遍却又最容易被忽视的问题。所谓数据漂移,是线上真实数据的分布和训练数据的分布出现了显著差异。比如电商大促期间,用户购买意愿整体提高,模型看到的特征分布就和平时不同,原来预测的准确率也就自然下降。
处理数据漂移,首先要能及时发现。实践中可以通过定期比较线上实时特征分布和训练特征分布来实现,常用的统计量包括PSI(族群稳定性指数)或KL散度。给每个关键特征设置阈值,当漂移指标超过阈值时触发告警,这算是一个可落地的第一步方案。
发现问题后,接下来要做的是找漂移根源。这个环节需要业务知识和数据排查结合:是不是近期有新的用户群体进入?某个特征的数据来源是否发生了变化?上游业务是否调整了规则?我通常会让负责这个模型的人先从业务侧排查,再看特征分布的变化细节,因为很多漂移的根因并不在模型本身。找到根因后再决定处理方案:有时需要重训模型,有时只需要调整特征工程,有时则要增加新数据源。
这里特别想强调:处理好一次数据漂移之后,一定要把根因和处理过程沉淀成文字,别让团队成员反复踩同一个坑。而且随着接入的模型越来越多,一个公共的漂移监控平台比每个模型各自写一套脚本要省心得多,这个平台的价值会在规模上来之后体现得格外明显。
6. 从零到一的落地路径:我个人推荐的顺序
6.1 小步快跑的路线图
从零开始搭AI工程,最大的忌讳是想一次到位。我见过不少团队上来就规划数据平台、特征平台、模型平台、推理平台,结果半年过去连一个能上线的模型都没有。比较好的路径是先跑通一个垂直场景的端到端闭环,再横向复制能力。
第一步是选择一个具体的业务场景,最好是一个有明确数据、有清晰效果衡量的场景,比如给用户做流失预警。围绕这个场景,把数据读取、特征工程、训练脚本、实验记录、简单部署全部跑通。这个阶段不需要完美,只需要“麻雀虽小五脏俱全”。重点是让团队对AI工程的全流程有体感,发现最容易卡住的地方。
第二步是在第一个场景稳定运行的基础上,提炼公共组件。比如数据校验、特征复用、模型版本管理、监控模板。这些组件在第一轮往往是“顺便”做出来的,验证有效后可以抽出来给更多场景复用。
第三步才是平台化。当你有了三五个线上模型,每个模型都要重复做一遍部署、监控、告警配置时,自然会产生平台化的需求。这时再做统一管理,就是顺水推舟的事,整个方案也会更贴合实际。
有明确的顺序感之后,团队不会因为一次性铺太大而陷入混乱。
6.2 过程中的关键经验心得
做到这里,已经算是一次比较完整的实践。最后说说我在反复经历“从零搭建、上线、踩坑、再搭建”之后,沉淀下来的一些体会。
第一,AI工程的核心约束是“反馈闭环”。如果模型预测之后,没有任何机制告诉你结果好不好,那整个系统就是盲目的。所以哪怕最开始没有复杂监控平台,也至少要有一个简单的数据回传渠道,记录用户行为或业务结果。
第二,工程上不要追求“最新”,要追求“最稳”。深度学习框架和部署工具的新版本往往伴随行为变化,生产环境升级必须谨慎。我的习惯是线上环境锁定版本,升级之前先在测试环境完整回归一遍模型指标和性能指标。
第三,文档和规范的价值会随着团队扩大而凸显。早期两三个人时,口头沟通仿佛够用;一旦加到五个以上,没有实验记录规范、没有部署流程定义,就会出现效率的指数级下降。这不是管理强迫症,而是AI工程本身的复杂性决定了它必须依靠流程来约束。
从零到一并没有多神奇,无非是把数据、实验、部署、监控这个闭环一圈圈跑顺,把该踩的坑提前踩掉。之后每接入一个场景,都会比上一个更快更顺,这也是做AI工程最有成就感的地方。