ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI工程从零开始:数据、模型与部署的完整实践指南

AI工程从零开始:数据、模型与部署的完整实践指南

1. "从零"到底是什么意思:先搞清楚AI工程师到底在做什么

很多人看到"从零开始学AI工程"这个概念,第一反应是去刷网课、背模型结构、抄几段PyTorch代码。但我带了这么多年AI团队,见到的真实情况是:真正卡住大家的往往不是模型本身,而是对"AI工程"这四个字的理解偏差。在我自己的经历里,从普通后端开发转过来踩过最深的一个坑,就是带着"写代码让机器干活"的惯性思维去做AI,结果前三个月全浪费在调参和改bug上,连一个能稳定跑完训练的项目都没做出来。

先给一个我自己的定义:AI工程,不是"用Python调库实现某个算法",而是"把数据、模型、算力、评估、上线、监控串成一条可靠流水线"的能力。算法工程师和AI工程师的区别就在这里——前者可以只关心模型准确率升了零点几个点,后者必须关心这个模型在真实流量里会不会崩、数据分布变了怎么重训、推理延迟能不能压到业务要求的100毫秒以内。

这篇文章比较适合两类人看。第一类是写过几年业务代码、想转AI方向的后端或全栈工程师;第二类是刚入门机器学习、发现"照着教程能跑通MNIST但面对真实问题毫无头绪"的初学者。我会按自己实际带项目的经验,把从零到能独立交付一个AI项目所需要的知识、流程和避坑点从头捋一遍,尽量说人话。

另外有个基本的道理先放在前面:从零开始不等于从理论开始。线性代数、概率论这些东西当然重要,但它们不该是第一关。第一关应该是建立"数据进、预测出、能验证"的最小闭环。先把这个闭环跑通,再回头补数学,效率会高很多。

2. 地基部分:数学、编程、数据三块砖怎么铺才不白费

2.1 编程能力:比很多人想的更"工程化"

AI工程师的编程能力和传统开发有明显差异。常规后端开发讲究的是业务逻辑清晰、接口稳定、状态管理严谨;AI工程里的代码,核心矛盾变成"怎么写才能让训练过程可复现、可调试、可扩展"。

我见过的初学者最容易犯的毛病,是写一堆全局变量加一个巨型函数,把数据预处理、模型定义、训练循环全塞进去。跑通一遍没问题,但等到要改模型结构、换数据集、跑对照实验的时候,整个人就崩溃了。建议从第一天起就养成三个习惯:

  • 所有随机种子统一管理(数据加载、模型初始化、PyTorch/TensorFlow框架层都要固定),保证实验可复现。
  • 数据和模型强解耦。数据集的读取、清洗、增强写在独立模块里,不要跟训练代码混在一起。
  • 每个实验结果都要有记录,至少记下超参数、数据版本、代码commit号。这个习惯在后期调优时救命的次数太多了。

至于编程语言,Python目前还是绝对的主流,没什么可犹豫的。但注意,AI工程里Python只是前端,真正跑得快的是底层的C++/CUDA。所以不用深入学C++,但要对张量操作、内存占用、CPU/GPU数据搬运这些概念有基本认知,否则后面做性能优化会完全无从下手。

2.2 数学要学到什么程度:一张表说清楚

我见过两个极端:一个是数学系出身的大牛,公式推得飞起,写起工程代码却一团糟;另一个是培训班出来的,代码能跑但稍微改个损失函数就懵。AI工程需要的数学,讲究的是"够用"和"会用",不需要你把一本PRML从头啃到尾。

数学门类必须掌握的内容典型应用场景
线性代数矩阵乘法、转置、特征分解、SVD全连接层前向传播、词向量降维、图像数据变换
概率统计分布、期望方差、最大似然估计、贝叶斯思想损失函数设计、A/B测试、模型不确定性评估
微积分偏导、链式法则、梯度含义反向传播原理、梯度下降变体的理解
最优化凸优化直觉、学习率概念、正则化原理训练不收敛时的排查、防止过拟合

这里有个很实用的观点值得分享:大部分时候你是"在用数学",而不是"在推导数学"。比如要理解Transformer里的Attention为什么能work,不需要从头推导QKV矩阵的数学性质,但必须知道它是一个"加权平均"的操作、权重来自相似度计算这个直觉。遇到问题能知道该查哪个知识点,比能默写公式重要得多。

2.3 数据能力:最容易被低估的关卡

