☰
从零搭建AI工程:数据、训练、部署与监控全链路实战
2026/9/30 8:24:25 网站建设 项目流程

1. 为什么从零搭建AI工程是第一道坎

1.1 从"能跑通"到"能上线",差的不只是运气

我头一回独立负责一个AI功能从0到1的全过程时,最大的感受是:跑通一个模型的Demo,和把一个AI功能稳定交付到生产环境,几乎是两门不同的学科。

当时我一腔热血,在Jupyter Notebook里把模型调得漂漂亮亮,离线指标也好看,兴致勃勃地往服务端一部署,立刻被现实教做人。接口响应不稳定、线上数据分布和训练集有明显偏差、特征字段偶尔缺失、模型偶发超时导致上游超时重试……这些破事没有一件是模型结构本身的问题,但它们每一项都能让功能在线上"翻车"。

这个项目标题叫"ai-engineering-from-scratch",说的正是这件事:不把AI当作"训练一个模型"这种单点任务,而是当作一套完整工程体系来搭建。从零起步的时候,你不只是在学怎么调参,而是在学怎么把数据、模型、服务、监控、迭代这五件事串成一条可持续运转的链路。

1.2 典型初学者工程的几个"隐形断层"

我复盘过自己最早期的几个项目,也帮不少人看过代码,发现从零起步的人通常会踩到同样的断层:

  • 数据断层:训练时用的是处理好的离线CSV,但线上接口拿到的原始数据形态完全不一样,中间缺了完整的ETL转换逻辑,模型上线即失效。
  • 评估断层:只用准确率或Loss这种单一指标评价模型,没有设计贴近业务场景的评估集和评估维度,模型在测试集上"高分低能"。
  • 实验断层:代码改来改去没有版本管理,超参数写在 Notebook 的某个角落,过两天想复现当时的"最好结果",连自己都找不到当时用了什么配置。
  • 部署断层:训练环境用的PyTorch版本、CUDA版本和生产环境的CPU推理环境不一致,模型导出后推理结果出现细微差异。

这些断层单独拎出来每一个都不是大问题,但叠加在一起就成了压死项目的最后一根稻草。这篇内容我会完整梳理一遍从零起步时我自己搭过的工程框架,把数据、训练、部署、监控、迭代这几层逐一说透,尽量少讲虚的,多放可以直接抄作业的东西。

2. 地基先行:从需求倒推技术栈与工程架构

2.1 先定义问题,再选武器

从零开始做AI工程,最大的忌讳是先选模型再想问题。正确顺序应该是把问题定义清楚,再倒推技术栈和架构。

具体来说,第一步要回答四件事:

  • 这个功能是分类、回归、排序、生成还是检索?
  • 线上调用允许的延迟上限是多少(比如50ms、200ms还是2s)?
  • 数据量和数据形态是怎样的(文本、图像、表格、时序)?
  • 错误代价有多高(推荐错了无所谓,风控判错了代价巨大)?

这四个答案直接决定了你的技术选型。我自己早期犯过的错是:不管什么需求,上来先加载一个Bert或者大模型再说。结果很多场景其实用XGBoost或者一个简单的Embedding检索就能解决,成本和延迟都低一个数量级。

2.2 技术栈选型的一个现实原则

技术选型没有银弹,但有一个很现实的原则:优先选择你团队里有人真正用过、遇到问题能查到答案、社区足够活跃的组件,而不是追逐最新最热但周围没人趟过坑的方案。

我整理过一个从零起步够用的技术栈清单,可以参考:

层级推荐方向说明
数据存储PostgreSQL / ClickHouse结构化业务数据选PG,日志和时序数据选ClickHouse
数据处理Python + Pandas/Polars + Airflow或Dagster起步阶段Airflow足够,数据量大了再考虑Spark
特征与训练PyTorch + sklearn + XGBoost三者互补,不必贪多
实验管理MLflow或W&B记录参数、指标、产物,免费方案够用
模型服务FastAPI + ONNX Runtime轻量稳定,能避开训练框架依赖地狱
监控观测Prometheus + Grafana + Evidently系统指标和模型指标分开管
部署方式Docker + K8s或轻量VPS视团队运维能力而定,不强上K8s

