开篇先说明一件事:现在网上聊 AI 的内容,十篇里有八篇在放大模型的“魔法”,但真正让模型在业务里稳定跑起来、让团队能持续迭代、让老板愿意为算力买单的,往往是那些听起来不那么性感的工程问题。我接触 AI 工程(ai engineering)这几年,最大的感受是:模型能力只是起点,把模型变成可靠产品的整条链路,才是 AI 工程师真正的战场。我不是算法研究员出身,也是从 CRUD 后端一步步摸过来的,所以这篇“from scratch”的经验,更适合那些想从零搭建 AI 工程能力、又不想只停留在跑通 notebook 阶段的同学。下面这套路径,不是一个标准答案,而是我踩过不少坑之后整理出的一条可复制的路线。
1. 先想清楚:AI 工程到底在解决什么问题
1.1 从“搭模型”到“交系统”,这是第一道分水岭
很多初学者会把“AI 工程”和“训练一个高精度模型”画等号,这是一个挺危险的误解。拿我参与过的一个智能客服项目来说,第一版模型在测试集上的准确率做到了 92%,听起来已经不错了,但真正部署到生产环境后,问题接踵而至:线上请求延迟超过 3 秒、并发稍高模型服务直接超时、脏数据导致推理结果偶发异常、老版本模型无法平滑回滚。这些问题的根源都在模型之外,却实实在在决定了项目能不能交付。
所以我对“AI 工程”的定义更偏向于:面向人工智能应用的软件工程、数据工程和运维工程的交叉。换句话说,AI 工程是研究如何稳定、高效、可维护地交付和运营 AI 系统的学科。它关注的不只是算法指标,还包括数据管道、特征存储、模型训练与调优、评估验证、线上部署、监控告警、版本迭代,以及成本控制。你看,一个完整的 AI 产品是一条流水线,模型只是其中的核心组件。
1.2 “from scratch”的真正含义:从头搭起一套能力栈
很多人理解“from scratch”是“不需要任何前置知识,从零开始学 Python、学数学”,但我更愿意把它理解为“从零到一地搭建一套 AI 工程能力栈,而不是零散地刷几十个教程”。这个区别很重要,因为前者容易让人陷入低效的资源收集状态,后者才有明确的目标感。
真要拆开来看,这套能力栈至少包含四大块:第一,基础编程与数据工具链,包括 Python、SQL、Pandas、NumPy 等,这是操作数据的底子;第二,算法原理与模型训练,需要理解线性模型、树模型、神经网络的核心思想,知道损失函数怎么设计、梯度怎么回传;第三,工程化落地,涉及 API 服务、Docker 容器化、模型序列化、性能压测、CI/CD 等;第四,平台化与迭代机制,包括实验追踪、模型注册、监控预警、数据回流。我后面所有章节的展开,基本就是顺着这条主线走的。
2. 从零起步:底层基础与工具链怎么打才不浪费
2.1 数学补到“够用”而不是“高深”
一提到 AI,很多人第一反应是数学太难,线性代数、微积分、概率统计一个都不能少,于是先去啃三个学期的数学教材。说实话,这个策略性价比很低,而且特别容易劝退。我的实际体验是,AI 工程日常用到的数学,基本集中在几个点:向量和矩阵的运算,理解矩阵乘法为什么能批量处理输入数据;梯度、偏导数的直觉,理解模型参数的更新方向;概率分布与期望,理解损失函数和数据采样。至于特征值分解、傅里叶变换这些偏研究方向的数学,90% 的工程岗位用不上。
我建议的做法是“边用边学”。先会用 NumPy 做矩阵运算,再遇到“为什么 loss 下降这么慢”的问题时,回头补学习率和梯度更新的关系;先跑通一个线性回归,再用它去理解“为什么多个特征要标准化”背后的数学原理。把数学嵌进问题里学,记忆会牢得多,也不会在一开始就被抽象公式劝退。数学够用到能看懂主流模型的结构、能自己推导简单网络的梯度,就足够应付绝大多数 AI 工程项目了。
2.2 Python 之外,数据工具链和工程习惯要同步建立
Python 语法本身不难,难的是用 Python 处理真实数据的工具链。我在带新人的时候,发现一个普遍现象:很多人能写函数、能做 LeetCode 题,但一拿到一份几千列的 CSV,不知道从哪里下手检查缺失值、类型、分布。这需要刻意训练 Pandas 和 SQL 的实战能力。
这里我特别想强调 SQL 的重要性。在真实业务场景里,数据基本都存在数据库里,而不是在本地 CSV 文件里。你能用几条 SQL 快速完成筛选、聚合、抽样,就直接决定了后续特征工程的效率。我见过不少算法能力不错的人,因为 SQL 和 PANDAS 不熟练,花了两三天时间才导出一份可用的训练集,这在项目节奏上是致命的。
同时,工程习惯要从第一天开始培养:用虚拟环境管理依赖,用 Git 做代码版本控制,用 requirements.txt 或 pyproject.toml 锁住依赖版本,给每个实验记录 seed、数据版本、超参数。不要以为这些都是“后置的工程问题”,我吃了太多“跑完训练后忘了记录数据版本,实验无法复现”的亏。AI 工程师也是个工程师,工程师的基本功一个都不能少。
3. 算法核心:从线性模型到深度学习的进阶路径
3.1 先吃透经典,再碰深度学习
有一个高频误区:初学者觉得深度学习才是 AI,于是第一个项目就上 Transformer,结果连过拟合、正则化、学习率这些基础概念都没建立,失败概率极高。我自己的学习路径是反过来的:先老老实实把经典模型吃透,再逐步过渡到深度模型。
具体来说,线性回归、逻辑回归、决策树、随机森林、梯度提升树,至少要亲手实现并调优一遍。别小看这些“老古董”,它们的好处在于:结构透明,你能直观看到每个特征的权重,理解模型“怎么决策”;训练速度快,能在几分钟内验证对数据预处理、特征选择的假设;与数据量和业务场景匹配度高,很多结构化数据场景下,XGBoost、LightGBM 的线上表现并不比深度模型差,甚至更好。
那什么时候才需要深度学习?我的判断标准很朴素:当数据具备空间结构或序列结构,卷积神经网络、循环神经网络、Transformer 这类模型才有明显的结构优势,也就是在图像、语音、文本等非结构化数据场景下,卷积和注意力机制才能真正体现出建模能力上的优势。如果你手里是一张几百维的表格,先试试树模型,大概率够用,而且训练和推理成本低得多。
3.2 训练流程的标准打开方式:数据处理、损失函数、验证策略、超参数
无论什么模型,训练流程的核心逻辑是固定的。我把它拆成四个环节,每个环节都有自己必须注意的坑。
数据处理是第一环。最关键的忌讳是“数据泄漏”——用整个数据集做标准化或者填充缺失值之后再做划分,会把验证集的信息混进训练过程,造成虚高的评估分数。正确的是先把数据划分成训练集、验证集(必要时还有测试集),再在处理管道里分别拟合训练集。处理完成后,还需要检查类别分布是否均衡,必要时用分层抽样,比如让 train_test_split 的 stratify 参数等于标签列。
损失函数和评估指标的选择要分清楚。“损失函数”是训练时优化的目标,“评估指标”是业务方关心的最终结果。回归任务常用均方误差做损失,但线上评估可能更关心平均绝对误差;分类任务常用交叉熵做损失,但业务指标可能是准确率、精确率、召回率或者 AUC。我养成的一个习惯是:训练前先定义清楚线上指标是什么,再倒推损失函数和验证指标,这样不会在追求 loss 下降的过程中跑偏。
验证策略是很多人会忽略的一个环节。最基础的做法是预留 20% 的验证集,但样本量小的时候,单次划分的方差很大,我倾向于用 K 折交叉验证。比如五折交叉验证,把数据切成五份,每次拿四份训练、一份验证,轮流做五轮,最后取平均指标,这样对模型真实水平的估计会稳定很多。对于那些正负样本分布不均的项目,StratifiedKFold 几乎是标准选项,既分层又交叉验证。
超参数调整这一步,我的建议是“先粗后细,先学习率后其他”。先设置一个较大的学习率跑通流程,观察 loss 是否收敛,然后再微调。常见的学习率范围是 1e-2 到 1e-5 之间,具体看优化器。自适应优化器(Adam、AdamW)对学习率的敏感度比 SGD 低,但也不是说可以随便设,我见过太多因为学习率太大导致 loss 变成 NaN 的现场。批量大小(batch size)会影响收敛稳定性和显存占用,“微小批量配合较小学习率”是我调参时比较常用的组合。还有个细节:当 batch size 增大时,通常需要同步调整学习率,否则梯度噪声变小,但更新步长不变,反而会收敛不理想。
最后,早停法(early stopping)是防止过拟合最简单有效的工具之一。在训练过程中,每一轮(epoch)结束后用验证集算一次指标,如果连续多少轮没有提升(我常用 5 到 10 轮作为耐心值),就停止训练并恢复到历史上验证集指标最好的那个模型权重。这一招可以解决“训练集 loss 一直降、验证集 loss 早就不动甚至回升”的典型困境。
4. 工程化落地:从 Jupyter Notebook 到生产系统的最后一公里
4.1 模型只是半成品,包好、测好、部署好才有价值
在真正做 AI 工程之前,我也经历过“训练完模型就万事大吉”的阶段。后来第一次部署线上服务,踩了一整周的坑,才彻底明白:模型权重文件只是半成品,AI 产品是一个完整的软件系统。
最基础的一步是模型导出。训练时我们常用 PyTorch 的 .pt 或 TensorFlow 的 .h5 格式,但生产环境不一定有对应的训练框架,或者框架版本不一致,所以需要把模型导出成通用格式,我比较推荐 ONNX。ONNX(Open Neural Network Exchange,开放神经网络交换格式)是一种开放的模型表示格式,它让你能把 PyTorch 或 TensorFlow 训练的模型直接导出,然后在 ONNX Runtime 上加载和推理,而不是非得装一个完整的 PyTorch 环境。这样做的好处很直接:部署体积大幅缩小,推理速度往往比原框架还快,运行时依赖更少,后续如果想接入 TensorRT 这类推理加速库,ONNX 也是现成的中转站。导出时要注意固定输入尺寸并设定动态维度,否则部署后遇到不同长度的输入就会报错。
模型服务化这一环,我的首选组合是 FastAPI + Uvicorn,而不是 Flask。FastAPI 对请求体有自动校验能力,不用手写大段类型检查代码;自带异步支持,在推理接口里跑 IO 类任务时吞吐量明显更好;通过 OpenAPI 文档,前端调用和联调能省下大量沟通成本。部署时可以先把服务跑在本地,curl 验证一次,再把模型文件和代码一起打包成 Docker 镜像。Dockerfile 里别忘了只复制必要的依赖,安装依赖时通过 requirements.txt 锁定版本,并刻意缩小镜像体积,纯 CPU 推理的镜像尽量控制在 1GB 以内,带 CUDA 支持的镜像也不要无脑装上全套开发工具,否则构建时间会拖垮迭代效率。
上线前必须做性能压测。我习惯用一个最简单的 Python 脚本对接口发起并发请求,记录三件事:P95 延迟、吞吐量、错误率。90% 的项目瓶颈都出在“服务并发能力不足”,这时候通常有两个方向:一是加缓存,对于同一输入重复查询的场景,用 LRU 缓存能让 QPS 翻好几倍;二是把同步推理改成批处理,也就是请求先进入队列,后端攒够一批再一次性推理,这种“动态批处理”(dynamic batching)能把 GPU 利用率拉高一大截。
4.2 监控与迭代:上线只是开始,不是结束
很多 AI 项目死在“上线即巅峰”的状态里,没有任何监控,模型的线下测试指标很高,线上却悄悄变质。AI 工程和传统软件工程最大的不同在于,模型的行为依赖训练时的数据分布,一旦线上数据的分布发生偏移,即使代码逻辑完全没变,预测质量也会肉眼可见地下降。这就是所谓的“概念漂移”和“数据漂移”。
监控的第一项是服务质量监控,包括接口延迟、错误率、CPU/GPU 利用率,这部分用通用的监控告警系统就可以覆盖。第二项是模型质量监控,更关键且更容易被忽略。我的做法是,在推理流水线的输入侧记录特征分布摘要,在输出侧保存预测结果和置信度,按天或按小时做统计;同时在业务允许的范围内,对一部分请求做人工抽检标注,用真实反馈图来修正模型的质量评估。当发现线上指标滑落,比如准确率从 90% 掉到 82%,就要触发数据集采集流程,把近期的线上负样本收集起来,作为下一轮重训的数据来源。这个“监控-采集-重训-发布”的循环,才是 AI 工程迭代的常态节奏。
模型版本管理同样需要规范化。我见过太多团队上线新模型后,代码里还跑着旧版本的预测逻辑,排查半天发现是存储路径或加载逻辑没有跟着版本走。建议用一个简单的模型注册表(Model Registry),记录每次发布的模型文件路径、训练数据版本、指标报告、上线时间、负责人的信息。模型文件名里至少带上时间戳和关键的指标,比如model_bert_20250111_f1_0.923.onnx,可以省略很多沟通成本。遇到线上事故需要回滚时,“切换到上一个版本”比“重新训练一个模型”快得多,也更稳。
5. 一份可以直接参考的学习路线与避坑指南
5.1 按时间轴推进的参考计划
说了这么多理论,落地到行动上,我整理了一个大约六到八个月从零到一的学习计划,按阶段推进,每一步都能产出可验证的成果。
第一个阶段(第 1 到 2 个月)聚焦 Python 与数据工具链。每天保证一定量的编码练习,重点攻克 Pandas 和 SQL。最终检验标准是:能自己从数据库里拉数据,完成清洗、统计、透视,并输出一份带图表的分析报告。第二个阶段(第 3 到 4 个月)吃透机器学习的经典模型。用 scikit-learn 跑通线性回归、逻辑回归、决策树、随机森林,再补上 XGBoost 或 LightGBM。这个阶段要能回答:什么是过拟合?正则化为什么有效?交叉验证如何实施?第三个阶段(第 5 个月)做一个端到端项目。我推荐一个经典项目——“客户流失预测”:用一份公开数据集,从探索性数据分析开始,到特征工程、模型训练、调参,最后用 FastAPI 包一个预测接口,并用 Docker 跑起来。走完这个项目,你就已经体验过 AI 工程的主要环节。第四个阶段(第 6 到 8 个月)挑战深度学习和监控迭代。先学卷积神经网络解决一个图像分类任务,再学 Transformer 架构跑一个文本分类项目,最后给第二个项目加上监控看板和简单告警,体验“在线下降-重训-发布”的完整闭环。
5.2 高频问题速查表
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 训练时 loss 变 NaN | 学习率过大、数据未归一化、梯度爆炸 | 降低学习率,检查数据是否有无穷值,尝试梯度裁剪 |
| 验证集指标远低于训练集 | 过拟合或数据泄漏 | 检查预处理管道是否泄漏,引入正则化、早停法 |
| 模型训练很慢 | 数据量太大但没有利用好批量训练,代码有瓶颈 | 先用小数据跑通流程,再用批处理或 GPU 加速,检查是否有大矩阵循环 |
| 部署后接口超时 | 模型推理耗时过长、服务并发不足 | 模型导出 ONNX 并尝试量化,加入请求缓存或动态批处理 |
| 线上指标与线下测试不一致 | 数据分布漂移或特征不一致 | 检查线上特征工程链路,建立数据漂移监控 |
| Docker 镜像过大 | 安装了不必要的开发依赖、无缓存清理 | 多阶段构建,只拷贝运行所需文件,安装依赖时最小化装饰 |
5.3 我的几点额外建议
最后这一段写给自己已经踩出来的经验,也是把“from scratch”这三个字拆到最后剩下的东西。
第一,不要等一切准备好再动手。AI 工程涉及面太广,真想“学完所有前置知识再实践”,大概率会在某个阶段停下来,永远走不完。先接受自己很多不懂,直接上手一个小项目,遇到什么补什么,是效率最高的学习方式,我也是用最小可行项目补完了数据访问、查询清洗、模型训练和 API 部署的整条链路。
第二,记录比记忆可靠。我自己的习惯是,每个实验都留一份 README,写明目标、数据来源、使用步骤和关键结论。你这样坚持半年,回头会发现手里的项目记录变成了最实用的一份参考手册,面试、复盘、新同事交接都会轻松很多。第三,AI 工程现在对人才的需求已经不是会不会调包的问题了,而是能不能稳定、高效、可维护地把模型送上线并在真实环境里维护它。所以我特别倡导的“端到端思维”,其实说穿了就是:训练脚本写完之后继续想,推理服务是别人怎么调的、监控怎么看的、模型怎么更新的,这个闭环走通了,你就是一名合格的 AI 工程师。