说句可能得罪人的话:现在很多AI项目的失败,不是死在模型选型上,而是死在对数据的理解上。我自己经手过的真实案例——花了一个月调模型结构,准确率纹丝不动;后来排查才发现数据里有大量重复样本,训练集和验证集重叠率高得离谱,之前的"提升"全是假象。这类事在真实项目里太常见了。

从零开始学AI工程,数据这块至少要做对三件事:

  • 学会系统性审视数据:样本量够不够、类别是否均衡、有没有标签噪声、分布有没有时间和地域偏差。
  • 掌握数据清洗和特征工程的基本操作:缺失值处理、异常值检测、标准化、类别编码,这些传统手段现在仍然有大量场景需要。
  • 建立数据版本意识:数据集本身要像代码一样管理,不能某天同事说"我更新了一下数据"然后整个实验基线全变。

提示:如果预算精力有限,我建议把50%的精力花在数据上,30%花在评估和上线,20%花在模型结构上。这个比例和大多数初学者的直觉完全相反,但真实项目里它就是最合理的分配。

3. 第一个真正完整的项目:从数据到模型到验证

3.1 选题是关键:宁小勿大

想要"从零"跑通完整流程,选一个恰当的练习项目比什么都重要。我强烈建议避开两类:一类是Kaggle上的大厂比赛题,数据动辄几十GB、特征几百个,新人很容易淹没在细节里;另一类是"用AI识别猫狗"这种早就被做烂的点,学不到新的工程经验。

更好的选择是找一个"有真实数据但还没有现成好方案的小问题"。比如你所在公司的客服工单分类、内部文档自动打标、或者爬一点公开数据做商品评论情感分析。这类项目的特点是:数据量不大(几千到几万条)、问题定义清晰、业务方愿意告诉你"什么样算好用"。

我见过最成功的一个新手项目,是有人拿自己过去一年手写的会议记录做字迹识别和主题归类。数据就几百条,模型也不复杂,但完整经历了数据标注、清洗、训练、评估、做成命令行工具给同事用的全过程。这个项目做完,他对AI工程的认知比上十门课都深。

3.2 从数据到模型的最小闭环

下面我用一个文本分类的案例,把从数据到模型的完整流程串一遍。假设要做的是"自动判断客服工单属于哪个一级分类"。

第一步,数据整理。原始数据可能是Excel表或数据库导出的CSV,先做这几件事:

  • 查看字段、统计缺失率和类别分布。
  • 定义标签体系,尽量控制在5到10个类别,保证每类至少有几百条样本。
  • 做一次简单的随机抽样人工检查,确认文本内容和标签是否对得上,这一步能发现大量标注错误。

第二步,数据预处理。这时候不用上什么复杂的深度学习,先用传统方法跑一个基线模型,比如TF-IDF加逻辑回归或XGBoost。这一步的目标不是追求高准确率,而是验证"数据本身能不能学出信号"。如果连简单的词频特征都分不出类别,说明数据质量或者标签定义有问题,这时候停下来排查比硬调模型有意义得多。

第三步,训练与验证。代码框架建议直接用PyTorch,虽然初学者会嫌它不如Keras好上手,但Keras封装过深,遇到问题不好排查。训练时注意拆出独立的验证集,早停(early stopping)和模型保存一定要做好。一个典型的训练循环长这样:

for epoch in range(num_epochs): model.train() for batch in train_loader: X, y = batch logits = model(X) loss = criterion(logits, y) optimizer.zero_grad() loss.backward() optimizer.step() model.eval() val_loss, val_acc = evaluate(model, val_loader) if val_loss < best_loss: torch.save(model.state_dict(), "best_model.pt") best_loss = val_loss

这个代码看起来简单,但里面有三个关键点:model.train()和model.eval()的切换(影响Dropout等层的行为)、验证集上的评估必须放在torch.no_grad()下(否则会占额外显存)、只保存验证集最优的模型而不是最后一个epoch的模型。这三个细节十个人里至少有五个会踩坑。

3.3 评估到底在测什么

很多初学者看到准确率95%就觉得自己成功了,这是非常危险的。以客服工单分类为例,如果"退款类"工单占了80%,那一个永远预测"退款"的模型准确率就已经是80%了。所以评估必须看更细的指标。

二分类问题至少要看精确率(precision)和召回率(recall),以及F1值。多分类问题除了整体准确率,还要看每个类别的精确率和召回率,重点关注那些样本少但业务重要的类别。另外,混淆矩阵一定要画,它能直接告诉你模型把哪些类别混在一起了——比如"退货"和"退款"经常被分错,这往往说明标签定义本身有歧义,而不是模型不够强大。

