ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从零开始AI工程:五层能力模型、避坑指南与文本分类实战

从零开始AI工程:五层能力模型、避坑指南与文本分类实战 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_labels5 ) # 这里需要把原始文本转成模型输入格式 def tokenize_function(examples): return tokenizer(examples[text], truncationTrue, max_length128) train_dataset raw_train.map(tokenize_function, batchedTrue) eval_dataset raw_val.map(tokenize_function, batchedTrue) training_args TrainingArguments( output_dir./results, eval_strategyepoch, save_strategyepoch, learning_rate2e-5, per_device_train_batch_size16, num_train_epochs3, logging_dir./logs, ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, eval_dataseteval_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, truncationTrue, max_length128, return_tensorspt) 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 版本不兼容——某个库要求numpy2.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 到底意味着什么我的答案很简单它不是一条捷径而是一座需要逐层搭建的楼梯。数学、代码、模型、工程、业务每一层都有绕不过去的坎但每一层都有清晰的路径。你不需要一开始就什么都懂你需要的是定好一个足够小、足够完整的项目然后走通它的每一个环节。我分享的这些方法论、踩坑记录和实操步骤都是这条路上最常被问到、也最容易被忽略的部分。希望你看完之后能少走几步弯路早日做出自己的第一个完整项目。
返回列表