ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零开始学AI工程:掌握模型部署与系统稳定,而非只刷模型分数

从零开始学AI工程:掌握模型部署与系统稳定,而非只刷模型分数

如果你在两年前问我,AI工程师需要会什么,我会掏出一份写满 Transformer、Attention、反向传播的学习路线图。但今天你要是再问,我大概会先反问一句:你做好准备每天跟数据管道、容器镜像和线上日志打交道了吗?因为我见过太多带着“训练模型改变世界”的想法转行的人,啃了半年数学和论文,真到了工位上才发现,AI工程这个工种的核心并不是刷模型分数,而是让模型在真实系统里稳定、可控、持续地产出价值。

这篇文章写给三类人:刚毕业想进入AI行业的计算机学生、有后端或数据背景想转岗的工程师,以及已经入行但觉得自己一直在“调包”的从业者。我不打算给你画一张需要学三年才能入门的地图,而是把我自己从零开始做AI工程时踩过的坑、沉淀下来的取舍逻辑,拆成一节一节可以照着做的路径。

1. 先搞清楚“AI工程”到底是什么工种

1.1 一个反直觉的现实:AI工程的重点不是模型

很多新手最大的误解,是把AI工程等同于“训练出一个高精度的模型”。我在刚入行时也这么以为,结果第一次参与真实项目就被上了一课:一个模型哪怕在测试集上做到99%的准确率,如果数据管道每天凌晨挂掉、推理接口时不时超时、模型上线后没监控、线上数据分布一变准确率就崩,这个项目依然等于零。

AI工程是一个系统工程。模型训练只是流水线上的一小段,真正的工作量分布大概是这样的:数据准备和清洗占到40%,训练和调优占20%,部署上线和稳定性保障占30%,剩下10%是监控、文档、协作和持续迭代。这个比例会随着团队成熟度变化,但绝对不会出现“只写模型代码”的AI工程师岗位——如果有,那大概率是研究型实验室里的算法科学家,而不是工程岗位。

1.2 AI工程师、算法工程师、后端工程师各自负责什么

很多招聘JD把算法工程师和AI工程师混着写,行业里确实也存在职责交叉,但对应届生和转行者来说,理解三者差异能帮你少走很多弯路。

角色核心产出主要工具考核指标
算法工程师模型效果、论文、技术报告Python、PyTorch/TensorFlowAccuracy、F1、NDCG等指标
AI工程师模型系统整体可用性Python、Docker、K8s、监控系统延迟、吞吐、稳定性、成本
后端工程师业务功能、系统架构Go/Java/Python并发、可用性、业务交付

后端工程师和AI工程师最容易混淆。同样是写推理接口,后端工程师更关心并发、事务一致性、数据库压力;AI工程师则需要额外理解模型的血缘:输入特征版本对不对、预处理逻辑有没有和训练时保持一致、模型权重是谁在什么数据集上产出的、线上表现如何回收反馈。

1.3 一个AI项目的真实生命周期

用一个最常见的“用户评论情感分析”需求举例。业务方说“帮我识别用户对产品的态度”,如果你把自己定位成只写模型的人,你的动作是找数据、训练、交模型。但AI工程师的第一反应是拆问题:

  • 数据从哪来?历史评论要导出,新评论要实时入库;
  • 标注标准是什么?“中立”和“正面”的边界怎么定?
  • 模型选多小才能扛住线上每秒几百次的调用?
  • 新评论和训练数据分布不一样了怎么办?
  • 模型效果差时怎么回滚?要不要灰度?
  • 成本和收益怎么跟业务方对账?

这些问题没有一个能靠“训练脚本”回答。它们共同构成了一个持续演进的系统,也就是现在行业里常说的MLOps。从零开始学AI工程,本质上就是学会让这个系统从无到有、从脆弱到稳定地运转起来。

2. 从零到一的四层知识栈,每一步都别跳

2.1 第一层:编程与数据基本功

