
半年前我第一次把训练好的模型交给后端团队上线时被问得哑口无言这个接口延迟多少QPS能扛多少模型文件多大特征怎么对齐怎么回滚我当时脑子里只有一份跑得通的notebook其他全是空白。那一刻我才意识到实验室里的准确率数字离一个真正的AI工程还差着十万八千里。这也是我想写这篇文章的原因。所谓ai-engineering-from-scratch不是教你怎么训练一个模型而是讲清楚从零开始把一个模型变成一套稳定、可靠、可迭代的AI系统到底要经历什么。它适合两类人一类是已经能跑通模型、但不知道下一步该怎么走的算法工程师另一类是准备在团队里推动AI工程化落地、却没找到完整路线图的Tech Lead。你不需要懂所有框架的源码但需要对数据、训练、部署、监控这四个环节有一个整体性的框架认知。下面就是我完整的实操经验。1. 从模型实验到AI工程的认知转换AI工程这个词被说得太烂了甚至有点被滥用。但真正做过的人都知道它和算法研究是完全两种工作方式。理解这个区别是建设AI工程的第一步。1.1 跑通模型只是起点在我接触的大量团队中最容易出现的误判是把notebook里的模型准确率当成了项目完成度。准确率90%好像就可以交付了。但实际上从跑通到生产可用中间还横着好几座山数据能不能持续流入特征会不会在线上和离线算的不一致模型服务能不能承受真实流量出问题了怎么定位我见过一个项目模型在线下测试的F1分数很高但上线后业务反馈一塌糊涂。查到最后发现线上请求经过网关时部分字段被截断进入模型的特征分布和训练时有明显差异。这种问题在notebook里永远发现不了只有在真实系统里才会暴露。所以说AI工程的核心工程对象不是模型本身而是围绕模型构建的一整套系统。一个朴素但重要的判断标准如果模型下线团队能不能在一小时内让业务恢复原状如果不能说明你的AI工程还缺少关键环节。1.2 AI工程的四个核心支柱我习惯把AI工程拆成四块数据、训练、部署、监控。这四块不是串联关系更准确的说是互相咬合的齿轮。数据质量决定模型上限训练流程决定迭代速度部署方式决定服务稳定性监控机制决定系统可持续性。这也是为什么我不建议一上来就追最新的框架、最强的算力。先盘一下四个支柱里哪个最薄弱然后集中精力补上。数据源头混乱先搞数据治理训练与复现靠运气先搞实验管理线上模型出问题无人知先搞监控告警。把最弱的短板补齐工程体系的稳定性会肉眼可见地提升。这里有个关键认知AI工程不是一次性的搭建工作而是一个持续演进的过程。不要试图一步到位先建立最小闭环再逐轮加固。2. 数据底座AI工程的起点如果说模型是马车数据就是路。路不平马车再好也跑不快。在我实操过的项目里数据相关的问题占了整个AI工程周期里超过一半的时间所以这部分必须最先聊透。2.1 数据管线的分层设计与实现从零开始搭数据管线我推荐按采集-存储-处理-发布四层来组织。采集层统一收口业务数据、日志、外部接口数据做到格式标准化、字段有schema约束。存储层原始数据存对象存储中间结果存数仓特征数据存特征库各司其职互不污染。处理层用批处理做离线聚合用流处理做实时特征刷新两条链路共用一套数据定义。发布层通过数据版本管理工具为每个数据集打快照训练作业只消费指定版本的数据。这里很多人会问一开始数据量不大是不是可以从简我的回答是工具可以简单结构不能乱。哪怕只有几百MB数据也要把目录结构、命名规范、版本标记建立起来。因为数据管线的核心目的不是处理大数据而是让每次模型训练的数据都可追溯。我自己的一个实操习惯是每个数据集快照都附带一个manifest文件里面写清楚数据来源、采集时间、预处理操作和负责人。这样当模型效果异常时我可以快速回溯是哪一批数据引入了问题而不是在全量数据里大海捞针。2.2 特征一致性离线与在线对齐问题这是AI工程里最隐蔽、也最容易翻车的坑。训练时模型从离线特征表里读数据推理时模型从在线特征服务里拿实时特征。如果两边对同一个特征的加工逻辑不完全一致那模型的输入分布就已经变了再强的算法也救不回来。我踩过最深刻的一次坑是时间戳处理。离线训练时我们把时间戳转换成了本地时间的小时特征上线时服务部署在多台机器上有的机器时区没设置对导致小时特征偏移了8小时。那个模型上线后每天晚上的预测准确率都下降排查了三天才发现是时区问题。要解决离线在线一致性问题必须做到特征逻辑代码统一。最稳妥的做法是把特征计算函数打成公共包离线和在线共用同一份代码。如果做不到至少要建立一份特征逻辑文档并通过离线回放的方式定期验证两个链路产出的特征分布是否一致。一个建议把特征一致性检查写入模型发布流程。新特征上线前必须离线回放N天数据比较在线特征与离线特征的分位数分布差异差异超过阈值则禁止发布。3. 训练端的工程化改造数据问题上道之后接下来就是训练端。很多算法工程师习惯在notebook里调参跑出一个模型就导出这种模式在小项目里没问题但当模型需要每周迭代、多人协作时就完全不可行了。3.1 从Notebook到可复现训练流程Notebook本身不是敌人不能复现才是敌人。我见过团队里的同学训练时用了某个随机种子但没记录到底是什么还有人手动改过训练脚本但代码库里没有对应commit。这种状态下一旦模型效果有波动根本无从定位原因。所以我对训练流程的工程化改造第一件事就是制定可复现三要素代码版本、数据版本、超参配置。三者必须明确记录缺一不可。一个可复现训练流程的落地路径代码入库管理训练脚本和特征代码全部纳入版本库禁止在本地裸跑后不提交。配置与代码分离把超参、路径、模型结构参数写进YAML配置文件中训练脚本只负责读取配置。统一入口用一个entrypoint脚本拉起训练记录git commit、数据版本、启动时间、机器信息。产物归档训练结束后把模型文件、评估报告、配置快照一起归档到模型注册中心。这套流程看起来简单但每一条都是我踩过坑之后才总结出来的。尤其是配置与代码分离一开始觉得多此一举直到有次需要复现一周前的一个实验发现超参全写在代码里而代码已经被改得面目全非那才叫绝望。3.2 实验追踪与算力资源管理加上实验追踪工具是训练端工程化的一个分水岭。我自己的经验是不管初期多忙至少要记录三组信息指标组loss、accuracy、auc等、参数组学习率、batch size、模型层数、元信息组数据集版本、代码版本、GPU型号、框架版本。这些信息可以手工记录也可以接入MLflow、WandB这类工具。我比较推荐从轻量方案开始先保证有记录、能对比再逐步规范化。等实验数量多了、参与的人多了再统一到平台化管理。算力资源管理是另一个容易被忽略的点。多个人同时训练GPU资源怎么分配怎么避免某个任务把显存占满拖垮别人我建议至少在团队内形成一个简单的约定训练任务统一使用资源调度工具拉起限制单任务最大算力占用超时未完成任务强制释放。小技巧训练任务结束前自动把关键指标和配置发到团队聊天群。这样做的好处是每个人都能看到实验趋势省去反复询问“你跑得怎么样”的沟通成本。4. 模型部署与推理服务化模型训练好了要真正产生业务价值还得跨过部署这一关。部署的难点不在于把事情跑起来而在于让它长期稳定地跑下去。4.1 部署方式选型在线服务、批处理与边缘端部署方式没有银弹只有适不适合。我通常会建议团队想清楚业务场景再选型部署方式适用场景优点代价在线API服务实时推荐、风控、客服低延迟、可扩展需要运维基础设施批处理预测离线画像、报表分析简单可靠无法满足实时请求嵌入式/边缘端手机端、IoT设备无网络依赖、隐私友好模型压缩复杂、更新困难从我实操过的项目来看第一版模型上线如果业务允许优先选择批处理方式。因为它不需要考虑复杂的服务治理问题跑完任务落库就行成本最低。等到业务验证了模型价值再演进到在线API服务。在线API服务要注意的细节很多最重要的三个是模型加载预热、超时控制、优雅关闭。模型加载预热是为了避免第一个请求被模型初始化时间拖垮超时控制是为了防止模型推理阻塞拖垮整个服务优雅关闭是为了在发布更新时正在处理的请求不能被硬生生掐断。4.2 推理优化的关键参数很多人在部署后才发现模型离线测试很快线上却反应慢。这里有几个关键参数需要提前算清楚。单次推理耗时用生产环境的CPU/GPU实测而不是本地跑出来的数据。吞吐量QPS结合业务预估峰值乘以冗余系数我一般取1.5-2倍。服务实例数由吞吐量和单实例处理能力计算再考虑高可用的多副本冗余。延迟分位数不能只看平均延迟要关注P95、P99避免尾延迟拖垮体验。我举一个实际算例。假设模型单次推理耗时20ms单实例可以轻松支撑50 QPS。业务峰值预估是200 QPS乘以1.5冗余系数就是300 QPS所以需要6个实例。如果还要保证单个实例故障时不掉线就要再加1个冗余实例一共7个。这个例子非常简单但很多人上线前根本没算过。等流量冲进来了才发现实例不够扩容又来不及只能干着急。提示上线前一定要做压测而且要在和线上环境一致的机器上压测。用本地MBP跑出来的性能数据和线上共享CPU环境下的表现往往差别巨大。5. 线上监控与迭代闭环模型部署完成很多团队就以为大功告成。其实真正的工程考验从这一刻才开始模型在线上表现得好不好数据分布变了吗用户行为模式变了吗这些都靠着监控来回答。5.1 模型性能监控与漂移检测监控不是只盯着服务器CPU、内存这些基础设施指标更要盯模型业务指标和输入数据分布。我推荐在监控体系里至少包含三类指标业务指标如推荐点击率、风控拦截率、客服解决率直接反映模型是否贡献了价值。输入分布指标特征的均值、方差、分位数分布用于发现数据漂移。运行时指标单次推理耗时、请求量、错误率用于发现服务稳定性问题。漂移检测的落地方式我比较常用的是周期性计算线上特征分布与训练特征的PSI或KL散度。当漂移指标超过阈值时触发告警并自动对比两端分布的差异帮助定位是哪一批特征发生了变化。线上业务指标下降时先不要急着调模型要先确认是数据漂移、特征逻辑变更、外部环境变化还是模型本身上限不足。盲目重训模型往往浪费算力却解决不了真实问题。5.2 回滚、灰度与自动化运维AI系统必须和其他系统一样具备快速回滚能力。模型是有版本的每一次发布都应该对应一个可回退的上一个版本。我建议在发布流程中强制加入灰度发布步骤先切5%流量观察核心指标稳定后逐步放量到20%、50%、100%。这一步很多工程师嫌麻烦尤其在业务方催促上线时经常有人图省事直接全量。我理解压力但灰度真的能救命。有一次我们的新模型在某个人群上表现极差灰度阶段发现了问题流量还停留在5%10分钟内就回滚了业务几乎无感知。如果当时直接全量影响面会非常大。自动化运维层面至少要补齐三件事健康检查、自动重启、故障告警。模型服务进程挂了应该能在秒级自动拉起拉不起来系统要立刻通知到值班人。不要让用户比你先发现故障。6. 从零搭建AI工程的常见坑最后这一章我整理一下这几年从零搭建AI工程时反复遇到的坑。这些内容很个人但大概率你也会碰到。6.1 数据治理的坑数据治理最大的坑就是觉得它不够性感、优先级低拖到最后才来做。结果就是每个新模型都要重新写一遍数据清洗逻辑每个数据源都在重复踩坑。我的建议是无论项目多小第一个迭代就要引入数据schema校验和异常数据告警。数据字段缺失率超过阈值、取值超出枚举范围都应该第一时间被发现。数据如果有毒后面的模型、部署、监控全都是白搭。另外提醒一下不要过早追求复杂的实时数据架构。很多团队的实时需求并没有那么大Kafka、Flink全套上马维护成本翻了几倍。先用好离线批处理在数据新鲜度确实无法满足业务时再引入流处理。6.2 评估与测试的坑模型测试不只是看准确率。我在实践中养成的习惯是每次训练完至少看四类表现整体指标、分人群指标、异常样本表现、新样本表现。只看整体指标很容易被平均值骗了某个群体的指标可能已经差到不能接受。另一个容易被忽略的是离线与在线指标的对齐问题。离线评估涨了一个点线上业务指标却可能纹丝不动。我建议在模型上线前就约定好离线指标与在线业务指标的映射关系并在多个历史版本上验证这个映射是否稳定。6.3 跨团队协作的坑AI工程从来不是算法一个团队的事。我参与的项目里顺畅推进的都是算法、后端、数据、运维坐在一起磨合过的。这里有个非常实用的经验把AI系统的接口契约、数据依赖、性能指标写清楚并提前和相关团队对齐。最怕的场景是算法团队自嗨做了一大堆后端团队直到上线前才第一次见面。那时候出任何问题都只能加班救火。我建议把跨团队里程碑列出来在关键节点同步一次。哪怕只是半小时的站会也能把大量隐患消灭在早期。最后一个经验是从零开始做AI工程不要贪大求全先搞定最小闭环把一个模型端到端跑通再逐步叠加复杂度。我在第一个AI项目中就是靠着一个简化但完整的闭环建立了团队对工程化流程的信心。后面的迭代反而越来越顺。希望这篇文章能让你少走一些弯路哪怕是少加一次班也算是值了。