我前几年一直在做算法和后台开发,现在的工作重心基本落在了AI工程化上。很多人觉得“AI工程”是个高大上的词,仿佛脱离了算法研究就只剩调库、调参、写接口。但真的把一个模型从训练环境推到生产环境、让它在真实流量里稳定跑上几个月,你就会发现这里面有一套完全不同的知识体系,而且和传统的软件工程有本质区别。这篇文章我想聊聊我理解的“AI工程”,也就是从零开始把一个算法或模型落地成稳定服务的过程。
我把它叫“from scratch”,不是说要从数学原理开始推公式,也不是说非要自己手搓一个深度学习框架。我的意思是:不依赖任何现成的垂直解决方案,从业务问题定义、数据准备、模型选型、训练管理、服务化部署到线上监控,一条链路自己完整走一遍。只有这么走一遍,你才会真的理解每个环节为什么是那样设计的,踩过哪些坑,哪些环节看着简单其实最容易翻车。
这篇文章适合两类人:一类是刚入行或者想转岗做AI工程的同学,想知道这条链路到底长什么样;另一类是已经在做算法和后台开发,但模型落地总是不顺、线上出了事不知道从哪查起的同行。文章不会堆概念,也不做广告,就是把我在实际项目里的选型逻辑、操作步骤、踩坑记录尽量讲清楚。
1. AI工程的定义边界与核心挑战
1.1 AI工程不是“算法调参”,也不是普通Web开发
我先聊一个最基础的问题:AI工程到底是什么?很多人把它和算法工程师的工作混在一起,其实完全是两回事。算法工程师的核心目标是让模型在离线指标上尽可能高,比如准确率、召回率、AUC这类评估指标。他们面对的环境相对“干净”:固定的训练集、标准的评测集、实验室里的GPU集群。而AI工程的核心目标只有一个——让模型在真实环境里稳定、可靠、低成本地产生业务价值。这就意味着,工程化的视角里,离线指标只是起点,后面还有一长串问题。
你可以把算法研究想象成在厨房里研发新菜,目标是让这道菜在品鉴会上拿高分。而AI工程是把它变成中央厨房里的标准化生产线,需要考虑原材料供应稳定、出餐速度、成本、口味一致性,以及哪天某个供应商掉链子,生产线该怎么切换。这个类比很能说明问题:AI工程关心的不是“菜好不好吃”,而是“这道菜能不能在大量用户面前稳定地好吃”。
从技术栈来说,AI工程也不是普通Web开发。传统后端开发里,代码逻辑是确定的,你可以通过单元测试、代码评审、灰度发布来保证质量。但模型是“数据驱动”的,同样的代码,换一批数据,输出可能完全不一样。这意味着AI工程引入了三个传统软件开发里不太存在的不确定性:
- 数据质量的不确定性:线上数据和训练数据分布不一致,模型表现会断崖式下滑。
- 模型行为的不确定性:你无法像断言一个函数返回值那样去断言模型在未知输入上的表现。
- 资源消耗的不确定性:推理时的内存占用、延迟、吞吐量都随输入变化而波动。
所以,AI工程需要的是一套额外的机制:数据校验、模型监控、特征一致性检查、版本回滚、Drift检测,等等。这些机制在传统DevOps体系里是没有现成答案的,需要自己设计和实现。
1.2 核心挑战:模型、数据与服务三者之间的三角关系
我觉得AI工程所有复杂性的根源,在于它必须同时管理“模型”“数据”“服务”这三者之间的关系,而且这三者之间会互相影响。
模型和数据之间的关系是双向的:模型从数据中学习规律,但数据本身的质量、分布、标注一致性又决定了模型的上限。在工程化落地时,训练数据的分布和线上真实请求的分布不可能完全一致,这就是我们常说的“分布漂移”。一旦漂移超过某个阈值,模型基本就废了,不管你的离线指标做得多么漂亮。服务逻辑和模型之间的关系也值得注意:模型就是服务的一部分,但它的“代码”不是人写的,而是数据训练出来的,所以模型的更新逻辑、缓存策略、超时处理都比普通接口更难做。
这三者之间的耦合,导致了AI系统排查问题的难度比普通系统高一个数量级。普通服务挂了,要么是代码bug,要么是基础设施问题。AI服务挂了,可能是代码bug、可能是上游数据异常、可能是模型本身对某类输入退化、也可能是特征计算逻辑和训练时不一致。你把日志翻一遍,可能每个环节看起来都是正常的,但结果就是不对。
所以,做AI工程的第一步,不是选什么框架,而是建立一套能把这三者串起来的“观测体系”。没有这个体系,后续的优化就像在暗房里修钟表。这也是为什么很多团队明明模型很先进,落地时却寸步难行——他们缺的不是“AI能力”,而是工程化能力。
2. 从零开始:技术栈选型与架构设计的底层逻辑
2.1 选型的原则:看起来“最好”的方案往往不是最合适的
如果你在搜索引擎里搜AI工程的工具,会看到一大堆名字:PyTorch、TensorFlow、Ray、Kubernetes、MLflow、Kubeflow、Airflow、Feast、Seldon、KServe……说实话,一开始我也被这些名词绕晕过,以为都得用一遍才算“正规军”。但踩过几次坑之后,我意识到AI工程的选型逻辑,跟传统软件开发是一样的:少即是多,简单即可用的原则永远不过时。
我从一个核心观点出发:技术栈的复杂度应该匹配团队规模和业务阶段。如果你是一个五人团队,业务刚起步,日请求量在几万到几十万这个量级,那根本不需要上一整套Kubeflow。你只需要:
- 用Python写训练脚本,用MLflow或者Weights & Biases来做实验记录。
- 用Airflow或者Prefect来做数据管道的编排,甚至初期直接上cron定时任务也够用。
- 服务化阶段,如果模型是单机就能扛住的,直接用FastAPI封装成一个REST API就行,不需要上分布式推理集群。
数据管道用Airflow或Prefect可能有点重,但相比自己手写一套调度,还是省心很多。它们有重试机制、依赖管理、日志界面,这些都是坑过之后才知道要的。
2.2 数据层、训练层、服务化层分别怎么选
我按自己的习惯把AI工程拆成三层:数据层、训练层、服务化层。每一层有不同的选型逻辑。
数据层是所有环节里最容易被忽略、又最容易出问题的地方。选型核心关注两点:一是存储够不够便宜、够不够大,二是数据管道能不能稳定调度。对象存储(比如S3或MinIO)是标配,因为训练语料、特征数据、模型产物都可能很大,本地磁盘一定不够用。管道调度上,我建议关注“失败重试”和“数据血缘”这两个功能。失败重试好理解,数据血缘是指你能追踪到一份特征数据是哪条管道、在哪个时间点生成的。没这个能力,线上特征异常时你会无从查起。
训练层的选型相对简单。框架层面就是PyTorch和TensorFlow之争。我的建议非常明确:没有历史包袱的新项目,直接用PyTorch。不是因为它比TensorFlow更好,而是因为现在PyTorch的生态太庞大了,从Hugging Face的模型库到各种分布式训练方案都以PyTorch为第一优先支持。实验管理这块,MLflow或者W&B二选一即可。MLflow的好处是开源、可自托管、日志功能够用;W&B在可视化体验上做得更好,但数据在SaaS上,很多公司会有合规顾虑。
服务化层的选型是争议最多的。如果你只是用FastAPI包一层,那是最轻量的方案,几行代码就能上线,适合模型逻辑不复杂、请求量可控的情况。如果模型需要实时响应、需要自动扩缩容,那就要考虑加一层推理服务框架。Triton是NVIDIA的,支持多种后端和动态批处理,性能很好,但上手成本不低。KServe是在Kubernetes上跑模型服务的标准化方案,功能齐全,但运维复杂度明显上升。我个人的经验是:从一个简单的FastAPI服务开始,等真的遇到性能瓶颈,再逐渐引入更重的框架。一上来就Kubernetes + KServe,大概率只会增加你的运维负担,而不是让你的服务更稳定。
2.3 为什么我不建议直接套用“大厂方案”
网上关于AI工程架构的文章,十有八九是照着大厂的方案写的。Kubeflow、Ray、Feast、Kafka那一套组合,看起来很完整,但那是为大规模、多团队、复杂组织协作设计的。一个十几人的团队去复刻这种架构,就像让小饭馆硬上中央厨房的自动化流水线,结果就是运维成本爆炸,业务迭代速度反倒变慢。
我见过最典型的案例:一家公司花了三个月把Kubeflow全套部署好,用它来做数据集管理、分布式训练、自动部署,结果三个月里真正用在业务上的时间不到一半,其余时间都在折腾Kubeflow本身的Bug和权限配置。后来他们换了方案,几个核心组件保留,其余全部丢掉,两周就重新跑通了全链路。
我的观点是:AI工程的“技术选型”本质上是“权衡的艺术”。你要在架构复杂度、开发速度、运维成本三者之间找平衡点。一旦意识到某个组件带来的复杂度已经大于它解决的问题,就果断把它去掉。后续章节我会以一个实际项目的链路来展开讲,大家会更清楚每个环节具体该怎么做。
3. 端到端实操:从数据处理到模型服务化的完整链路
3.1 业务问题定义与第一版指标体系
在写任何代码之前,先想清楚一个问题:这个AI服务上线后,业务上谁会看什么指标?这个问题看起来很简单,但很多项目栽就栽在没人能回答它。
我通常会把指标分成业务指标和技术指标两层。业务指标是你给老板看的,比如“推荐的点击率提升了多少”“客服转人工率降低了吗”“风控拦截的精准率是否达标”。技术指标是跟踪线上系统用的,比如服务延迟、推理QPS、内存占用、模型查询的失败率。两层指标都必须一开始就定义好,否则后面你做任何优化,都说不清楚有没有效果。
有个经验可以分享:技术指标的阈值要在项目启动时就定下来,而不是上线前才拍脑袋。比如“推理平均延迟要控制在80ms以内”“特征数据延迟不能超过5分钟”,这些数字必须在架构设计时就要有预算。否则等你发现线上延迟太高,再想优化,往往要大改架构。我自己有个习惯,就是用一张表把所有关键指标的当前值、目标值、责任人列出来,每周过一遍。这个动作让我避免了很多次“上线后感觉模型还不错,但说不出哪里不错”的境地。
3.2 数据管道搭建:别小看“很无聊”的数据工程
我见过太多团队把精力花在模型结构上,却在数据管道上草草了事。实际上,AI工程里最容易导致项目失败的,从来不是模型精度不够,而是训练数据、特征数据、线上数据三者之间出现了不一致。我做一个项目时,通常会用差不多30%到40%的时间在做数据管道和特征工程,这个比例在工业界是非常常见的。
数据管道的第一层是“采集与清洗”。如果你做的是推荐系统,那你需要埋点收集用户行为;如果是风控,你需要对接各种业务系统的日志。采集之后是清洗:去重、字段格式统一、异常值过滤。我建议在清洗阶段就引入“数据校验规则”,比如字段的非空率、取值范围的合法性、主键的去重率。不要觉得这些是基本功不需要认真做,实际上线上的脏数据远比你想的会变着花样出现。
第二层是“特征计算与存储”。这一层很容易埋雷。比如你按小时更新用户的历史点击特征,但线上模型拿到的特征可能是10分钟前算出来的,这就存在特征延迟。训练时用的是T+1的全量特征,线上却只能拿到T+30分钟的部分特征,模型的效果就会受影响。要解决这个问题,你必须在设计阶段就把在线和离线的特征口径统一,并且对特征延迟做明确的SLA定义。
第三层是“样本生成”。模型训练的样本集,决定了模型的能力边界。我建议样本生成必须做成可版本化的流水线,每次训练用的样本集都有对应的哈希值、生成时间、生成代码版本。这样出了问题才能快速定位是数据变了、代码变了,还是模型本身的问题。
这层的工具选型,我建议初期从轻开始。如果数据量在百万到千万量级,一个Python脚本加一个调度框架就足够。如果到了亿级,可以考虑引入Spark来处理大规模分布式计算。但千万不要一开始就上Spark,因为它的运维成本和调试难度都不低。先用最简单的方案跑通,让业务看到价值,再决定要不要升级,这个顺序非常重要。
3.3 训练阶段的管理:记录、评估与多模型对比
训练阶段看起来是“最AI”的部分,但从工程视角来看,它最需要的是“管理能力”。在训练代码里,我强烈建议从一开始就把这几个东西变成固定模板:
- 超参数:所有超参数必须通过命令行参数或配置文件传入,禁止硬编码在脚本里。
- 日志:除了标准输出日志,还要有结构化的训练日志,包含每个epoch的loss、评估指标、学习率等。
- 产物:每个模型训练完,要把模型权重文件、tokenizer配置、预处理代码版本、数据样本集版本、训练环境依赖列表,全部打包记录到一个固定地方。
我习惯每次训练都生成一个MLflow的run,记录上述所有信息。你不需要把所有实验都保存成可部署模型,但每个实验的记录必须能随时回溯。事后你会发现,很多时候线上模型的回滚,不是回滚到某个代码commit,而是回滚到某个MLflow run对应的那个模型产物。
再看评估环节。离线评估的价值有限,但它是上线前的最后一道闸门,不能省。评估集的选择有讲究:随机抽样的评估集往往高估模型效果,更合理的做法是按“时间分段”,用最近时间段的样本做评估。因为线上流通的数据分布,永远是更接近最近这段时间的。你拿三个月前的样本评估今天的模型,指标会好看,但参考价值很低。
多模型对比的训练在AI工程里也很重要。同一个业务场景,可能既有一个复杂的大模型,也有一个轻量的基线模型。工程上的做法是让它们并行跑一段时间,用小流量切分来观察线上真实表现差异,再决定谁转正。这种AB测试的机制,应该在训练完成后、部署之前就搭好,而不是上线之后再去补。
3.4 模型服务化:从FastAPI到Triton的演进路径
模型部署是AI工程里最接近传统后端开发的部分,但有几个细节是传统后端不太会遇到、又非常关键的。
模型本身不是一个“普通的可执行文件”。PyTorch训练出来的模型权重,需要加载到内存里,配好tokenizer、预处理逻辑、后处理逻辑,才能对外提供服务。我最早踩过的一个坑是:把模型权重文件和预处理逻辑分开部署,结果线上预处理逻辑和训练时不一致,模型输出一塌糊涂。后来我养成了一个习惯:把预处理、推理、后处理全部写成一个完整的推理流水线,打包进同一个服务。模型要更新,整个流水线一起更新,不允许单独替换任何一部分。
FastAPI是我最推荐的首选服务化方案。写一个简单的预测接口只要几十行代码,而且自带Swagger文档,调试非常方便。初期QPS不高的时候,单机跑几个worker就完全够用,不需要复杂的基础设施。如果你用的是PyTorch模型,需要加一个特殊的处理:把模型放在GPU显存里,必须做“预热”,也就是正式接流量之前,先发几个样本跑一遍,把显存里的CUDA context准备好,否则线上前几个请求会异常慢。
当请求量增长到单机撑不住,或者模型单次推理耗时较长时,就要考虑Triton这类推理框架。Triton最大的优势是Dynamic Batching:它能把一小段时间内的多个请求合并成一个batch,一次推理完成,单位时间吞吐量可以提升好几倍。但Triton的配置项非常多,模型仓的目录结构、参数设置、后端选择都需要花时间学习,所以一定要在确实有性能瓶颈时再引入。
Kubernetes部署是另一个话题。我建议中小团队初期不要碰Kubernetes,除非你本来就有运维基础。先跑在几台固定服务器上,用systemd或者supervisor做进程管理,用Nginx做负载均衡,这套方案也能支撑几十万的日请求量。数据科学团队往往高估了Kubernetes带来的好处,低估了它的维护成本。如果你的团队里没有专人负责基础设施,老老实实先跑虚拟机或者物理机,是更理性的选择。
3.5 特征一致性校验:一个容易被忽视却致命的细节
我想单独花一段讲特征一致性,因为这个坑坑了太多人,包括我自己。所谓特征一致性,是指训练模型时输入的特征分布,和线上推理时输入的特征分布,保持一致。听起来理所应当,但实际操作中非常难做到。
一个典型的场景是:离线训练时,你可以把用户的最近10次行为拼成一个特征序列,因为你有全量历史数据。但线上实时推理时,你只能拿到当前这一秒能查到的最近记录。网络延迟、存储延迟、上游系统的处理延迟,都可能让线上特征比训练特征“少了最近几个行为”。这种细微的差异累积起来,模型的表现就会明显下降。
解决这个问题有几个方向。最简单的是:训练时故意模拟线上能做到的延迟窗口,只使用截止到某个时间点的特征去训练模型,这叫“特征截止时间一致”。更进阶的做法是:线上实时特征和离线批量特征两套系统并存,用统一的特征存储层保证口径一致,比如用Feast这类特征平台。但Feast部署和使用都有成本,团队初期不一定hold住。我的建议是:先有条件地在训练阶段模拟线上特征环境,同时做好“特征漂移检测”。等规模上来了,再考虑引入专门的平台。
在监控层面,至少要保证:线上特征统计信息和训练特征统计信息是定期对比的,比如均值和分位数。一旦偏差超过阈值,就要告警。这是你发现“特征被改坏了”的最快途径。
4. 线上运营:监控预警、问题排查与模型更新迭代
4.1 该监控什么:不只是“服务有没有挂”
不少团队部署完模型后就进入“裸奔”状态,只监控服务的存活情况,进程还在就认为系统正常。但AI服务真正的风险,往往是进程在、能力已经坏了的时候。所以你的监控体系里,除了常规的QPS、延迟、错误率之外,至少要加下面几个AI专属指标:
- 预测分布监控:模型输出的预测值分布有没有发生明显变化。比如一个二分类模型,以前正样本比例是20%,最近变成50%,这很不正常,模型可能已经坏了。
- 特征漂移监控:输入特征的分布统计值与训练时的基线偏差有多大。常用的指标有PSI(Population Stability Index)或者KS统计量,也可以用简单的分位数偏离比例来做。
- 数据质量监控:上游传来的特征字段是否合法、非空率是否达标、取值是否在合法范围内。
- 业务结果回传:模型的预测是否真的转化成了业务指标。比如推荐模型上线后,点击率有没有提升、人均点击有没有变多。这是最慢的监控,但也是最终的检验。
我把这些指标分成两类:实时告警类和日报观察类。延迟、错误率、非空率这类,告警阈值可以设得严格一些;预测分布、特征漂移这类变化速度慢的指标,用日报趋势观察更合理,不需要频繁告警,否则容易变成“狼来了”的告警疲劳。
4.2 线上模型效果下降,怎么定位问题?
我总结了一套排查线上模型问题的“三板斧”,这是我在很多项目里反复验证过的流程,基本上能覆盖80%以上的场景。
第一步:先确认“是不是数据问题”。翻监控看特征漂移指标和上游数据质量指标。最常见的情况是上游某个表或者接口的字段含义变了,比如以前年龄字段是0到100的整数,某天开始变成了“年龄区间字符串”,模型直接崩溃或者输出乱掉。这类问题特征就是“突变”,从一个小时到下一个小时效果断崖式下跌。确认了数据问题,修上游逻辑或者做字段兼容,通常当天就能解决。
第二步:确认“是不是模型退化”。如果数据没问题,就要看预测分布监控。有时候模型没有变,但用户的分布变了,比如季节因素、突发新闻、产品改版,导致模型面对的新数据并不是它训练时学过的主流分布。这类问题通常是渐变的,每天掉一点点,积累到一周后发现效果差了。处理方式就是重新训练模型,用更新鲜的数据版本。
第三步:确认“是不是架构问题”。比如你改了特征计算逻辑、升级了依赖库版本、或者调整了服务实例数量,这些看起来和模型无关的变动,也可能悄悄改变模型表现。我记得有一次,线上延迟升高,运维同事把超时时间从100ms调到了300ms,结果模型效果反而变差了——因为延迟升高本身是上游数据源变慢的信号,模型拿到的是更“陈旧”的数据,超时时间一放宽,等于把陈旧数据的请求也放过去了。这种问题用监控数据对比一下改动前后的指标就能发现,难的是你一开始就要对每次系统改动打版本标记。这也是开发和运维协作时最容易被忽视的细节。
4.3 模型版本的灰度发布与回滚机制
模型更新是AI工程里风险很高的操作。直接用新模型替换线上的旧模型,如果新模型在某些场景上表现异常,就会直接影响用户体验。所以灰度发布是必须的。
最简单可行的方法:新版和旧版服务各部署若干实例,用流量灰度策略把一小部分用户请求导向新版,观察业务指标和模型监控指标。如果一切正常,再逐步放大流量比例。这里的重点在于:灰度比例不应该只按用户比例来切,更推荐按“用户分组”来切。因为同一个用户如果这次请求打到新模型,下次打到旧模型,他感受到的体验是不一致的,这对推荐和风控类场景尤其明显。
回滚机制同样要做到一键操作。为了做到“秒级回滚”,模型服务的部署结构要做成:服务代码和模型权重分离的发布流程。模型作为一个可替换的静态资源,挂载到一个稳定的推理服务进程上。发布新模型时,把旧模型文件保留,一旦异常,只需要切换挂载回去就能恢复服务。我见过一些团队把模型直接打包在镜像里,回滚就得重新构建镜像、重新部署服务,一次回滚要十多分钟,这种时间成本在线上事故里是无法接受的。
回滚决策要趁早。模型服务的特点是:你观察得越久,业务受损越大。我的习惯是设定一个“快速失败”标准:比如新版本上线2小时内,技术指标超阈值,或者业务指标负向超过5%,直接回滚,不做任何调优尝试。调优是线下干的事,线上第一优先级永远是止损。
4.4 持续更新:让模型保持“新鲜”的机制化方案
模型是有保质期的,业务越活跃,保质期越短。推荐系统可能要每天更新,风控模型可能一周更新一次。所以AI工程的后半段,其实是建立一个可持续更新模型的“机制”。
我的建议是:把模型训练和上线流程完全流水线化。一条自动化管道,定期拉最新的数据样本,触发训练,跑评估指标,生成新模型,然后推送到灰度环境。整个流程里,除了异常情况需要人工介入,其余全部自动完成。这套机制可以基于当前最常用的工作流编排工具来做:数据准备是Python脚本,调度用Airflow,训练记录写入MLflow,部署调API触发。不要一开始就把所有环节都自动化,反而是先把每个环节手动跑熟,再把它们固化进流水线。手动跑不熟就自动化,你会得到一个“自动快速制造事故”的系统。
这个循环里,有一个需要重点管理的角色:模型的“退役评审”。模型更新不是一次性的,也不是“越新越好”。每个模型版本在线上生存多长时间、下线后如何归档、是否保留复现能力,这些都要在流程里定义好。归档不只是存一个权重文件,而是把训练代码、数据版本、依赖环境全部固化下来。哪怕这个模型以后不会再用,它也是一份“历史样本”,能帮你回答“当初这个指标为什么是这个值”的问题。
5. 踩坑实录与效率心得:一些可以直接照搬的做法
5.1 别急着上Kubernetes,先跑虚拟机
这条我前面提过,但还是想再强调一遍,因为它是我见过最多团队踩的坑。Kubernetes对AI模型服务确实有帮助,它提供了自动扩缩容、滚动更新、自我修复这些能力。但这些能力是有代价的:你得设计好Docker镜像、配置好资源配额、处理Pod重建带来的模型加载时间和显存分配问题,还得有人负责集群本身的安全和版本升级。
如果你只是需要把模型服务跑起来,并且在流量增长时能加机器,那用几台虚拟机加一个Nginx负载均衡,完全能达到目的。等业务真的到了流量波动剧烈、必须通过水平扩展来跟上节奏的阶段,再考虑Kubernetes也不迟。而且那时候你已经有明确的业务痛点和容量数据,可以给Kubernetes集群设置合理的参数,而不是纯靠猜测。
还有一个实际问题:Docker镜像加模型文件,体积经常是几个GB甚至十几个GB。每次发布模型都要推镜像,这个时间足够让你怀疑人生。我的做法是:镜像里只装推理环境,模型权重文件单独存放在共享存储里,服务启动时动态拉取加载。这样做,模型更新就不再需要重新构建镜像,发布耗时可以从分钟级缩短到秒级,回滚也是一样。
5.2 日志结构化,从第一行代码就开始
AI服务跑起来,最让人头疼的往往是“问题复现”环节。普通后端问题,你看到异常堆栈,基本就能定位。但AI服务的问题,比如某一天的预测结果整体偏离,你需要的是不同维度的数据才能找到原因:当时输入的特征值是什么、模型版本是哪个、上游数据是什么时候更新的、服务有没有发生过重启。
要支撑这种排查,日志必须结构化。从第一天写代码起,所有关键信息就要按JSON格式输出,带上时间戳、请求ID、模型版本号、特征数据摘要。不要图省事只打印一句“prediction failed”,这句话对排查一点用都没有。我有个习惯,在预测接口里会专门打印一份“预测日志”,包含:请求ID、入参前N个特征的快照、模型输出的原始值、后处理之后的最终值。这样一来,当你需要复盘某条请求时,就能完整还原模型当时的行为。
5.3 给AI工程团队的一些建议
如果让我总结AI工程团队需要什么样的能力模型,我会说:它需要一个“连通者”。这个人既要懂一些算法,理解模型在做什么,又要懂工程设计,知道服务怎么部署、数据怎么流动。现实中很难找到在两个方向都顶尖的人,但这两个方向的“桥梁型”人才是团队里最稀缺的。
如果你是管理者,不要试图同时追最新的模型结构和大规模基础设施,两头都抓的结果往往两头都一般。选一个主线:如果业务更需要稳定的服务,就把精力放在数据管道、特征存储、模型监控上;如果业务更需要模型能力提升,那就把服务化做简单点,把资源倾斜给训练和数据组。资源永远是有限的,取舍是必须做对的第一件事。
如果是个人学习者,我建议不要一上来就啃分布式训练或者Kubeflow。从一个小项目开始:自己写一个模型,自己搭一套数据管道,自己部署一个FastAPI服务,自己写监控脚本,完整走一遍。只有亲身走过一遍全链路,你才会理解那些框架存在的意义到底是什么。
5.4 三个最关键的自检指标
最后分享我自己每次上线AI服务前都会做的“终检清单”,就三个问题:
- 如果明天上游数据源挂了,我的服务会怎样?有没有默认值兜底?会不会把异常值当成正常特征喂给模型?
- 如果新模型上线后效果崩了,我能多快发现问题?是等业务反馈,还是监控直接打到手机?
- 如果模型效果下降,我需要多少时间定位到根因?日志、特征快照、模型版本是不是都齐了?
这三个问题,前两个决定你事故的严重程度,第三个决定你恢复的速度。想清楚这三个问题,AI工程里最重要的风险基本都覆盖了。
写到这里,我想起一个实际的体会:AI工程做久了,你会发现最难的往往不是让模型在离线指标上再涨一个点,而是让这个模型在真实环境里稳定地、连续地、可预测地工作。这个目标不需要你发明新的算法,也不需要你掌握所有最新的工具,它需要的是对系统整体的理解,是把每个环节的连接处都打磨平整。我踩过的那些坑,说到底大多不是“技术不够”,而是“没想到居然这里也会出问题”。希望这篇文章能帮后来者少走几段弯路,把那些本来可以提前想到的问题,提前在自己的系统里解决好。