这里我特别想强调一个反直觉的经验:第一次做项目的人,最大的问题通常是"想一步到位"而不是"分步迭代"。正确做法是先做一个最粗糙的版本,然后花一个下午时间一条一条看错误预测样本,弄清错误类型,再针对性地改进数据和特征。这个"看错误"的习惯,比任何调参技巧都值钱。

4. 逃不开的工程化:框架选型、算力、MLOps基础

4.1 深度学习框架和开发环境怎么选

PyTorch现在是事实上的主流,学术生态和工业界都大量使用。TensorFlow在部分老系统里还在,但新项目基本不推荐从它入门。选PyTorch的理由很简单:问题排查资料多、动态图调试方便、和Hugging Face等生态集成最顺畅。

环境的坑比框架本身多得多。强烈建议从一开始就用虚拟环境管理依赖,而不是在全局环境里装一堆包。我的习惯是每个项目一个独立的Python环境,用requirements.txt或poetry锁定依赖版本。CUDA和GPU驱动这块更是重灾区——经常有人装完PyTorch之后发现CUDA版本对不上,显卡识别不了。建议安装时直接用对应官方推荐的匹配版本,不要手动乱装最新的CUDA工具包。

一个我后来才彻底想明白的道理:不要去追新版本。在AI这种迭代极快的领域,保持在稳定版本上运行半年到一年,比每个版本都更新要靠谱得多。框架更新带来的兼容性破坏,能浪费你大量的时间,而收益对普通项目来说微乎其微。

4.2 算力不够怎么办

很多初学者没有GPU服务器,觉得AI工程无从下手。但实际上,个人开发阶段对算力的需求没有想象中那么大。我自己最早做深度学习是在一张老显卡上和Google Colab上完成的,模型规模控制在百万参数量级,照样跑通了完整的项目流程。

有几个缓解算力的实际方案供参考:

  • 优先缩小数据量和模型规模。小模型跑通之后再放大,而不是上来就用大模型。
  • 在Colab之类的免费环境上做实验,注意保存代码和模型权重,避免会话超时丢失。
  • 利用预训练模型的权重做微调,比自己从零训练省下大量算力。比如用Hugging Face上的中文BERT模型做文本分类,即使在CPU上只需要几个小时就能完成微调。

一个很值得记住的判断标准:如果你的模型在单机上训练超过几天才出结果,先想的不是换更大的机器,而是数据是否太多、模型是否过大、训练循环是否有bug。绝大多数情况下都能优化到一天以内。

4.3 MLOps:什么时候开始考虑

MLOps听起来很高大上,但对"从零开始"的工程师来说,可以先分阶段理解。第一阶段没必要上什么Kubeflow或者完整的CI/CD流水线,你需要的是几个最基础的规范:

  • 实验记录。用简单的表格、Notion或者WandB都行,记录每次实验的数据版本、超参数、模型结构、评估指标。
  • 模型版本管理。模型文件像代码一样有版本,命名里带上训练日期和数据版本,不要出现"model_final_v2_真的最终版.pt"这种名字。
  • 可复现的部署脚本。训练好的模型需要有一个固定的推理接口,把预处理逻辑和模型加载封装在一起。

一开始做成这样已经足够。等到项目多了、需要定期重训练和上线时,再慢慢引入Docker、模型服务化框架(比如FastAPI加ONNX Runtime)和自动重训调度。MLOps的本质是"让模型可靠地在生产环境里工作",不是某个特定工具。工具只是手段。

5. 真实项目里最常踩的坑:五个方向的经验复盘

5.1 数据泄漏:最隐蔽也最致命

前面提过训练集验证集重叠的问题,这其实就是数据泄漏的一种。数据泄漏的意思是:模型在训练时"看到了"它本不该看到的信息,导致评估结果虚高,上线后立刻现原形。

防止数据泄漏有几条具体做法:时间序列数据必须按时间切分,不能用随机划分;文本去重后再划分数据集;特征工程(尤其是归一化和缺失值填充)的参数只能用训练集拟合,验证集和测试集不能参与。这些看起来都是细节,但如果从一开始没有养成习惯,后面返工的成本极高。

我自己的真实经历:做一个流失预测模型时用了"用户近30天是否登录"做特征,听起来没问题,但样本标签是"未来60天是否流失"。训练时一切正常,线上效果却惨不忍睹。排查之后才发现,那批训练数据本身就已经包含了部分未来信息,属于典型的特征和标签时间窗口重叠。这类错误,只有建立"时间意识"才能避免。

