从零搭建AI工程能力这件事我前前后后折腾过好几轮。最早的时候我也走过弯路——买了一堆讲Transformer原理的书把注意力机制的公式推了一遍又一遍结果真到了要上线一个模型服务的时候连推理延迟怎么压、显存怎么省、请求怎么排队都搞不清楚。后来我才想明白一个道理AI工程不是AI研究它更像是一门把模型安全、稳定、高效地跑在生产环境里的手艺活。这个项目标题ai-engineering-from-scratch之所以值得聊就是因为它戳中了很多人的痛点——大家不缺调包的能力缺的是从零把一整套工程链路搭起来、并且知道每一步为什么这么做的能力。这篇文章我想聊的不是某个具体框架的API怎么调而是从零构建AI工程能力时那些真正决定成败的环节数据管道怎么设计才不会在后期拖垮你、模型训练和推理的工程边界在哪里、服务化部署时哪些参数是生死线、监控和迭代闭环怎么搭。适合已经会写Python、跑过几个demo、但一到真实项目就发怵的开发者也适合想系统梳理自己知识盲区的老手。我会尽量把每一步背后的为什么讲透而不是甩给你一堆命令让你照抄。1. 先搞清楚AI工程到底在工程什么1.1 模型只是冰山露出水面的那一角很多人对AI工程的想象是这样的拿到数据训练模型部署上线完事。但真实项目里模型训练代码往往只占整个代码库的5%到10%。剩下的90%是什么是数据清洗、特征管理、实验追踪、模型版本管理、服务编排、监控告警、回滚机制。我见过太多团队把全部精力砸在调模型结构上结果上线后发现数据分布漂移了没人知道模型更新了没有回滚方案一个bad case排查了三天才发现是上游数据管道某天开始多了一个空值。所以从零搭建AI工程能力第一件事是建立正确的心理预期你花在非模型部分的时间会远超想象而且这些部分才是决定项目能不能长期活下去的关键。模型可以换架构可以调但一套烂掉的数据管道和缺失的监控体系会让整个系统变成没人敢碰的黑盒。1.2 三个绕不开的核心子系统把AI工程拆开看无论你做的是CV、NLP还是推荐底层都逃不出三个子系统数据子系统负责数据的采集、清洗、版本化、特征抽取和供给。它的核心诉求是可复现——同样的输入必须产出同样的输出否则你连实验都没法对比。训练子系统负责实验管理、超参搜索、分布式训练、模型评估和产物管理。核心诉求是可追踪——任何一个模型产物你都能回溯到它是用哪份数据、哪套配置、哪次代码提交训练出来的。服务子系统负责模型推理、请求编排、资源调度、监控告警。核心诉求是可观测——线上出了任何问题你能在分钟级定位到是数据、模型还是基础设施的锅。这三个子系统不是孤立的它们之间有明确的接口。数据子系统产出的特征要能被训练和服务同时消费这就是为什么特征存储这个概念会出现训练子系统产出的模型要能被服务子系统无缝加载服务子系统收集的线上数据又要能回流到数据子系统形成闭环。从零搭建的过程本质上就是把这套接口定义清楚、把每个子系统的边界划明白的过程。1.3 一个反直觉的结论先搭服务再训模型大多数人的直觉是先有模型才能服务所以顺序是数据→训练→服务。但在工程实践中我强烈建议你先把服务子系统的骨架搭起来哪怕里面塞的是一个随机初始化的假模型。原因有三个第一服务化会倒逼你把输入输出的契约定义清楚。你到底接收什么格式的请求返回什么结构的结果超时怎么处理这些问题的答案会直接反过来约束你的数据预处理和模型输出设计。如果等模型训完再想这些往往要返工。第二服务骨架搭好后你可以用假模型先把整条链路请求→预处理→推理→后处理→返回跑通把监控、日志、限流这些基础设施都验证一遍。等真模型来了只需要替换推理那一小段风险可控。第三也是最重要的一点有了服务骨架你才能定义什么叫模型好。离线指标准确率、F1和线上指标延迟、吞吐、业务转化经常是打架的。先有服务你才能建立线上评估的基准线训练才有明确的目标。2. 数据管道最容易被低估、也最容易埋雷的地方2.1 为什么你的实验总是无法复现我敢打赌每个做过AI项目的人都遇到过这种情况上周跑出一个效果特别好的模型这周想复现结果怎么调都回不到那个指标了。代码没改超参没改问题出在哪十有八九是数据变了。数据管道最常见的坑是隐式依赖。比如你的清洗脚本里写了一句过滤掉长度小于10的样本但你没记录这个阈值是怎么来的又比如你的特征抽取依赖了某个外部API而那个API某天悄悄改了返回格式。这些变化不会报错只会让你的数据静默地变样然后模型效果莫名其妙地波动。解决办法是数据版本化。每次数据管道跑完产出的数据集要有一个唯一标识可以是内容哈希也可以是时间戳加配置哈希并且这个标识要和你训练时用的配置、代码commit一起记录下来。这样任何时候你都能回答这个模型是用哪份数据训的。工具层面DVC、LakeFS、或者自己用对象存储加元数据库都能实现关键不是工具而是养成数据即产物的意识。2.2 特征一致性训练和服务的头号杀手训练时用Python的pandas算特征服务时用Java或Go重写一遍——这是特征不一致的经典来源。两边逻辑只要有一丁点差异比如pandas的默认填充值是NaN而你服务端填的是0线上效果就会崩。业界的标准解法是特征存储Feature Store核心思想是特征的定义只写一次训练和服务共用同一份计算逻辑。实现方式有两种一种是离线用Spark算好存起来服务时直接查适合变化不频繁的特征另一种是定义好特征变换逻辑训练时批量跑、服务时单条跑保证逻辑一致适合实时特征。从零搭建的话我建议先用最简单的方式起步把所有特征变换逻辑抽成一个独立的、无副作用的纯函数库训练和服务都import这个库。等业务复杂到需要实时特征了再引入专门的特征存储。不要一上来就上重型工具那会让你在还没搞清楚需求的时候就被工具的复杂度淹没。2.3 数据质量监控别等模型崩了才发现数据脏了数据管道搭好只是开始持续监控数据质量才是长期活。你需要监控的维度包括监控维度具体指标异常后果完整性空值率、缺失字段数特征计算失败或偏差分布均值、方差、分位数漂移模型效果下降一致性字段类型、取值范围管道报错或静默错误时效性数据到达延迟实时特征过期唯一性重复样本比例训练集泄漏、评估失真这些监控不需要多复杂哪怕就是每天跑一个脚本把关键统计量和历史基线对比超过阈值就告警就能挡住80%的问题。我踩过最惨的一次坑是上游某个字段从字符串数字变成了带单位的字符串导致特征全部变成NaN而管道没报错模型照常输出只是输出全是垃圾。如果当时有分布监控这个问题在第一天就会被发现。3. 训练工程把实验从玄学变成科学3.1 实验追踪不是可选项是必需品没有实验追踪的AI开发本质上是在赌博。你改了五个超参效果变好了但你不知道是哪个起的作用你想回到两周前那个最好的版本但你已经不记得当时改了什么。实验追踪要记录的东西至少包括代码版本git commit、数据版本、超参配置、环境依赖requirements或conda环境、评估指标、模型产物路径。工具上MLflow、Weights Biases、TensorBoard都能用但核心是纪律——每次实验必须记录不能有例外。我见过太多团队买了工具但没人用最后还是靠Excel记那还不如不买。从零搭建的话我建议先用最轻量的方式每次训练自动生成一个实验目录目录名用时间戳加配置哈希目录里放config、metrics、模型文件再用一个简单的SQLite或CSV做索引。这套土办法能撑很久等真的不够用了再迁移到专业工具。3.2 分布式训练什么时候需要怎么不踩坑单卡训不动了要上多卡这是必然的。但分布式训练的水很深我见过太多人一上来就上多机多卡结果调了一周连loss都不收敛。先搞清楚你的瓶颈在哪是显存不够模型太大放不下还是算力不够模型放得下但训太慢。如果是显存不够优先考虑梯度累积、混合精度、梯度检查点这些单卡就能用的技巧如果是算力不够再考虑数据并行。模型并行和流水线并行是最后的选择因为它们的工程复杂度高一个数量级。数据并行里最常见的坑是batch size和learning rate的缩放关系。你把batch size从32提到256如果learning rate还保持不变收敛会明显变差。经验法则是learning rate随batch size线性或平方根缩放但具体用哪个要看优化器和任务需要做小规模实验验证。另一个坑是BatchNorm的统计量在多卡下每个卡只看到部分数据统计量会有偏差这时候要么用SyncBN要么换成LayerNorm/GroupNorm。3.3 模型评估离线指标好看不等于线上好用离线评估最大的陷阱是数据泄漏。你的验证集如果和训练集有重叠样本或者特征里包含了未来信息离线指标会虚高得离谱上线后原形毕露。检查数据泄漏的方法很简单用一个随机模型跑一遍如果它的指标明显高于随机水平那基本可以确定有泄漏。另一个陷阱是评估指标和业务目标脱节。比如你优化的是AUC但业务关心的是Top-K的准确率或者你优化的是整体准确率但业务对某一类样本的召回率有硬性要求。评估指标一定要和业务方对齐最好能建立一个离线指标到线上指标的映射关系哪怕只是粗略的相关性分析也能帮你判断离线提升是否值得上线。4. 服务化部署模型上线的最后一公里4.1 推理服务的三种形态与选型逻辑模型服务化大致有三种形态各有适用场景嵌入式模型直接打包进业务应用进程比如移动端的TFLite、服务端的ONNX Runtime。优点是延迟极低、无网络开销缺点是更新模型要重新发版资源隔离差。独立服务模型单独部署成一个服务业务通过RPC或HTTP调用。优点是解耦、可独立扩缩容、更新不影响业务缺点是多了网络开销需要处理服务发现问题。Serverless按请求计费冷启动时加载模型。优点是成本低、无需运维缺点是冷启动延迟高不适合延迟敏感场景。选型的核心是看延迟要求、更新频率、成本预算这三个维度。延迟要求高且模型不大选嵌入式需要频繁更新且要独立扩缩容选独立服务流量波动大且能容忍冷启动选Serverless。大多数生产场景是独立服务因为它在灵活性和性能之间平衡得最好。4.2 延迟优化的几个关键手段推理延迟是服务化的核心指标优化手段按性价比排序模型量化把FP32转成FP16或INT8延迟通常能降30%到70%精度损失可控。INT8量化需要校准数据集FP16基本无损。算子融合与图优化用TensorRT、ONNX Runtime、TVM这类推理引擎它们会自动做算子融合、内存复用、kernel调优。实测下来同样的模型用TensorRT比原生PyTorch推理快2到5倍。批处理Batching把多个请求攒成一个batch一起推理能显著提升吞吐。但要注意动态批处理的等待时间不能太长否则延迟反而上升。一般设一个最大等待窗口比如10ms窗口内攒多少算多少。KV Cache与投机解码针对大语言模型的优化KV Cache避免重复计算历史token投机解码用小模型草稿加