ARTICLE DETAIL

资讯详情

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

AI工程从零到一:构建真实系统的完整路径

AI工程从零到一:构建真实系统的完整路径 我见过太多这样的朋友GitHub 上 Star 了一堆 AI 项目跟着教程跑通了几次开源模型的 Demo简历上写着熟悉 AI 工程但一旦被丢到一个真实业务场景里面对一堆脏数据、不确定的模型效果、复杂的基础设施整个人就懵了。ai-engineering这个词这两年异常火热从模型微调到推理优化大家都在聊但真正的问题不是你会不会用某个框架而是你有没有从零到一完整搭建过一个 AI 系统的能力。我写这篇东西就是想把我自己从只会调包到现在能独立落地 AI 产品的那条路拆开给你看它不是一条照着教程敲代码的路而是一条理解系统、理解数据、理解迭代的工程师之路。不管你是刚转行的程序员还是被公司推着做 AI 功能的业务开发这篇文章的价值在于帮你建立一张完整的地图知道脚下该踩哪块石头。1. 先搞清楚一件事AI 工程不是跑通模型这么简单1.1 调包侠和 AI 工程师之间差了什么我在面试或者带新人的时候经常先问一个看似简单的问题如果给你一批用户评论让你第二天上线一个情感分析接口你打算怎么做大多数人第一反应是找个预训练模型用一下。这个答案本身没错错的是到此为止。你问他用什么模型、基于哪个框架、延迟预算多少、数据分布长什么样、有没有 badcase 反馈机制他会非常茫然。这就是调包侠和 AI 工程师的分界线。调包侠的眼光只到模型输出结果为止AI 工程师的眼光则覆盖从数据采集、模型选择、训练评估、上线部署到线上监控的全过程。ai-engineering-from-scratch这个标题之所以值得认真对待就是因为它强调from scratch——从零开始意味着你不能用现成的轮子来掩盖认知上的空白。举一个我自己的例子。早年我做一个文本分类系统团队里有人直接用了 GPT效果看起来很好准确率 90% 多。但上线后一个季度数据分布一变化准确率直接掉到 75%。我们完全没有监控机制用户投诉了一周才发现。那个项目复盘的时候大家才意识到模型只占整个系统的 20%剩下 80% 是数据治理、版本管理、上线策略和反馈闭环。所以如果你决定认真进入 AI 工程这条路第一件事不是装环境而是接受一个心智模型——AI 系统是一个活的工程体模型只是其中一个组件而且往往不是最复杂的那个组件。1.2 从零开始到底是从哪里开始很多人被 from scratch 吓到以为要从线性代数推导开始手动实现反向传播才算数。真不用这样。我的理解是from scratch 指的是你要亲手把一条完整的链路走通哪怕用的是很成熟的工具但每个环节你都要知道它解决什么问题、有什么取舍。比如数据环节你要亲手处理过 CSV、JSON、数据库导出、接口采集这些来源的数据理解什么是脏数据、缺失值怎么处理、标签一致性为什么重要。模型环节你要亲手从特征工程做起先用传统机器学习模型LR、GBDT建立 baseline再对比深度模型的收益感受大力出奇迹和数据质量问题之间的张力。部署环节你要亲手把一个推理函数封装成服务体会 TPS 限制、显存占用、超时重试这些平时教程里根本不提的事情。我下面会按照一条我自己认为最高效的路径展开每一步都对应一个可以实操的项目阶段。你可以把它当成一个最小可行路径不用追求一年读完但一定每一步都动过手。2. 起步前的地基练习不是知识越多越好是够用就好2.1 数学基础真正用到的其实就三块我见过最快被劝退的人往往是被大学教材里的大段推导吓跑的。真实做 AI 工程你需要的数学没有那么高不可攀关键是把抽象符号还原成直觉。第一块是线性代数但你只需要吃透向量、矩阵、矩阵乘法和维度变换。矩阵乘法之所以无处不在是因为它就是批量运算的数学表达——一个神经网络层做的事情本质上是一堆输入向量同时经过一组权重和偏置的变换。你把它想成流水线一批零件进来每个工位按各自的参数加工输出下一批零件。第二块是概率统计重点理解条件概率、均值方差、正态分布、极大似然估计。工程中你碰到的模型输出概率值、多分类的 softmax 分布、A/B 测试的置信区间全都从这里来。当年我把极大似然估计理解成找到一个假设让已经发生的事看起来最不意外这个直觉帮了我很多。第三块是微积分主要就是偏导数和链式法则。反向传播说穿了就是链式法则的工程实现你不需要手动推导复杂公式但必须知道梯度是从损失函数逐层回传的知道学习率为什么太大会振荡、太小会磨蹭。我的建议是不要从一个线性代数公开课开始啃而是从一个小项目需要的数学片段开始比如实现一个线性回归遇到矩阵运算回头补矩阵遇到梯度下降回头补偏导。这个按需补课的效率是系统性啃教材的三倍以上。2.2 Python 基本功注意不是语法是这三项能力AI 工程的常用语言是 Python但你不需要成为一个 Python 语言专家你需要的是三项具体能力。第一项是数据操作能力核心就是 pandas 和 numpy。我在实际工作中发现很多人的一个不健康习惯是遇到数据处理就写一堆 for 循环又慢又容易错。你要习惯用 pandas 的 groupby、merge、apply用 numpy 的向量化运算让数据块整体移动而不是逐元素搬砖。判断标准很简单万行级的数据你的处理代码能不能在几秒内跑完。第二项是调试能力这是从跑通到能维护之间最被低估的能力。模型训练 loss 变成 NaN、数据 join 之后行数暴增、推理接口偶发超时——这些都不是语法错误而是运行时逻辑问题。这里我强烈建议你学会单步调试而不是到处 print。print 在数据管道里一多你根本分不清哪一行是哪个阶段打出来的。第三项是所有工程师都被反复考验的——处理烂代码的能力。你没看错AI 工程最大的现实就是你要读别人的代码读旧的脚本读没有注释的数据处理逻辑。这个过程锻炼的是你通过变量名、函数调用关系和数据流反向理解代码意图的能力。这条能力在你接手任何一个真实项目的时候都会救你一命。2.3 早早在脑子里装上数据洁癖这个开关我见过太多算法功底不错的人在真实数据面前翻车。原因是他们默认数据是干净的默认字段名能对上默认缺失值只是偶然现象。真实情况是从业务库导出的数据字段名是乱写的日期有五种格式同一用户在不同表里有不同的 ID正负样本的分布严重失衡。所以我特别建议新手从第一个练习开始就带上数据洁癖——拿到手里的数据先别急着建模先回答这四个问题数据有多少行、多少列类型是否正确每个关键字段的缺失率是多少缺失是否随机目标变量标签的分布是否合理有没有极端失衡特征之间的相关性有没有明显异常有没有泄漏这四个问题看起来基础但能避免你 80% 的模型为什么那么准/那么差的困惑。我后来养成了一个习惯写任何数据脚本的第一行都是打印 shape 和 dtypes第二行打印 describe。这俩动作不值钱但能让你对数据一直有掌控感。3. 第一个全链路项目从原始数据到推理接口3.1 项目选型为什么我建议从文本分类入手市面上有太多入门项目房价预测、手写数字识别、猫狗图像分类、情感分析。我的建议是如果只能做一个选文本分类情感正负分类或者邮件分类都行。原因有几个第一文本数据不需要复杂的采集设备中文也好英文也好网上能找到大量公开数据集或者你可以自己爬一批新闻、评论来标注虽然标注辛苦但这个过程能让你彻底理解人工标注的噪声是怎么回事。第二文本分类的建模手段极其多样你既可以用 TF-IDF 逻辑回归做 baseline也可以用简单的词向量取均值做浅层网络还可以用预训练模型来 fine-tune。同一个数据集你能横向感受到传统方法、简单深度方法、预训练方法三者之间的差异——这个感受非常宝贵因为大部分业务场景里你不一定需要最贵的模型。第三文本分类的部署形态最典型就是一个输入字符串返回标签和概率的 HTTP 接口非常适合练习工程化。3.2 动手做数据清洗和样本设计确定项目后第一个实验不是训练而是把数据吃透。假如你用的是电影评论情感分类数据集流程大致是这样读取数据查看评价文本长度分布、标签分布把乱码、重复数据、空样本剔除设计文本清洗流程去除无意义字符、统一换行符、处理 URL 和表情符号等思考什么信息对情感是有意义的比如否定词不好和好差一个字语义完全相反简单词袋模型会吃大亏这里我特别想说样本设计。很多人一开始就把全部数据切分成 train/valid/test然后直接训。更好的做法是先留出一部分老板测试集——这些样本不影响迭代只在最后用一次模拟真实世界的数据情况。这样能防止你在实验途中反复偷看测试集最后得到一个自欺欺人的高分数。另一个关键设计是把标签噪声考虑进来。我在自己标注数据时发现一个人在不同心情下对同一条评论的标注可能不同。所以在工程上我常会做多数投票——同一条样本让三个人标取多数。这个过程很累但你从中学到的比读十篇论文都多。3.3 先跑一个垃圾模型再开始聪明调参这个建议可能让追求完美的读者不适但它是我的真实经验第一个模型永远别追求最好追求全链路跑通。哪怕准确率只有 65%只要它走完了加载数据 → 预处理 → 训练 → 评估 → 存 checkpoint → 写一个推理函数 → 返回结果这条链路你就已经完成了一个重要的突破——你有了一个系统骨架后续的优化全部是在骨架上加肉。我第一次做这个的时候先用 TF-IDF 特征加上逻辑回归准确率大约 78%跑得非常快。然后我换了 LSTM准确率涨到了 82%但训练时间翻了二十倍。最后我用了一个当时比较小的预训练模型准确率到了 88%但显存和延迟都上来了。这三组实验给了我一个非常坚定的认知**在动手优化之前先明确你的性能瓶颈到底是什么。**如果你的瓶颈是准确率那就上更复杂的模型如果瓶颈是线上延迟那前两个模型可能反而更合适。很多 AI 项目失败不是因为准确率不够而是因为优化目标选错了。3.4 部署成接口第一次感受到工程化的重量训练结束只是上半场下半场是从有一个模型文件到一个可用服务。这里我用过 Flask也用过 FastAPI现在更推荐 FastAPI因为它自带请求参数校验和异步能力。一个最简推理服务大概是这个思路加载模型和 tokenizer/特征器注意只能在服务启动时加载一次不能在请求时反复加载定义输入数据模型比如一条文本写推理函数预处理 → 模型推理 → 后处理 → 返回 JSON加一个健康检查接口方便之后接入容器编排系统实际部署的时候有几个我这个阶段踩得很惨的坑必须告诉你第一个坑是版本对齐。训练时用的 Python 包版本和部署环境的版本不一致导致模型 loading 直接报错。我那次整整花了半天排查最后发现是 tokenizer 库小版本不同词汇表对不上。现在的解决方式很粗暴所有依赖用 lock 文件固定版本容器镜像里直接复制训练环境。第二个坑是并发控制。GPU 模型对你第一次部署的调包侠来说是个黑盒。多个请求同时进来如果没有排队机制显存直接爆掉。处理办法也很朴素一个线程锁或者一个队列控制最大并发数其余请求排队。第三个坑是超时处理。线上服务必须给推理设置一个超时上限否则模型一旦异常卡住整个服务就悬在那里。这个在上线最初期体现不出来但一旦调用方开始增多超时就是稳定性的大敌。4. 工程化的分水岭在模型性能之外你在管什么4.1 数据集版本管理与实验追踪前三年我吃了太多这个结果怎么复现不出来了的苦头。表现经常是上周明明跑出一个 90% 的准确率这周同样的代码怎么只有 87%查来查去最后发现是数据集被不知不觉更换了版本或者是超参数脚本被谁改了一个数字没有记录。所以这里我非常认真地建议从你第一个正式项目开始就建立两个纪律第一数据集本身要纳入版本管理。最简单的做法是给每个数据集一个版本号在代码里指定用哪个版本不允许用最新数据这种模糊说法。你可以直接用 DVC 这类工具也可以简单到在 train 脚本的配置项里写下数据路径和 hash 值。第二每个实验要有完整的元信息记录。不一定一开始就上重量级的 MLflow 或者 wandb至少要用一个 CSV 记录每次实验的时间、数据集版本、模型结构、超参数、训练耗时、主要评估指标。我早期用 Excel 记都行——关键是坚持。后来实验多了再迁移到 MLflow补起来就不会那么痛苦。这套习惯的最低价值是当老板问你这个准确率是在哪版数据上跑出来的的时候你不用支支吾吾。最高价值是你的思路连续性不会断你能清楚看到每次调整带来的是提升还是噪声。4.2 评估不能只看准确率要建一套业务视角的指标集工程和论文有个很大的差异论文看 benchmark 指标工程看的是一连串和业务绑定的指标。拿情感分类来说模型报告里的准确率可能很高但你要想几个实际问题当用户输入是一串无意义乱码时模型是不是还硬要输出一个情感当负面评论比例在真实场景只有 5% 时你的召回率还够看吗线上数据有大量新出的网络用语模型的置信度为什么会快速波动我在实际业务里评估一个模型从来不会只看单一准确率。我至少要同时看这几个维度在代表性样本上的分类准确率、精确率和召回率尤其关注少数类在人工构造的困难样例比如带讽刺、带网络梗上的表现模型的平均置信度和置信度校准情况避免模型明明不确定但乱说输出的稳定性同样的输入重复跑结果不会随机跳动这套指标出来后你会发现模型优化这件事有了明确的方向而不是被一个总分牵着鼻子走。4.3 线上监控和反馈闭环AI 系统的免疫系统线上模型最怕的不是 bug而是静默失效——模型还在响应但输出质量已经崩了。数据漂移是最常见的元凶训练数据里没有的新词汇、新表达方式不断流入模型逐渐变得不合时宜。做监控的关键是找到预兆指标。对文本模型来说预兆指标可以是输入条数、输入文本长度分布、词汇覆盖率输入词汇有多少出现在训练词表中、输出置信度分布、用户侧的相关业务指标比如你的系统里客服二次转接率或者用户手动纠错率等。这些指标不用全部实时可视化但一定要有一个按天的看板或者报表。我印象很深的一次是线上一个实体抽取模型连续一周的词汇覆盖率往下掉但我当时没建立这个监控直到业务方反馈抽取结果明显变差才反应过来。后来加了覆盖率监控数据还没到业务受损的程度时我们就提前预警并重训了模型。反馈闭环的意思更直接把线上生产环境中被识别为 badcase 的样本回流到训练集定期重训或微调模型。这个飞轮才是 AI 工程的精髓——模型不是一次性交付的静态物品它是一个伴随业务进化的动态系统。5. 当我回头看哪些弯路可以再避开5.1 知识学习的节奏不要囤积要按项目喂我想分享一个对我影响很大的习惯转变。早年我很喜欢囤课程、囤论文、囤优秀项目的代码收藏夹几百个链接但真正从头到尾跑完的不到十个。后来我换了一个策略——手头永远只维持一个进行中的项目遇到不懂的再去找资料。比如我在做一个推荐系统实验时需要实现一个双塔模型那段时间我就集中精力学 embedding、损失函数和负采样学完立刻在代码里改改完立刻看效果。这种项目驱动学习的知识留存率远高于漫无目的地刷视频。因为每个知识点都附着在你亲手搭建的系统上回忆起来的时候你想起的是自己代码里的某个函数而不是某个抽象概念。5.2 团队协作里的工程意识你不只是在写 Jupyter Notebook另一个比较晚才意识到的点是AI 工程是一个多人协作的系统工程。哪怕你是个人开发者一旦项目复杂度上来代码组织方式也会决定你的后期效率。这里推荐尽早使用模块化结构别把所有逻辑都堆在一个 notebook 里。通常我会把项目拆成这几个模块数据加载与预处理、特征工程、模型定义、训练流程、评估脚本、推理服务、配置管理。这样分工清晰单人维护轻松将来交给别人也不至于变成一团乱麻。关于 notebook我态度是探索性实验可以用但它不适合做工程交付。notebook 里的隐藏状态、乱序执行太容易制造一个灵异结果。所以我的一般流程是先在 notebook 里做快速探索验证确定方案后马上把关键代码迁移到 Python 模块里之后所有正式实验都跑脚本。5.3 一个微小但关键的建议学会阅读别人的报错最后我想专门说一下报错。很多人一报错就立刻把整段错误信息丢给搜索引擎或者 AI 助手这个操作本身没问题但你在伸手求救之前应该先自己完成这样几步读一遍错误信息的前三行确定错误类型是值错误、连接错误、维度错误还是 OOM找到 traceback 里的最后一个你的项目文件的位置这里是让错误发生的你的代码思考这个错误发生在哪个阶段——是数据读入还是特征处理还是模型前向还是后处理尝试用最小化思路复现比如把巨大的 DataFrame 换成 3 行的样本来跑同一段代码这套流程看起来笨拙但它实际是锻炼你结构化排查问题能力的最好训练。等你排查过几十次报错之后你会发现你能把类似问题分类快速锁定方向。这比背诵 API 文档有价值得多。回到一开始说的ai-engineering为什么这么多人学了理论却做不出东西就是因为他们的学习路径里缺少从零到一亲手搭建一个完整系统的经验密度。我文章中讲到的这套路线——夯实够用的数学、建立数据洁癖、跑通一个极小全链路项目、补齐数据集版本管理与监控闭环、在项目驱动中积累知识——不是某个培训班发明的速成法它就是我自己磕磕绊绊走了好几年后沉淀下来的路径。如果你现在还在起步阶段我真心建议别急着追最新的模型先花两个月把这条链路完整走一遍。等哪天线上的模型出了问题你不慌不忙地打开数据报表、查看监控指标、定位到一个特定版本的输入样本分布变化然后组织数据、重训、上线——那个时候你心里就有底了你知道 AI 工程是怎么回事。
返回列表