这两年“AI工程师”的岗位突然多了起来,但有趣的是,很多人对这个title的理解还不一致。有人以为AI工程就是调参炼丹,有人以为就是写Python脚本调第三方接口,还有人直接把它当成算法工程师的另一个称呼。我自己是后端出身,后来带过几个从零起步的AI项目,踩过的坑比吃过的盐还多。今天不聊算法原理,也不搬运论文,就从一个“从零开始把AI模型变成线上服务”的真实路径出发,讲清楚AI Engineering到底要具备哪些能力、解决哪些问题、适合什么样的人。想往AI工程纵深走的朋友,这篇可以作为你的起步地图。
1. 先搞清楚什么是AI Engineering:算法岗和工程岗别再混为一谈
1.1 算法工程师和AI工程师的分工差异
很多人以为算法工程师和AI工程师是同一个岗位,区别只是叫法不同。我在实际协作中感受特别明显:这两类人的思维方式、日常产出和验收标准完全不一样。
算法工程师的核心产出是“模型能跑出多好的指标”。他们要处理的是损失函数怎么设计、网络结构怎么调整、数据增强策略怎么选,最终交付物通常是模型权重文件、训练代码和一份实验报告。我见过不少算法同事,模型在Notebook里精度很高,但交付给工程侧之后,却连一次批量预测都跑不通。这不是算法能力问题,而是工程化缺位。
AI工程师的核心产出是“模型能不能稳定地产生业务价值”。这里的“稳定”换成“可靠”更准确,因为线上系统不允许你靠运气。AI工程要管的范围包括:训练好的模型怎么在服务端加载、请求进来时延迟是多少、并发上来后显存会不会爆、特征口径和训练时是否一致、模型效果变差时能不能及时发现、新数据回流后怎么优雅地更新模型。这些事在实验环境里可以糊弄,上了线就是事故。
如果用做菜来类比,算法工程师是研发新菜谱的人,重点在味道和创意;AI工程师是把菜谱变成连锁餐厅中央厨房的人,重点在批量生产、出餐速度、食品安全和成本控制。没有菜谱,中央厨房没意义;只有菜谱没有厨房,餐厅也开不下去。所以这两个角色是搭档关系,不是上下级关系。
1.2 AI工程要解决的三件难事
我做了几个完整项目之后,发现AI工程最麻烦的是三件难事,几乎每一个项目都会遇到。
第一件是数据侧的可靠性。训练数据从哪来、怎么清洗、怎么标注、怎么切分,任何一个环节粗糙,后面模型效果都会打折扣。更头疼的是训练集和线上实时数据的口径容易漂移。比如训练时用了一个小时前的特征,线上预测时特征服务延迟高,拿到的是两小时前的值,模型输入分布变了,效果自然下滑。这类问题光靠算法调参解决不了,必须从数据管线和特征服务层面解决。
第二件是模型侧的迭代效率。模型不是训练完就结束,它会因为数据变化而衰减,也需要根据业务反馈持续迭代。如果没有实验追踪、模型版本管理、回滚机制,改进模型就成了碰运气。我见过有团队把模型文件名改成“v2_final_真的最终版.pth”,这种做法在小作坊可以,团队超过三个人就是灾难。
第三件是交付侧的工程约束。模型要部署在哪里、用什么框架推理、算力预算多少、允许的最大延迟是多少、服务可用性要求多高,这些约束决定了整个技术方案。很多时候不是选最先进的模型,而是选能在当前资源下稳定跑起来的模型。BERT效果好但CPU上慢得让人崩溃,换成蒸馏小模型指标掉一点,但服务能用了,这就是工程决策。
1.3 一条从零开始的成长路径
我在带新人时,会把AI工程的学习路径切成五个阶段,每个阶段都有明确的验收标准。
| 阶段 | 核心目标 | 可交付物 |
|---|---|---|
| 阶段一 | Python工程化基础 | 能写出带类型注解、异常处理、日志和测试的脚本 |
| 阶段二 | 深度学习框架运行机制 | 能独立完成数据加载、训练、验证、保存和加载模型的全流程 |
| 阶段三 | 数据管线与特征工程 | 能搭建可重复运行的数据处理流程,让训练和线上特征口径一致 |
| 阶段四 | 推理部署与监控 | 能把模型封装成服务,配置好指标采集和告警 |
| 阶段五 | 系统治理与迭代 | 能设计模型更新、回滚、A/B测试的完整流程 |
这个路径看起来很长,但只要每个阶段都做一个小项目练手,而不是光看书,进度会很快。我见过一个零基础转行的朋友,用八个月走完了全程,最后独立上线了一个文本分类服务。他唯一的秘诀就是“每个阶段都做东西,不空想”。
2. AI工程基础栈:没有这几块拼图做不了正经项目
2.1 Python与工程化基础
AI工程虽然听起来很“AI”,但根子上还是工程。Python写不好,后面的路都走不稳。我强调的Python工程化,不是会写for循环和调用sklearn,而是能按软件工程标准写可维护的代码。
最基本的几条:变量和函数要有类型注解,接口要用Pydantic或者dataclass定义而不是到处传裸字典,业务逻辑要拆成函数和类而不是一长串Notebook cell,关键路径要打日志,重试和超时要处理。比如训练脚本如果读数据不设超时,上游文件系统抖动一次,整个训练任务就挂在那等半天,这种问题在本地开发时根本碰不到。
我自己现在写AI项目,入口脚本一定长这样:
import logging import sys from typing import Optional import typer from loguru import logger app = typer.Typer() def setup_logging(verbose: bool = False): level = "DEBUG" if verbose else "INFO" logger.remove() logger.add(sys.stderr, level=level) @app.command() def run_training( config_path: str, experiment_name: Optional[str] = None, dry_run: bool = False, ): setup_logging(verbose=dry_run) logger.info(f"loading config from {config_path}") # 后续逻辑看起来只是脚手架,但实际价值很大:命令行参数清晰,日志可控,dry_run可以快速验证流程。新人写代码经常忽略这些,等到要排查线上问题的时候就会发现,没有日志等于没有眼睛。
依赖管理也要认真对待。Python项目最怕“在我机器上能跑”这种话,根因就是依赖没有锁定。项目里必须用venv或者poetry管理虚拟环境,并且把依赖锁定到精确版本。训练脚本里torch的版本差异,经常导致模型结果对不上,这种问题排查起来极其痛苦。
2.2 深度学习框架与模型生命周期
AI工程绕不开深度学习框架。PyTorch是目前工程侧事实上的标准,TensorFlow的生态虽然也在,但新项目用PyTorch的占比明显更高。我平时主力用PyTorch,不是因为它比TensorFlow优秀多少,而是因为社区活跃、模型库全、Debug直观,团队招人也更容易。
掌握框架不仅仅是会用“模型类加训练循环”,更重要的是理解模型的生命周期:训练、验证、保存、加载、转换、推理。每个环节都有坑。训练好的模型文件是什么格式,直接决定了能不能被服务端加载。PyTorch默认保存成.pt或.pth,推理时还要依赖Python环境和模型类定义;如果要导出成ONNX,就可以脱离PyTorch运行,部署更轻;如果要在NVIDIA GPU上极致优化,可以再用TensorRT导出成.engine格式。我建议初期至少把PyTorch原生导出和ONNX导出都跑通,后面做推理优化心里就有底。
模型保存时有一个细节容易被忽略:保存的应该是模型状态字典,而不是整个模型对象。整个对象包含了类定义和运行时环境,换一台机器、改一下代码结构就加载不了。正确做法是只保存state_dict,同时记录模型结构参数、预处理方式和超参数。我在项目里会给每个模型文件配套一个manifest.json,里面写模型名字、版本、训练数据hash、预处理分支、框架版本、评估指标。这样任何一个人拿到模型文件,都能完整复现它的能力。
2.3 数据管线与特征工程
数据管线是AI工程里最不性感但最要命的部分。模型方法再先进,数据有问题一切都白搭。我见过一个意向预测项目,开发的时候离线AUC高达0.93,上线后实际转化率反而下降,查了一个星期才发现是训练数据里把“用户最后是否购买”当成特征用了,这就是典型的数据泄漏。
数据管线要解决的核心问题是“可重复”和“一致性”。可重复指的是同一份原始数据,无论跑多少遍,处理出来的训练集都一样;一致性指的是训练时用的特征加工逻辑,和线上推理时用的是同一套代码。为了实现这两个目标,我习惯把特征工程代码抽成独立模块,训练脚本和推理服务都调用同一个package,而不是各写一份。
数据验证也要自动化。我在每个训练任务启动前都会跑一套数据校验,检查必填字段是否缺失、类别分布是否异常、数值范围是否在合理区间。比如文本分类任务的标签如果只有“好评”和“差评”,那数据里出现“中评”就要报警。这种校验用pandas加自定义断言就能写,也可以在团队成熟后引入Great Expectations这类专门的验证库。
2.4 推理优化与部署
模型部署是AI工程最接近传统开发的环节,但又有额外的复杂性。上线一个模型服务,不能只把模型加载到内存里就完事,还要考虑延迟、吞吐、成本。
先说推理方式。如果请求量小、对延迟不敏感,直接用PyTorch的CPU推理加批量处理就够;如果请求量大,就需要上GPU推理,同时考虑显存占用和并发控制;如果是边缘设备,比如手机和嵌入式设备,还需要量化、剪枝这类模型压缩手段。我在项目中常用几种优化手段,整理成一张表:
| 优化手段 | 适用场景 | 收益 |
|---|---|---|
| 动态批处理 | 在线服务、请求到达时间不均 | 提升GPU/CPU利用率,降低平均延迟 |
| FP16/INT8量化 | 对精度损失容忍度较高的场景 | 显存减半,推理速度提升明显 |
| 模型蒸馏 | 需要极致延迟和轻量部署 | 用少量精度换体积和速度 |
| 结果缓存 | 重复请求占比高的业务 | 直接省掉计算,效果最直观 |
服务框架方面,我几乎用FastAPI,原因是它基于Starlette和Pydantic,性能不错,自动生成OpenAPI文档,参数校验也省心。Flask我也用过,但做AI服务总觉得别扭:并发能力一般,校验全靠手写,文档还要另配。FastAPI对新手也友好,官方文档例子直接能跑。
部署形态上,Docker是最低要求。把服务、模型文件、依赖环境打包成一个容器,推送到镜像仓库,然后在服务器上拉取运行。这里我不强调某个具体品牌,核心思路是“构建产物必须是不可变的”,这样部署到开发、测试、生产环境,行为都是一致的。如果训练好的模型超过几个GB,还要设计单独的模型下载步骤,把模型文件放在独立存储里,启动时按版本拉取,而不是把几百MB的文件塞进代码仓库。
2.5 模型评估与监控
模型上线只是开始,监控才是长期工作。很多团队把离线评估做得很漂亮,线上却完全黑盒,模型什么时候开始变差都不知道。
监控分两层。第一层是系统指标,包括推理延迟、QPS、错误率、显存占用、CPU使用率,这些用Prometheus加Grafana就能埋点展示。第二层是模型指标,包括特征分布漂移、预测类别分布变化、用户反馈信号。这一层需要业务侧配合,比如推荐系统要采集用户点击、客服机器人要采集用户是否转人工。
模型漂移是最容易忽视的问题。我会在关键特征上计算PSI(Population Stability Index)和KL散度,设定阈值,漂移超过阈值就触发告警,提醒模型需要重新训练。比如电商促销期间,用户行为分布剧烈变化,之前训练的购买预测模型效果会断崖式下跌,这时候如果能提前监控到特征分布漂移,及时切到活动期间重训的模型,业务损失会小很多。
3. 从零搭一个AI工程系统:以客服意图识别为例
3.1 需求定义与方案选型
理论说再多,不如亲手搭一个完整系统。我拿一个经典场景举例:客服意图识别。业务目标是把用户发给客服的文本自动分成“退款”“物流查询”“商品咨询”“投诉”等几个类别,然后路由给对应的人工坐席。
先定需求约束。业务方说线上服务P95延迟不能超过300毫秒,单机QPS需要支持50,类别数量是10个。基于这些条件,我决定用BERT蒸馏后的小模型,比如distilbert中文版或者更小的albert,因为全量BERT在CPU上跑到300毫秒以内很困难。如果公司有GPU资源,上GPU推理,那模型选择空间会更大,但我的例子按CPU单机来设计,让更多人能复现。
数据方面,先拉取最近三个月的客服会话记录,人工标注出用户问题对应的意图标签。这里有个坑:原始会话里包含坐席回复,标注时只能看用户发送的消息,否则模型会学到坐席话术这种“作弊特征”。标注好之后,按用户ID做分层抽样切分训练集和验证集,保证同一个用户的样本不会同时出现在两边。
3.2 数据准备与验证
数据切分之前,先检查类别分布。如果“物流查询”占了60%,“投诉”只有3%,模型会倾向于把所有样本都预测成多数类,看起来准确率不错,但实际业务里少数类的召回率惨不忍睹。这时候要么增加少数类的样本,要么在损失函数里加类别权重,要么用F1而不是准确率作为主指标。
我习惯写一个简单的数据概览脚本,每次训练前打印类别分布和样本数:
import pandas as pd DATA_PATH = "data/intent_train.csv" df = pd.read_csv(DATA_PATH) print(df["label"].value_counts(normalize=True)) # 检查缺失 missing = df["text"].isna().sum() assert missing == 0, f"find {missing} missing text"这个脚本看着简单,实际能拦住很多低级错误。有一次我在新数据里发现某个标签拼写变成了英文,比如“退货”变成了“return”,导致模型把同一个意图当成两个类别,浪费了一次训练周期。
标注质量也需要抽检。我当时找了另外一个同事,随机抽了200条样本重新标注,和原始标注做一致性比对。如果一致性低于90%,说明标注规范不清晰,需要先修订规则再继续。这个步骤在正式项目里不能省,宁可多花两天把数据搞脏的代价提前付掉,也不要让模型学进错误信号。
3.3 训练脚本与实验追踪
数据就绪后写训练脚本。由于是演示项目,我把代码结构拆成四块:数据加载、模型定义、训练循环、评估逻辑。每块一个模块,方便后续替换。
下面是一段简化版训练循环的核心逻辑:
# train.py(关键片段) import torch import torch.nn.functional as F from torch.utils.data import DataLoader def train_one_epoch(model, dataloader, optimizer, device): model.train() total_loss = 0.0 for batch in dataloader: input_ids = batch["input_ids"].to(device) attention_mask = batch["attention_mask"].to(device) labels = batch["label"].to(device) optimizer.zero_grad() logits = model(input_ids=input_ids, attention_mask=attention_mask) loss = F.cross_entropy(logits, labels) loss.backward() optimizer.step() total_loss += loss.item() return total_loss / len(dataloader)真正重要的不是这段代码本身,而是实验追踪。每次训练都应该记录:数据版本、模型结构、超参数、最终指标、训练时长。我用MLflow来追踪,每个实验自动生成一个条目,包含参数和指标。没有这套东西,你很难回答“上周那个效果最好的模型是用什么配置跑的”。
选择超参数时,我走了不少弯路。刚开始训练,学习率直接用1e-4,结果损失一直在高位震荡,后来才知道这是学习率偏大。对于微调预训练模型,主流做法是学习率设在2e-5到5e-5之间,配合Warmup和线性衰减。批次大小也不能贪大,显存有限时用小批次加梯度累积更稳。给新手的建议是:先复现一个现成配置,再围绕它微调,不要上来就发明新超参。
3.4 封装成服务
训练完成后拿到一个准确率还不错的模型权重,接下来进入服务化环节。我用FastAPI写一个最小的推理服务:
# service.py from fastapi import FastAPI from pydantic import BaseModel app = FastAPI(title="intent-service") model = None tokenizer = None class PredictRequest(BaseModel): text: str @app.post("/predict") def predict(request: PredictRequest): inputs = tokenizer(request.text, return_tensors="pt", truncation=True, max_length=64) logits = model(**inputs).logits label_id = int(logits.argmax(dim=-1)) return {"label": label_id, "text": request.text}这里有几个容易忽略的细节。第一,tokenizer的作用不可小视,训练时测试集做了什么样的预处理,推理时就要原样复现,分词、截断长度、特殊token都要一致。第二,接口入参必须用Pydantic模型定义,不能收到什么数据都硬跑,比如空字符串、超长文本、异常编码,都要有明确的行为,至少要返回400而不是让服务崩溃。第三,模型加载放在模块加载时完成,不要在请求函数里重复加载,否则每次请求都卡顿。
Dockerfile我做得比较保守:
FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["uvicorn", "service:app", "--host", "0.0.0.0", "--port", "8000"]构建容器之后,本地启动,用curl模拟一个请求:
curl -X POST http://localhost:8000/predict \ -H "Content-Type: application/json" \ -d '{"text": "我的快递怎么还没到"}'返回结果里如果有正常意图标签,整个链路就算通了。之后要做的就是把容器推到私有仓库或者交付给运维平台,这部分根据公司基础设施选择具体方案。
3.5 上线后的监控与迭代
服务上线只是开始。我给这个意图识别服务配置了三类监控:系统类、数据类和业务类。
系统类监控负责回答“服务还活着吗”,包括P95延迟、QPS、错误率、CPU和内存。数据类监控负责回答“线上数据还和训练时一样吗”,主要看输入文本长度分布、关键词频率、请求文本的平均向量距离。业务类监控则要看“模型预测结果是否带来业务价值”,例如预测为“投诉”的工单是否真的进了投诉流程、用户是否在得到回复后继续追问。
下表是我常用的监控指标和告警阈值示例:
| 类别 | 指标 | 采集方式 | 告警阈值 |
|---|---|---|---|
| 系统 | P95延迟 | 服务中间件埋点 | > 500ms |
| 系统 | 错误率 | 服务日志聚合 | > 1% |
| 数据 | 输入文本平均长度 | 请求日志离线统计 | 偏差>20% |
| 数据 | 意图预测分布 | 请求日志离线统计 | KL散度>0.2 |
| 业务 | 转人工率 | 下游工单系统 | 周环比>10% |
模型迭代也不能等模型彻底崩了才动。我习惯固定一个重训周期,比如每两周或者每个月,用这段时间回流的高质量线上数据重新训练一轮,经过离线评估和灰度验证后再替换线上模型。替换时保留上一版本,方便一键回滚。
4. 实战中高频踩坑:数据泄漏、延迟抖动、模型漂移排查录
4.1 数据泄漏:离线指标虚高的元凶
数据泄漏是我见过出现频率最高、危害最隐蔽的问题。离线指标好看得不得了,上线后直接裸奔,十有八九都是数据泄漏。
一个典型场景是特征泄漏:训练集里包含了“目标发生之后才能知道的信息”。比如客服意图识别里,如果特征工程把“用户是否已经点击了退款链接”作为输入特征,但线上推理时用户还没点击链接,模型就缺少这个特征,分布直接对不上。另一个场景是切分泄漏:切分训练集和验证集时直接随机切,同一个用户的多条对话被分到两边,模型等于提前见过用户,验证集指标虚高。正确的切分逻辑是按用户ID或者会话ID做group的切分。
排查数据泄漏有个笨办法但很有效:把离线评估中的关键特征单独做一次线上特征完整性对比,逐个检查训练时有、线上没有、或者逻辑不一致的特征。我还在代码评审阶段增加了一个硬性要求:特征工程代码必须同时提供训练版本和线上版本,两者必须指向同一份来源,不允许复制粘贴两份。
4.2 复现性问题:今天能跑明天跑不了
做AI工程最怕出现在本地能复现、到同事机器上结果对不上的问题。云端GPU和本地配置不同,驱动不同,CUDA版本不同,都会导致训练结果不一样。更隐蔽的是随机性问题:如果不固定随机种子,即使在同一台机器上跑两次,结果也可能不同。
我的做法有三步。第一,给训练脚本固定随机种子,包括Python的random、NumPy和PyTorch的随机数生成器。第二,锁定所有Python包版本,用requirements.txt精确到小版本。第三,记录GPU驱动和CUDA版本。如果用了多卡分布式训练,还要注意分布式采样器的随机种子问题。处理完这三步,大多数复现性问题都能解决。剩下的极少数不一致,通常来自非确定性操作,比如某些CUDA算子在不同硬件上的浮点运算顺序差异,这类问题只要确认指标差距在正常波动范围内,就可以接受。
4.3 推理延迟与内存问题
模型服务上线后最直观的故障是延迟抖动。我遇到过CPU推理服务在高峰期延迟从200毫秒涨到3秒,查了半天才发现是服务进程被内存分配拖累。PyTorch推理时频繁创建Tensor,会不断申请和释放内存,Python的GIL又限制了多线程并行,导致延迟波动很大。
解决方案有几板斧。首先在服务启动时做一次预热请求,把模型权重加载进显存或内存,避免第一个请求触发初始化。其次设置批量推理接口,把同时进来的多个请求拼成一个batch,充分发挥模型的计算并行性。第三,给服务进程配置资源上限,防止内存无限制增长。如果用的是GPU推理,还要监控显存碎片化,长时间运行后显存占用不断上升但模型本身没有变大,多半是存在Tensor泄漏,可以用torch.cuda.empty_cache()缓解,或者排查是不是有批量数据的临时Tensor没有被释放。
4.4 模型漂移:线上效果衰减的隐形杀手
模型上线时效果很好,三个月后用户反馈变多,这是模型漂移的典型表现。原因通常不是模型自己变坏了,而是线上数据的分布变了。比如客服意图识别,上半年用户问“怎么退货运费险”,下半年开始问“怎么取消免密支付”,意图类别可能没变,但文本用词完全不同,模型就心有余而力不足。
应对漂移最有效的思路是“提前发现、快速重训”。我在特征服务里计算每个特征分布的PSI,磨损到一定阈值就触发告警。告警之后跑一次快速重训,用最近一个月的数据加原来的数据混合训练,然后灰度发布。灰度阶段把新模型和旧模型同时在线,按照流量比例放量,对比业务指标,确认没问题再全量。
4.5 团队协作规范:工程问题背后其实是沟通问题
AI项目往往是算法、工程、产品、运营多方协作,很多工程问题表面上是技术问题,根子上是沟通问题。比如算法说“模型指标涨了”,工程说“服务延迟降了”,但两边没有统一口径,导致上线后业务方发现效果不如预期。我后来立了一个规矩:核心指标必须共享,离线指标、上线性能、业务指标放在同一个看板上,谁都能看到。
代码评审和模型评审也要分开做。代码评审关注工程质量,模型评审关注业务有效性。模型评审时算法同学要讲清楚数据来源、切分方式、评估指标、已知限制,工程同学要讲清楚性能预算、依赖、回滚方案。只有两边都确认,模型才能进入发布流程。这套规范看着多费时间,但能避免上线后出大事故再花更多时间救火。
5. 工程化工具链选型:我踩完坑后的最终清单
5.1 必备工具清单
工具不在多,在于匹配团队现状。我的最终选择是经过多个项目验证的,给出一个保守且不折腾的组合:
| 环节 | 工具 | 理由 |
|---|---|---|
| 深度学习框架 | PyTorch | 生态好,Debug直观,团队上手快 |
| 实验追踪 | MLflow | 轻量、支持训练和模型注册,省去自研 |
| 数据版本管理 | DVC | 能对数据集做版本标记,和git workflow接近 |
| 推理服务框架 | FastAPI | 类型校验、性能、文档生成都合适 |
| 容器化 | Docker | 环境一致性,部署流程成熟 |
| 监控 | Prometheus + Grafana | 开源可扩展,社区资料丰富 |
| 日志聚合 | Loki或ELK | 根据基础设施选一个,别同时上两套 |
MLflow是我尤其推荐的。很多团队一开始觉得“用Excel记录实验就够了”,但实验数量一多,谁改过超参、谁训出来的模型效果最好、哪个版本对应哪个代码提交,全都成了糊涂账。MLflow里能注册模型,并标记模型状态为Staging或Production,和上线流程无缝衔接。
5.2 学习资源建议
我不打算列一长串书单,那样只会制造焦虑。对我实际帮助最大的资源只有几类:官方文档、开源项目、系统设计类文章。
PyTorch官方教程值得精读两遍,特别是DataLoader、torch.save/load、TorchScript和ONNX导出这几个章节。FastAPI的官方文档很短,一天就能看完,但一定要亲手写一个带路径参数、查询参数和请求体校验的服务。MLflow的官方example也够用,把tracking和model registry跑通即可。
动手是第一位的。建议自己找一个真实小数据,比如一个月内的客服对话、商品评论或者工单记录,按照我前面的流程从数据处理做到服务部署,完整跑一遍。我第一次完整跑通之后才发现,阻力不在“训练模型”那里,而在“数据接口一致”“模型加载方式”“服务预热逻辑”这些看似不起眼的细节上。这些细节,只有亲手踩一遍才会变成自己的经验。
6. 写在最后的个人体会
做了这么多AI工程项目之后,我的体会有三条。第一条是,AI Engineering的核心能力不是模型有多深,而是数据、模型、服务三条线能不能闭环。模型再先进,如果数据不可靠、服务跑不动、监控不到位,最终业务收益依然是零。第二条是,工程规范和业务速度并不矛盾。前期多花时间和业务方对齐需求、多花时间统一评估口径,后期反而能更快迭代。第三条是,从零开始的最好方式不是刷课,而是接一个真实的小需求,把它做上线,再把踩过的坑记录下来。我现在的团队面试新人,最看重的就是候选人有没有完整上线过一个AI服务,哪怕项目很小,只要能讲清楚数据怎么处理、模型怎么部署、线上怎么监控,就足以证明他真的理解AI工程这件事。如果你也想转向这个方向,建议从今天开始,选一个自己手头就能获取数据的场景,动手做第一个项目。做完之后你再回头看,会发现那些曾经觉得很难的环节,其实都有清晰的路径可循。