ARTICLE DETAIL

资讯详情

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

从零搭建AI工程体系:数据清洗、模型评估与部署实战

从零搭建AI工程体系:数据清洗、模型评估与部署实战 从零开始搭建自己的AI工程体系这个事我前后折腾了大半年踩坑无数最终沉淀出一套可以复用的方法论。今天不聊框架选型对比不谈大模型有多火就纯粹以一个过来人的身份聊聊我如何从会用模型走到能独立交付一个像样的AI工程。这个项目我给它取名ai-engineering-from-scratch听起来像个仓库名其实就是一套从底层搭建起来的个人能力体系。很多朋友问我你不是科班出身怎么在半年内把AI工程串起来的我的回答一直是——把工程思维补上比多学几个模型重要得多。如果你是刚入门AI、想往工程方向走或者已经在用现成API但想更进一步这篇内容应该能帮你省下不少弯路。1. 先想清楚AI工程到底在解决什么问题在动手写第一行代码之前我得先把这件事的边界划清楚。很多人在AI领域卡住不是因为模型难学而是因为从一开始就没搞清楚自己到底在做什么。1.1 别急着写代码先拆需求我见过太多同学拿到一个AI项目第一反应是我要用哪个模型我要不要微调一下。这完全是本末倒置。真正的工程思维是先明确这个系统要解决什么业务问题数据从哪里来模型的输出给谁用失败时怎么兜底。拿我自己做过的一个人事档案抽取项目来说。需求一句话把PDF简历里的关键字段自动填进系统。听起来简单但拆开之后是这样的数据侧PDF格式五花八门有扫描件、有Word转的、有手机拍照的清晰度参差不齐模型侧直接套通用抽取模型准确率大概七八成但人事系统要求至少95%流程侧抽取结果不能直接入库需要人工复核环节还要保留审计日志部署侧数据不能出内网模型必须本地跑还得控制单条处理耗时这些问题没有一个能在写训练代码之前回答。所以我在项目里做的第一件事不是选模型而是写了一份两百行的技术方案草稿把输入输出、性能指标、异常路径全列清楚。这个习惯一直保留到现在效果比任何框架都管用。1.2 我当初为什么选这条路在AI领域摆在面前的路其实有三条做算法的、做应用的、做工程的。算法岗拼数学和paper应用岗拼产品嗅觉和集成能力工程岗拼的是系统化落地能力。我选的是第三条原因很现实市场上有大量业务场景缺的不是更好的模型而是能把模型稳稳当当用起来的人。工程这条路的核心可以用一句话概括把AI从实验室里的demo变成生产环境里稳定的服务。这句话意味着你要管的远不只是模型本身——你要管数据怎么流转、服务怎么部署、GPU资源怎么分配、出问题了怎么排查、模型要更新怎么升级。这些全是不太性感但极其磨练人的活。我在项目里给自己定了几条原则每个环节都必须有可验证的标准不能模棱两可能自动化的绝对不手工哪怕前期多花时间所有模型效果说辞必须能量化成指标摆出来这三条原则在后面的实操里反复救了我。2. 环境与基础把底子打牢很多教程上来就让你跑模型我偏不。从零开始做AI工程环境与工程基础是第一道分水岭。跳过这一步的人后面百分之百要回来补课。2.1 Python工程化基础别只用notebook我见过不少人研究AI特别喜欢Jupyter Notebook模型试验阶段用它确实方便但一旦进入工程化阶段notebook的缺点会无限放大代码顺序依赖、没有模块边界、测试没法写、版本diff看不清。我自己的项目坚持一个原则——一切以代码仓库为主notebook只用来做探索性分析分析完把结论固化到正式的.py文件里。判断你的Python工程能力是不是到位可以看这几条能不能用venv或conda重建干净环境而不是在我机器上明明能跑写没写过标准的setup.py或pyproject.toml让别人一条命令装好依赖有没有给自己的代码写pytest测试至少把数据预处理这类核心函数覆盖掉知不知道怎么用logging而不是print来记录运行信息我刚转工程时也不习惯这些总觉得写测试浪费时间。直到有一次改了一个数据清洗函数顺手把某个字段的null判断写反了模型训练完才发现精度掉了三个点回头排查花了一整天。从那以后凡是核心逻辑函数测试必写。这不是教条是用时间换来的教训。2.2 数据与模型IO的规范AI工程里有个特别容易被忽略的细节数据格式和模型输入输出的规范化。很多人跑demo没问题一旦做系统就挂在这里。我举一个真实的例子。项目里有个Excel输入文件里面电话列有时候是数字格式有时候是文本格式还有时候带空格。在demo阶段数据量小肉眼看着没问题就过了。到了正式流程全量数据一跑光这个字段就导致三分之一的记录解析失败。最后我统一加了一个数据清洗层所有输入先进清洗层转成标准schema再往下流。模型IO我同样做了约定。所有模型的输入统一包装成标准结构输出也是不管是单条预测还是批量打分都走同一个接口。这样做的最大好处是当你要换一个模型哪怕从传统模型换到大模型业务方那边感知不到任何变化。还有一点数据版本管理。模型效果别靠我记得当时用的哪个文件。我在项目里用dvc做了数据文件版本管理配合git做代码版本这样每次跑出来的结果都能追溯到对应的代码和数据版本。这个习惯在排查模型效果波动时救了我好几次。2.3 版本管理不只有git数据也要管这里想多说一句很多人以为引入Git就万事大吉了。但AI项目的特殊性在于代码只是整个系统的一半数据、模型权重、配置文件共同决定了最终行为。我现在的项目仓库基本长这样repo/ ├── data_versions/ # dvc管理的数据文件 ├── models/ # 模型权重存储 │ └── checkpoints/ # 训练中间结果 ├── src/ │ ├── data/ # 数据加载与清洗 │ ├── features/ # 特征工程 │ ├── models/ # 模型定义与训练 │ ├── api/ # 服务接口 │ └── evaluation/ # 评估脚本 ├── tests/ # 测试 ├── configs/ # 配置文件YAML ├── scripts/ # 运维与批处理脚本 └── README.md每次训练完成我会记录四样东西代码commit号、数据版本号、模型文件路径、评估指标。这四样合一就是一个可复现的训练记录。说实话大部分公司内部都还没做到这个程度你自己提前做起来后面复盘会轻松非常多。3. 第一个完整闭环从数据集到API服务理论铺垫完了直接上实战。我自己项目里最有价值的一段经历就是完整走通一条从原始数据到线上API的流水线。这个过程逼着我系统解决了数据、训练、评估、部署每一环的具体问题。3.1 数据集构建与清洗的实操流程不夸张地说一个AI工程项目60%以上的时间花在数据上。我这句话说过太多次了但每次都还是有很多人低估它。我处理人事简历数据的时候定的清洗流程是这样的格式统一把所有PDF、Word、图片统一转成文本图片类走OCR识别字段抽取用规则加模型双重策略抽字段比如手机号、邮箱先用正则兜底姓名、职位这类开放字段交给模型质量标注抽出来的结果要二次标注我搞了个小标注平台人工抽检修正数据切分按时间顺序切训练集、验证集、测试集避免数据穿越有一个细节必须提数据切分。我看到很多人随机切这在时序数据场景是大忌。比如你要做某个行业的招聘趋势分析用今年数据训练去年数据验证看起来没问题但如果行业有周期性波动模型学到的规律根本不能泛化。我早期就吃过这个亏后来一律按时间来做严格切分。清洗完的数据还需要做质量评估。我写了个自动报告统计每个字段的缺失率、格式异常率、重复率。数据质量老板不看但你自己一定要心里有数。有一次我就是靠这个报告说服了业务方——问题不在模型在他们给的原始数据就有三成是脏的。3.2 训练脚本怎么写才不算玩具代码很多人写的训练脚本就是读数据-建模型-跑fit-保存这在小规模试验没问题距离工程还有距离。我自己在项目里沉淀下来的训练脚本信息量要大得多。一条比较完整的训练记录包含运行环境信息Python版本、关键库版本、硬件信息超参数配置完整的参数列表包括学习率、batch size、epochs等评估结果精确率、召回率、F1以及最关键的——同配置下的历史对比样本trace随机抽几条错例和正确例子方便人工直觉判断这些信息全部写进一个JSON文件存成带时间戳的目录。为什么这么麻烦因为等我第二次、第三次调整模型时如果没有历史记录我根本分不清新改动到底让模型变好了还是变坏了。另外训练过程我坚持用配置文件管理参数而不是硬编码在脚本里。比如model: name: bert-base-chinese max_length: 128 batch_size: 32 learning_rate: 2e-5 epochs: 3 data: train_path: data/processed/train.csv val_path: data/processed/val.csv到了后面要调参的时候只需改动配置文件代码一行都不用动。这听着简单但在从零开始的路上很多人就是没养成这个习惯每个实验都改代码最后代码改得乱七八糟。3.3 模型评估不能只看准确率评估是AI工程里最考验功力的环节之一。我很长时间里就被准确率98%这种话迷惑过后来才明白——准确率只是一个平均数掩盖了无数问题。我列一下项目里实际用到的一组评估方式指标用途注意事项精确率/召回率/F1分类核心指标必须看类别分布不均衡数据下F1比准确率真实Confusion Matrix观察具体错误类型千万别只看汇总数要按错误类型拆分个案抽检人工看几十条结果模型系统性问题一眼就能看出来鲁棒性测试加噪声、换表达验证模型不是靠死记硬背在人事档案抽取项目里模型整体准确率95.6%听起来还行。但当我按错误类型拆分后发现问题主要集中在学历字段——把硕士在读识别成了已毕业。这个错误对人事系统影响很大如果不拆分指标根本发现不了。所以我现在每完成一个模型都会写一份评测报告包含以上所有维度并把典型错误案例截图附上。这份报告既是给自己看的也是给团队看的。有了它大家讨论的是具体问题而不是各说各话。4. 工程化关键环节部署、监控与迭代模型训练出来只是开始。真正从能做模型到能落地上线你还要跨过部署、监控、迭代三道坎。4.1 模型服务化的几种方案对比部署方案的选择我建议用满足当前需求的最低复杂度方案。别一上来就上Kubernetes、上微服务那只会让你被运维细节淹没。我这半年用过的方案按复杂度排序是单机Flask/FastAPI适合内部工具、QPS不高、业务简单的场景Docker容器化适合需要统一环境、迁移到服务器或云平台的场景容器编排Docker Compose起步适合多服务依赖的场景我用FastAPI比较多原因很实在自带异步支持、自动生成接口文档、性能足够看。一个最小可用的服务长这样from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class Payload(BaseModel): text: str class Response(BaseModel): entities: dict app.post(/predict, response_modelResponse) def predict(payload: Payload): result extract_entities(payload.text) return Response(entitiesresult)这个接口拿到生产环境还要考虑几个事请求日志、超时控制、错误返回格式、并发与资源限制。这些看着琐碎但线上出问题的时候每一条都在帮你定位原因。记得有一次我把接口部署上线同事反馈偶尔很慢。第一批排查看日志、看延迟曲线发现是某几条超长文本导致推理时间特别久触发了后续请求排队。解决办法是加了个单条文本长度限制超出直接拒绝并返回提示。就这么一个简单的参数线上服务稳了一大截。4.2 性能与资源估算部署另一个让人头疼的是资源估算。GPU和内存怎么配直接拍脑袋肯定不行。我总结了一套快速估算方法。拿简历抽取这个任务来说单条简历文本平均约2000字BERT编码后token数约800左右模型推理时显存占用按batch size 1估算约2GB单条推理耗时约200毫秒GPU或2秒纯CPU业务高峰QPS大概每秒5条请求那么GPU显存需求 并发数 × 单条显存。如果并发10因为推理只能同时跑几个至少20GB起步。CPU方案则需要起多个进程并行否则延迟完全不能看。我建议每次上线前做一个简单的压测拿一段脚本连续打接口记录延迟P95和错误率观察资源使用率。压测不用很专业用Python的requests库写个循环就够了关键是帮你提前发现瓶颈。另外提醒一句模型加载本身也吃内存我遇到过服务启动后内存占用瞬间飙到十几G的情况这就是没算模型常驻内存导致的。4.3 监控与日志线上模型出问题怎么发现部署上线之后最怕的事情是什么是模型在线上悄悄变差而你毫无察觉。没有监控的AI服务就像没有仪表盘的飞机飞在空中全靠感觉。我在项目里做的监控分为三层第一层是基础运维监控CPU、内存、GPU利用率、接口延迟。这些直接用prometheus加grafana就能搭。我不建议从零手写现成的工具已经足够好了。第二层是业务指标监控预测结果的分布有没有异常。比如简历抽取当天抽取成功的比例突然下跌或者某个字段的输出长度异常这时候就要警惕。第三层是数据漂移预警新进来的数据分布如果和训练集差异很大模型效果很可能下降。这个层我自己用了一个简易方案——记录每条输入的长度分布、关键字段出现频率每天生成一份对比报告。如果分布偏移超过阈值就人工介入看一眼。具体到日志我坚持所有请求都打结构化日志。线上排查问题时那种只能看到一行行print的输出真的会让人崩溃。结构化日志长这样{ timestamp: 2024-03-15T10:00:00Z, req_id: a3f2c9, input_len: 1842, output: {name: 张三, edu: 硕士}, latency_ms: 186, status: ok }有了req_id把一次请求从前到后的所有日志串起来问题定位效率会提升好几倍。5. 踩坑实录与常见问题速查这一章是我最想分享的内容。这些坑不是从书上看来的是我真金白银踩出来的希望你能绕过。5.1 五个我记得最深的坑第一个坑低估数据清洗的重要性。我第一次做AI工程时花了大量时间研究模型结构结果数据一塌糊涂训练出来全是噪音。后来才明白数据决定上限模型只是逼近这个上限。现在但凡有人让我看他的AI项目我第一句就是问你的数据清洗和验证是怎么做的。第二个坑训练集和验证集划分不当。不是随机划分就行要考虑数据本身的结构。如果数据有时间属性就必须按时间切分如果有用户ID同一个ID的数据不能同时出现在训练集和测试集。我因为这个吃了亏重新梳理了一遍数据最后精度提升了将近四个点。第三个坑模型评估只看汇总指标。我前面已经详细讲了准确率会骗人。必须拆开看分错误类型看抽样看原始输出。第四个坑部署方案过度设计。有一段时间我非要搭一套微服务加队列的方案结果花了三周时间在运维上核心业务动都没动。后来想清楚了内部工具一个FastAPI进程跑得稳稳的根本没有必要上重型架构。工程化追求的是恰如其分不是越复杂越高级。第五个坑没有先做监控就上线。最惨的一次经历是模型上线一周完全没发现问题。直到业务方反馈最近推荐的东西怪怪的我才去查发现因为上游数据格式调整我的预处理函数直接报错所有请求都走了兜底逻辑线上等于被降级处理了一个星期。这就是没有监控的代价。5.2 常见问题排查表遇到问题怎么排我整理了一个速查表按现象定位原因现象可能原因排查步骤模型精度远低于实验线上数据分布不同对比线上与训练数据分布统计字段缺失率接口时快时慢请求长度差异大按长度分桶看延迟给超长文本设限GPU利用率很低数据加载是瓶颈加大batch加num_workers检查IO训练结果复现不了环境或数据版本不一致固定随机种子核对代码版本与数据版本内存持续增长代码里有泄漏用memory profiler定位检查全局变量和缓存线上效果逐渐变差数据漂移每天做分布对比设置漂移告警阈值排查问题时我还特别推荐一个习惯每次只改一个变量。人的直觉很容易被多变量干扰尤其做模型调优的时候。一次只改一个东西改完跑完整流程记录结果再改下一个。虽然慢一点但每个改动对结果的影响都是清楚的这套方法论在复杂系统里特别值钱。另外Garbage In Garbage Out这句话我越做越觉得是AI工程第一定律。模型再强也救不了烂数据这个理念要刻在脑子里。最后想再说两句从我自己的实操体会来看ai-engineering-from-scratch这件事真正的难度不在AI本身而在工程。AI技术的公开资源非常多模型、论文、大厂方案到处都能查到难的是把这些技术装进一个可靠、可维护、可扩展的系统里。这个过程没有捷径唯一的路径就是亲手做一遍把从数据到部署的每一个环节都踩一遍、想一遍。如果这篇分享能给你一点启发建议你先别急着学更多算法而是把自己手头的一个小需求走通整个流程——做个数据清洗脚本、写个训练评测体系、用FastAPI包个接口、配个监控告警。整个过程走完你的AI工程能力会比背十个模型结构都管用。最后分享一个小技巧给自己每次上线的项目写一份一页纸的运行说明包括如何启动、关键路径、常见问题处理办法。这份文档在你三个月后回来看时会救你的命——别问我怎么知道的。
返回列表