尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI工程从零到一:构建可靠可控可度量的AI系统

AI工程从零到一:构建可靠可控可度量的AI系统 1. AI工程的认知误区不是会调API就等于会做AIAI工程师这个头衔最近两年几乎被喊烂了。但也正因如此大部分人对AI工程的理解是被扭曲的——以为会写几个提示词、用LangChain接个大模型、把HuggingFace上的模型跑个demo就等于做AI工程了。我在一次招聘面试中被问到一个问题对方说你会用transformers库对吧我说会能加载模型、能做推理预测。他接着问那你把模型搞到线上来用户请求进来吞吐量上不去第一层哪里看我当场被问住了。那一刻我才真的想明白一件事AI工程的核心是把AI能力变成一个可靠、可控、可度量的系统而不是把一个模型跑起来那么简单。这条认知的转变是从我开始系统梳理从零做AI工程这件事开始的。今天这篇文章就是我踩了无数坑之后沉淀下来的完整路径适合刚入门的算法工程师、准备转型AI方向的软件工程师以及那些想从用AI做玩具跨向用AI做产品的开发者。1.1 AI工程师和算法工程师到底有什么区别先说个很扎心的事实很多团队招AI工程师的时候脑子里要的人其实是能训练模型的人。但实际工作中你会发现训练模型只是整个生命周期里极短的一环。一张图就能说明白文字描述版全流程是一个漏斗最上层是业务需求接下来依次是数据收集与治理、特征工程、模型训练与调优、模型评估与验证、部署上线、监控反馈、持续迭代。模型训练只是漏斗中段的偏下位置。这就造成一个尴尬算法工程师的背景决定了他们大多数人在模型架构、损失函数、优化器上投入很深但到了工程化环节——模型怎么打包、服务怎么做资源隔离、QPS波动怎么处理、数据漂移怎么感知——完全就是另一套知识。反过来软件工程师虽然懂分布式、懂微服务、懂性能优化但要他们去理解attention机制、去解释梯度消失、去做样本加权一样会头皮发麻。所以AI工程这个岗位本质上是要站在两者中间把研究原型翻译成生产系统。你不是在写科研代码你是在写能扛流量、能运维、能迭代的代码。这两者之间差的是系统工程的那套方法论。1.2 从零起步需要建立的AI工程知识体系从零起步听起来很唬人但拆开来看其实就是三块内容的交叉机器学习基础不要求你会复现一篇论文但得懂数据怎么组织、模型训练的逻辑是什么、val_loss和acc到底在反映什么。这是所有上层工程的基石。后端工程能力API设计、并发处理、缓存策略、容器化部署、CI/CD、日志与监控这些传统后端该会的东西AI工程师一个都跑不掉。MLOps专门的工程实践特征存储、模型仓库、版本管理、线上A/B测试、模型回滚机制、数据与概念漂移的监测这些是AI系统特有的工程味道。我个人建议的入门路径是不要先啃深度学习理论也不要一上来就追ChatGPT周边。先做一个小而完整的闭环——比如用scikit-learn训练一个分类模型然后自己用FastAPI包装成服务Docker打包部署到一台服务器上加上日志和监控。这个过程做完你对AI工程的实际体感就建立了后面再学什么都知道往哪儿挂。2. 开发环境的搭建逻辑比装个PyTorch多考虑三步很多人搭建AI开发环境就是pip install torch tensorflow transformers三连然后跑通了就觉得自己环境搞定了。真要拿这个去搞工程后面一堆问题会把你坑到怀疑人生。2.1 依赖隔离为什么conda/virtualenv只是起点依赖冲突是AI项目里最经典的第一天就炸的问题。PyTorch要某个版本的CUDA库TensorFlow要另一个版本NumPy还夹在中间两头得罪。用虚拟环境隔离确实能解决一部分问题但它只隔离到Python包层面隔离不了系统库层面的冲突。我自己踩过最大的一个坑是两台机器同一份requirements.txt一台能跑一台报GLIBC版本错误。排查到最后发现是系统OpenMP库版本不一致Python层面完全看不出来。所以搭建环境时我的建议直接上Docker。把镜像文件Dockerfile作为环境的唯一真相来源而不是靠我这台机器能跑来当标准。Docker可以把CUDA、Python版本、系统库全部固化下来换机器不用靠人品团队协作也不用拿在我电脑上能跑来互相折磨。2.2 一个可行的AI工程起步环境代码与技术栈参考以我现在的实际项目为例起步环境大概是这样的——不是唯一答案但你可以直接抄作业层次选型为什么这样选容器Docker docker compose环境可复现开发和生产保持一致Python管理uv或poetry锁文件机制依赖版本可精确复现训练框架PyTorch生态最全工具链成熟跟论文接轨成本低推理框架ONNX Runtime vLLM如果涉及大模型前者能优化中小模型推理后者专吃大模型吞吐服务框架FastAPI异步支持好自动生成OpenAPI文档调试方便监控Prometheus GrafanaAI系统也是系统该有的可观测性一个都不能少这套组合背后有一个核心思想开发环境对应的就是生产环境的缩小版尽量减少开发时能用、上线就跑不通的系统性偏差。2.3 消费级硬件上的现实选择先跑通再想规模我明确说一句可能被鄙视的话如果不是做CV大模型或者从零预训练语言模型深度学习框架PyTorch加一块普通的GPU比如RTX 3060或者4060对起步阶段的AI工程完全够用。我在很长一段时间里都是拿Google Colab免费额度练手后来干脆自己配了一张显卡反而更顺手。重要的不是硬件有多堆而是你要在真实的硬件限制下养成考虑算力成本的习惯。比如一个模型训练要跑三天才收敛你就不会去做那种拍脑袋调参的事——这种被迫理性的过程其实就是工程思维的开端。3. 数据管线AI工程里最脏最累却最值钱的一环说到AI工程大家的第一反应永远是模型但真正做过的人会把最多的精力花在数据上。业界有句老话叫Garbage in, garbage out翻译成中文就是数据决定了模型能力的上限模型只是在逼近这个上限。3.1 数据获取与真伪清洗爬虫之外的非技术环节很多人拿到数据就开始做预处理跳过了最要命的一步——数据清洗前的审计。这块的工作内容包括检查字段是否完整、是否有重复、标注是否存在系统性偏差比如所有正样本都是同一个人标注的、时间戳是否合理训练集和测试集不能有时间穿越。我处理过一个文本分类项目的真实案例。原始数据里有十几万条样本看起来分布很均匀但我按来源渠道拆分检查时发现A渠道的样本平均长度是B渠道的三倍而且A渠道的文本几乎都是同一种风格还高比例集中在某几个话题上。模型训练完在A渠道的数据上表现很好到了真实线上数据全部拉胯。就是因为训练数据看着均衡实则偏置。为了避免这类问题我现在的数据审计流程是这样的按来源拆分统计分布不只是看整体分布而是要按来源拆分统计检查重复样本尤其是近似去重文本经过简单改写的情况需要特殊处理可视化关键特征文本长度、类别分布、时间分布手工随机抽300~500条人肉过一眼质量人肉抽查这个步骤被很多团队忽略但往往最有效。我在一次抽查中直接发现一批标注全是同一个标签的低质量数据机器层面完全检测不出来但一眼就能看出来。3.2 特征工程中的关键视角训练/测试分布一致性特征工程不只是构造新特征还包括一个重要问题——保证线上可获取的特征和训练时一致。这个问题最容易发生在时间特征、用户历史统计类特征上。举一个例子你在训练时用了用户过去7天点击次数这个特征但因为历史数据完整这个特征没问题。上线时你发现新用户的7天点击次数是0老用户的数据也只有日志系统里存的那部分。怎么办直接暴露0会误导模型不填特征模型又跑不起来。这个问题的标准解法是特征对齐上线前专门模拟线上环境做一个特征可用性验证把所有模型用到的特征列一个清单逐项确认训练时怎么来的、线上时怎么来的。一旦发现有差异要么调整特征要么补数据管线。提前把这件事情做了能省掉线上模型莫名其妙变差的排查时间。3.3 数据版本管理别让你的模型变成薛定谔的模型模型重复训练但结果对不上这个问题我相信每个做AI的工程师都遇到过。上次跑AUC 0.91这次同样代码只有0.87数据好像没变但好像又变了。恭喜你掉进数据版本未管理的坑了。我的解决方案是从一开始就给数据建版本。工具上我推荐DVCData Version Control它把数据和Git仓库关联起来每次数据变更都产生一个commit记录模型训练时记录当前数据版本。这样哪个数据版本训出的哪个模型效果是多少一目了然。我自己的做法是给每个模型卡一个唯一的模型编号格式类似exp_032_20240215_lr3e-5_balanced_v2包含实验序号、日期、主要超参、数据版本。这套规则看起来繁琐但它让模型管理这件事从靠记忆变成了靠制度。当模型需要回滚时你可以精确判断是回到上一版数据还是回到上一版模型参数。4. 模型训练到服务部署之间的隐形鸿沟训练时模型在GPU上跑得飞快各种指标都漂亮。部署上线之后要么响应时间超标要么内存爆炸要么并发一高就报错。这就是训练环境和服务环境割裂带来的典型问题。4.1 训练权重到可部署产物不止是保存一个文件很多人把模型部署理解成把.pt文件丢给后端加载一下完事。实际上训练产物和部署产物之间需要经过一次形态转换。各类模型产物的格式差异我用一张表格来说明格式用途特点PyTorch.pt/.pth训练保存/断点续训包含完整参数甚至优化器状态体积大ONNX.onnx跨平台部署计算图固化可优化适合CPU/GPU推理TensorRT.engineNVIDIA GPU极致优化层融合加精度校准推理延迟最低GGUF本地大模型推理针对消费级硬件做了量化优化关键点是部署时你需要的是一个推理图不是训练图。训练图里有反向传播算子、有BatchNorm的running stats更新逻辑、有dropout层——这些在推理时要么不需要要么行为要改变。所以从训练权重转成推理格式时典型的操作包括去掉训练专用层、固定BatchNorm参数、把模型设为eval模式然后做TorchScript或ONNX导出。4.2 推理优化的三板斧量化、批处理、缓存模型部署到线上核心指标就是吞吐量和延迟。在不动模型结构的前提下有三个方向可以压榨性能第一板斧量化。把FP32权重压成FP16甚至INT8。听起来像有损压缩但对大部分推理任务来说精度损失可以控制在可接受范围内。以我常用的一个BERT分类模型为例FP32转INT8后体积减少约75%推理速度提升约2~3倍AUC只掉了0.004。收益远大于代价。第二板斧动态批处理。单条数据和一批数据同时送进GPU后者虽然总耗时更多但平均到单条的时间远小于前者。这就是批处理的效果。但线上请求是随机到达的不能等攒够一批才处理所以要靠服务框架做请求排队定时批处理的机制。FastAPI配合一个简单的队列几行代码就能实现动态批处理。第三板斧缓存策略。如果是文本分类这类任务相似输入的输出通常也是相似的。可以给模型加一层近似缓存对输入做hash在有限大小缓存里直接返回结果。注意设置好TTL别让缓存里是永远不刷新的旧知识。4.3 API层设计模型的嘴巴和耳朵很多机器学习模型的线上接口是无数个if-else拼出来的接口逻辑。输入参数极其脆弱输出格式混乱不堪。真正工程化的做法是输入侧用Pydantic定义严格请求模型明确字段类型、是否必填、取值范围输出侧统一结构化返回带code、message、data三层结构错误处理模型推理失败要有兜底逻辑不能直接把500异常抛给调用方超时设置一个模型接口你最好心里清楚P95的耗时是多少然后在此之上加安全余量把API层看成一份模型和外界沟通的合同你就会重视输入校验和输出约束了。很多根本问题字段名变动、缺失值格式不一致都能从这个角度被提前堵住。5. 一个从零到一的完整案例垃圾短信分类器的工程化之路前面讲了很多原则这里用一个完整的实际项目把所有环节串起来。就从最经典的垃圾短信分类器说起——麻雀虽小五脏俱全非常适合做AI工程的入门闭环。5.1 需求拆解与基线版需求一句话给定短信内容判断是否为垃圾短信。普通人的第一反应是找个预训练模型微调一下。但工程上的第一反应是先定义清楚边界——目标延迟是多少数据大致长什么样模型输出之后业务方怎么用以及有没有不做机器学习的替代方案我当时做基线版用了一个很朴素的方法TF-IDF 逻辑回归。效果如何F1约0.93。够用吗对业务场景来说比随机强出一大截关键是推理速度快、无GPU依赖、部署简单。这个基线版的工作极其重要它给出了一个底线效果参照。后面你花大力气上BERT如果提升不到0.005以上性价比就很低。AI工程里有个原则叫先找一个足够便宜的baseline再决定是否上贵的方案。5.2 数据侧的处理细节数据集用的是短信文本标注为spam垃圾和ham正常两类。清洗逻辑并不复杂但每一步都有原因去除HTML实体和URL这类内容对分类有信号但需要归一化否则同一个URL的不同参数会被当成不同特征中文场景还要做分词我这里直接用了英文数据集所以走了空格分词加小写不去停用词在短文本分类里停用词表经常把有效信号也删掉了类别不平衡处理垃圾短信占比大概15%直接用原始分布会让模型倾向全预测为正常短信所以训练时对spam类做了上采样你以为清洗完就结束了吗还没有。我额外做了一个锚定验证按时间顺序把数据集切成三份前两份做训练最后一份做验证。这样可以模拟未来数据的效果。结果发现模型在新时间切片上的表现比随机切分低了近两个点这个是数据漂移的一个预兆信息。5.3 模型评估与回归机制模型上线之前评估是最后一道闸门。这个项目里我用的评估指标有三个维度指标数值说明Precision0.95说了是垃圾到底准不准Recall0.91真正的垃圾短信有多少被逮住P95延迟12msCPU推理环境下的响应时间光看指标是不够的还得建立回归机制。我把测试集固定下来含2000条样本每次训练新的候选模型都要在这个测试集上跑一遍分数不低于当前生产模型才允许上线。这个机制保证了AI系统不会越改越烂而不自知。补充一个表格里看不到的细节模型误判的样本本身及其难度层级我也做了沉淀因为误判类别是第一手信号。比如会有什么广告文本很接近正常短信的写法导致模型误判成ham这种案例收集多了后续怎么调整阈值、怎么补充训练数据都有依据。5.4 上线运行与监控部署方案很简单FastAPIONNX RuntimeDocker打包单机跑。没有上K8s因为初期流量小一台CPU机器顶得住。这也是一个工程判断没有必要的复杂度就是最优的复杂度。监控方面做了三层基础监控API的QPS、错误率、P99延迟模型监控预测分布的漂移检测——比如垃圾短信预测比例从15%飙到30%肯定哪里变了业务监控每日拦截率是否在预期区间这个项目做完我对AI工程的理解就从训练模型彻底转变成了构建一个AI系统。6. 从工程闭环到持续迭代AI工程师的进阶之路从零到一做完一个项目不代表AI工程的学习结束了。恰恰相反真正的挑战在于从一到N的持续迭代。6.1 模型生命周期管理的核心可回归、可回滚我见过太多项目模型上线之后就不敢动了。原因是没人知道动一下会发生什么。解决办法就是第5节说的回归机制——只要有固定评估集性能门槛每次迭代都有客观判断依据。但还有一层比回归更深的回滚预案。线上模型出问题时能否快速切回旧模型如果新旧模型不兼容比如特征版本变了回滚就不是切个版本号那么简单。我的经验是每次模型升级都要带着数据兼容性一起考虑确保至少有一个线上可用的安全回退路径。6.2 算力成本和系统开销的精打细算AI工程和算法研究的一个明显区别是算法研究只关心效果指标AI工程必须算成本。GPU机型的每小时费用、推理服务的响应延迟对业务转化率的影响、模型体积对镜像构建和分发时间的影响这些都是实打实的成本要素。举一个很小的例子同一个模型做大模型推理服务时用float16和int8响应速度差两倍以上显卡占用率差一个量级精度只差零点几个点。不需要多少优化的高深技术只需要这种一切可度量的意识工程化水平就能上一个台阶。6.3 最后的几点个人建议如果你现在真的想从零开始建立AI工程能力我觉得最值得做的三件事是找一个最小规模的真实需求哪怕就是给客服消息自动打标签完整走一遍数据、训练、部署、监控的闭环刻意练习先想清楚再动手——做一个决策清单数据来源是什么、模型效果怎么度量、上线失败怎么办学会把模型效果和业务效果分开度量前者是工程师关心的后者是老板关心的我在这个领域里摸爬滚打的时间不算短最大的体会就是AI工程这件事没有太多天才的时刻更多是一个又一个枯燥但必要的细节堆积起来的。环境管理、数据版本、回归测试、监控告警——每一项单看都很平淡但串在一起就是AI系统能稳定跑下去的全部理由。希望这篇从零到一的路径梳理能让你少走一些我走过的弯路。
返回列表