ARTICLE DETAIL

资讯详情

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

从零开始AI工程:构建数据-模型-服务闭环的实战指南

从零开始AI工程:构建数据-模型-服务闭环的实战指南 1. 为什么“从零开始学AI工程”是一条更难、但也更扎实的路先交代一下背景。我最早接触“ai-engineering”这个词的时候和大多数人一样第一反应是这不就是调库、调参、跑模型吗结果真正动手做项目之后才发现AI工程和算法实验完全是两码事。算法实验关心的是“在测试集上能不能涨两个点”AI工程关心的是“模型放进真实业务里能不能稳定跑三个月”。这两个目标之间的鸿沟比大多数人想象的要大得多。所谓的“from scratch”从零开始两层含义。第一层是心态上的从零也就是不完全依赖现成的端到端平台愿意把底层组件的原理搞清楚第二层是知识体系上的从零也就是不默认自己会写Python就等于会做AI工程而是把数学基础、数据处理、模型训练、模型部署、监控运维整条链路都过一遍。这条路确实比“两天上手某平台”要慢但走完之后你对系统里每一个环节的把握能力是完全不同层级的。这篇文章适合谁适合那些已经能跑通一些开源模型推理但一遇到“数据集怎么组织”“训练时显存不够怎么办”“模型上线之后效果变差怎么排查”就卡住的人。也适合刚入行、面对一堆课程不知道从哪下手的初学者。写的内容不追求面面俱到而是把我自己从零走一遍之后觉得最值得掰开揉碎讲的东西拿出来说。先说一个核心观点AI工程的本质不是建模而是构建一个可靠的数据-模型-服务闭环。建模只是这个闭环里的一个环节。你如果只盯着模型结构看等于只看到了整台机器里的一颗齿轮。这也是为什么很多科班出身的人反而不如一些从工程侧转过来的人好用——后者天然带着“系统能不能跑起来”的视角去看问题。2. 我拆解出来的AI工程核心知识体系五层结构如果要把“ai-engineering”需要掌握的东西画成一张地图我会分成五层从下往上分别是数学与理论地基、数据工程、建模与训练、部署与推理优化、监控与迭代。每一层都有各自的关键技能和常见误区。2.1 数学与理论地基不深但范围要够很多人听到数学就头疼但实际上AI工程所需要的数学深度是“广而不深”。你不需要像数学家那样去证明定理但至少要熟悉以下这些概念并且知道它们各自在哪个环节起作用线性代数矩阵乘法、张量形状变换、特征分解。模型推理的底层全是矩阵运算你搞不懂shape的变换规则就根本没法写自定义层和数据预处理。概率论与统计分布、期望、方差、最大似然估计。评估指标、置信区间、采样策略全都建立在这上面。微积分与最优化梯度、链式法则、学习率、损失函数曲面。理解“为什么学习率太高会震荡”比记住一堆优化器的名字有用得多。信息论基础熵、交叉熵、KL散度。分类任务的损失函数本质就是在最小化两个分布之间的差异。我见过不少工程背景很强的人在调模型的时候纯靠直觉和网格搜索。不是说不行而是效率太低。你如果理解梯度下降就知道学习率不是“越小越好”而是要看损失曲面在这个位置的变化率你如果理解数据分布就知道训练集和验证集划分不随机会造成什么样的偏差。这些知识不是用来考试的而是用来在关键时刻做决策的。2.2 数据工程真正拉开差距的地方实话说在AI项目里模型结构选错了往往还好补救数据出了问题才叫灾难。数据工程这一层包含数据采集、数据清洗、标注方案、特征工程、数据版本管理、数据质量监控六个子模块。大多数入门教程都跳过了这一层直接拿现成的数据集跑模型这就导致了“我明明复现了别人的代码效果却差很多”的经典困惑。你想想看一个CV模型训练集里的图像分辨率和生产环境里真实图片的分辨率不一致轻则掉几个点重则模型完全不可用。一个NLP模型训练数据的语言风格和用户真实输入的语言风格差异很大效果自然会很差。这就是为什么特征分布检查EDA和上线前的数据对比验证至关重要。数据版本管理是个经常被忽视的点。我自己的做法是给每个数据集打tag并把数据集的哈希值记录到训练任务里。这样任何一次实验结果都能追溯到“当时用的到底是哪一份数据”省的出了问题连回退都不知道回退到哪。2.3 建模与训练从跑通到稳定收敛到了这一层才是大多数人认为的“AI”本身。但即便在这个环节重要的也不是刷榜而是建立一套训练方法论基线先行不要一开始就上大模型、花式数据增强。先用一个小规模的简单模型跑通整个流程确认数据管道没有bug。损失曲线分析训练损失下降、验证损失不降是过拟合两个都不降往往是学习率或数据流出了问题验证损失出现周期性波动就要怀疑学习率循环设置或batch size过小。确定性复现固定随机种子、设置确定性模式。别小看这一步如果实验不能复现后面所有的调参结论都是空中楼阁。实验记录光靠脑子记参数是不行的。每个实验至少记录数据版本、模型配置、超参数、损失曲线截图、评估结果。我一般用一个简单的JSON文件统一记录跑完一次实验就更新一次。这里还要特别提一下损失函数的选择。很多新手对损失函数不敏感随便选一个就用导致模型训出来行为完全不对。分类问题用交叉熵没问题但如果你做的是目标检测就需要了解定位损失和分类损失的平衡做搜索排序可能要考虑pairwise损失。损失函数是模型行为的指挥棒值得花时间理解清楚。2.4 部署与推理优化模型写好只是开始模型在notebook里跑通和在线上环境稳定服务是两码事。部署这一层涉及的东西非常琐碎但每一样都能决定服务可用性模型格式转换与量化FP32转FP16、INT8量化对推理速度的提升非常可观代价是精度可能略微下降。你需要在离线提前评估量化前后的指标差异而不是上线后发现效果崩了。推理服务框架FastAPI配合模型进程还是直接用Triton这类专业推理服务器取决于并发量和模型类型。简单的单模型服务用FastAPI就够多个模型、需要动态batch的上专业框架更合适。预热与冷启动模型加载很耗时服务刚启动时如果直接接流量很可能会出现大面积超时。所以要在服务真正对外之前做一次推理预热。资源估算GPU显存占用、CPU利用率、内存占用这些都需要在部署前压测摸清楚。我记得第一次部署一个BERT模型的时候天真的以为只要pip install一下起个FastAPI进程就行了。结果上线当天就遇到GPU显存OOM因为并发请求一多每个请求单独分配显存缓存瞬间就爆了。后来改用动态batch加显存池化才把稳定性提上来。这种经验不亲自踩一遍真的很难有体感。2.5 监控与迭代模型上线不是终点才是起点很多团队把模型上线当成了项目的结束这绝对是个致命的误解。模型一旦上线只是进入了“持续运营”阶段而这恰恰是AI工程和传统软件工程最大的差异点传统软件的行为是确定的模型的行为却会随着数据漂移Data Drift而逐渐劣化。你需要监控的指标包括延迟和吞吐量服务性能的硬指标。预测分布模型输出的概率分布是否发生了明显变化。特征分布线上实际输入的特征分布是否已经偏离了训练集。反馈闭环用户的真实反馈点赞、点击、修正能否回流到模型迭代流程里。这些指标构成了“模型在真实环境中是否仍然健康”的判断依据。一旦发现分布偏移就需要触发告警并进入重新训练流程。很多团队忽略了这部分等用户投诉了才发现模型早就变成了“人工智障”。3. 从零到一我亲手走完的一个最小可运行AI工程闭环光说不练假把式。下面我用一个非常小的、可运行的项目来演示一个从零开始的AI工程闭环到底长什么样。这里选用文本分类任务因为大家最熟悉技术栈最轻也最能暴露出工程思维上的不足。3.1 需求定义第一件要做的事项目需求给定一段客服对话文本自动判断它属于“咨询”“投诉”“售后”“其他”四类之一。这个需求看起来很普通但第一件事不是去找模型而是定义清楚准确率要多高才算达标80%还是95%错误容忍度如何错把投诉分到咨询后果远严重于错把其他分到咨询。推理速度要求是离线批量处理还是线上实时返回有多少训练数据数据从哪里来标注成本谁承担这些问题的答案直接决定了后面所有的技术选型。如果推理延迟要求大于500毫秒那老老实实用一个小模型就够如果准确率要求极高那要考虑人机协同而不是一味追求模型自动化。3.2 数据准备原始数据的清洗和标注假设我们从客服系统里拿到了原始工单文本。这些文本会是这样的“你好我上周买的手机屏幕碎了可以保修吗在线等挺急的。”先做文本清洗去掉HTML标签、处理全半角符号、去除无效字符、识别并进行基本的分词。因为文本量不大清洗工作用正则加简单的Python脚本就能完成。然后是标注。这里有一个巨大的坑标注标准不统一。比如“手机屏幕碎了可以保修吗”这个句子有人觉得是“售后”有人觉得是“咨询”。如果不事先定义好“咨询类指未发生交易需要了解信息售后类指已发生交易需要处理问题”标注一致性就会很差模型效果也会被拉低。我的建议是先标注一小批让标注人员和模型开发人员一起review对齐标注标准再大规模展开。标注完成之后还要做标签分布的检查。如果“投诉”类数据占比只有5%而其他类占比70%那模型会天然倾向预测多数类少数类基本识别不出来。这时候要么补充少数类样本要么在训练时给少数类更高的权重要么用采样策略来平衡。3.3 建模与训练一个可复现的基准模型分类任务的最简单可行方案是微调一个预训练的中文BERT小模型。为什么不用从零训练的文本CNN因为预训练模型自带语言知识在小数据量下效果远好于从零训练的词向量浅层模型。训练流程from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) model AutoModelForSequenceClassification.from_pretrained( bert-base-chinese, num_labels4 ) training_args TrainingArguments( output_dir./results, evaluation_strategyepoch, save_strategyepoch, learning_rate2e-5, per_device_train_batch_size16, num_train_epochs3, weight_decay0.01, load_best_model_at_endTrue, metric_for_best_modelf1, )注意几个细节学习率设置在2e-5左右比常规深度学习任务低一个量级因为预训练模型已经很接近最优点学习率太大会破坏学到的知识。评估指标用F1而不是准确率。因为类别不均衡准确率会骗人。固定所有随机种子保证可复现。训练完成后不仅在测试集上看指标还要抽几条真实样本人工检查模型的判别逻辑。比如模型把一条“我要投诉你们快递太慢”分到了“售后”这到底算不算错如果业务上认为“投诉”和“售后”可以合并处理那就调整标签体系而不是硬调模型。3.4 部署把模型封装成服务模型训练完毕下一步是部署。最简单的方案是用FastAPI把模型包装成一个HTTP服务提供predict接口。from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class TextIn(BaseModel): text: str app.post(/predict) def predict(data: TextIn): inputs tokenizer(data.text, return_tensorspt, truncationTrue, max_length128) outputs model(**inputs) proba outputs.logits.softmax(dim-1).tolist()[0] label_idx int(outputs.logits.argmax(dim-1)) return {label: label_idx, probabilities: proba}但这里还藏着一个问题每次调用都重新走一次tokenizer和模型推理高并发时性能会很差。解决办法是加一个缓存层如果入参的文本哈希值命中缓存直接返回历史结果不再重复推理。另一个问题是模型的加载时机如果不做预加载第一个请求会因为要加载模型权重而特别慢。所以用Lifespan机制来初始化模型让服务在启动阶段就Ready。3.5 监控与度量的第一个版本上线仅仅只是“从零实现闭环”的最后一步。我的建议是至少记录三类日志推理耗时、输入文本的长度分布、模型输出的类别分布。不要小看这三个指标它们能帮你快速发现问题。比如输入长度突然都变成512了可能是爬虫灌了垃圾文本输出类别突然大量集中在某一类可能是业务内容发生了巨大变化模型需要更新了。到这里一个最小可运行的AI工程闭环就已经打通了定义需求准备数据训练模型部署服务监控运行。整个链路虽然简单但它是完整且真实的。很多纸上谈兵的教程最大的问题就是讲到训练完就戛然而止从不告诉你模型上线之后发生了什么。4. 在线和离线之间的差距被大多数人忽视的生产级细节把同一个模型放在notebook里评估和放在生产环境里服务效果和体验可以是天壤之别。这个差距的来源不是模型本身而是生产环境的“杂质”输入噪声、请求并发、系统依赖、延迟约束。4.1 推理时数据预处理必须严格对齐训练时训练时对文本做了什么清洗推理时必须一模一样地重复。比如训练时把全角逗号统一成了半角、过滤了URL、做了分词那推理时也必须走同一套函数。我把这个函数的代码在训练和推理两侧同步维护每次修改都提交到版本控制里避免谁改了训练代码、忘了改推理代码的情况。这里有一个真实踩坑经历训练时数据清洗环节会过滤掉所有长度小于10个字符的短文本当时觉得这种短文本没有信息量但线上真实请求是允许用户输入短文本的。于是模型上线后遇到了大量的短文本输入表现一塌糊涂。根源就是训练集分布和推理分布不一致。4.2 延迟目标的拆解假定业务要求单次推理延迟小于300毫秒。这个300毫秒不是模型推理时间而是从客户端发出请求到收到响应的完整时间。它至少包含网络传输耗时通常占20%到40%服务端接收请求和预处理耗时10%模型推理耗时40%到60%响应序列化和回传耗时10%所以模型本身可能只需要100毫秒但加上其他环节就超时了。要想优化先要Profile定位瓶颈在哪一环而不是一上来就换更小的模型。我一般用cProfile配合中间件记录每个阶段的耗时再决定优化策略。4.3 并发场景下的显存管理GPU显存是共享资源多线程推理时如果不加控制很容易出现显存溢出。用PyTorch的话建议在推理时开启torch.no_grad()并将模型设置到eval()模式。但更要注意的是transformers库的batch_encode_plus在处理一批长度不一的文本时会自动padding到batch内最长的那个如果并发batch size较大显存消耗会变高。一个很实用的优化是动态batch如果可能将10个并发请求合并成一个batch做推理而不是分别跑10次。这样做吞吐量成倍提高但也要小心延迟抖动——如果有一个文本特别长整个batch都会变慢。更稳妥的方案是长度分桶按文本长度分组长度接近的请求合在一起做batch。5. 学习路径误区为什么学了三个月还在原地踏步“从零开始”最大的绊脚石不是知识太多而是知识太碎。我见过太多人在前三个月里反复学Python基础、反复看机器学习入门视频、反复跑MNIST就是不往下一个阶段走。我把这些学习陷阱总结成几条每一条都是我自己或身边人亲测踩过的。5.1 教程依赖症看教程让人产生“我在进步”的错觉因为学习曲线平滑每一个练习都有标准答案。但真实项目没有标准答案。看100小时视频不如自己从头到尾跑通一个像样的项目。我的建议很简单尽早脱离按部就班的课程以项目为目标倒逼自己查资料。当你带着具体问题去查文档的时候每一个知识点都会被牢牢记住。5.2 跳过工程底子直接追热点“大模型”“智能体”“多模态”这些词热度一上来很多新手就直奔最先进的技术结果连Linux基本命令都用不利索连Docker是什么都不知道。AI工程首先是一门工程工程的基础能力命令行、脚本编写、调试技巧、版本管理、容器化才是一个项目能落地的基石。模型结构再先进你没法把服务可靠地跑起来一切都白搭。5.3 没有建立自己的debug方法论普通软件开发里有明确的报错栈而模型训练里的“报错”往往是“指标不达预期”没有任何清晰的原因指向。这个时候最有效的debug方式是分层排查。数据对不对预处理对不对模型forward对不对损失函数对不对梯度有没有在更新逐层打日志确认。我见过很多新手卡在一个地方几个小时就是因为把时间全花在猜测参数怎么调而不是确认每一个环节是否正常。5.4 不写实验记录不写实验记录的后果是同一个超参数这次效果好、下次效果差但你完全想不起来上次跑的时候数据版本是什么、随机种子是什么、环境依赖是什么。AI项目里需要记录的变量太多了数据集、预处理、模型结构、超参数、随机种子、训练框架版本、GPU类型等等。不记录后果就是大量无效的重复劳动。6. 从零开始AI工程的实操路线与学习资源选择逻辑如果你已经下定决心走这条路下面是我个人推荐的实操路线。不是“必选”但按这个顺序做下来基础会非常扎实。6.1 第一阶段补齐工程底子约2到4周目标不是变成运维专家而是熟悉AI项目运行的基本环境。要求是掌握Python虚拟环境和依赖管理工具venv、conda、poetry任选一个熟悉Linux命令行、文件权限、环境变量会用Docker构建镜像并运行容器会用Git管理代码并理解分支和合并的基本操作这一阶段看起来和AI没什么关系但它决定了后面所有工作能不能顺畅推进。我建议用“把一个最简单的PyTorch推理脚本容器化”作为过关项目能跑通说明工程底子基本合格了。6.2 第二阶段跑通一个完整的小项目约6到8周选一个经典任务比如情感分类目标是完整走完数据准备到部署的全流程。注意这里的关键不是模型效果多好而是链路完整。你可以用任何公开的中文情感分类数据集规定自己必须做到数据清洗和统计分析训练一个简单的模型哪怕是线性模型记录实验日志用FastAPI封装并部署到本机运行推理并记录延迟做到这些你对AI工程的整条链路就有了真实的体感。接下来再去学更复杂的技术就有了锚点。6.3 第三阶段参与真实项目或者自己造一个真实需求真实需求和教学项目的差别在于真实需求里你会遇到脏数据、不配合的业务方、突然变化的评估标准、资源紧张的压力。这些不可控因素才是工程能力的练兵场。如果没有真实项目可参与我的建议是给自己找一个“伪需求”比如“帮我自动分类自己的邮件”或者“监控我博客评论区的垃圾评论”然后认真把它做成一个长期运行的服务。6.4 资源选择逻辑别收藏要使用资源太多反而是负担。我一直坚持“一本书两门课一手文档”的策略。书用来建立体系课用来快速上手官方文档用来解决具体问题。比起在知乎上收藏几十个“干货合集”真正有用的做法是把手头正在用的库的官方文档读透。别人总结的二手知识永远有损耗官方文档虽然枯燥但它是唯一准确的信息源。7. 几个被反复问到的“工程向”问题一次性说明白最后聊几个我在实践和带新人过程中被问过无数次的问题。这些问题看起来很基础但如果答案能在脑子里自动化工作起来会顺手很多。7.1 模型效果不好先从哪一步查起我的顺序永远是先查数据再查代码最后才查模型。具体来说先看训练集和验证集的分布是否一致再看数据增强或预处理代码里有没有泄漏接着确认损失值在下降、梯度在正常更新最后才考虑结构调整。80%的情况都是数据或代码bug真正需要动模型结构的情况少之又少。7.2 什么时候该重新训练模型不是“效果变差了才重新训练”而是应该建立固定的重训节奏例如每周或每月一次定时重训结合线上监控指标做触发式重训。触发条件可以设定为预测分布偏移超过某个阈值、新反馈数据的积累量达到某个数量、或者线上指标连续多天下滑。7.3 小团队做AI最大的成本在哪个环节数据环节没有之一。不是模型算力的成本而是把数据整理成模型能用的形态所需要的人力成本。标注标准制定、数据清洗、质量审核这些环节在小团队里通常由工程师自己扛极其耗时。如果预算允许这是最适合外包出去的部分但前提是你制定的标注标准足够清晰。7.4 AI工程师需要深入掌握算法原理吗不同阶段要求不同。入门阶段不需要能推导每一个公式但要求知道模型的行为逻辑和适用边界。进阶阶段对自己主攻的方向要深入比如做NLP的要对Transformer的注意力机制了如指掌。到了资深阶段跨领域的算法视野反而比单个模型的深入更重要因为你需要对整个系统的技术选型负责。7.5 大模型技术火热还要从基础开始学吗要而且更要。大模型本质上仍然遵循数据、训练、部署、监控这套工程闭环。你如果基础不牢遇到大模型的幻觉问题、上下文长度问题、效果调优问题会完全找不到排查抓手。技术的形态一直在变但“用工程化方法解决模型真实落地问题”的核心能力是永远不过时的。在我自己从零走完这条路的体会里最重要的一条是入门AI工程比拼的从来不是智商而是能不能在信息爆炸的环境里忍住诱惑把一条链路从头到尾扎实走完。走完一遍之后你会发现很多所谓的新技术不过是在你已经熟悉的闭环之上换了一个组件。把闭环的本质掌握住后面学什么都会很快。这也是这篇文章我想传递的最核心的东西不用等所有知识都准备好了再动手现在就从最小闭环开始缺什么补什么你会发现这条路没有想象中那么远。
返回列表