Python 是绕不开的。别急着学花哨的语法技巧,先把 NumPy、Pandas、Scikit-learn 这三件套用熟。NumPy 帮你理解张量和向量化计算,Pandas 负责处理“脏乱差”的真实业务表格,Scikit-learn 让你不用从零手写模型就能理解机器学习流程。

SQL 是高性价比的技能,很多AI工程师会忽略。我做过一个推荐项目,最耗时间的不是调模型,而是从十几张业务表里拼出训练样本。SQL 写不顺,连数据都拉不出来。

2.2 第二层:机器学习和神经网络的核心概念

这一层最容易陷入“学不完”的焦虑。我的建议是先掌握主线:监督学习、无监督学习、过拟合与正则化、交叉验证、常用的评估指标。深度学习方面,理解张量、梯度、反向传播就够了,CNN、RNN、Transformer 先知道它们长什么样、各自解决什么问题,不需要第一遍就把注意力公式彻底推导一遍。

工程上有一条很实用的原则:你先会用 PyTorch 写一个训练循环,比你能默写损失函数的导数更有价值。框架代码已经帮你处理了底层数学,你真正需要理解的是数据怎么流动、参数怎么更新、模型怎么评估。

2.3 第三层:生产环境工具链

Docker 是必学项。它解决的核心问题是“环境一致性”:你本地跑得好好的代码,到了服务器上Python版本、CUDA版本、依赖库一变就挂。把训练和推理环境装进容器,一次构建到处运行。

Kubernetes 和 MLflow 这类工具,我认为了解即可,不用一上来就深入研究。K8s 只是在服务数量多到一定程度后你需要它来管理调度;MLflow 解决的是实验追踪问题。判断标准很简单:你的服务还需要手动重启的时候,先别上K8s。

2.4 第四层:业务理解与成本意识

这是很难在教程里学到的能力。模型再先进,如果业务方用不起来,或者推理成本高到客户不愿意买单,都等于零。所以从学习期开始,就要养成两个意识:

  • 每个技术方案都问一句:它值多少钱?能cover多少业务问题?
  • 每个模型上线前都想清楚:它真的很准,还是只是在测试集上准?

我给新人的学习节奏建议是:前3个月解决编程和数据基础,第4到6个月搞定机器学习和PyTorch入门,同时穿插学习Docker和工程习惯,第7到12个月做一个完整的端到端项目。一年之内完全可以成为一名有基本工程素养的AI工程师候选人。

3. 动手第一步:搭一套不折磨人的开发环境

3.1 本地环境:第一个要避开的坑

很多新手入门第一步,是直接在电脑上装一个 Python,然后用 pip 往系统环境里装包。用不了几个项目就会发现版本冲突、路径混乱、一升级全崩。我现在的习惯是用uv或 conda 管理 Python 版本和虚拟环境,每个项目独立环境,依赖写在配置文件里。

如果是跑深度学习,本地没有NVIDIA显卡时,别硬着头皮在CPU上训练大模型。CPU可以用于学习和调通代码,但真正的训练直接上云GPU。云服务按量付费,工时计算也很透明,合理规划时间的话成本并不夸张。

3.2 云端GPU的正确使用节奏

使用云GPU最需要注意的只有一条:用完记得释放资源。很多初学者第一次跑训练,晚上睡前提交任务后忘了关机器,第二天醒来发现整晚都在计费,一次下来花了上百块。这个坑我掉过不止一次,我身边同事也都经历过。

更合理的节奏是:先在本地写好代码,用小规模数据跑通全流程,确认没有bug之后,再启动云端GPU跑完整训练。这样能最大程度压缩在线时长,省钱省时间。

3.3 一个让实验可复现的项目目录结构

环境弄好后,接下来要养成工程习惯。我这里给出一套我沿用了很久的目录结构,简单但实用:

project/ ├── configs/ # 所有实验的配置文件 ├── data/ │ ├── raw/ # 原始数据,只读 │ └── processed/ # 清洗后的数据 ├── src/ │ ├── data/ # 数据加载和预处理 │ ├── models/ # 模型定义 │ └── train.py # 训练入口 ├── experiments/ # 每次实验的日志和输出 ├── notebooks/ # 探索性分析和可视化 └── deployment/ # 部署相关代码

