从零开始学AI工程:数据管道、特征系统与推理服务实战

发布时间:2026/9/30 8:46:35
从零开始学AI工程:数据管道、特征系统与推理服务实战 两年前如果有人告诉我做AI工程的核心不是调模型而是调服务、管数据、控成本、扛故障我大概会嗤之以鼻。那时候我一心只想把模型效果刷上去在榜单上拿个好名次。直到我第一次把一个自认为“完美”的模型部署上线被线上流量和无穷无尽的数据问题打得满头包才彻底想明白模型只是AI工程这棵大树的树冠底下看不见的根系——数据管道、特征系统、推理架构、监控告警——才是决定生死的部分。最近好几个技术群里都在转一个叫ai-engineering-from-scratch的开源项目标题很直白从零开始学AI工程。真正打开看过的朋友会发现它没有按套路铺一堆机器学习理论而是把重心压在“工程”两个字上——数据管道怎么设计、特征怎么算才算数、模型怎么上线、上线之后怎么盯、流量暴增时怎么扛。这个定位恰好戳中了一大波人的真实困境理论学过了模型也能跑通可真要交付一个能稳定使用的产品还是不知道从哪里下手。这篇文章我就以这个项目给我的启发为主线结合我从算法岗位转向AI工程岗位后的实战经历把“从零开始做AI工程”这件事完完整整拆一遍。无论你是刚入行的算法工程师、想转AI的后端开发还是已经在做ML但总觉得缺了点工程底子的同学这篇内容都值得花点时间读下去。1. 先搞清楚AI工程到底在“工程”什么1.1 为什么单靠“调模型”撑不起AI项目很多人的第一反应是AI工程不就是把模型训练好、部署上去嘛。如果你只是做一个课程作业或Demo这个理解勉强成立但真实业务里的AI项目模型训练往往只占整个工作量的百分之二三十。剩下的时间全部被这些事情吃掉了数据对不对、特征新不新鲜、上游延迟多少、推理服务能不能扛住双十一流量、模型上线后效果有没有悄悄退化、日志怎么埋、指标怎么采、出了问题怎么在十分钟内定位回滚。你可以把AI项目想象成一家餐厅。模型只是掌勺的厨师但客人能不能吃上一顿满意的饭还取决于采购数据、切配特征工程、传菜推理链路、餐具清洗资源回收和排位系统流控降级。厨师固然重要但光有一个好厨师撑不起一家餐厅。AI engineering的核心就是把这整条链路从“能跑”做到“稳跑、快跑、可监控、可回滚”。这个认知如果没有建立后面的一切都会走偏。所以我带过的每一个新人入职第一周我都不让他们碰模型先从读线上日志和看监控面板开始先把“工程”两个字刻进脑子。1.2 一个完整的AI工程链路长什么样从 ai-engineering-from-scratch 项目的目录结构也能看出这条链路的完整轮廓。它大致把AI工程拆成了五个环节环节核心问题典型工具/技术数据管道数据从哪来、怎么清洗、怎么保证可靠Airflow、Kafka、Spark、dbt特征系统特征怎么算、怎么存、线上线下一致性怎么保证Feast、Redis、Flink训练与实验实验怎么管理、模型怎么评估、怎么复现MLflow、Weights Biases、PyTorch推理服务模型怎么上线、延迟吞吐怎么平衡FastAPI、ONNX、TensorRT、Triton监控治理模型是否漂移、系统是否健康、怎么告警Prometheus、Grafana、Evidently这五块不是说都要做深做透才叫入门而是每个环节你都要有“能动手”的能力。很多人刚开始容易犯的错误是贪多求全今天刷一下数据工程的课明天又看两篇推理优化的文章结果什么都摸了一遍什么都立不起来。正确的做法是把这条链路跑通一个小而完整的闭环哪怕只是一个很小的业务场景再逐段加深。2. 从零起步核心技能栈与学习路线拆解2.1 数学与编程的“够用”标准“从零开始”这四个字吓退了不少人总觉得要先把线性代数、概率论、凸优化全部学到位才能动手。我的看法是数学要补但不需要一步到位。你只需要先握稳三个支点线性代数里的矩阵乘法与特征分解理解向量化计算和降维、概率论里的条件概率与贝叶斯思维理解模型的不确定性、微积分里的梯度与链式法则理解反向传播。这些你甚至可以在遇到具体问题时再回头查不用先把三本数学教材啃完。编程方面的门槛稍微高一些。Python是必须的但重点不是语法而是三个能力用NumPy/Pandas做数据操作、写清晰的模块化代码、以及读懂框架源码的错误信息。另一个容易被忽视的能力是Linux命令行和Shell脚本。你在本机能跑通的训练脚本到了服务器上往往要处理环境变量、GPU驱动、进程守护、日志轮转这些都不是Python能替你解决的。说句实在话我会Linux操作和Docker部署的博士生通常比只会在Jupyter里拖拽训练的同学更容易拿到好机会。2.2 模型训练之外数据管道与特征系统这是从“会做模型”到“会做AI工程”的跨越中最陡的一道坎。模型训练本身非常单纯拿一批标注好的数据定义一个损失函数用优化器迭代。真正复杂的是数据怎么来的。在真实业务中数据散落在不同数据库、不同日志文件、不同第三方接口里格式不一样、口径不统一、延迟还各异。你要设计一个管道让这些数据按时、按质、按量地汇入训练集和特征库。特征系统的核心痛点则是“线上线下一致性”。这是很多从零起步的人完全没概念的地方。简单说就是训练时你算特征用的代码和线上推理时算特征用的代码必须完全一致否则会出现训练离线评估95分、上线实测50分的惨案。我在早期的项目里就吃过这种亏——离线特征用Pandas算出某个字段线上推理时却因为时间戳格式不同而变成空值模型直接“失明”。**经验从第一天起就要求自己把特征计算写成统一的函数库离线和在线都调用同一份代码并用真实线上数据做回放测试。**这条铁律能帮你避开八成以上的线上效果翻车问题。2.3 部署与推理从离线模型到在线服务模型训练完成后你手里拿到的是一堆权重文件。要让业务方调用它你得把它变成服务。这个环节里新手最容易误解的一点是部署就是把Flask起一个接口load一下模型文件然后调predict方法。这在低并发、实验性的场景下没有太大问题但生产环境里你很快会遇到瓶颈单次推理耗时长、GPU显存不够、进程一多就不稳定、如何动态扩容、如何灰度发布。实际工作中我一般会把推理服务按这个层次来设计模型转换与优化训练好的PyTorch模型先转成ONNX再加Torch-TensorRT或直接转TensorRT引擎根据GPU型号做FP16量化。这一步在性能上的收益通常是几倍到十几倍远远大于你换台更强的机器。服务框架选型小流量场景直接用FastAPI封装就够用并发要求高、有动态批处理需求时考虑用Triton Inference Server这类专门为推理设计的框架。服务化封装对外提供统一的HTTP/gRPC接口内部做输入校验、特征拼装、模型推理、输出后处理、日志埋点。弹性伸缩用Kubernetes管理服务副本数配置HPAHorizontal Pod Autoscaler按CPU、GPU利用率或QPS自动伸缩。这一套下来你的AI项目才算真正有了“工程”的模样。很多从零开始的朋友不是缺少学这些的能力而是缺少一个“我应该学这些”的认知地图。ai-engineering-from-scratch这类项目最大的价值就在于把这张地图给你画出来了。3. 实操搭建一个端到端的AI工程最小系统3.1 环境与技术栈选型要真正理解AI工程你不应该只是看文档而是亲手搭一个最小闭环。我建议的场景非常简单做一个文本情感分类服务输入一句商品评论输出正面或负面。数据可以用公开的影评数据集模型用BERT-base或者更轻量的DistilBERT。为什么选这个因为数据量小、模型不复杂你可以把绝大部分精力放在工程链路上而不是陷在调参里。技术栈我推荐这样搭配这是个人实践下来性价比最高的一套Python 3.10PyTorch 2.x训练与模型定义MLflow实验追踪、模型注册FastAPI推理服务API层Docker容器化Prometheus Grafana监控指标展示PostgreSQL存储特征与预测日志方便回溯分析这套组合覆盖了从训练到上线再到监控的完整链路而且每一环都有大量的社区资料可以参考。3.2 数据准备与特征计算细节这个最小系统你不需要一开始就上Kafka和Flink那一套重型组件但数据管道的基本思维要练。我的建议是把数据准备过程写成一个可重复执行的脚本而不是在Jupyter里手动跑。每一步都做校验比如检查数据量是否异常、标签分布是否偏离预期失败时要有明确的报错。特征工程在这个任务里相对简单对评论文本做清洗去HTML标签、统一大小写、处理表情符号然后交给Tokenizer转成模型需要的输入格式。但你要在特征计算这一步养成一个习惯把特征逻辑和模型逻辑分开。什么意思清洗文本和转token的逻辑放在独立的包里面这样后续做服务化时可以直接复用而不是把一堆代码塞进训练脚本里。我踩过的一个坑是训练时用HuggingFace的Tokenizer做了padding到512长度但线上推理时忘了设置同样的max_length结果输入张量长度不一致直接报错。这种细节你要是没有统一的封装就会以最折磨人的方式出现。3.3 训练、评估与实验追踪从零开始训练一个模型会牵扯大量实验不追踪你永远记不住哪个参数组合跑出了什么效果。我强烈建议从一开始就接入MLflow哪怕你只有自己一个人用。每次训练记录超参数、数据集版本、模型结构、关键指标准确率、F1、推理耗时并把对应的模型权重注册到Model Registry。这样你回头看的时候每一条实验结果都有据可查。训练本身有几个参数值得多花时间理解而不是直接抄别人的batch size影响显存占用和收敛稳定性的平衡一般从16或32开始调。learning rateBERT微调常用的范围是2e-5到5e-5这个区间如果跑飞了画出来的loss曲线会很鬼畜。warmup steps学习率预热早期让模型逐步进入状态对Transformer类模型效果比较明显。还有一个容易忽略的实操细节固定随机种子。训练脚本里对Python、NumPy、PyTorch都设置随机种子否则你换一台机器跑同一个脚本结果对不上排查问题时会被折磨疯。项目初期就要把“可复现性”当作工程目标来对待这不只是学术规范也是工程排障的基本手段。3.4 模型服务化与性能优化模型感觉不错了接下来把它变成服务。我见过的第一个版本通常长这样FastAPI接口里每次请求都加载一次模型然后同步推理。这种写法问题很大——每次请求都要重新读权重文件延迟高不说GPU显存还会被频繁申请释放搞得很不稳定。正确做法是在服务启动时加载模型到内存只初始化一次后续请求共享同一个模型实例。在线推理时还需要做几件工程上的关键事输入校验长度超限、空文本、异常编码必须在接口层挡住不能任它们穿透到模型里。批处理如果流量模式是短时间大量请求可以在服务里做一个简单的动态批处理——把同时到达的若干请求拼成一个batch一起推理吞吐量提升非常明显。Triton这类框架内置了这个能力FastAPI里你也可以自己实现一个缓冲队列。超时与降级模型推理万一卡住接口要有超时控制并返回兜底结果比如默认分类为“中性”保证业务方不会因为AI服务故障而完全瘫痪。性能优化也不是盲目的。你要先量化瓶颈如果耗时主要在特征预处理就优化特征计算如果在PyTorch前向推理就考虑模型量化和TensorRT如果网络IO耗时严重就考虑gRPC通信。没有数据的优化都是议论文先拿Profile工具测清楚再动手。4. 从Demo到生产避坑经验与故障排查实录4.1 常见坑数据漂移、包版本、GPU显存这部分是我最想写给“从零开始”的同学的。以下每个坑我都亲自踩过而且踩一遍痛一遍。第一个坑是数据漂移。模型上线时效果很好过了两周准确率悄悄掉了5%。一开始我怀疑模型坏了查了半天代码都没问题最后对比线上输入特征分布才发现用户的评论内容和表达方式在变化训练集已经跟不上形势了。这就是典型的特征漂移和概念漂移。解决思路有两层一是监控特征分布的变化比如用PSIPopulation Stability Index检测二是建立周期性重训练的机制。很多团队只做模型部署不做模型更新这是生产事故的高发原因。第二个坑是环境不一致。本地训练用PyTorch 2.0到了服务器变成1.13或者本地Python 3.11服务器的系统Python是3.8。这种不一致会导致各种匪夷所思的行为有的是运行时直接报错更可怕的是行为静默改变。所以规范的Docker镜像不仅仅是“方便部署”它是环境一致性最有效的保障。我现在的团队刚入职的同学第一课就是学写Dockerfile不夸张地说这比多会两个模型重要得多。第三个坑是GPU显存管理。推理服务跑久了显存占用慢慢上涨最终OOM崩溃。这通常是因为推理框架在动态申请显存后没有合理缓存管理。一个捷径是用 PyTorch 的torch.cuda.empty_cache()结合max_memory_reserved做监控把显存状态打进日志和监控面板提前发现泄漏趋势。4.2 监控与回滚比部署更重要的事部署上线不是终点只是起点。没有监控的AI服务等于裸奔。我个人认为AI工程的监控有三个层次系统层监控CPU、内存、GPU利用率、QPS、延迟P50/P95/P99、错误率。这部分用Prometheus Grafana足够不需要任何AI专用框架。数据层监控输入数据的格式是否变化、缺失率多少、特征是否漂移。这一层常常被忽略但恰恰是最容易出问题的。模型层监控预测的分布、置信度变化、线上标注回流后的效果指标。另一个必须提前设计的是回滚机制。我见过一些团队模型上线出问题后只能“重新部署上一个版本”听起来不难但如果没有规范的镜像版本管理你甚至会找不到“上一个版本”到底对应哪个镜像。MLflow Model Registry 固定的镜像Tag比如model:v1.2.3可以解决这个问题每个模型注册时都锁定代码版本、权重和依赖回滚就是切换Tag的事。4.3 团队协作与项目管理的经验AI工程做久了你会发现最难的不是技术而是协作。一个AI项目通常涉及算法、后端、数据、运维等多个角色。如果各方没有统一的规范联调环节会变成一个黑洞。我的经验是强调三样东西接口契约先行在写代码之前先定义好输入输出字段、错误码、超时时间前后端按契约并行开发。Everything as Code数据管道配置、模型版本、服务部署都用代码和配置文件管理凡是人肉手工操作的环节都是事故隐患。文档即记忆架构图、决策记录、排查经验都要沉淀到文档里哪怕是简单的FAQ。AI工程的知识密度高、链路长靠脑记忆绝对撑不住。回到 ai-engineering-from-scratch 这个项目本身它的价值不是告诉你某一条具体的命令怎么写而是帮你把“AI工程”这个模糊的大词拆解成一系列可以逐项训练的技能点。你在跟随它学习的过程中会逐渐形成自己的技术判断力什么时候该上重型数据管道什么时候一行脚本就够了什么时候要引入监控平台什么时候只看日志就行。这种判断力就是AI工程师和只会调模型的人之间最本质的区别。最后分享一个我实际带团队时的小习惯每次项目复盘我都会让团队把“这次最大的阻塞点是什么”“下一次可以在哪个环节提前规避”写在一张便利贴上贴到工位上。几个月下来墙上贴满了各式各样的教训。我后来发现那些贴得最多的人恰恰是成长最快的工程师。AI工程这条路本质上就是一个不断把教训内化成肌肉记忆的过程走得慢一点不要紧关键是每一步都走扎实。