ARTICLE DETAIL

资讯详情

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

从零开始做AI工程:数据、部署与监控的完整指南

从零开始做AI工程:数据、部署与监控的完整指南 三年前我第一次以AI工程师的身份独立负责一个项目的时候差点把整个项目做没了。不是模型训练不出来——恰恰相反测试集上的准确率、召回率、F1分数都漂亮得能拿出去炫耀。但模型一上真实数据就崩业务方看着我的眼神从期待变成了怀疑。复盘时我才意识到问题根源不在AI而在工程数据分布变了没人知道训练和推理的预处理逻辑不一致评估集是精挑细选的干净样本线上却是满地垃圾输入。这段时间我最大的收获就是彻底想明白了一件事AI工程不是把模型训出来而是在充满不确定性的条件下稳定可靠地把模型建出来、部署上去、持续维护好。这篇文章想写的就是我对ai-engineering-from-scratch这件事的完整理解——从零开始做AI工程到底意味着什么需要具备哪些能力按什么顺序成长以及过程中最容易被忽视的致命细节。无论你是刚转行的新人、带团队的负责人、还是已经调过不少模型但总觉得差口气的工程师都应该能从里面找到对应自己阶段的东西。1. 为什么把AI工程单独拎出来说——从一段失败的面试经历讲起1.1 那段让我重新审视AI工程概念的经历有一次我面试一个候选人简历很亮眼计算机视觉方向、发表过论文、熟练使用PyTorch和TensorFlow、做过三个AI项目。我问了一个自认为很基础的问题你训练好的模型是怎么部署到生产环境里的他愣了一下回答说我都是把模型文件发给后端他们自己处理。我又问那线上效果变差了你怎么判断是数据问题、模型问题还是特征问题这次沉默的时间更长了。这位候选人的技术水平不算差但他从未完整经历过一个AI系统的生命周期。这恰好点中了AI工程区别于AI研究或调模型的核心要的是从业务问题到系统稳定运行的全链路能力而不是某一个环节的熟练技巧。1.2 AI工程与调模型的本质区别很多人对AI工程的第一印象是找个开源模型、准备数据集、跑一轮训练、拿到指标、发个总结。这套流程下去产出的是一个能跑的模型但不是一个能用的系统。能跑的模型和能用的系统之间的差距用一句话概括就是前者在固定环境下做固定的事后者必须在不固定环境下持续做正确的事。模型训练时你的数据是静止的、标签是确定的、硬件环境是固定的但一旦进入生产数据会漂移、用户输入会千奇百怪、依赖库会升级、GPU可能会挂掉、QPS会突然飙升——这些都是工程问题。我之前在团队里做过一次小范围讨论让大家把自己理解的AI工程写在一张纸上。收到的答案五花八门有人写训练和调参有人写数据清洗有人写模型部署甚至有人写搞AIGC的。这些都不算错但都只是整个拼图的一块。在我看来AI工程是以模型为核心、以数据为燃料、以稳定性为目标的软件系统工程。它覆盖需求分析、数据工程、模型训练、评估验证、部署监控、迭代更新六个环节任何一个环节掉了链子整个系统都会反馈到线上效果上。1.3 什么人才算真正会AI工程根据我带团队和面试候选人的经验真正会AI工程的人通常具备三个特征这三条可以当作自测标准。第一能讲清楚为什么这个方案能解决这个业务问题而不是因为别人都这么做。例如做文本分类你是直接用预训练模型微调还是先跑一个朴素贝叶斯基线前者的效果大概率更好但如果业务场景是标签随时变化的长尾分类固定结构的分类头可能不如Embedding向量检索灵活。能根据业务约束选技术方案的人才是工程师只会套SOTA模型的人是工具人。第二能从端到端的视角串联问题。模型在离线评估时F1是0.9上线后掉到0.6你能不能快速定位是哪个环节出了问题这需要你对数据流转的每一步都有清晰认知——从原始日志到特征工程再到训练集从模型输出到业务决策再到反馈回流。第三有防呆意识。训练脚本要可复现实验记录要留痕模型版本要可回滚线上推理要有监控告警。这些不产生任何纸面指标但它们决定了项目能不能长期跑下去。2. AI工程与传统软件工程的分野五个决定性的差异2.1 不确定性是第一公民传统软件工程里if-else的逻辑是确定的输入A永远得到B。但AI系统的行为是由数据和参数共同决定的同样的代码、不同的训练数据产出的是两种不同的模型即便是相同的代码和相同的数据受随机初始化影响跑两次也可能得到略有差异的结果。这个差异带来的直接后果是你不能用传统软件工程的确定性思维来管理AI系统。传统软件出bug了查堆栈、找逻辑漏洞就行AI系统出问题了可能没有任何错误只是概率分布悄悄变了。我见过太多从传统后端转过来的工程师在AI项目上抓狂因为他们习惯性地找哪里出的错而AI系统的错误经常是渐变式的、统计层面的。应对这种不确定性的工程手段是为所有可能变化的环节设置可观测点包括数据分布、特征分布、输出分布、模型性能指标。没有观测就没有掌控。2.2 数据比代码更值得用心传统软件工程的核心资产是代码数据只是输入输出。AI工程把这件事完全倒过来了模型参数是从数据中学习出来的代码包括训练脚本、数据处理逻辑只是在帮助数据发挥效用。同样的代码数据质量不同产物天差地别。有个经典的比喻数据是原料代码是加工流水线模型是成品。原料变质了流水线再先进也产不出合格品。在我自己的项目里最花时间、最磨耐心的永远是数据处理那一关格式统一、缺失值处理、去重去噪、标签校准。这些工作听起来毫无技术含量但它的ROI比调任何超参数都高。数据工程的另一个隐形要点是数据血缘——你要能说清楚每一批数据的来源、用途和流向。生产环境里的线上推理结果经过采样回流成下一轮训练数据这个闭环一旦断裂模型就会慢慢偏离真实分布。2.3 评估体系从布尔变成概率传统软件用单元测试、集成测试来做通过/不通过的判断边界是清晰的。AI系统的评估本质上是统计学活动用一批带标签的数据去估计模型在真实场景中的表现这个估计天然带有误差和置信区间。所以AI工程的测试应该分两层。第一层是技术层的离线评估包括精确率、召回率、AUC、人工抽检等第二层是业务层的指标验证比如这个模型真的帮客服减少了转派率吗。很多项目死在第二层——离线指标合格但业务方不认可模型的实际价值因为离线评估的假设和真实业务场景根本不匹配。我常用的做法是离线评估不只看单一指标而是按业务的分支场景拆分。例如一个工单分类模型按问题类型、按客户等级、按文本长度分别评估你会发现不同切片上的表现差异巨大。只看平均指标的团队迟早会翻车。2.4 迭代模式发生根本变化训练-评估-数据-再训练传统软件迭代是代码维度的改需求、改代码、发布、验证。AI系统多了一条数据维度的循环收集新数据、清洗标注、合并旧数据、重新训练、评估发布。而且这条循环的频率和成本都远高于传统上线。这意味着AI工程的规划和排期方式也要改变。你不能用六周迭代一个版本这种纯软件节奏去管理AI项目因为你永远不知道下一轮数据质量怎么样、训练过程中会不会遇到收敛问题。我习惯把AI项目的排期设计成数据先行、模型并行即先把数据管线跑通、把标注规范定好然后模型训练可以快速跟进数据管线永远是主线任务。2.5 基础设施与依赖管理更复杂了传统后端只需要管理代码依赖和运行环境AI工程的基础设施涉及更多层次数据存储与版本管理、特征存储、训练资源调度、模型仓库、推理加速GPU/CPU混合部署、线上监控告警系统。这些组件任何一个出问题都会影响全局。印象很深的一次事故我们的推理服务一直跑得好好的某天忽然超时率飙升。排查半天发现不是模型变慢了而是上游数据源把返回格式从JSON换成了XML解析代码没做兼容导致每次请求都要多耗几百毫秒。这个问题的本质是模型外部的依赖变化但它最终影响的是AI系统的服务质量。所以AI工程师必须对整条链路的依赖关系了如指掌并且给关键依赖设置熔断和降级策略。3. 从零起步的进阶路径我建议的入门顺序与理由3.1 阶段一数学与编程——够用就好但必须真够用聊到从零开始学AI很多人第一反应就是啃高数、啃线性代数、啃概率论。我不反对打基础但反对从入门到放弃式的死磕。以工程应用为目标数学知识的够用线其实是可以划出来的线性代数会矩阵乘法、理解向量的几何意义、明白特征值和特征向量的直觉概念。这是理解Embedding和降维的基础。概率统计理解分布、期望、方差、最大似然估计、贝叶斯思想。这是理解损失函数和模型不确定性的基础。微积分重点是链式法则和梯度下降的直觉理解不需要会手推复杂偏导。编程方面Python是绝对的主力语言但会写Python和能用Python做工程是两码事。工程意义上的Python能力至少包括面向对象组织代码、环境管理conda/venv、依赖管理requirements/pyproject、单元测试、日志规范、性能调优向量化、并行。这些技能是进入真实项目的敲门砖。我的建议是不要用超过两周的时间集中补数学而是在后续的项目实践中边用边补。对成年人来说带着具体问题学概念效率远高于空对空啃教材。3.2 阶段二用一个小项目建立端到端感觉理论学再多不跑通一个完整项目你永远不知道自己哪里不会。我见过太多人卡在这个阶段数据集下载了、教程跟着跑了、代码能执行了但让他独立处理一个新问题大脑一片空白。破除这个卡点的方法是主动做一个麻雀虽小五脏俱全的端到端项目。别用Kaggle上已经处理好的竞赛数据集自己从原始数据开始走一遍全流程。什么样的项目算合格举个例子收集一批客服对话记录或评论数据自己定分类体系、设计标注规范、清洗文本、训练一个分类模型、做成一个带简单Web界面的Demo、再设计几组边界测试用例验证它。这个小小的项目本质上把AI工程的所有核心模块都过了一遍。做完后你对从数据到模型再到服务全流程就有了肌肉记忆。这个阶段不需要追求模型效果多强而是要体验和理解每个环节的输入输出和常见问题。3.3 阶段三把模型变成产品——工程化能力的分水岭训练好模型只完成了40%的工作后面还有60%属于工程化。这个阶段要刻意练习几个关键能力第一模型服务化。把训练好的模型封装成HTTP接口还是用gRPC用FastAPI还是Flask如何处理批量请求和并发这些决定线上服务的质量和吞吐。第二实验管理。训练过程中的数据版本、代码版本、超参数、评估结果都要能追溯。项目跑三个月后你还能不能复现第一次实验的效果我用过MLflow也写过最简单粗暴的Excel表格记录实验经验是工具不一定要多高级但版本可追溯这件事必须做到。第三部署与监控。模型上线只是开始你需要设计监控指标请求量、延迟、模型输出的置信度分布、预测结果的类别分布。任何一个指标异常都可能是数据漂移的前兆。这个阶段很难靠看视频学会强烈建议参与一个真实项目或者做一个超写实的模拟项目。3.4 阶段四用提示词工程和Agent扩展能力边界如果说前三阶段是经典机器学习工程的底盘那现阶段最重要的变量就是大语言模型带来的范式扩展。提示词工程Prompt Engineering和智能体Agent不是空中楼阁它们是构建复杂AI应用的新方式。提示词工程的关键能力有两个一是把业务需求翻译成对模型的清晰指令包括角色设定、任务描述、输入输出格式、约束条件、示例二是设计多轮交互的链路——当单一Prompt回答不了复杂问题时把任务拆解成多个子任务每个子任务单独调模型再汇总结果。Agent则进一步把模型调用变成模型自主编排。在设计Agent系统时我的核心原则是明确Agent的工具边界设计好任务路由和中间校验避免自由发挥导致不可控。之前做一个内部问答助手时我让Agent自主决定是否调用检索工具结果它经常在简单问题上过度调用外部工具导致响应慢、费用高。后来改成规则路由先根据问题类型判断是否需要外部知识再决定是否触发检索。这个教训说明Agent再聪明工程上也要有边界和兜底。对大模型项目的工程化我单独说几条经验一是上下文窗口是稀缺资源尽可能精简二是输出的JSON解析一定要容错模型偶尔会返回不规范格式三是成本控制要前置每次调用的Token开销要计入监控指标。4. 一个真实项目的完整拆解从业务问题到线上推理4.1 业务问题定义与数据可行性判断理论篇幅够多了我们来走一个真实的项目。就用最经典的客服工单自动分类来拆解这个场景我做过不止一次非常典型。第一步永远是定义问题而不是选模型。业务方会告诉你我希望系统自动把工单分给对应部门。这句话信息量严重不足。你要追问的是工单有多少个类别类别之间的边界清晰吗有没有历史人工分派记录可以当标签分错类别的代价有多大分配错了可能延误客户也可能只是内部转派新类别出现的频率高吗回答完这些问题你会得到一个关键结论这个任务到底适合规则系统、传统机器学习、深度学习还是大模型。如果工单类别只有5类、边界清晰、文本是标准格式化内容那BERT可能都大材小用正则加关键词就够用了如果类别有几十类、边界模糊、自由文本为主那才轮到深度模型上场。接着做数据可行性判断。我会找历史三个月的工单数据统计文本长度分布、类别分布、以及是否有足够多的样本支撑每个类别。如果一个类别只有50条样本那你首先要解决的问题是数据增强还是类别合并而不是盲目上模型。4.2 数据清洗与特征设计的实操细节项目走到数据处理环节时活儿才真正开始累。工单文本通常长这样订单xxxx延迟送达客户非常生气要求马上处理并赔偿。里面混着订单号、时间、情绪词、品牌词、标点符号不统一。我的清洗管线一般分几步规范化统一全半角、大小写、去掉HTML标签和多余空格。脱敏把手机号、地址、订单号等个人信息替换成占位符既保护隐私也避免模型记住这些虚假特征。分词中文场景先用jieba或者基于预训练模型的分词器但要注意专业术语可能被切碎。比如退款原路返回可能被切成退款/原路/返回语义会变。停用词注意不是所有停用词都该删。不没这种否定词一旦删掉类别判断会被彻底带偏。我通常只删除高频无实义的虚词。特征设计方面除了文本向量化之外我会加几个浅层特征辅助分类文本长度长文本可能是投诉短文本可能是简单咨询、是否包含金额信息、是否包含情绪强烈的词、是否包含具体商品名。这些特征对提升边界情况的判断非常有帮助。当然如果用大模型做分类浅层特征可以直接省略模型自己会理解它们的意义更多是给传统机器学习模型提供人工先验。4.3 基座模型选型为什么我最终选择微调而非从头训练项目性质定下来后就到了极其重要的选型环节用预训练模型微调Fine-tuning还是从头训练从零开始训练模型这个说法在AI工程里很有迷惑性。坦白讲真正的从零开始训练一个通用的深度模型在绝大多数商业场景下都是错误的决策。预训练模型的参数里已经蕴含了海量的语言知识你在它基础上做微调只需要很少的数据就能适配新任务。从头训练意味着你要重新让模型学一遍语法、语义、常识这需要的数据量和算力是一般团队承受不起的。我在这类工单分类项目上的选择是先用一个中小规模的预训练模型比如BERT系列的base版本微调跑通基线如果效果不够再考虑更大规模的模型或引入领域语料继续预训练Continue Pretraining。具体操作上用的是HuggingFace生态。加载模型和分词器把工单文本转成input_ids和attention_mask用交叉熵损失训练分类头。训练时要注意三个细节学习率要比从头训练小得多一般用2e-5到5e-5训练轮数不能太多容易过拟合批量大小受显存限制时用梯度累积。4.4 评估闭环离线指标与人工抽检的双轨机制模型训练完别急着说自己完成了任务——评估环节至少做三轮。第一轮是在留出测试集上看核心指标。对分类任务precision、recall、F1都要看别只看准确率。特别是类别不均衡的时候准确率会骗人如果90%的工单是账单类你全部预测成账单类准确率就90%了但剩下的那10%工单全错。第二轮是分切片评估。把测试集按文本长度、类别、是否含金额信息等维度切分逐一观察指标。这一步能暴露模型的隐性短板。我遇到过的情况是模型在短文本上表现很好但在长文本工单上准确率只有60%。后来分析发现长文本里包含多个子问题模型只能识别最后一个主题需要调整为多标签分类或加一个主问题抽取的前置步骤。第三轮是人工抽检。让业务方挑100条线上真实工单用模型预测完人工逐一打分。这一步虽然费力但比任何指标都可靠因为只有懂业务的人才知道分到A类但理由完全不对和分到B类但处理方式相同之间的微妙差别。4.5 推理服务化成本、延迟与稳定的平衡模型部署阶段我优先考虑的是延迟和成本。一个BERT-base分类模型单条推理延迟在CPU上可能50-100毫秒在GPU上10毫秒以内。工单分类对延迟不敏感几百毫秒可以接受所以可以选择CPU部署大幅节省成本但如果是实时对话系统就得考虑GPU推理和批量优化了。服务化我用FastAPI封装把模型加载、预处理、推理、后处理封装成一个类提供一个统一的predict接口。代码逻辑上有一个关键点预处理逻辑必须和训练时完全一致。这句话我强调一万遍都不为过——加载同一个分词器、执行同样的清洗和编码步骤然后才进入模型。我曾经因为线上少做了一步统一大小写导致模型输入分布和训练时不一致整体F1直接掉了10个百分点。这个坑我在后面排查章节会细讲。服务稳定性的几个工程配置模型加载后常驻内存、接口做超时控制、批量请求做排队或并发限制、模型输出做格式校验。对生产系统我还会给模型预测加一个置信度阈值低于阈值的工单不自动分类直接流转人工。这个人在环路的设计是有效的兜底方案。5. 工程落地中最容易踩的四个坑及其排查思路5.1 数据泄露训练集里混进了未来信息这类问题是最隐蔽的它会让你的离线评估虚高到不可思议。我有一次给一个时间序列预测项目做评估模型在测试集上误差几乎为零。看着那完美的曲线我第一反应不是高兴而是怀疑——正常模型不可能好到这个程度。排查后发现训练集和测试集是按时间划分的但特征工程里包含了一个最近N天均值的滚动窗口特征。这个特征在计算时用到了测试期之前14天的数据而那些数据根本不该在真实预测场景中出现——因为在线上预测时你不可能用到未来14天之后才能计算出来的统计量。严格说这是特征工程对时间边界的破坏本质就是数据泄露。处理办法是建立时间旅行检查模拟真实的预测时刻只允许使用该时刻之前可用的信息。时间序列项目里划分训练/验证集时必须按预测截止日做严格切割特征计算也必须在切割点左侧完成。5.2 线上线下不一致训练和推理的裂缝这类坑几乎每个AI团队都踩过表现形式多种多样训练时做了标准化、正则化、停用词过滤上线时忘了实现训练时用的分词器是旧版本上线时环境里自动装成了新版本训练时文本先清洗后编码线上却是先编码后清洗。排查思路其实很简单选一条训练样本完整记录从原始文本到模型输入张量的每一步中间结果再到线上服务里用同一个输入走一遍推理链路拿到对应的中间结果然后逐层比对。哪一步开始不一致问题就锁定在哪一步。我在项目里要求所有预处理逻辑都封装在训练脚本和推理服务共享的同一个模块里。这样从根源上防止两边漂移。另外代码版本和模型版本要绑定管理一个模型检查点对应一组精确的代码版本、数据版本和环境依赖版本。5.3 评估集太干净指标好看但上线就崩第三个高发坑是评估集和真实分布的偏差。团队在构建测试集时往往会不自觉地进行人工美化选的都是表述规范、类别清晰的样本用集体讨论的方式定标签。但线上迎来的可能是错别字连篇、中英文混杂、情绪化口语甚至广告垃圾信息。一个真实的教训我做一个评论情感分类模型离线AUC约0.95看起来很棒。上线一周后业务方反馈大量中性但被识别为负面的误判。抽检后发现线上评论里大量这个产品一般般吧但也不是不能用式的转折表达和反讽在干净评估集里根本没有代表性样本。这属于评估集没有覆盖真实分布的边缘情况。正确的做法是评估集必须包含一定比例的脏数据——原始未清洗的、少量噪声的、类别边界模糊的样本。我建议从真实生产日志里按随机策略采样构建仿真评估集而不仅仅依赖人工精标的数据。5.4 依赖与环境的可复现性为什么模型隔三个月就跑不出原指标这个问题在从零开始做AI工程的团队里尤其普遍。项目初期团队在各自的电脑上训练模型环境配置靠口头交流三个月后发现同样代码在不同机器上跑出来的效果对不上甚至同一台机器上重新装环境后也复现不了。我经历过最夸张的一次某天模型效果突然下降排查了两天才发现是pandas库从1.3升级到了1.5改变了某个字符串处理的默认行为导致特征构造产生了细微差异。这类问题的根源是环境不可复现。解决思路有两个层面。第一环境锁定用requirements.txt锁定所有Python包版本用Docker把CUDA、cuDNN等系统级依赖也固定下来训练和推理尽量都在容器里进行。第二实验记录每一个训练任务都要记录代码版本hash、数据版本、关键依赖版本、超参数配置和最终指标。这些记录要能做到任何一次实验都能被重新执行。工具上我推荐MLflow或简单的JSON配置记录方式重点不是工具而是养成习惯。6. 我个人沉淀的几条AI工程心法6.1 工程思维优先研究思维靠后做AI工程的时候默认心态不应该是我要把这个模型做到SOTA而是我要在这个业务约束下找到足够好的方案。SOTA只适合比赛和论文真实项目面对的是成本、延迟、可解释性、维护性的多重约束。刚入行时我特别容易沉溺于调参和换模型的快感——每次指标涨0.01都能开心半天。但后来发现真正决定项目成败的往往是那些无聊的环节数据规范是否清晰、评估逻辑是否合理、监控是否到位、回滚是否顺畅。这些工作不性感但它们是系统的地基。6.2 对一键训练脚本保持警惕我看过很多团队的训练脚本run.py一敲数据加载、预处理、模型定义、训练循环全在里面500行起步。看起来方便但对团队来说是灾难任何人改任何一处都可能悄无声息地影响整个流程而且很难追溯每次实验到底改了什么。我的实践是把训练流程拆成清晰模块数据处理、模型定义、训练循环、评估器、配置管理。配置文件单独存放每次训练自动保存配置快照。这样每个环节可以独立修改和测试也方便快速定位问题。6.3 把数据漂移监控当成生产系统的安全气囊模型上线后我至少要监控五个维度的变化输入文本长度分布、词汇分布、预测类别分布、平均置信度、业务侧结果指标。任一维度出现持续漂移都要触发告警并启动重训或人工干预的预案。有一次我注意到某分类模型的娱乐类预测比例从8%涨到了15%同时平均置信度在下降。排查后发现是社交平台改版导致文本表达风格骤变。因为监控及时我们提前两周重新收集数据、准备微调避免了线上效果断崖式下跌。6.4 小团队如何分配精力数据7成、建模2成、部署1成如果团队只有两三个人精力分配我建议走三七开——七成精力放在数据层面采集、清洗、标注、分布分析两成放在建模调优一成放在部署运维。这不是说部署不重要而是数据一旦扎实模型训练就是水到渠成的事数据稀烂建模做得再精细也是白费。最后再说一个项目收尾时的小习惯无论项目多忙我都要求团队把数据处理和建模流程写成文档哪怕只是三页纸的wiki。很多项目烂尾都烂在人走了、知识也走了。文档化的过程会让隐性知识沉淀成团队资产下一次做类似项目时你会发现自己站在了前一个项目的肩膀上。我自己从调包侠到真正理解AI工程走了不少弯路。如果让我给刚起步的朋友一句建议那就是别急着追求更复杂的模型先把你已有的模型全链路跑得滴水不漏——从数据到训练到评估到部署到监控每一步都经得起追问。这一步迈过去你才算真正进入了AI工程的大门。
返回列表