关键原则有三个:

  • 原始数据不可变,一旦改动就不能复原;
  • 每次实验有独立输出目录,记录配置、日志和checkpoint;
  • 代码不能依赖“手动操作”,从原始数据到训练结果必须一条命令跑通。

这套结构的核心价值是可复现性。两个月之后你回来看自己的实验,能准确说出“这个模型是用哪份数据、什么参数训练出来的”,这是所有工程判断的基础。

4. 跑通一个端到端项目,比刷一百个教程有用

4.1 推荐从这两个方向选一个

学习AI工程最好的方式,不是跟着教程一行行敲,而是自己定一个目标项目,逼着自己把整条链路走通。我推荐两个方向:

第一个是文本分类任务,比如中文新闻标题分类。任务本身简单,业界有成熟数据集,半小时就能出一个基线模型,适合用来熟悉完整流程。

第二个是RAG问答系统。这是目前实际落地最多的大模型应用方向,把文档切片、向量检索、大模型生成串起来。它比文本分类多了一层“系统集成”的复杂度,也更贴近当前企业的真实需求。我的建议是:第一个项目选文本分类,第二个项目再挑战RAG,循序渐进而非一步登天。

4.2 数据阶段,决定了项目的生死

真实场景中的数据永远比教程里的要脏。我从实际数据清洗里总结出几个必备动作:

  • 去重:处理重复样本,不然模型会过度拟合这些重复;
  • 核对标签:真实标注经常有错误,至少抽查一部分标注结果;
  • 检查类别分布:类别极不均衡时就引起注意,准备好应对策略;
  • 按时间划分数据集:如果数据带时间戳,最好用前段训练、后段验证,这能检验模型对未来数据的泛化能力,而非对“过去记忆”的拟合。

4.3 训练阶段,像做实验一样严谨

模型训练并不只是“跑起来就好”。我要求在训练过程中强制自己养成这些习惯:

  • 固定随机种子,保证可复现;
  • 全程记录loss曲线,观察收敛情况和是否过拟合;
  • 每若干个epoch保存一次checkpoint,防止训练中断;
  • 训练参数、数据版本、代码commit号要记在实验日志里。

我建议训练时把模型效果和日志定期同步到实验记录平台(如MLflow),或者至少一个人作为检查追踪节点。没有记录的实验等于白做,因为下次想复现时你根本不知道当初怎么调到这个结果的。

4.4 评估:别被一个准确率骗了

文本分类项目里最经典的坑就是类别不均衡。假设92%的样本是“负类”,8%是“正类”,模型什么都不学,全预测成“负类”,准确率也能到92%。这时候你如果只看准确率,会误以为模型很成功。

正确的做法是看混淆矩阵、F1、精确率和召回率。不同业务场景对这两个指标的权重不同:垃圾邮件过滤更看重精确率(别误伤正常邮件),癌症筛查更看重召回率(尽量别漏判)。如果你的分类问题存在明显不均衡,可以处理样本权重,或对少数类做上采样,但最重要的是先学会用正确指标去发现问题,而不是让数据摆布你。

5. 把模型部署上线:最后一公里才是价值所在

5.1 最小可用的推理服务长什么样

模型训练完关在notebook里是没有价值的。“上线”最简单的形式就是把模型封装成一个HTTP服务,让业务方可以通过API调用。我拿FastAPI举个例子:

from fastapi import FastAPI from pydantic import BaseModel import torch import onnxruntime app = FastAPI() class PredictRequest(BaseModel): text: str class PredictResponse(BaseModel): label: str confidence: float ort_session = onnxruntime.InferenceSession("model.onnx", providers=["CPUExecutionProvider"]) @app.post("/predict", response_model=PredictResponse) def predict(req: PredictRequest): input_tensor = preprocess(req.text) outputs = ort_session.run(None, {"input": input_tensor}) label = postprocess(outputs[0]) return PredictResponse(label=label, confidence=float(outputs[0][label_id]))