技术栈不追求全,追求"链路完整"。上面的组合我实际用过,已经能满足大多数中小型AI项目从0到1的需求。

2.3 从零起步的最小架构长什么样

很多人一听到"架构"就联想到一堆微服务和复杂中间件,但AI项目的起步架构可以非常简单,重点是分层清晰。我当时用的最小架构是五层:

  1. 接入层:FastAPI提供HTTP接口,做鉴权、限流、参数校验。
  2. 逻辑层:负责调用编排,比如先查缓存、再走检索/再调模型、最后做结果后处理。
  3. 数据层:存储业务原始数据、特征数据、模型日志。
  4. 模型层:加载训练好的模型文件,提供推理函数,不直接接触HTTP。
  5. 观测层:记录推理耗时、输入分布、结果分布,出现异常时能报警。

这套架构没有一上来就上消息队列、没有复杂的模型平台,但每一层边界清楚,后续想往哪个方向扩展都有明确的位置可放。工程化不是铺大摊子,而是先把必要的职责切分出来。

3. 让数据成为可依赖的资产:工程化的最小闭环

3.1 数据管线的第一步:从源头建立约束

在AI工程里,数据是资产还是负债,取决于你有没有从源头建立约束。很多项目前期数据乱成一团,后面模型怎么调都救不回来。

我后来总结出一个"源头约束三件套":

第一,定义Schema。每张数据表、每个特征文件,都应该有一个明确的字段定义,包括字段名、类型、允许的取值范围、是否可空。用Pydantic或Great Expectations这类工具在数据入口做校验,不合格的数据要么拦截、要么告警,不能直接混进数据集。

第二,定义数据版本。不要覆盖式更新数据集,每次新增或修正数据都要生成新的版本。我习惯用"时间戳+变更摘要"的方式命名特征文件和训练集,比如train_dataset_20250610_v2.parquet,并在实验记录里绑定对应的数据版本。

第三,定义更新节奏。业务数据是每日更新还是实时更新,代码里必须有明确约定。否则你训练时用的数据和线上模型读取的数据时间口径不一致,模型就会"穿越"——用未来数据训练,却在用历史数据推理。

3.2 特征存储与大模型背景下数据工程的重心

特征存储这个词听起来高大上,但核心思想特别朴素:把原始数据加工成模型可用的特征这个过程,应该有一个统一的、可复用的地方,而不是在每次训练的代码里临时现算。

我第一次做AI项目时,特征计算逻辑散落在各个Notebook里,同一特征在不同脚本里算出来的结果都不一样,后来排查到怀疑人生。把特征计算统一成特征工程模块之后,这个问题才彻底解决。

还有一点值得提醒:在大模型火热的背景下,很多人以为数据工程的重点变成了"投喂长文本",但实际上,大模型应用里更常见的是检索增强(RAG)、结构化数据抽取、文档解析这类工程问题。你最终会发现,没有一个可靠的知识库数据清洗管线,RAG检索出来的全是噪音,生成质量自然拉胯。所以不管模型怎么变,数据工程的底层基本功不会过时。

3.3 数据质量校验怎么落地

数据质量四个字听起来很抽象,落到工程上其实是四个具体维度的检查。

  • 完整性:字段缺失率是否超过阈值(比如5%)。
  • 时效性:数据延迟是否超过要求,比如昨天应该入库的数据今天还没到。
  • 一致性:同一实体的字段在不同表中是否矛盾,比如订单金额和支付流水对不上。
  • 分布漂移:线上特征分布和训练集分布是否出现明显偏移。

分布漂移这个维度容易被忽略,但恰恰是模型线上效果衰减的头号元凶。我当时用Evidently这个开源库来监控特征分布,设置每周对比线上近期数据和训练集数据的分布差异,一旦PSI指标超过0.2就把警报拉起来。PSI超过0.2代表特征分布明显漂移,这时候模型效果下滑就别慌,第一反应先看数据漂移,而不是重新调参。

3.4 数据切片与建模中的类别不平衡问题

另外一个贯穿数据全流程的问题是类别不平衡。很多业务场景里正样本比例低到离谱,比如转化率1%甚至0.1%,这时候你再怎么调模型结构,效果改善都有限。

工程上的处理思路通常有三个方向:

一是采样策略,对负样本做下采样、对正样本做上采样或合成,但要注意采样比例别太极端,否则线上分布与训练分布脱节更严重。

二是样本加权,给少数类样本更高的损失权重,比简单粗暴地复制样本效果更稳。

三是评估指标换血,别死盯准确率,改用Precision/Recall/F1、PR-AUC等更贴合不平衡场景的指标。我见过不少人用准确率评估一个正样本只有1%的模型,模型把所有样本都判成负类,准确率99%,看起来"神了",实际上一无是处。

4. 从训练到上线:模型交付链路上的关键节点

4.1 第一份代码规范:让实验可复现

模型训练的代码规范,重要程度被严重低估。训练代码和普通业务代码最大的区别是:它带着"实验性"——你会反复改参数、换结构、对比效果,如果没有严谨的规范,最后一定是一团乱账。

我在经历过一次"复现不出最好结果"的惨痛教训后,给自己定下了三条硬规矩:

第一条:显式设置随机种子。涉及随机性的库(Python、NumPy、PyTorch)都要固定seed,保证每次训练初始状态一致。虽然不同硬件上仍然可能有细微偏差,但至少同一台机器上可以复现。

第二条:配置和代码分离。所有超参数写入配置文件(YAML或JSON),代码里不硬编码任何关键参数。每次实验记录用的就是这份配置文件的哈希值,改任何参数都能追踪到。

第三条:保存完整运行环境。用requirements.txt锁死每个依赖包的精确版本,而不是>=区间。PyTorch升级一个小版本,某些算子行为都可能变化,生产环境的依赖版本必须和训练环境完全一致。

这三条规矩我后来一直沿用,再也没出现过"当时是怎么跑出来的"这种追债问题。

4.2 评估体系:指标必须对着业务说话

技术指标和业务指标之间的落差,是从零起步做AI工程最容易困惑的地方。比如你做推荐系统,模型离线指标AUC涨了0.01,老板问"这能带来多少收入",你答不上来——说明你的评估体系还没打通业务。

我的做法是建一个三层评估体系:

  • 模型层:看Loss、Accuracy、F1等经典指标,用于快速筛选实验方向。
  • 行为层:看模型预测结果在业务上的行为是否符合预期,比如推荐结果的多样性、相关性;客服机器人的兜底率和转人工率。
  • 业务层:看最终业务指标,比如转化率、留存率、客单价。

离线评估阶段主要看模型层和行为层,但必须把行为层指标提前在离线阶段设计好。很多项目到了线上才发现模型没有满足业务行为要求,就是因为评估体系缺少中间这一层。

4.3 模型服务化的一个稳妥起点

模型从训练环境走向生产环境,最常见的坑是环境不一致。你的训练库用的是PyTorch+CUDA,生产服务器可能只有一个2核4G的容器,强行跑PyTorch服务既慢又笨重。

我推荐一个稳妥且成熟的路线:PyTorch训练,转ONNX,用ONNX Runtime做推理,FastAPI包一层HTTP服务。

这个路线的优势有三个:

  1. ONNX是一个开放格式,不绑定训练框架,生产环境不需要装PyTorch。
  2. ONNX Runtime的CPU推理性能远优于直接用PyTorch的CPU模式,对大部分中小型模型来说延迟完全够用。
  3. FastAPI写起来清爽,自带请求校验和OpenAPI文档,调试联调体验比Flask好不少。

导出ONNX的代码不复杂,但有两个易错点:一个是动态轴要显式声明(比如batch size就是动态的),另一个是输入数据的预处理逻辑要固化到导出的模型里,或者至少在导出前把预处理函数也整理好。

4.4 大模型应用的"上下文供给"问题

现在很多项目开始涉及大模型应用,和传统模型相比,它带来的工程新问题不是"怎么训练模型",而是"怎么给模型喂正确的上下文"。

核心场景是RAG。看起来只是"把知识库切片、embedding、检索、拼Prompt、调API",但实际操作中有几个细节没做对,效果会差很多:

  • 切片策略要按语义边界切,而不是纯按固定字数硬切,否则一个完整知识点被拦腰截断,检索质量大受影响。
  • 检索策略不能只做向量相似度,要配合关键词召回做混合检索,尤其是用户问题里包含专有名词、型号、编号的时候,向量检索经常不如精确匹配好用。
  • 重排阶段别省,召回Top50之后再让重排模型精排取Top5,质量提升非常明显。
  • 引用溯源必须保留,让用户或运营能查每条回答依据的来源,这也是排查"AI胡说八道"的重要手段。

