ai-engineering-from-scratch 这个项目名,说实话我第一次看到的时候,脑子里冒出来的画面是一个初学者对着满屏的报错信息发呆。但真正走完一遍之后你会发现,AI工程这个方向,最难的不是某一门技术,而是把零散的知识串成一条能落地的链路。从数据到模型到上线,每一步都有坑,每一步都在考验你的工程判断力。
这篇内容适合三类人:刚入门想往AI方向走的学生、写后端或业务代码想转AI工程化的开发、以及已经在训练模型但总感觉工程化能力不足的算法同学。我尽量把路径、技术选型、实操细节和踩坑经验一次讲透,读完你能对"从零开始做AI工程"这件事有一个清晰的地图。
1. 先搞清楚:AI工程和"调模型"根本不是一回事
1.1 一个典型的AI工程闭环
先给个定义。AI工程不是"用Python跑通一个模型"那么简单,它是一整套从需求到稳定交付的系统方法论。一个完整的闭环长这样:业务理解、数据准备、模型开发、评估验证、部署上线、监控迭代,然后循环回来。你在网上看到的那些公开数据集上刷分的项目,只覆盖了中间一小截,前后两端才是真正拉开差距的地方。
拿电商场景举个例子。业务方说"我们要做一个评论情感分析",听起来很简单对吧?但落地的时候你要回答的问题是:数据源从哪里来?历史评论怎么存储、怎么采样?标签体系是二分类还是多粒度?模型跑多快才能扛住双十一的峰值?误判一个差评为好评,对业务的影响有多大?这些问题没有一件是纯算法能解决的,全是工程决策。
算法工程师和AI工程师最大的区别就在这。算法岗可以拿到一份干净的数据集、一台单机GPU,把模型的离线指标刷到AUC 0.98然后写进周报。AI工程师不行,你必须面对脏数据、模糊需求、有限资源和不可控的线上环境,把模型塞进一个真实业务里让它持续起作用。这也是为什么很多算法很强的人,到了实战项目里反而束手束脚。
1.2 从零开始必须建立的三种思维
第一个是系统思维。你要把一个模型看成一个黑盒服务,拥有明确的输入输出、资源消耗、延迟特性。你关心的是这个盒子怎么跟上下游配合,而不是天天纠结某个卷积核是怎么计算的。就像你开一家餐厅,厨师的厨艺很重要,但你更关心的是食材怎么采购、菜品怎么定价、顾客怎么排队,厨房只是整个经营链条的一个环节。
第二个是数据思维。一句话:先看数据,再谈模型。我见过太多人数据集都没仔细翻过,上来就写训练代码,最后模型loss下不去,排查半天发现是标签错位了。数据质量决定了模型效果的上限,算法只是在逼近这个上限。你花一周清洗数据,比花一周调参划算得多。
第三个是运维思维。模型不是训练完就结束了,它上线之后会变差、会崩、会被业务方质疑。你要提前想清楚:模型指标怎么监控?异常了怎么告警?要不要灰度发布?怎么快速回滚?这些东西教科书里不会教你,但是生产环境里躲不掉。
2. 从零开始的核心技术栈拆解
2.1 地基层:Python、Linux、Git,别小看这三样
先说Python。不是会写for循环就完了,工程化要求你理解环境隔离、依赖管理和代码组织。我建议你从第一天就养成用conda或者venv建虚拟环境的习惯,每个项目一个环境,不要一台机器打天下。依赖管理上,requirements.txt要固定版本,最好加上hash校验,否则两个月后你想复现一个项目,发现依赖全冲突了,那种感觉真的是欲哭无泪。
Linux是你绕不开的生产环境。我不要求你成为一个运维专家,但基本的文件操作、权限管理、进程查看、日志排查、cron定时任务,这些必须顺手。写代码用惯了Windows的话,我建议你装个WSL2或者直接用云服务器练手,因为迟早要面对没图形界面的服务器。
Git更是底线技能。很多初学者喜欢"zip发送最终版",这种习惯在AI工程里是致命的。模型代码、数据处理脚本、配置文件全都要进Git仓库,而且要养成写清楚commit message的习惯。你回想一下项目里最崩溃的时刻,是不是"跑出了个好结果但想不起来是哪份代码跑出来的"?Git就是治这个的。
2.2 核心层:深度学习框架与模型原理
框架层面,现在的主流选择是PyTorch,没有太多悬念。你需要掌握的不只是调包,而是几个核心概念:张量怎么运算、自动求导是怎样发生的、DataLoader是怎么加载数据的、PyTorch的Module体系怎么组织。这些懂了,后续换框架也好学。
但我必须泼一盆冷水:不是所有场景都需要从零训练模型。今天的常态是下载一个预训练模型,做微调(fine-tuning)或者直接拿来做推理。你在HuggingFace或ModelScope上找一个合适的底座,用业务数据调几百步,往往比你自己搭一个ResNet从头训效果更好、成本更低。模型选型的思路应该是:能用现成的不自己造,必须自己造的也要站在巨人肩上。
模型评估这块也得多说两句。准确率是最直观的,但不是万能的。遇到类别不平衡,你要看精确率、召回率、F1;遇到排序场景,你要看AUC、NDCG;遇到生成任务,你要看BLEU、ROUGE,但心里清楚这些指标跟实际效果相关性有限。关键是你得知道业务要什么,然后选对评估口径。我见过一个垃圾邮件模型,总体准确率95%,但漏掉的5%恰好全是诈骗邮件,业务上完全不可接受。这就是评估口径没对齐的教训。
2.3 应用层:大模型时代的工程新技能
现在聊AI工程,绕不开大模型。这部分我不从底层原理讲起,就从工程实践的角度说几个新技能点。
第一,API接入与封装。OpenAI、国内各家大模型厂商都开放了API,你要熟悉它们的调用协议、模型参数(temperature、top_p、max_tokens)、限流策略,并且把这些API包成内部自己好调用的服务。第二,Prompt Engineering。别觉得这只是"写写提示词",它是大模型应用里最直接提升效果的手段。系统提示词怎么写、few-shot样例怎么给、输出格式怎么约束,都有方法论。一个写得好好的prompt,能把模型回答的正确率提高二三十个百分点。第三,RAG(检索增强生成)。简单说就是先检索你的业务知识库,把相关片段拼进上下文,再让大模型基于这些内容生成答案。它的工程链路涉及向量化、向量数据库、召回排序、上下文拼接,是一套完整的技术栈。第四,Agent的概念在快速普及。模型不再只是被动的问答机器,而是能自己规划步骤、调用工具、根据中间结果调整后续行动。这套东西的工程复杂度比单次推理高一个量级。
3. 实操全过程:从想法到上线的完整链路
3.1 第一步:选题和目标定义
很多人入门第一个问题就是"我能做什么项目"。我的建议是:选数据容易拿、边界清楚、评估标准明确的题目。比如影评情感分类、垃圾评论识别,这些有公开数据集、任务定义明确,适合练手。不要上来就搞"基于多模态的智能问答系统",容易死在半路上。
目标定义也很关键。不要只说"效果要好",要把目标拆成可量化的指标。离线阶段看哪些指标,上线之后看哪些指标,目标值是多少。比如:离线分类准确率不低于0.9,线上推理P95延迟不超过200毫秒。没有这种量化的目标,你后面做每一个决策都会摇摆。
3.2 第二步:数据准备,决定上限的环节
数据准备在工程链路里占的时间往往远超训练。你要做几件事:采集数据、去重清洗、处理缺失值、标注或验证标签、切分训练验证测试集。切分的时候注意保证分布一致,比如按时间排序的数据,不能拿前80%做训练、后20%做验证,却期待分布还相同。还有一个常被忽略的点:任何涉及"未来信息"的特征都可能引起数据泄漏。比如预测用户会不会买某个商品,你把"用户当天有没有买"放进特征,这就是作弊,训练时效果奇好,上线立刻打回原形。
我建议你写一个数据探索的脚本,把每个字段的分布、缺失率、异常值扫一遍,然后把样本从头到尾翻一翻。这个习惯的价值没法量化,但它能帮你躲掉至少一半的坑。
3.3 第三步:建模训练,从Baseline到调优
一开始不要追求花哨模型。先用一个简单模型或者直接拿预训练模型跑出一个baseline,把整个训练流程跑通、评估脚本写好、日志记录体系建起来。有一句老话,先让它跑起来,再让它跑好。Baseline的意义不仅是给你一个效果下限,更是帮你验证代码链路有没有bug。连最简单的模型都训练不起来,直接上复杂模型只会更痛苦。
训练过程中的参数选择我建议记住几个常用经验值。微调场景里,Transformer模型的学习率从1e-5到3e-5起步是安全的,全参数微调和用LoRA等高效微调方法的学习率也不同,后者可以放宽到1e-4。batch size受显存限制,一般从8、16、32尝试,但要注意batch size变了,学习率往往也要跟着调。训练轮数不是越多越好,要结合验证集指标动态判断,定期保存checkpoint,至少保存验证效果最好的那个。
调优阶段的核心方法论是"错误分析"。不要只看指标涨没涨,要切到具体样本上,看看模型把哪些样本分错了、为什么分错。比如分类模型里,反复错的那批样本是不是本身标注就有问题?是不是某些类别样本特别少?基于错误分析动手调优,效率远高于盲目试参数。每做一次改动,只改一个变量,记录效果变化,这个纪律能让你少走很多弯路。
实验管理也是一个容易被忽略的工程点。我强烈建议用wandb或者tensorboard记录每一次实验的配置、指标、曲线,至少也要在自己本地维护一张Excel实验记录表。写上实验编号、改动内容、数据版本、代码版本、结果指标。没有记录的训练等于黑箱,你很难知道自己到底是因为什么而涨点。
3.4 第四步:部署与监控,上线才是开始
模型训练完了,怎么把它变成别人能用的服务?按项目复杂度分几种方式。最简单的,用FastAPI或者Flask包一层接口,本地起服务,适合验证阶段。进入正式环境,用Docker打包镜像,放到容器平台或者Kubernetes上,挂上负载均衡和自动伸缩。如果只是调用第三方大模型API,那部署的重点是网关限流、缓存、熔断降级。
部署之后必须建立监控。我最关心四类指标:延迟(P50、P95、P99)、吞吐(QPS)、资源占用(CPU、内存、GPU)、模型效果反馈。前三类属于系统健康度,第四类最重要也最难。因为线上通常没有标注,你得靠业务侧的转化数据、用户反馈、人工抽检来间接评估模型是否失效。还有一个专门的坑叫数据漂移:线上数据的特征分布跟训练时不一样了,模型自然变蠢。你可以定期对线上新样本的特征分布做统计,跟训练集对比,偏差超过阈值就告警,然后考虑触发重训流程。
上线策略上,不要一次性全量。先灰度推给5%的流量,观察几天,对比新旧版本的关键指标,确认没问题了再逐步放量。一旦发现问题,能快速回滚到旧版本。
4. 真实项目复盘:一次完整AI工程实践里的坑
4.1 项目背景与整体流程
去年我做过一个电商客服对话分类的项目,目标是对用户咨询自动打标,分到售后、售前、物流、活动等类别,方便后续自动流转。数据大概有20万条历史对话,模型选的是一个中文预训练BERT,微调后部署成在线服务。听起来是一个很标准的流程,但实际操作中每一步都出了幺蛾子。
流程大概分五段:数据清洗、标签体系整理、模型微调、模型评估、部署上线。原本预计四周搞定,实际花了将近七周,多出来的时间基本都耗在数据上。
4.2 第一个大坑:标签体系乱到离谱
数据拿过来,我先做了标签分布统计,发现60个类别里有一半样本量不到100条,标签命名还有重叠,比如"退款问题"和"申请退款",语义上几乎没区别。后来跟业务方一起梳理标签规范,把60类合并到了12类,去掉了语义重叠的类别,才勉强能训。这个过程的教训是:标签体系的数据治理,是所有模型项目的第一优先级。你不能期待一个代表性不足的类别,模型能学好它。
4.3 第二个大坑:训练和验证分布不一致
我一开始把数据按时间切分,前80%训练、后20%验证,结果训练时loss下降很顺利,验证集指标就是上不去。后来一查,发现后半年的对话规则变了,出现了大量新话术和新商品型号,训练集里完全没有。这个问题的根源是分布漂移。我的解决办法是重新采样,保证训练和验证集里都包含了新旧数据,同时把模型迭代到人工复核后的新标签上再训练。这件事提醒我:数据切分不是机械流水线,要确保训练集和验证集来自同一个分布。
4.4 第三个大坑:显存优化和推理延迟
微调阶段,batch size稍微调大就爆显存,本来想偷懒直接用最大batch size,结果还没训两步就OOM了。我用了三个办法:梯度累积、混合精度fp16、把序列长度限制在128。最后batch size稳定到16,训练速度和显存占用都能接受。但真正的暴击在上线阶段:模型单条推理延迟在CPU上要1.2秒,远超过业务要求的200毫秒。后来换成GPU推理,压到100毫秒左右,又把输入长度限制到128、换成了ONNX推理,才算交差。这个经历让我意识到,训练阶段就要把推理性能当作一个约束条件,不能等到上线才考虑。
5. 常见问题排查与避坑指南
| 问题 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| 训练loss不下降 | 学习率过大/过小、数据标签错、模型结构bug | 先在小数据上过拟合测试;打印loss曲线;学习率从1e-5、1e-4、1e-3逐步试 |
| 验证集指标远低于训练集 | 过拟合、分布不一致、数据泄漏 | 看训练集是否也低;检查数据切分逻辑;查特征中的未来信息 |
| 显存不足(OOM) | batch size过大、序列过长、模型过大 | 调小batch size;用梯度累积;开混合精度;限制序列长度 |
| 训练和推理结果不一致 | 预处理不一致、模型权重没正确加载 | 把推理代码里的预处理和训练时对齐;打印模型输出做对比 |
| 线上效果断崖式下跌 | 数据漂移、上游特征缺失、取数逻辑变更 | 对比线上新样本和训练集的分布;检查特征依赖;定期人工抽检 |
| 大模型API限流 | 触发QPS限制 | 增加缓存、限流退避重试、把频繁调用的逻辑本地化 |
| 环境依赖冲突 | requirements不固定、多项目共用环境 | 每个项目独立虚拟环境;固定版本号;用Docker镜像锁环境 |
上面这张表是浓缩版,下面展开一个我最想强调的细节:模型能跑通不等于训练正确。我见过不少人训练loss降得挺好看,但评估时发现模型对所有输入都输出同一个类别,原因是分类层没初始化好、标签id映射错位了。这种“模型哑了但指标看起来还行”的情况,解决办法就是强制自己去看一批验证样本的具体输出,而不是只盯指标面板。
还有一个常被问的问题:GPU和CPU差距太大,训练慢怎么办。我的经验是,先在CPU上用极小数据跑通代码逻辑,再用GPU跑全量。只要你确认逻辑没问题了,GPU的算力才值得被浪费。如果预算有限,用免费的Kaggle Notebook、Google Colab练手完全够用,记得开了GPU加速环境之后检查运行时类型。
6. 学习路线与几个心态建议
6.1 一条可复制的分阶段路径
我按三个月来规划,每天两小时,零基础也够用。
第一个月打基础。Python语法和面向对象编程、conda环境管理、基本Linux命令、Git常用操作,同时把Python的NumPy和Pandas上手。这一阶段不要碰深度学习理论,先把工具用熟。
第二个月学核心。快速过一遍PyTorch官方教程,了解张量、自动求导、神经网络模块。找一个最简单的图像分类或文本分类项目跑一遍,理解Train/Validate/Test循环。然后围绕HuggingFace生态,学会加载预训练模型做推理和微调。
第三个月做实战。选一个自己感兴趣的小项目,把建模、评估、打包、API化完整走一遍。不需要部署到K8s,只需要用FastAPI本地起服务,能通过HTTP调用模型,就算完整闭环了。
三个月之后,给自己一个挑战,找一个小型公开竞赛或一个业务场景,做一次完整的AI工程流程,目标是把数据、模型、服务、监控全部串起来。做到这一步,你就不是"会调包"的入门者了。
6.2 资源、社区与合作建议
资源方面我不过度推荐,说几个经得起时间考验的:PyTorch官方文档和教程、HuggingFace的课程和模型库、fast.ai的免费课程。比起到处囤教程,我更建议你尽早开始做项目,哪怕很丑、很小。另外,国内一些社区平台也经常有高质量的开源项目和实战经验贴,刷的时候多看评论区,那里面往往藏着干货。
还有一个容易被忽略的建议:找一个能一起搞事的学习搭子。一个人坚持学习很容易断,两个人互相拉扯就能撑过迷茫期。你可以把练习项目放到开源平台上,哪怕没有用户,版本管理、文档编写、代码整洁这些工程素养都是在这里面练出来的。
我个人的体会是,AI工程这条路,真正筛选人的不是智力,而是耐心和复盘能力。它像跑马拉松,前几公里你感觉不到进步,但只要你持续做、持续记录、持续总结,几个月之后再回头看,你已经能独立完成一个让半年前的自己惊讶的项目了。