1. 为什么说"从零开始"做AI工程,坑比想象中多
"ai-engineering-from-scratch"这个标题,我盯着看了很久。因为它听起来太简单了——好像只要找个教程、装个环境、跑通一个模型,就算入门了。但真正动手做的人都知道,这条路根本不是一条直线,而是一张网:数学、代码、模型、数据、部署、业务,任何一个环节掉链子,整个项目就卡在那里。
我见过太多人兴致勃勃地开始,最后却卡在同一个地方:教程看了一堆,环境装了一晚,模型跑通了,但离"能交付一个东西"还有十万八千里。所以今天这篇东西,我不打算给你列一份"30天速成AI工程师"的清单——那种东西害人不浅。我想讲的,是"从零开始"这四个字背后的真实结构:你要面对哪些层级、每层需要解决什么问题、哪些东西可以缓一缓、哪些东西绕不过去,以及我自己在这条路上踩过的坑。
这篇内容适合几类人:完全没有经验、想转行做AI工程但不知道从哪里下手的新手;已经能跑通一些demo、但感觉离真实项目还有距离的进阶者;以及想系统梳理自己知识体系、查漏补缺的从业者。我不会回避难度,但会把难度拆开,让你知道每个阶段该干什么。
1.1 被误解的AI工程:它不是调库,也不是写论文
先说一个最常见的误解。很多人以为AI工程就是"调库"——把现成的模型加载进来,喂点数据,然后等结果。做的时候才发现,调库只是最外层的一步。真正的工程问题全在库的外面:
数据长什么样?字段缺失怎么处理?标注质量要不要二检?模型训练收敛了吗?还是loss下降只是过拟合?部署的时候推理延迟能不能压到100毫秒以内?上线之后用户给的数据分布跟训练集不一样了怎么办?这些问题,任何一个解法不对,前面的工作全白做。
同样,AI工程也不是写论文。论文追求的是在新基准上刷高零点几个点,工程追求的是在真实约束下稳定产出可用结果。约束包括时间、算力、数据质量、团队协作、业务指标。我在项目里学到的最重要一课就是:一个能在测试集上精度很高的模型,放到线上可能一塌糊涂,因为真实世界的输入远比测试集脏。
所以如果你准备从零开始,第一个要调整的是心态:你不是在学"怎么玩模型",你是在学"怎么用模型解决真实问题"。这两者的路径完全不同。
1.2 从零到一的第一道坎:你到底卡在哪一层
我复盘过自己从零到能独立交付项目的过程,发现大多数人的卡点可以归为三类:
- 数学层:看到公式就头大,梯度、矩阵、概率分布完全不熟,导致模型原理看不懂,调参全靠瞎试。
- 工程层:代码能跑但写得很脆,不会用版本管理,不会搭环境,数据一换就崩,更别说做服务化部署。
- 业务层:能复现教程,但拿到一个模糊的需求("帮我们做个智能客服")的时候,完全不知道从哪下手,不知道该用什么模型、怎么评估效果、怎么定义成功。
这三层是串联的,不是并联的。数学层缺了,工程层会走很多弯路;工程层缺了,业务层永远落不了地。我见过数学很好的朋友写出的训练代码一坨浆糊,也见过工程能力很强的朋友因为不懂模型原理,在一个很简单的调参问题上卡了三天。
关键不是"从零开始"有多难,而是你得先搞清楚自己卡在哪层,然后按顺序补。下面我把自己认为最靠谱的路线拆给你看。
2. 我的从零路线图:五层能力逐层打通
先说结论:AI工程从零到能干活,我把它拆成五层——数学底座、编程基础、模型原理、工程闭环、业务视角。这五层不是并列的,而是有依赖关系的。你可以并行推进,但主线顺序不能乱。
2.1 数学底座:哪些必须学透,哪些可以先放一放
很多新手被数学劝退,我特别理解,但我可以负责任地说:你不需要把《统计学习方法》《深度学习》里的每个公式推导都搞懂,才能开始动手。你需要的是"够用的数学直觉"。
必须学透的,我认为只有三块:
- 线性代数:矩阵乘法、向量空间、特征值与奇异值分解。尤其是矩阵乘法的形状变化,这决定了你能不能看懂任何一层神经网络的输入输出。我的经验是,用代码把矩阵乘法写一遍、打印出每个维度的变化,比背十遍公式都管用。
- 微积分(偏导为主):你不需要会算很复杂的积分,但你必须理解链式法则——反向传播的根基就是链式法则。一个参数更新为什么是
w = w - lr * grad,这个式子背后就是梯度的方向导数含义。 - 概率与统计:条件概率、贝叶斯公式、期望与方差、常见分布(正态、伯努利、多项式)。这部分撑起了你对损失函数、正则化、评估指标的理解。
cross-entropy为什么长那样,你一旦从信息论角度看就通了。
可以先放一放的:泛函分析、凸优化理论、复杂的概率论证明。这些是你要做算法研究时才需要啃的骨头,不是工程入门的主菜。我自己就是先动手跑模型,遇到不懂的公式再回头查,效率远高于先把一本数学书啃完再碰代码。以工程目标倒推数学需求,才是从零开始的正解。
2.2 编程基础:Python之外的工程习惯
Python是绝对主力,这一点没什么好争论的。但我要说的是,Python语法本身只是入门,真正决定你能不能做好AI工程的是几个工程习惯:
- 虚拟环境管理:用
conda或venv给每个项目建独立环境。我吃过最大的亏就是全局环境里装了一堆包,版本互相打架,最后只能全部重装。从第一天开始就用虚拟环境,能省掉你后面数不清的崩溃。 - 版本控制:
git必须会用。不只是commit和push,更要会用分支和git diff回溯代码。AI项目里"改了几行参数效果变好了/变差了"是常态,没有版本管理你根本不知道是哪几行导致的。 - 代码结构:别把所有东西写在一个
.py文件里。至少把"数据加载"、"模型定义"、"训练流程"、"评估逻辑"分开。不是说一开始就要搞多优雅的架构,但分层意识越早建立越省事。 - 调试能力:
print大法可以救急,但要学会用pdb或 IDE 的断点调试。尤其在排查训练loss异常的时候,看中间张量的形状和数值分布,比盯着最终输出猜原因高效得多。
我见过不少数学基础很好的人,因为代码一团糟,导致复现不出自己的实验结果。AI工程首先是工程,工程就意味着代码要能被别人(包括三个月后的你自己)看懂和修改。
2.3 模型原理:从线性回归到Transformer的心智模型
模型原理这块,最容易走两个极端:一个是只看API文档,完全不懂内部机制,模型出问题只能干瞪眼;另一个是死磕论文推导,几个月了还在看第一篇文章。我的建议是走中间路线:建立分层心智模型。
第一层,理解线性模型和逻辑回归。它们是所有神经网络的地基,理解了y = wx + b和 sigmoid 的输出含义,你就理解了分类问题的最本质结构。
第二层,理解多层感知机和反向传播。关键是建立"数据如何向前流动、梯度如何向后流动"的直觉。我会推荐你自己用 numpy 手写一个两层神经网络,不要用框架。这个练习有奇效,做完之后nn.Linear、nn.ReLU这些概念就不再是黑盒了。
第三层,理解卷积和循环结构的基本思想。CNN的局部感受野、权值共享,RNN的时序依赖,虽然现在很多任务已经被Transformer替代,但它们代表的两类归纳偏置,对理解为什么Transformer能成功非常重要。
第四层,理解Transformer。重点不是背Attention公式,而是理解三个问题:Self-Attention在算什么?位置编码在解决什么问题?为什么它适合并行计算?一旦把这三件事想明白,GPT、BERT、CLIP这些模型在你眼里就不再是神秘的黑洞,而是一个"Attention堆叠 + 训练目标设计 + 数据规模"的组合体。
坦白说,如果你能一口气把这四层走完,你已经超越了绝大多数只会调库的人。走完的标志不是能背出公式,而是能给别人讲清楚"这个模型为什么这样设计、它的能力边界在哪"。
2.4 工程闭环:数据、训练、部署、监控的完整链路
模型原理只占AI工程的一部分。一个能交付的AI系统,至少有80%的代码不在"模型"里,而在模型周围的管道上。我画过一张自己的闭环图,五个环节缺一个都不行:
- 数据:采集、清洗、标注、校验、版本管理。数据质量决定了模型的上限,模型只是在逼近这个上限。
- 训练:训练脚本、超参管理、实验追踪、模型选择。要能回答"你这个模型是怎么选出来的",而不是"跑了好几次,挑了个看起来最好的"。
- 评估:离线指标 + 人工抽检 + 错误分析。只看accuracy你会被骗,要看具体的错误样本长什么样。
- 部署:服务化(比如用 FastAPI 包一层)、推理优化(模型导出、量化、批处理)、接口设计。
- 监控:线上输入分布漂移了吗?推理延迟增大了吗?预测结果有没有系统性偏差?没有监控的线上模型,就是一个定时炸弹。
这五个环节里,新手最容易忽视"监控",因为教程里从来不会教。但真实项目里,模型上线只是开始,后续的维护才占时间的大头。
2.5 业务视角:需求拆解与ROI判断
最后一层,也是很多技术出身的人最欠缺的:拿到一个模糊的"我们要做个AI产品"的需求,怎么落地。
我见过最典型的失败案例是:业务方说"做个智能推荐",技术方直接上了一个深度召回模型,结果数据量不够、业务场景不匹配,做出来的效果还不如一个简单规则。问题不出在技术,出在需求没有被拆解清楚。
从零开始学AI工程,我建议你把"需求拆解"当成一项刻意练习。拿到需求先问自己几个问题:
- 这个问题的输入是什么、输出是什么?格式明确吗?
- 成功长什么样?是准确率95%,还是用户点击率提升20%?
- 数据从哪来?有没有历史数据?质量如何?
- 一个简单的基线方案(规则、统计方法、线性模型)能做到什么程度?
- 深度学习是不是必要条件?还是杀鸡用牛刀?
这些问题不是纸上谈兵。每提前问一个,后面就会少踩一个坑。我在自己的项目里逐渐形成了一个习惯:任何AI方案,先写一个哑基线(dumb baseline),再迭代。这个习惯救了我很多次——很多时候你会发现,一个精心调参的深度模型,只比简单基线好一点点,而付出的复杂度代价却翻了十倍。这时候你就要学会说"不",或者把资源投到数据建设上而不是模型炫技上。
3. 一次完整的从零实践:我用一个文本分类项目打通全流程
光讲理论太虚了。我从自己带新人的经验里,挑一个"从零到一"的标准练习项目出来拆解:新闻标题的主题分类。这个项目数据好拿、需求清晰、模型复杂度适中,非常适合作为你的第一个全流程项目。
3.1 项目选题与数据获取
选题为什么重要?因为选题决定了你后续所有工作的复杂度。新闻标题分类的好处是:
- 数据公开:很多开源数据集可以做,用爬虫也能解决一部分,版权风险小。
- 任务明确:输入是一段文本,输出是预定义类别,评估标准清晰(准确率、F1)。
- 领域约束小:不需要专业知识就能完成语义判断,适合练手。
数据获取这一步,新手最容易犯的错是"拿到一个数据集就直接开跑"。正确做法是:
- 先做数据探查:类别分布均衡吗?文本长度大概多长?有没有重复、空值、乱码?
- 画一个类别分布的直方图,看一眼样本长什么样。
- 划分训练集、验证集、测试集,并且保证划分后类别分布和原始分布一致(用
sklearn的train_test_split时加上stratify参数)。
我在这个项目里用的是一个大约 3 万条的新闻标题数据集,涵盖 5 个类别。探查阶段的耗时大概是半天,这半天让我后面省了至少两天——因为一开始就发现有两个类别在语义上高度重合,例子混淆严重,如果不做处理,后面模型怎么调都白搭。
3.2 基线模型到微调模型的演进
这个项目的模型演进,我建议严格按这个顺序走:
第一步,规则基线。用关键词匹配做一个最简单的分类器。比如"股市""基金"出现就归为财经,"世界杯""欧冠"出现就归为体育。这个基线不用写代码,用字典匹配就行。它的作用不是好用,而是给你一个"不能被击败的下限"。
第二步,统计学习基线。用 TF-IDF 加逻辑回归或者朴素贝叶斯。这一步在代码上的投入大约一小时,但通常能把准确率从规则基线的 60% 左右提到 80% 以上。我每次都会跟新人强调:如果统计基线已经能达到 85%,先别急着上深度学习,先想想业务到底需不需要那 5 个百分点。
第三步,预训练模型微调。用transformers库加载一个中文预训练模型(比如bert-base-chinese),在数据集上做微调。代码框架大概长这样:
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") model = AutoModelForSequenceClassification.from_pretrained( "bert-base-chinese", num_labels=5 ) # 这里需要把原始文本转成模型输入格式 def tokenize_function(examples): return tokenizer(examples["text"], truncation=True, max_length=128) train_dataset = raw_train.map(tokenize_function, batched=True) eval_dataset = raw_val.map(tokenize_function, batched=True) training_args = TrainingArguments( output_dir="./results", eval_strategy="epoch", save_strategy="epoch", learning_rate=2e-5, per_device_train_batch_size=16, num_train_epochs=3, logging_dir="./logs", ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, ) trainer.train()这套代码跑通之后,准确率通常能到 90% 以上。但注意,这里有个关键细节:微调阶段的学习率一般设置在1e-5到3e-5之间,比随机初始化训练小一个量级,因为预训练权重已经处于一个比较好的局部最优附近,步子太大容易把学到的知识冲掉。
3.3 部署与评估:离线指标和线上表现为何会不一致
模型训好了,准确率 91%,看起来不错。但这是离线指标。把它部署成 HTTP 接口后,你会发现真实世界的输入五花八门:有人发来一个表情符号,有人发来一段长微博,有人发来完全看不出类别的乱码。这些输入在训练集里从来没出现过。
所以部署阶段要考虑的事情:
- 输入校验:长度限制、格式校验、空值处理。别让模型收到无法处理的数据。
- 推理速度:BERT 模型在 CPU 上跑一条样本大约需要几十毫秒到几百毫秒,如果 QPS 要求高,得考虑用 GPU 服务或者模型量化。简单做法是先加缓存,命中相同输入直接返回。
- 失败兜底:模型置信度低于阈值时,返回"无法判断"而不是硬给一个答案。用
softmax输出的概率来判断置信度。
部署代码用 FastAPI 就能实现,包装一下模型推理逻辑:
from fastapi import FastAPI from pydantic import BaseModel import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification app = FastAPI() tokenizer = AutoTokenizer.from_pretrained("./models/bert-title") model = AutoModelForSequenceClassification.from_pretrained("./models/bert-title") model.eval() class Item(BaseModel): text: str @app.post("/predict") def predict(item: Item): inputs = tokenizer(item.text, truncation=True, max_length=128, return_tensors="pt") with torch.no_grad(): logits = model(**inputs).logits probs = torch.softmax(logits, dim=-1) conf, pred = torch.max(probs, dim=-1) if conf.item() < 0.7: return {"label": "unknown", "confidence": conf.item()} return {"label": id2label[pred.item()], "confidence": conf.item()}这个项目做完,你就完整地走过了 AI 工程的最小闭环。很多人学了大半年,缺的就是这样一个"自己做出来的、自己部署的、能给别人看到效果"的项目。它的价值不在于技术多难,而在于每个环节你都亲手碰过,知道那些坑长什么样。
4. 工具链选型心得:框架、算力、数据管理的现实选择
做AI工程,工具选择是个绕不开的话题。我在这里只讲现实经验,不讲厂商宣传词。工具没有绝对的好坏,只有适不适合你当前的阶段。
4.1 框架选择的底层逻辑
当前主流的深度学习框架就两个:PyTorch 和 TensorFlow(加上 JAX,但份额小)。我的建议非常明确:新手上手直接选 PyTorch。理由不是 TensorFlow 差,而是生态和社区趋势——你遇到问题,搜到的答案、开源项目里的参考代码、论文的官方实现,绝大多数都是 PyTorch 写的。
框架之上,transformers库是目前做 NLP 和生成式AI 事实上的标准工具。它把预训练模型的加载、tokenizer 的调用、微调的训练循环全部封装好了。新手用起来的上手曲线比从零写训练循环平缓得多。但注意,封装是双刃剑。你还是要理解训练循环内部发生了什么——所以我前面建议你用手写两层神经网络的方式补上这一课。
还有一类工具值得从第一天就用上:实验追踪。最简单的可以用wandb或者mlflow,把每次实验的配置、指标、模型产物都记录下来。我见过太多人跑了一百次实验,最后根本说不清哪个配置产生的最好结果,因为全在脑子里或者散落在文件夹里。这非常不专业。
4.2 算力问题的务实解法
算力是很多个人开发者最头疼的问题。我的标准建议是这样的:日常调试用 CPU 就够了。先用 CPU 把代码逻辑跑通,用几十条数据验证训练流程没问题,再上 GPU 跑全量数据。这个习惯能帮你省一大笔算力费用——因为训练脚本第一次运行时几乎必然有 bug(数据维度不对、标签错位、loss 数值异常),拿昂贵 GPU 去试错完全是浪费。
个人项目需要 GPU 时,资源和资金方案大概有这几挡:
- Free Colab / Kaggle Notebook:适合跑小规模的微调实验,免费额度够入门。
- 云 GPU 按量付费:跑一个几小时的训练任务,花费通常在几元到几十元,适合中规模实验。
- 本地 GPU 或租长期实例:适合有持续训练需求的阶段,但请先把前面的免费方案用好再考虑这一步。
另外强调一个反直觉的经验:很多个人项目真正缺的不是算力,而是数据。把宝贵的小时算力花在清洗、构造高质量数据上,ROI 远高于堆算力硬训。我在做文本分类项目时,模型从基线到微调的提升,有差不多一半来自数据清洗而非模型升级。
4.3 数据管理的血泪教训
数据管理这个事,看起来不起眼,实际上能毁掉一个项目。我自己犯过的最蠢的错误是:手工改了一个 CSV 文件,没做备份,然后跑了一整天训练,最后发现那批改动是错的,想回退却发现原始文件被覆盖了。
从那以后我立了三条规矩:
- 原始数据永远是只读的。任何清洗、转换操作都在副本上进行,原始数据归档保存。
- 用
dvc或者至少用 gzip 存档管理数据集版本。每次数据集大改,记录下来改了什么、为什么改。 - 每个实验记录对应的数据版本。否则你后面会发现某个实验跑出来的结果莫名其妙地好,但你已经找不回当时用的那份数据了。
这三条规矩的执行成本很低,但能在关键时刻救你的命。数据管理和实验追踪一样,是"工程素养"的一部分,而不是可有可无的杂事。
5. 我在从零路上反复踩的坑和最终的应对方式
最后这部分,我想把那些不太会出现在官方文档里、但真实项目里天天遇见的坑集中写出来。这些坑我踩过不止一次,每次都很疼。
5.1 环境与依赖的坑:版本地狱是真实存在的
你装上 PyTorch 的时候,它还附带了一堆依赖库(numpy、tokenizers、safetensors 等等)。每个库都有自己的版本要求,稍有冲突就会报出完全看不懂的错误。最经典的是 numpy 版本不兼容——某个库要求numpy<2.0,另一个库已经用上了 2.x 的 API,结果一跑起来就报AttributeError。
我的应对方式是三层防线:
- 永远用虚拟环境,而且一个项目一个环境。这是底线,没得商量。
- 把环境依赖固定下来。用
pip freeze > requirements.txt或者用conda env export导出完整的依赖列表。这样哪怕三个月后环境坏了,你也能一键还原。 - 用好容器化。有条件的话,把环境封装成 Docker 镜像。镜像的好处是不只是"环境",而是"环境+代码+系统依赖"的完整快照。我在换电脑或者换服务器时,Docker 镜像让我免去了无数个重新装环境的夜晚。
另一个小技巧:遇到诡异报错,先搜错误信息原样,而不是从第一行开始读整个 stack trace。报错末尾的关键句往往直接指向问题所在。
5.2 评估方式的坑:指标好看不等于效果可用
我第一次做完分类项目时,准确率 92%,觉得自己挺厉害。结果拿几个典型样本实际测,发现它把"某公司发布新款手机"这种科技新闻分到了财经类,原因可能是标题里出现了"发布""公司"这些词。准确率很高,但错误完全集中在一两个特定的混淆对里。
这就是只看宏观指标的问题。正确的做法是:
- 画出混淆矩阵,找出错得最多的类别对,分析原因。
- 对验证集做错误分析:把所有预测错的样本打印出来,逐个看。你会发现错误往往是系统性的——某些表述方式、某些关键词导致模型稳定误判。
- 如果有类别不平衡问题,别只看 accuracy,要看 precision、recall 和 F1,特别是 F1 的 macro 和 weighted 版本差异。
我再分享一个从零开始就值得建立的意识:评估指标必须和业务目标挂钩。如果你的业务方更在意"别把A类误判成B类",那评估时就应该重点看这一类别的 precision,而不是整体的 accuracy。这个意识越早建立,你和业务方的沟通就越顺畅。
5.3 时间管理的坑:从零开始不是所有时间都花在学模型上
最后说点不那么技术、但同样重要的事。从零开始学AI工程,最大的风险是时间黑洞——今天看一篇Transformer讲解,明天调一个环境,后天又想补数学,一个月过去好像学了很多,但仔细一想什么项目都没做出来。
我的经验是严格执行"项目倒推学习"的原则:
- 先定一个能完成的闭环项目(文本分类、情感分析、简单的问答检索,都可以)。
- 学习内容以完成这个项目为准,项目需要什么就学什么,不需要的先跳过或者浅尝。
- 每次学习都围绕项目推进:看文档是为了写出某段代码,学数学是为了理解某个参数为什么这么调。
这套方法的反直觉之处在于:它看起来很"功利",但实际学习效果远好于漫无目的地刷教程。因为项目给你提供了即时的反馈——代码跑通了,你立刻获得正向激励;跑不通,你立刻知道自己哪里不会,带着问题去学,效率比被动看视频高十倍。
还有个时间分配上的建议:每周至少留出固定的大块时间做动手练习,碎片时间用来读文档、看概念。动手练习一次至少两小时起步,因为AI项目的状态切换成本很高——你花 20 分钟进入状态,刚热身就被打断,等于白练。我一般周末上午固定三小时做项目,雷打不动,效果比每天晚上挤半小时好得多。
回到开头那个问题:ai-engineering-from-scratch 到底意味着什么?我的答案很简单:它不是一条捷径,而是一座需要逐层搭建的楼梯。数学、代码、模型、工程、业务,每一层都有绕不过去的坎,但每一层都有清晰的路径。你不需要一开始就什么都懂,你需要的是定好一个足够小、足够完整的项目,然后走通它的每一个环节。我分享的这些方法论、踩坑记录和实操步骤,都是这条路上最常被问到、也最容易被忽略的部分。希望你看完之后,能少走几步弯路,早日做出自己的第一个完整项目。