5.2 过拟合和欠拟合的快速识别与应对

初学者经常搞不清模型效果差的真实原因。有一个非常实用的判断方法:看训练集和验证集之间的差距。

  • 训练集和验证集表现都差:欠拟合。增加模型复杂度、加特征、多训练几轮。
  • 训练集好、验证集差:过拟合。加正则化、加大数据增强、使用早停、减小模型规模。
  • 训练集和验证集的差距不大但绝对水平不如预期:数据本身质量或标签定义的问题。

我在带人时经常说:不要一上来就调参。先判断当前是欠拟合还是过拟合,再决定改哪里。大多数人上来就调学习率,完全是把时间浪费在不该管的东西上。

5.3 训练不收敛的排查顺序

训练时loss变成NaN或者一直不降,是每个AI工程师都会遇到的问题。我的排查顺序是固定的:先看数据,再看模型代码,最后才怀疑超参数。

  • 数据:有没有NaN值、有没有极端值。文本任务里检查词表里是否有未登录的token,图像任务里检查像素值是否做了归一化。
  • 代码:学习率是否有除零操作、损失函数是否有log(0)的情况、标签是否有超出类别数的值。
  • 超参数:学习率过大是最常见的原因,新手很容易在初始化时就卡住。

按这个顺序排查,大多数问题在半小时内能定位。反过来的话,你可能在无关的方向上耗一天。

5.4 生产环境和训练环境的差异

训练跑得很好的模型,上线后表现断崖式下跌,这个现象被称为"训练推理不一致"。常见原因有:线上推理时数据预处理和训练时不一致、模型被量化后精度损失、线上特征在真实场景里取不到或取到的值分布不同。

这里给一个具体建议:训练时就要用"你上线时会用的那份代码"做数据预处理。不要训练时用一套Pandas脚本,线上推理时又重写一份。很多团队的做法是直接共享同一个特征工程模块,我看这是最低成本避免不一致的方式。

5.5 不要迷信SOTA模型

最后说一个观念层面的坑。很多人一上来就想着用最新的大模型、最复杂的结构,好像模型的先进程度决定了项目的成败。实际上,绝大部分业务场景里,简单模型加干净数据击败复杂模型的案例比比皆是。

以文本情感分类为例,一个清洗干净的数据集加上BERT-base微调,往往就能达到90%以上的准确率。你换成GPT级别的大模型来做推理,可能也只涨两个点,但延迟和成本翻了几倍。真正的AI工程素养,是在给定资源条件下选择"够用且可控"的方案,而不是永远选择"最先进"的方案。

6. 一条可执行的六周起步路径

有读者可能觉得上面讲的内容还是有点散,我干脆给一条自己验证过的六周学习路径,照着走基本能建立起完整的AI工程心智。

第一周:跑通最小图像分类项目。用PyTorch官方的CIFAR-10示例,不看教程先把代码默写一遍,核心目标是理解数据加载、模型定义、训练循环、评估这四件事的骨架关系。

第二周:把数据处理练熟。用Pandas和NumPy对一个真实数据集做清洗、可视化、特征工程。这周不碰模型,专门练"理解数据"。

第三周:完成第一个文本分类微调项目。用Hugging Face加载中文预训练模型,在自定义数据集上做微调,把评估指标、混淆矩阵、错误分析全做一遍。

第四周:学习部署。把训练好的模型用FastAPI封装成一个HTTP接口,写一个简单的调用脚本,理解推理服务的全流程。

第五周:训练一个从头开始的简单模型。不借助预训练权重,自己实现一个两层全连接网络或单层LSTM,手动处理梯度下降过程,加深对模型内部机制的理解。

第六周:做一个综合小项目。可以结合自己的工作和兴趣,完成从业务问题定义到模型上线再到监控的完整闭环。这个项目的完整记录,就是你找AI岗位时最有说服力的作品。

每个阶段结束后都建议写一篇博客或笔记,不是给别人看,而是强迫自己把理解和经验结构化。我观察到一个规律:能坚持下去写记录的人,三个月后的水平普遍比闷头刷题的人高一大截。

六周之后,你已经有了完整的链路认知,接下来再深入某个方向就不会迷路。我个人一直觉得,AI工程能力不是靠背多少知识堆出来的,而是在一堆失败的实验中慢慢打磨出来的。所以别怕犯错,关键是每次失败都要把原因挖透。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进