这两年"ai-engineering"这个词被提得越来越密,尤其是大模型冒出来之后,几乎每周都有人跑来问我:"我零基础,想走AI工程这条路,到底该怎么开始?"说实话,这个问题我也被问了无数遍。我自己就是从数学不太好、代码也一般的情况下一点点摸进来的,踩过的坑可能比大多数人想象中要多。今天这篇就把"ai-engineering-from-scratch"这件事掰开揉碎讲清楚:AI工程到底意味着什么、从零起步需要学什么、第一个项目怎么做、上线部署有哪些坑,以及后续怎么保持成长。这篇不搞虚的,全部按我自己实操过的路径来,适合刚入门、或者已经会跑几个模型但总觉得隔着一层纸的朋友。
1. 从零进入AI工程,先想明白"工程"二字的分量
1.1 AI工程不是"调包",而是系统级的交付
很多人以为AI工程就是会用TensorFlow、PyTorch,或者会调用OpenAI的API,这其实是个很大的误解。工程化和写算法Demo是两码事:Demo只需要在Notebook里跑通一个结果,而工程化要考虑数据从哪来、模型怎么训练、怎么部署、上线之后怎么监控、效果变差了怎么回滚,还要考虑成本、延迟、并发,甚至团队里别人怎么接手你的代码。
我自己带过几个新人,最明显的共性问题是:他们能把一个模型训练得很好,却不知道如何把它变成一个别人能用的服务。有一次一个同事做了个很不错的分类模型,本地跑F1值到了0.9,结果准备上线时才发现,模型推理一次要2秒,接口完全扛不住并发,线上数据格式和训练时也对不上。这就是典型的"会算法、不会工程"。
AI工程的核心能力其实是在"模型之外":数据处理管线的健壮性、训练脚本的可复现性、部署运维的自动化程度、监控告警的完备性。这些能力不性感,但决定了你的模型到底能不能真正产生价值。
1.2 零基础起步需要具备的三项储备
我一般建议想入行AI工程的人先自测三项基础,不需要全满分,但至少要达到"够用"的水平:
- 编程能力:Python是必须的,至少要能熟练写类、装饰器、生成器,会管理虚拟环境,能看懂别人开源项目的代码结构。不是会写for循环就算会Python,而是要能组织一个多文件的工程化项目。
- 数学直觉:不需要你会推公式,但得知道梯度下降在干什么、过拟合是什么、损失函数的意义是什么。线代里的矩阵乘法、概率里的贝叶斯思想,这些都是"用到再补"也行,但不能完全没有概念。
- 业务理解:这经常被忽略。模型是给业务用的,你得知道你的用户是谁、数据从哪产生、预测错了会有什么后果。比如做信贷风控模型,误判一个坏人的代价和误杀一个好人的代价完全不同,这决定了你的阈值怎么设、评估指标怎么选。
这三项里,编程能力是最硬的敲门砖,数学直觉决定你能走多深,业务理解决定你能不能做出真正有用的东西。
1.3 我踩过的最大的一个弯路
说一个我自己的弯路。刚入行那会儿,我花了整整两个月去啃西瓜书和花书,想着把算法原理全搞明白再动手。结果呢?两个月后我连一个完整的训练脚本都写得磕磕绊绊。后来我才明白,正确的姿势是"带着问题学原理"——先跑通一个最简单的模型,再倒回去看它为什么有效、为什么失效。
现在回头看,AI工程的学习路径不应该是线性的,它更像一个螺旋:先动手做一个小项目,遇到不懂的原理再回头学,学完再回去优化项目,如此循环。这一篇接下来的内容,就按这个螺旋逻辑来展开。
2. 环境搭建和第一个最小闭环,跑通比什么都重要
2.1 硬件和云资源怎么选才不花冤枉钱
环境搭建是第一个劝退点。我自己早期就在这上面浪费了很多时间,折腾CUDA版本、驱动兼容,一弄就是好几天。很多人一上来就要买4090或者租A100,真没必要。
我的建议是分阶段来:
| 阶段 | 推荐方案 | 理由 |
|---|---|---|
| 入门学习(跑通代码) | 个人电脑CPU跑小模型,或用Google Colab免费版 | 学习阶段重点是理解流程,小数据量CPU完全够用 |
| 正式做小项目(数据量几万条) | Colab Pro / Kaggle免费GPU | 免费额度足够跑中小型模型,T4的算力训练文本分类绰绰有余 |
| 训练大模型/大规模微调 | 按需租用云GPU(按小时计费) | 不需要一次性买卡,用多少租多少 |
这里有个非常现实的经验:不要用本地环境折腾深度学习的GPU加速。我自己在Windows上配TensorFlow-GPU,前前后后折腾了不下五次,每次都能遇到新问题。现在我的建议是——本地只装CPU版本的库用来写代码调试,真正训练放到云上去。调试用CPU、训练用GPU,这个组合能让你少掉一半头发。
2.2 Python环境和依赖管理,越早养成好习惯越省心
新人最容易犯的错,就是全局装包。今天装一个requests,明天装一个transformers,几个月后环境乱成一锅粥,某个库升级导致另一个库崩掉,根本查不出原因。
我现在的标准操作是:
- 每个项目单独建一个虚拟环境,用
python -m venv venv,或者直接用conda管理。 - 项目依赖用
requirements.txt或pyproject.toml锁版本,特别要锁传递依赖。 - 所有实验都用seed固定随机数,保证结果可复现。
# 创建项目目录和虚拟环境 mkdir my-ai-project && cd my-ai-project python -m venv venv source venv/bin/activate # Windows下用 venv\Scripts\activate # 安装基础依赖 pip install numpy pandas scikit-learn # 深度学习框架建议分开装,方便排查问题 pip install torch # CPU版先调试这套流程看起来笨,但后面做项目能省巨量的时间。我后来接手过不少别人的代码,最头疼的就是那种"在我电脑上明明能跑"的问题,九成都是依赖没锁版本导致的。
2.3 第一个最小闭环:训练一个文本分类模型
环境好了就该跑第一个端到端流程。我第一次完整跑通的项目是一个垃圾邮件分类器,数据量只有几千条,用TF-IDF加逻辑回归就能到0.95的准确率。这个项目虽然简单,但它让我第一次完整经历了"数据→训练→评估→保存→加载推理"的全流程,后来的所有复杂项目都是在往这个骨架里填充更重的内容。
最小闭环大概长这样:
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 1. 数据 df = pd.read_csv('spam.csv') X = df['text'] y = df['label'] # 2. 特征化 vectorizer = TfidfVectorizer(max_features=5000) X_vec = vectorizer.fit_transform(X) # 3. 训练 model = LogisticRegression() model.fit(X_vec, y) # 4. 评估 print(classification_report(y, model.predict(X_vec)))这四个步骤是AI工程的最小原子单元:数据、特征化、训练、评估。你后面做的任何复杂系统,本质上都是在每个环节上做得更精细。跑通这个,你就有了"工程感"的第一块基石。
3. 数据、模型、评估三者之间的关系,比你想的更微妙
3.1 数据质量决定模型上限,这个规律永远有效
Kaggle上有句话我印象很深:"Garbage in, garbage out." 模型的上限是由数据决定的,模型只是去逼近这个上限。我做过一次很惨的教训:一个文本分类项目,训练集准确率99%,测试集却只有70%,一开始我以为是模型过拟合,结果排查了半天才发现是数据泄漏——我在做数据清洗的时候,把标签信息通过特征工程泄漏进了训练集。
数据清洗这件事看着简单,但它是AI工程里最消耗时间的环节。我通常会把数据处理分成三层:
- 结构层面:处理缺失值、重复值、异常值,统一格式,这两步大概占数据工作量的30%。
- 语义层面:去停用词、纠正常见错误、处理专业术语,这一步需要领域知识,占40%。
- 分布层面:检查类别分布是否均衡、时间分布是否有偏移、训练测试集是否同分布,这占30%但经常被忽略。
第三层尤其重要。很多模型上线后效果滑坡,就是因为训练数据和线上数据的分布发生了偏移,这个在训练阶段根本发现不了,只能靠上线后的监控去抓。
3.2 模型选型的逻辑:先在简单模型上找基线
选模型有个常见的陷阱:一上来就上最先进的模型。BERT效果好,那就用BERT;LLaMA效果好,那就微调LLaMA。结果是训练成本高、部署复杂,还不一定比简单模型好多少。
我的习惯是反向操作,先跑一个最朴素的基线:
- 文本分类先跑TF-IDF + 逻辑回归或朴素贝叶斯。
- 图像分类先跑一个小型CNN,比如ResNet18。
- 只有基线跑不通,或者基线离业务目标差距明显,才升级到Transformer系列。
这个做法的核心逻辑是:基线模型能帮你快速定位问题的性质。如果简单模型效果就很差,那大概率是数据问题或任务定义问题,换再大的模型也没用;如果简单模型效果尚可但不够好,那升级模型才有意义。
我在一个命名实体识别项目上就吃过亏,一开始直接上BERT-large,训练慢、显存吃紧,效果也只是比CRF好一点点。后来我换成先跑CRF,发现主要问题其实在于训练数据里实体标注不一致,BERT再好也学不会混乱的标注。把数据修好之后,CRF的效果已经能应付大部分场景,最后我用BERT只是在它基础上加了3个点。
3.3 评估指标的"骗局":准确率高不代表模型好用
评估是很多人最容易糊弄的一环。最常见的问题就是只看准确率。我见过一个信贷风控模型,坏样本只占1%,模型全部预测为好,准确率99%,看似完美,实际上毫无用处。
正确的做法是回到业务场景去定义指标:
- 类别不平衡:看精确率(Precision)和召回率(Recall)的P-R曲线,根据业务代价选F1或者其他加权指标,而不是单一准确率。
- 排序类任务(如推荐、搜索):看NDCG、MRR,这类指标更关注好结果是否排在前面。
- 回归类任务:看MAE和RMSE,RMSE对大误差更敏感,MAE更直观。
- 成本敏感场景:引入业务代价矩阵去计算总代价,比如错误拒绝一个VIP客户的成本是X,错误接受一个骗子的成本是Y,两者不是一个量级的。
我自己的习惯是,每个项目在开始之前先写一段"评估方案":明确业务上什么算好、什么指标最贴切、门槛值是多少。这段文字一般不超过一页,但能让后续所有实验都有了一个锚点,不会在指标的迷宫里迷失。
4. 把模型变成产品:部署与服务化的实战要点
4.1 模型部署的三种方式,按需选择
模型训练完了,真正的工作才刚开始。部署方式没有绝对的好与坏,只有合适与不合适:
- 离线批量预测:用调度工具(比如cron或Airflow)定时跑批,把预测结果写入数据库。这种方式实现最简单,适合对实时性没要求的场景,比如每日用户分群、批量内容审核。
- 在线API服务:把模型封装成一个HTTP接口,实时接收请求返回预测。这是最常见的形态,适合实时风控、在线推荐、聊天机器人等场景。
- 边缘端部署:把模型压缩后放到移动端或嵌入式设备上运行,不依赖网络。适合离线翻译、端侧语音助手等场景,但受限于算力,需要做剪枝量化。
我早期做的项目基本上都是离线批处理,因为最简单。后来做在线服务时才意识到,在线部署对代码质量的要求高了一个数量级——你要考虑超时、限流、熔断、并发安全、内存泄漏,这些都是Notebook里永远不会出现的问题。
一个最简单的在线服务其实没有想象中那么玄:
# FastAPI + torch 的最小在线推理服务 from fastapi import FastAPI from pydantic import BaseModel import torch from transformers import BertTokenizer, BertForSequenceClassification app = FastAPI() tokenizer = BertTokenizer.from_pretrained("local_model") model = BertForSequenceClassification.from_pretrained("local_model") model.eval() class Request(BaseModel): text: str @app.post("/predict") def predict(req: Request): inputs = tokenizer(req.text, return_tensors="pt", truncation=True, max_length=128) with torch.no_grad(): logits = model(**inputs).logits pred = logits.argmax().item() return {"label": pred}这段代码能跑,但它只能算Demo。真正生产级的服务还要加模型版本管理、请求日志、QPS监控、异常重试,每一样都需要单独设计。
4.2 推理性能优化:先用便宜的招
服务上线后最先遇到的问题就是慢。我在实际项目中总结了一套"从便宜到贵"的优化顺序,按这个顺序来能省很多事:
- 模型蒸馏或换小模型:把BERT换成DistilBERT,速度提升接近一倍,效果只掉一两个点。这是性价比最高的方案。
- 批量推理(batching):把多个请求攒到一起进GPU推理,吞吐量可以提升好几倍。用FastAPI的话,可以配合异步队列实现。
- 缓存:对高频重复的请求做结果缓存,比如热门文章的情感分析结果可以被复用。
- 量化:把FP16或INT8量化,模型体积变小、速度变快,代价是轻微精度损失。
- 换推理框架:比如用ONNX Runtime或TensorRT替换原生PyTorch推理,不改变模型结构就能提速。
有一个很典型的经历:我之前做一个文本分类API,单次推理平均200ms,压测时5个并发就超时了。我先上了批量推理,把P99延迟压到了150ms;然后换上了量化后的INT8模型,延迟降到了80ms;最后加了一层缓存,热点请求直接命中,延迟只剩下10ms。每一步都很简单,但叠加起来效果惊人。
需要特别强调的是:优化之前一定要先量化你的瓶颈。我用过一个GPU性能分析工具,发现很多情况下模型推理只占30%的时间,剩下都在数据预处理和后处理上。一味的在模型侧压榨,不如先看看前后处理的代码有没有冗余。
4.3 线上监控与模型迭代:你不能只交付一次
模型上线从来不是终点。我做过的所有项目里,凡是效果持续稳定的,背后都有一套监控系统。监控的核心四件事:
- 输入数据监控:特征的分布有没有偏移?有没有涌现新的数据模式?比如一个模型训练时样本都是简体中文,结果线上突然出现大量繁体输入,这就是分布偏移。
- 预测结果监控:预测值的分布有没有变化?分类模型各类别的占比如果突然变化,通常意味着线上数据出问题了。
- 业务效果监控:最终业务指标有没有达成?比如点击率、通过率是否达标,这个指标比模型指标更直接。
- 系统性能监控:QPS、延迟、错误率、显存占用。这些是工程侧的红线,超出阈值就得告警。
监控这件事看着繁琐,但它其实是AI工程和算法研究最重要的分界线。算法研究追求离线指标更好,AI工程追求的是系统长期稳定地产生价值。
5. 一个完整入门项目的复盘:从0到上线的全过程
5.1 项目选题:怎么选一个既能练手又不过于复杂的题目
如果让我推荐一个最适合入门AI工程的完整项目,我会选"新闻标题的多分类"。原因有三个:
- 数据容易获得,公开数据集很多,不需要爬虫和标注。
- 任务难度适中,简单模型能跑到0.85,复杂模型能到0.95,可以明显感受到不同方法带来的收益。
- 分类任务链路完整:数据清洗、特征工程、模型训练、评估、部署、监控,每个环节都能练到。
避免一开始就做那些看起来炫酷但复杂度太高的题目(比如从零预训练一个大模型、做多轮对话系统),因为这类项目的调试周期太长,你很难快速建立一个完整的工程闭环。
5.2 我从这个项目里整理出的标准流程
我通常会把这个流程固化下来,做成项目模板,后面每个项目都在这个骨架里替换内容:
- 定义问题:明确输入是什么、输出是什么、业务上怎么用。
- 数据探查:写一个Data Profile脚本,统计数据量、字段类型、缺失率、类别分布。
- 基线模型:用一个简单的模型快速跑通流程,定下第一个评估基准。
- 迭代优化:加特征、换模型、调参,每次只改一个变量,记录实验日志。
- 部署上线:把模型封装成服务,写好接口文档。
- 监控复盘:上线后记录线上指标,定期对比离线评估和线上效果的差距。
其中第4步最容易乱。我的经验是:实验日志一定要结构化管理。用个表格记录日期、数据版本、模型版本、参数、评估结果、备注。否则过了两周你就忘了当时那个0.91的准确率到底是用什么参数跑出来的。
5.3 复盘:这个项目踩过的坑,希望你别再踩
这个项目我做的时候踩过几个坑,现在回看都是很典型的初学者问题:
第一个坑是训练集和验证集的划分不干净。我当时做数据清洗时先对整个数据集做了标准化,然后再切分训练测试集,这导致了数据泄漏——测试集的信息通过标准化过程流进了训练集,验证结果虚高。后来改成先切分再分别处理,验证结果瞬间真实了很多。
第二个坑是忽视了数据的时间属性。这个数据集里的新闻是有发布时间的,不同时间的新闻主题分布差异很大,而我直接随机切分了。正确的做法应该是按时间切分,用前期的数据训练、后期的数据验证,这样才能模拟线上真实场景。
第三个坑是急于上复杂模型。一开始就微调BERT,结果训练时间和调试成本都很高,最后发现用简单的TF-IDF加LightGBM就已经能到0.9,BERT只提升了两个点。如果先跑基线,后面每一步的收益都会更清晰,整个项目的节奏也稳很多。
6. 后续进阶路线与实用建议
6.1 不同背景的人怎么继续走
AI工程这个领域最适合的状态是"持续小步快跑"。不同背景的人侧重点不同:
- 偏工程的开发者:已经有较强的编码能力,重点补机器学习和深度学习的基础知识,要多做模型训练的实验,理解数据、损失函数、优化器之间的相互作用。
- 偏算法的研究者:模型功底很好,重点补软件工程能力:代码规范、单元测试、CI/CD、容器化、监控告警。这部分是你和纯算法岗拉开差距的地方。
- 完全零基础转行者:先用两到三周跑通前面说的最小闭环,建立整体认知,再决定往哪个方向深入。
我个人的体会是,AI工程岗的核心竞争力不是某项单一技术,而是把多个技术栈串起来的能力。你能独立做到:拿到一个业务问题,设计数据方案,训练模型,部署上线,再监控迭代,你就是能独当一面的AI工程师。
6.2 一个可自测的阶段性清单
如果你想评估自己在哪个阶段,可以参考我给自己设计的清单:
- 阶段一(入门):能独立跑通一个完整的训练评估流程,能读懂常见模型的官方文档,能写简单的数据预处理脚本。
- 阶段二(熟练):能把模型封装成接口上线,能定位并解决服务性能瓶颈,能设计并落地监控方案。
- 阶段三(独立):能独立负责一个AI项目从0到1,能根据业务场景选择合适的模型方案,能制定优化计划并按期交付。
每次带新人,我都会让他在第一阶段把基本功打扎实,尤其是依赖管理、实验记录、代码规范这些"不性感但必须"的东西。这些习惯越早养成,后面做复杂项目时就越从容。
最后分享一个我自己一直在用的小技巧:无论项目多忙,每周固定留出半天时间做技术复盘。把这周遇到的问题、解决思路、还有哪些没弄懂的点都记下来。很多当年觉得高深莫测的知识,其实就是在这样一次次复盘和补漏中,不知不觉变成你自己的东西的。AI工程从来不是一条笔直的路,但只要能持续闭环迭代,你一定会发现自己的进步比想象中快得多。