"from scratch"这个短语,在AI工程圈子里有一种天然的分量感。市面上教你"三分钟训练一个模型"的内容很多,但真正把AI工程说清楚的路径很少——因为从零起步的人最缺的不是代码技巧,而是对整个工程链路的全局认知。"ai-engineering-from-scratch"想表达的正是这种状态:不是从调包开始,而是从问题定义、数据理解、模型选型、训练评估、部署运维一路打通,最后形成一个真正能跑的AI系统。这篇文章就是围绕这条路来写的,适合准备进入AI工程领域的新人,也适合已经在做算法但一直觉得"模型上线很难"的工程师。
1. 先想清楚:AI工程到底在解决什么问题
1.1 AI工程不是AI研究,也不是纯软件开发
很多人刚接触这个概念时会把AI工程和算法研究混在一起,我见过不少开发者的第一反应是:AI工程是不是要把数学功底练到能推导新模型?完全不是。AI工程的核心问题从来不是发明新算法,而是让已有算法稳定、可靠、低成本地跑在真实业务里。换句话说,AI研究解决的是"模型能不能识别猫",AI工程解决的是"这个识别猫的系统能否每天处理一百万张图片、在200毫秒内返回结果、并且在数据分布变化后还能保持效果"。
这种区别在落地时极其明显。研究环境下,一个模型的精度小幅提升就能发论文;工程环境下,精度的提升如果带来了延迟翻倍、显存暴涨或者推理成本上升,那这个提升就没有任何产品价值。我接手过的多个AI项目都验证过这件事:算法同学给出的SOTA模型在离线数据集上效果漂亮,一旦接入真实流量就问题不断——不是模型变笨了,而是工程链路跟不上。这其实是AI工程和算法研究的分水岭:研究追求上限,工程守护下限。
所以,从零学AI工程,第一件要做的事是培养"工程思维"。什么是工程思维?就是拿到一个需求时,先不急着翻论文、选模型,而是先问:线上环境是什么约束?数据从哪里来?延迟、成本、准确率的优先级怎么排?出现Bad Case时靠什么机制兜底?这个习惯越早建立,后面踩的坑越少。
1.2 从标题拆解一条完整的学习主线
如果只看"ai-engineering-from-scratch"这个标题,可以拆出三个关键词:ai(人工智能技术)、engineering(工程技术)、from scratch(从零开始)。这三个词合在一起,实际上给出了一条明确的学习结构:先从业务场景提炼问题,再围绕问题搭建数据体系,然后选择合适的模型并完成训练与评估,最后把模型封装成服务并持续迭代。
我把它总结成五个环节:业务定义、数据工程、模型工程、部署工程、迭代治理。业务定义是搞清楚"要做的事值不值得做";数据工程是解决"吃什么";模型工程解决"怎么学";部署工程解决"怎么用";迭代治理解决"怎么长期活"。完整走一遍这五环,才算入门AI工程;任何一个环节是短板,系统性翻车只是时间问题。
这里要特别提醒一点:不少人学习时把大量时间砸在模型训练上,数据、部署、治理全都往后放。这在学习阶段还能接受,一旦真进入项目,数据质量往往决定模型效果的70%以上,部署方案决定落地成本的70%以上。所以从scratch开始,就应该按工程全链路来学,而不是按照课本里"机器学习—深度学习—强化学习"的学术顺序走。
2. 从零上手:工具链和学习路线的选型逻辑
2.1 基础工具链怎么选
AI工程涉及的技术栈比较杂,但启动并不需要一开始就把所有东西铺开。我用下来的建议是:Python + PyTorch + Docker + FastAPI + PostgreSQL/对象存储,这套组合可以在零成本的前提下覆盖从数据处理到服务部署的完整链路。
选择Python没有争议,生态最全,团队协作成本低。PyTorch之所以是首选而不推荐TensorFlow,主要原因是它的调试体验更符合工程习惯——你可以用正常的print和断点去看中间结果,这对新手极其友好。Docker解决的是环境一致性问题,我见过太多"在我电脑上能跑"的尴尬场景,只要把训练环境做成镜像,这种问题基本绝迹。FastAPI则负责把模型包装成HTTP接口,它自动生成API文档、性能好、写起来简单,非常适合模型服务这种场景。
数据存储方面,早期项目不必追求复杂的数仓体系,一个PostgreSQL加一个对象存储(或者本地文件系统)就够了。PostgreSQL存结构化数据,对象存储存图片、音频、文本原始文件。很多教程会推荐直接上Spark或Flink,这属于严重的过度设计——数据量还没到那一步,你真正要练的是理解数据、清洗数据、管理数据的能力,而不是操作大数据框架的能力。
2.2 学习路线的合理顺序
结合我自己带人和自学的经历,从零到可以独立完成端到端AI项目,最顺的路线是分四个阶段走。
第一阶段是掌握Python和基础数据处理。核心是pandas和SQL,达到能独立完成数据清洗、聚合、统计的水平。这个阶段不碰模型,只碰数据。第二阶段是机器学习基础。建议从sklearn入手,理解分类、回归、聚类三大任务类型,掌握交叉验证、特征工程、过拟合这些概念。这里不需要手推复杂公式,但要对"模型是怎么学出来的"有个直觉。
第三阶段才是深度学习。用PyTorch从零手写一个两层MLP、一个CNN、一个简单的Transformer,把前向传播、反向传播、损失函数这些黑盒打开一遍。这个阶段最忌讳的是只调库不写代码,哪怕写得丑也没关系,手写一遍的印象远胜于看十遍教程。
第四阶段是部署与上线实践。用FastAPI封装一个训练好的模型,写Dockerfile构建镜像,部署到一台服务器上跑起来,然后用Prometheus或简单的日志监控采集指标。走完这四步,你对AI工程的体验就完整了。很多人学了前三个阶段后依然觉得"AI工程"是个玄学,问题就出在缺了第四阶段——只有当你亲手把一个模型变成线上服务,并且肉眼看到请求日志、错误率、响应延迟这些真实指标时,工程化的感觉才会落下来。
2.3 为什么说"先跑通再深挖"比"系统学习"更有效
我见过两种典型的学习风格:一种是想把所有数学基础、数据结构、算法原理全部学完再上手项目;另一种是拿到一个目标,直接开始做,缺什么补什么。在AI工程这个领域,我强烈建议采用第二种。原因很简单:AI工程的知识树非常庞大,如果不知道实际项目会用到哪些知识,很容易在细枝末节上消耗大量时间,比如在看Boosting原理时死磕公式推导,但实际工作中你只需要知道什么时候用XGBoost、怎么调几个关键参数。
先跑通一个端到端项目,再反过来根据项目中暴露的问题补充理论,这样学习效率会高得多。举个例子,当你真的遇到"训练集和测试集分布不一致导致线上效果崩塌"时,再去读关于数据分布漂移的资料,那种理解深度是任何教程都给不了的。我正在接触的一位学员就是这样:她用了三周时间把一整套商品评论情感分析服务跑上线,过程中补了特征工程、模型调优、Docker部署三块知识,效果比之前闷头看两个月书好太多。
3. 核心实操:一个端到端AI项目的完整过程
3.1 项目定义与方案设计
为了把工程链路讲明白,我以"客服工单自动分类系统"为例,完整走一遍从零搭建的过程。这个项目非常典型:业务目标清晰、数据容易获取(可以自己造或者用开源数据集)、模型不复杂但需要工程化处理,特别适合用来演示AI工程全流程。
第一步是定义问题和评估口径。客服工单自动分类,就是把工单文本分成"售后退换""技术支持""物流查询""投诉建议"等类别,方便后续自动路由到对应处理小组。这里有一个非常关键的思路:不要上来就追求模型精度达到99%,而是先定义一个明确的业务成功指标。我做的是"人工复检率"——系统自动分类后,只有抽检或置信度低于阈值的工单才需要人工介入。目标是让人工介入比例从100%降到40%左右,同时分类准确率不低于90%,这就比单纯追求一个学术指标有意义得多。
3.2 数据采集、清洗与标注的实操要点
这个项目的数据来源可以用公开的电商客服对话数据集,也可以自己模拟。但无论来源哪里,工程上都有一套标准处理流程。原始数据通常是CSV格式,包含工单编号、用户描述、受理时间、处理结果等字段。拿到手的第一步是数据探查,我会先做三件事:看缺失值比例、看类别分布、看文本长度分布。
前两件事通常好理解,第三件事很多人会忽略。客服工单的文本长度差异极大,短的只有几个字(比如"退钱"),长的可能是一大段描述。如果不做长度分布分析,直接塞进模型,短文本很容易被模型强行截断或补齐,影响效果。我在这个环节的具体策略是保留原始字段,同时增加一列"归一化文本",用规则做基础清洗:去掉特殊符号、统一大小写、处理重复标点、把常见繁体替换为简体。
类别分布问题同样要重点处理。客服工单里"物流查询"往往占一半以上,"投诉建议"却可能只有5%。如果直接训练,模型会对小类别严重不敏感。我采用的方案不是简单地过采样,而是先算出每个类别的最低样本阈值,再结合类别权重做训练。对于严重不足的类别,还需要补充标注数据。在标注环节,我的经验是:哪怕用开源工具或人工粗标,也至少要保证每个类别有几百条高质量样本,而且标注规范要尽量统一。标注质量参差不齐,后面很难排查问题到底出在模型还是出在数据。
3.3 特征工程与模型选型的实际选择
在这个项目中,文本表示方案我对比了三种:TF-IDF + 线性模型、预训练模型嵌入 + 分类头、微调完整预训练模型。最终选的是第二种。原因是:TF-IDF + 线性模型虽然训练快、部署轻,但在同义词、口语化表达上比较吃力;微调完整预训练模型效果最好,但对硬件和推理成本的要求都比较高,对内部工具型项目来说有点浪费。
预训练模型嵌入 + 分类头的方案是当前工程落地中性价比极高的选择:用sentence-transformers或者直接取BERT的[CLS]向量把文本变成固定维度的向量,然后接一个简单的MLP分类器。这样一来,主干网络不需要训练或只需要浅层微调,训练速度很快,模型体积也小得多。
训练时我通常会设置一个验证集策略:按时间切分,而不是随机切分。客服工单有很强的时间演进性——用户会不断发明新的表述方式,产品政策也在变。如果只做随机切分,验证集与训练集高度同分布,线上效果会被严重高估。按时间切分才能模拟真实的预测场景,这是工程判断里很重要的一环。
3.4 模型服务的封装与部署
模型训练完成后,工程之路才走了一半,接下来的部署环节才是很多新人翻车的重灾区。我在这里给出一个最简单但足够稳的部署方案:用FastAPI封装推理接口,使用Docker打包成镜像,通过docker-compose管理外部依赖。
在封装接口时,很多人关注的是"怎么调用模型",但真正要提前想好的问题有三个:输入数据如何校验和预处理、异常情况返回什么结构、如何统计每次预测的耗时和置信度。这三个问题如果不提前设计好,写第一版时会很爽,上线后会发现日志完全没法看。比如用户传了一个空字符串,模型会报错还是返回默认分类?再比如模型推理偶尔会很慢,如何设置超时?这些细节都必须在接口层面兜住。
Docker部署的一个常见误区是"把模型文件打进镜像就完事"。模型文件动辄几百MB甚至几GB,每次修改代码都要重新构建镜像非常痛苦。我建议的方式是:镜像只装代码和依赖,模型文件通过挂载卷或者对象存储路径访问。这样模型更新只需要替换文件,不用重新build镜像,迭代速度会快很多。FastAPI的启动命令要注意设置超时和最大请求体大小,避免前端拿到长时间无响应的异常。部署完成后,第一步测试不是直接压测,而是先拿几条真实工单跑一遍,确认接口返回正常、延迟可控。
3.5 评估体系与上线后的指标观察
上线不等于结束,评估体系才是工程闭环的开始。这个项目的评估指标我分成三层:首先是模型层,看准确率、召回率、F1,重点观察每个类别的单独表现;其次是服务层,看接口的响应时间、错误率、QPS,确保系统稳定;最后是业务层,追踪人工复检率、处理时效提升、用户满意度变化。这三层缺一不可,很多团队只盯第一层,结果模型离线指标很好,线上却业务价值寥寥。
上线后我还会设置一个置信度阈值机制:当模型对某条工单的预测概率低于0.8时,自动转入人工处理,不直接归类。这个机制虽然让"自动分类率"看起来低了一些,但大幅降低了错误分类带来的业务风险。在早期,宁可多让人工介入,也要保证系统输出可信,这是AI工程中需要反复强调的一种取舍——不是所有事情都要自动化,而是"在对的地方自动化"。
4. 常见问题与排查技巧实录
4.1 数据问题导致的"训练集效果很好、线上全面崩溃"
这是我见过最多的一类问题,出现的频率远高于模型本身的问题。最典型的原因是数据切分方式不科学——很多新手拿到数据后习惯用train_test_split做随机划分,但业务场景中的数据几乎都带有时间或用户偏好特征。随机划分会让训练集和测试集的数据分布极其相似,模型在这种测试集上的表现自然很好,线上面对真实的新数据时就露馅了。
解决思路也不复杂:优先按时间切分,或者按某个与业务强相关的维度切分。比如客服工单按日期排序后,用前80%做训练、后20%做验证。另外一个隐蔽的坑是标签泄漏:清洗数据时用了整条记录里的某个字段作为预测目标,但该字段实际上只在事后才会产生。排查时要逐个字段检查特征是否真的可以在预测时刻获得,一旦发现泄漏,就必须把这个字段从特征里删掉。
4.2 推理延迟过高怎么定位和优化
模型接口响应慢,可能的原因链条很长。我个人的排查顺序是:先看网络链路,再看数据预处理,最后看模型推理。其中数据预处理的问题最容易被忽视——比如每次请求都把原始文本重新分词、过滤、转ID,这些步骤在离线脚本里用着流畅,在线高并发时却会成为瓶颈。
优化策略很实用:把静态词典、分词结果、中间特征做成预计算缓存;文本长度做截断或短文本补齐时用向量化操作而不是逐条循环;如果模型中包含多重循环或递归结构,考虑改用矩阵运算或预训练库的高效实现。还有一招很有效——为推理配置单独的GPU或CPU线程池,但这个问题在新手项目中不常遇到。真要压测时可以用locust或wrk,但要注意压测不能只跑几十个请求就结束,至少要跑到超出预计峰值的水平,才能暴露出模型并发推理时的真实瓶颈。
4.3 长尾类别永远学不好怎么办
客服工单分类里,"投诉建议"这类样本少而多样,是标准的难学长尾类别。提升它的常用操作有几个:一是补充数据,从历史工单里用关键词检索出更多相关样本;二是调整损失函数,比如用focal loss让模型更关注难样本;三是做半监督方法,比如用置信度高的预测结果进行伪标注扩充训练集。前两种我都很常用,第三种要谨慎,伪标注数据如果本身错误率较高,反而会污染训练集。
还有一个容易被忽略的点:长尾类别在线上更容易出现"新的表达方式"。比如以前用户只会写"投诉",现在会出现"平台竟然这样对我"。这种问题不是靠模型能彻底解决的,必须配合规则接口或者定期增量更新。所以工程上我会在分类接口里保留一个"其他"兜底类,它表面上拉低了分类正确率,实际上给系统留了宝贵的容错空间。在新手项目中,"其他"类常被当作用不到的东西扔掉,我每次都强烈建议保留。
5. 从学习到实战:一些值得养成的AI工程习惯
到这一步,一条完整的AI工程学习路径已经铺开。最后分享几个我在实践过程中觉得价值极高的习惯,也算给准备从零开始的你一些落地参考。
第一个习惯是"先定评估标准,再动手建模"。很多项目的失败不是模型不好,而是项目负责人从一开始就没想清楚什么叫"成功"。无论是做一个推荐系统还是做内容审核,先定义清晰且可量化的业务指标,等于整个项目有了坐标轴,后面做的每一步都不会跑偏。
第二个习惯是"养成写实验记录的强迫症"。我在训练模型时一定会记录每次实验的数据集版本、超参数、验证集效果、失败原因,哪怕只是在本地做一个简单demo。原因是AI实验的变量极多,不记录的话,三天后回看就不知道自己调整了什么、为什么这么调。这个习惯在工作协作中尤其重要,当团队需要复现你的结果时,一份完整的实验记录比任何代码注释都管用。
第三个习惯是"每隔一段时间就重新审视数据和标签的质量"。AI系统上线后并不是一劳永逸的,用户行为、数据分布、业务目标都会变。我见过很多系统上线半年后效果悄然滑坡,却很少有人去复盘数据质量的变化。把数据质量监控作为系统的一部分,而不是一次性的准备步骤,这是AI工程与一次性模型实验最本质的区别。
说到底,AI工程从零起步并没有想象中那么高不可攀,它需要的不只是算法知识,还有工程落地的方法论和持续迭代的耐心。动起手来,从一个完整的小项目开始,把数据、模型、部署、监控都走一遍,你就会发现之前那些看起来玄乎的概念,都会慢慢变成你手里实实在在的东西。这条路我走过,也带不少人走过,只要每一步都踏实,你也能走通。