5. AI工程与"软件工程"的分界线:稳定、可观测与持续演进

5.1 可观测性:传统软件的监控思路不够用

传统软件工程师上线一个接口后会看QPS、延迟、错误率,这些指标在AI服务里当然也要看,但远远不够。模型服务的核心风险在于"质量劣化"——接口响应一切正常,错误率毫无波动,但模型输出的内容质量在悄悄下降。

所以AI服务的可观测性要增加三个特有指标:

  • 输入分布漂移:线上实时输入的数据分布是否偏离训练集分布。
  • 预测分布漂移:模型输出的类别比例、分数分布、内容多样性是否出现异常。
  • 反馈闭环数据:用户是否有反馈按钮(点赞/点踩)、业务侧是否有后验结果(比如用户是否真的购买了推荐商品),这些数据能不能回收并量化成模型质量指标。

这三点才是AI工程区别于普通软件工程的核心监控维度。我自己的经验是,先保证能度量这三点,再去精细化调报警阈值。

5.2 持续迭代:模型版本、数据版本、代码版本三者协同

传统软件上线只需要管代码版本,AI项目上线则要同时管三样东西:模型文件版本、训练数据版本、推理代码版本。任何一个不一致,线上行为都不可复现、不可追溯。

我用的协同方案是:每次模型上线前,把模型文件、对应的训练数据版本号、推理代码仓库的commit号组成一个"发布单元"登记到一张上线表中,并在模型服务的日志里同样记录这三个标识。这样遇到线上问题,我能直接定位到"这个坏行为到底是哪份代码、哪个模型、哪份数据带来的",而不是在服务日志里大海捞针。

5.3 模型回滚与灰度发布

模型回滚和代码回滚不太一样。代码回滚是"回到上一个可用版本",模型回滚除了要保留上一个模型文件,还应该保留它当时的推理代码——因为中间可能改了输入输出处理逻辑,直接用新代码加载旧模型可能会出问题。

灰度发布则有一个容易忽略的点:除了按流量灰度,还应该按"输入特征"灰度。比如客服对话机器人,可以先灰度一部分"非高价值用户"的流量;风控模型,灰度流量要刻意避开高峰期,因为模型延迟和特征获取在峰值期的表现往往和平时不一样。

5.4 从0到1最容易丢分的地方

最后盘一下从零搭建AI工程时最容易被忽略、但后来反复回头补课的几个地方:

  • 没有在项目启动时就定义好线上质量指标。这个指标要从业务价值出发倒推,不是从模型指标出发。
  • 日志设计没考虑追溯性。线上推理日志只记录结果,没记录输入特征快照,出了问题想复盘都没法复盘。
  • Embedding模型更新之后老向量没处理。换了一个embedding模型,向量距离的语义空间全变了,旧向量库必须离线重算,这件事极容易漏。
  • 温度、Top-p这类参数被随意调来调去。大模型应用的生成参数看似无伤大雅,实际上对回答风格和质量影响巨大,每一项参数变更都应该走配置管理和评估流程。

6. 最后再说点实在话

这篇文章写到这,基本把我从零搭建AI工程体系的骨架都翻出来了。

我个人最大的体会是:AI工程从来不是"模型有多强"的比拼,而是"链条有多稳"的较量。数据链路断了,模型再新也没用;评估链路虚了,调参就是赌博;部署链路糙了,再好的效果也落不了地;观测链路缺了,线上出了问题你连往哪查都不知道。

如果你正打算从零起步,我给的最实在的建议是:不要一上来就追求大而全的AI平台,先把一条最小的链路走通——一个稳定的数据入口、一份可复现的训练代码、一个轻量的推理服务、一组基本的监控指标。这四样东西跑顺了,你再去引入更复杂的调度、更完善的实验平台、更精细的反馈闭环,每一步都有清晰的落点。

起步阶段不用怕慢,怕的是步子還沒邁出去,就被"什么都要学"吓住了。挑一个真实业务场景,把这条链路完整跑一遍,比看一百篇教程都有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询