注意我这里面用onnxruntime而不是直接加载PyTorch模型,原因是推理场景下ONNX Runtime的启动时间和推理延迟更可控,部署也更轻量。通过预处理的对齐、输入输出统一用JSON结构,业务方接入成本低,排查问题也能做到“拿一个请求就能复现”。

5.2 推理性能:延迟、吞吐和成本的三角关系

上线之后你必然会遇到性能问题。新手最容易犯的错误是“为了降低延迟拼命上更贵的显卡”,但更成熟的路径是分层优化:

  • 批处理:多接口请求合并成一次推理,大幅提升GPU利用率;
  • 量化:把FP32模型转成FP16甚至INT8,牺牲少量精度换取成倍的速度提升;
  • 缓存:完全相同的输入直接返回缓存结果,省去重复计算;
  • 模型裁剪或蒸馏:在业务接受范围内减小模型体积。

一个基本换算逻辑:单次推理延迟从50ms降到30ms,每秒吞吐可能提升不到一倍;但加上批处理,吞吐提升3到5倍很常见。上线前不妨先估算线上峰值QPS,再倒排需要多大的并发和显存,别一开始就把资源拉满。

5.3 模型的版本管理、回滚与灰度

想明白一个点:模型也是代码,甚至比代码更需要严格的版本管理。因为模型本质上是拿数据训练出来的“天然黑盒”,行为不能100%预判。哪怕你已经通过了离线评估,上线后由于线上数据分布差异,效果也可能不如预期。

我每次上线新模型,都会先在流量低峰期部署到测试环境,验证通过后再用灰度方式逐步放大流量。遇到效果不达标或者线上数据异常,立即回滚到旧版本。这个流程需要配套的模型版本管理表格:

版本训练日期训练数据范围离线指标线上上线状态回滚操作
v1.22025-01-082024全年F1=0.87运行中可用
v1.32025-02-012024全年+1月F1=0.89灰度中待确认

5.4 上线后必须盯的几个指标

线上系统不能只靠用户投诉来发现问题。至少要监控四类指标:

  • 延迟:特别是P95/P99延迟,平均延迟会掩盖大量长尾慢请求;
  • 吞吐:每秒处理的请求数,验证是否达到了设计容量;
  • 错误率:超时、请求失败、解析异常的比例;
  • 数据漂移:线上输入分布和训练分布是否发生偏移,这是模型效果劣化的早期信号。

最后一类,新手容易忽略。我做过一个文本服务,用了一年的历史数据训练,上线三个月后因为用户表达方式变化,线上的准确性明显下降。等到业务方反馈才被动调整,已经造成了不少影响。如果当时做好漂移监控,在指标刚开始偏移时就预警,就能争取更多主动权。

6. 几个容易弯路的想法,最后再唠叨几句

从我带过的新人和自己的经历来看,最大的失败模式是两手抓:一边囤积所有课程,一边反复调参。囤课的人会陷入“学过=会了”的错觉,永远不真正开始;调参的人则沉迷于微小指标的提升,却忘了模型上线才是真正的目标。

我推荐的项目推进法是:先定一个最小可用的版本,快速跑通端到端;然后在后续迭代中一次只改一个变量。比如这一轮只优化数据清洗方式,下一轮只尝试不同的模型结构。坚持记录每次实验效果,你会发现所谓的调参能力,不是玄学,而是在完整、可靠实验记录之上自然而然的判断力。

关于求职和职业发展,我想说句掏心窝的话:市场缺的不是能复述深度学习理论的人,而是能拿真实数据做出稳定系统、并讲清楚每一个设计决策的人。你简历上有一个数据来源真实、部署过线上、带监控指标和版本迭代记录的项目,说服力远超一张什么比赛的复现证书。

从零开始学AI工程确实是一个漫长的过程,但这条路上值得付出的地方在于:每走一步都能看到明确的产出——一个接口跑通了、一个指标改善了、一个线上问题被定位了。这种不断“做成事”的积累,才是你在这个领域里真正长远的能力资产。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进