
1. 内容整体设计与思路拆解1.1 先搞清楚AI工程和单纯写模型的区别去年年初我开始接触这个标题对应的方向时一度陷入一个很典型的误区——天天刷论文、复现模型、调参玩觉得把准确率从 92% 刷到 93% 就是做 AI了。后来被拉进一个真实项目才发现模型训练只占整个系统的一小块真正的工程问题全在模型之外数据从哪来、格式怎么定、训练好的模型怎么给业务调用、线上效果掉了怎么及时发现、推理成本谁来控。这时候我才意识到所谓的ai-engineering-from-scratch核心不是从零实现一个 Transformer而是从零搭起一条完整的 AI 应用生产线。如果你也是刚入门可以参考我当时的思路把这个方向拆成六个环节——目标定义、数据和特征、模型选型与训练、评估体系、工程交付、监控迭代。六个环节串起来才叫 AI 工程少任何一个都只能算交付了一个模型文件。这篇文章就按这条链路往下走每段都会附上我自己实测过的方案和踩过的坑适合那种不想只当调包侠的数字产品经理、独立开发者、以及刚带队的初级技术负责人参考。1.2 为什么非要从零开始做一遍市面上现成的框架太多了HuggingFace 上随便下个预训练模型几行代码就能跑通一个 Demo。那年我第一版的AI 助手就是 flask 套了个人 API两小时搞定当时还觉得自己效率惊人。但真正进入生产环境就发现Demo 的每一次成功都是侥幸——依赖版本锁得死死的数据格式稍微变一点就崩连个日志都没有出事只能靠猜。从我自己的体会出发从零做一遍最大的价值在于把系统黑盒变成白盒。你自己写数据处理管线、自己设计评估集、自己配置监控告警以后任何一个环节出问题你能直接定位到是哪一天改了哪段逻辑、哪类数据的分布发生了漂移。别人给的东西出了问题你只能祈祷自己搭的东西出了问题你能处置。这种掌控感对 AI 项目的长期维护来说比什么都重要。当然从零不意味着什么都要重写一遍数学公式。我理解的是核心链路你自己串底层的重型计算让成熟库来扛。比如反向传播用框架的自动微分就行但数据配比、采样策略、评估口径这些决定项目生死的东西必须自己亲手设计。这才是工程的含金量。2. 项目目标定义与里程碑规划2.1 先定义什么叫做成再动手写代码我见过太多项目死在第一个月根子不在技术在于一开始就没想清楚目标。做 AI 工程和做传统软件最大的差异是传统软件需求清楚写就完了AI 项目需求天生模糊你又不能上来就问老板准确率要多高——因为准确率本身就不是一个业务指标。我习惯在第一周拉着业务方一起做三件事第一把业务问题翻译成预测问题比如智能客服的诉求是减少人工介入那预测目标是这个对话需不需要人工接管第二定义清楚正样本和负样本坏数据比缺数据更可怕一个标注错的正样本能带偏整个模型的判断第三定出上线及格线比如说接管的准确率达到 85%同时人工复核的成本降低 30%不是追求 100%因为 AI 项目的边际收益通常不是线性的盲目追高往往把成本翻好几倍、收益只涨一两个点。目标定完我会把项目拆成三个里程碑。第一个里程碑叫端到端能跑通哪怕效果惨不忍睹但数据能灌进去、模型能训练、接口能返回结构化的预测结果最多花两周第二个里程碑叫满意且稳定核心指标达到及格线并且连续一周波动在可接受范围内通常要一个月第三个里程碑叫可交付可维护补上监控、日志、回滚机制和模型更新的标准流程这个阶段可能再花两三周。我见过最快的团队把这三个里程碑压到六周但前提是数据质量一开始就很好这个前置条件不可轻易复制。2.2 资源规划算力、人力与时间哪个最贵算力规划这件事我的经验是用实验次数 × 单次成本来估算而不是看峰值的机器规格。第一个里程碑阶段我用单卡就能满足大多数中小规模的需求但进入调优阶段以后并行跑实验的需求上来了我通常配置一个四卡的小集群因为串行调参的等待时间成本往往比租机器的成本高得多。人力分配上我的优先级是数据工程师最贵其次是做评估和数据分析的人模型训练反而是门槛最低的一环。现在开源社区太成熟了真正卡住进度的往往是数据标注标准不统一导致返工三周这类数据问题而不是模型收敛不了。时间规划上一定要预留 15% 的缓冲不要排满。整个链路里代码出 bug 都能查但数据标注错了往往要等业务方重新确认这种依赖外部反馈的环节时间不可控排期一定要留余量。有个特别容易踩的坑就是想一步到位买最好的机器。其实第一个里程碑阶段哪怕是几年前的旧卡也够跑数据预处理和基线模型等确定模型规模再投入更高规格的资源也不迟。我第一年做项目时直接上了新卡后来发现大部分时间 GPU 利用率不到 20%而这个钱本可以省下来去多标几千条高质量样本。3. 数据工程的从零搭建3.1 数据采集与清洗把垃圾进垃圾出这条铁律刻在脑子里数据质量是决定 AI 工程上下限的头号因素我自己在这上面的教训就值三次大坑。第一版项目从网上爬了一堆数据没做去重就喂进去训练结果验证集里跟训练集高度重合看起来准确率 97%一上线立刻被打回原形。后来重新严格按哈希值去重才看到真实水平大概在 88%。所以做数据工程的第一件事先建去重机制再谈建模。采集阶段至少要问自己三个问题数据量够不够覆盖边界情况正负样本比例会不会失衡样本的时效性是否符合业务现状。我会针对每个问题写对应的校验脚本比如统计类别分布、检测时间戳异常、识别字段缺失比例。当年写的第一版脚本会自动把空值全填成未知结果模型把未知学成了一个有效类别上线后一堆异常输入全命中这个类别排查了半天才发现是填充策略埋的雷。清洗环节我的做法是分层处理格式层清洗负责统一编码、去掉乱码和控制字符语义层清洗负责识别无效信息比如重复文本、无意义语气词一致性层清洗负责正则化时间、金额、地点这些实体表达。这三层清洗直接决定模型特征的质量值得投入比建模多一倍的时间。3.2 标注方案的避坑指南标注环节是数据工程里最容易失控的最大的坑是标准写得不够具体。我第一版标注文档说判断该评论是否包含消极情绪结果三个标注员给出的标签一致性只有 65%。后来我把标准改成评论中出现负面情感词汇、消极体验描述或明确差评倾向时标记为消极若同时存在积极与消极内容以主要情绪倾向为准一致性立刻提到了 88%。另一个坑是标注数据分布被刻意均分了。当时质检的时候发现标注员很聪明地认为正反两类各标 50% 才算合格结果样本分布完全偏离自然规律训练出来后模型判断天然偏向均衡。解决方式是硬性要求标注员按原始顺序处理不允许挑着标并在后台统计每人的正负比例偏离超过 15% 就人工介入复核。如果你预算有限也可以先把规则代码写出来做粗标再由人去修正机器判断错误的样本。实践下来这种预标注人工修正的模式比纯人工标注快 40%而且质量并不差。但前提是你的预标注规则足够准低于 70% 准确率时人看机器的错误标注反而会产生锚定效应导致标注质量更差这一点要特别注意。3.3 特征工程让模型站在数据之上特征工程近年的口碑有点两极分化有人说深度学习时代不需要特征工程了我的实战感受是需要但需要的方式变了。以前是手动构造大量离散特征给 LR 用现在更多是设计信息通路把原始数据组织成模型更容易学习的形式。我实践中收益最高的三类特征处理是第一文本数据做长度截断和分段而不是整篇塞进去超出窗口的尾部信息往往含噪截断后效果反而更稳第二时间特征做周期切分比如拆出小时、星期、是否节假日而不是直接丢一个时间戳第三ID 类特征不做 target encoding 的话就不用处理做了反而容易过拟合。实操中还要注意特征穿越问题。比如用整个样本集统计的均值去填缺失值会把未来信息带到训练集里验证时指标虚高上线就崩。正确做法是只用训练集的统计量做填充并把这个统计量序列化保存线上推理时加载同一个统计量。当年我被这个问题坑过一次之后所有特征处理函数都强制拆成 fit 和 transform 两步训练和推理共用同一套逻辑再也没出过类似事故。4. 模型选型与基线建立4.1 选型原则先让复杂的系统简单跑起来选模型的时候我见过两类人各踩一边一类是无脑上最前沿的大模型一个亿级参数的模型塞进一个小业务里推理延迟根本扛不住另一类是畏手畏脚总想着先把所有数据处理完美再开始建模。正确的做法是先选一个最鲁棒的方案把整套链路跑通建立一个不太好看但是真实的基线之后的所有改进都拿这个基线来对比收益。具体的选型逻辑可以按数据形态来走。数据是纯文本中小规模场景可以直接用预训练语言模型做微调如果是表格数据为主树模型往往是性价比之王实测在很多结构化数据上它对特征尺度不敏感、调参成本低稳定性也远超玄学好调的神经网络如果文本加结构化混合则先分别建模再做融合。我的原则是可解释性要求高就选简单模型纯效果导向才考虑大模型不要为了技术新鲜感增加运维成本。4.2 基线模型的建立与记录规范基线模型的设计目标不是效果最好而是流程正确、指标可复现。我在第一个里程碑通常会用一套默认参数直接跑正则系数设置居中学习率设置适中偏保守训练轮数固定不做花式调整保证任何时间重跑都能得到几乎一样的结果。关键的细节是实验记录规范。我吃过太大亏了最开始调参时靠记忆结果过了两天就忘了哪个参数配哪组指标后来不得不重跑实验。现在我会给每个实验建一个固定格式的记录数据版本、特征代码版本、模型配置、训练耗时、评估指标、线上推理耗时以及备注。有这套记录之后回溯任何一个线上问题都能很快对应到当时的实验版本。基线实验跑通过之后我建议大家顺手做一个该模型的错误分析把模型预测错的样本单独拉出来看分门别类统计。这个工作看起来朴素但对下一步调优的方向决策作用巨大——你会清楚地知道是缺数据、特征不合理、标注错误还是模型容量不够。我见过一个项目准确率卡在 90% 上不去做完错误分析发现将近一半的错判来自同一种少见样本补了几百条数据后直接涨了两个点。4.3 常用训练参数的抄作业配置开始调模型之前给一组我实际验证过的、在不同场景下都比较稳的初始参数。文本分类场景学习率建议 2e-5 到 5e-5batch size 在 16 到 32 之间训练轮数不要太贪除了监控损失我还会盯验证集的每轮指标一旦连续几轮不涨就停掉节省大量时间。表格类任务用树模型重点是限制树的深度和叶节点数以及特征采样比例这些参数控制的是模型的复杂度比盲目加大迭代轮数收益更大。还有个容易困扰新手的点要不要做数据增强。我的经验是数据增强只能解决数据多样性不足的问题不能解决标签噪声大的问题。如果标注本身不可靠加再多增强反而是强化错误。另外任何数据增强手段都必须只在训练集上做验证集和测试集要保持原始分布否则评估结果虚高上线必现原形。5. 评估体系的设计与效果调优5.1 评估指标别只看准确率要结合业务代价准确率是最直观的指标但绝不是唯一应该看的。当正负样本比例失调时一个什么都不预测的模型也能有很高的准确率误导性非常强。真正做项目时我会先和业务方确定两类错误的代价把普通用户误判为高风险带来的打扰成本和把真正高风险放过带来的漏判成本。这两者往往差着一个数量级决定了模型调优的方向。举例来说去年做一个内容审核辅助工具正样本比例只有 3%。只看准确率的话模型全判负也有 97%但业务真正需要的是在误伤尽量少的情况下召回更多的正样本。这种场景下我会直接看召回率、精确率、F1 这三件套并且明确我认可的最优阈值是偏向召回还是偏向精确。训练时模型输出的通常是概率上线时通过调整阈值来控制判决策略这个阈值的选择应该基于验证集上误报代价与漏报代价的权衡不能拍脑袋。5.2 过拟合的早期信号与纠偏策略训练初期损失值快速下降是好事但如果训练损失持续下降的同时验证损失开始回升那就是过拟合的典型信号此时停手是最明智的。我常用的正则手段按优先级排序依次是增加数据效果最直接、降低模型复杂度、加大正则强度、做早停、做交叉验证。早期的一个项目里我的训练集和验证集划分没做分层采样导致验证集全是一个类别的数据分布看起来像过拟合实际上是数据划分不均匀。正确的做法是分类任务做分层采样确保训练和验证集里各类别比例与整体一致如果涉及时间序列特性还得保证验证集在时间上晚于训练集模拟真实线上场景。判断一个指标波动到底是因为模型问题还是数据问题我用的快捷方法是看同一份验证集多次评估的波动范围如果波动本身就很大说明评估集规模太少或分布不稳定先解决评估可靠性再谈调参。5.3 利用可视化工具快速定位问题很多新手习惯只看最终指标数值很少画曲线。但实际上训练曲线的形状能透露大量信息训练损失和验证损失之间的距离就是过拟合的直观度量曲线长时间不下降说明学习率可能太小一步正常一步飙升多半是 batch size 太小或学习率太大验证曲线剧烈震荡则需要检查验证集是否稳定、有没有对验证集做过数据增强。训练结束后我还会做一次特征重要度的排序分析。这一步在树模型上有现成 API 可以输出在神经网络模型上则可以用更持久的置换特征法。拿到的排序不是用来决定上线与否的而是帮助自己理解模型在靠什么信号做判断失去业务合理性的重要特征就说明数据清洗有严重问题。这个视角太关键了因为工程交付的模型不仅是代码和权重更是业务侧能理解的决策逻辑。6. 工程化部署与线上稳定运行6.1 模型部署形态的选型模型训练完成只是中点真正的工程挑战在部署环节。部署形态基本三种批处理预测、实时 API 服务、嵌入式推理。批处理适合离线跑分场景比如每日定时给用户列表打分做一次全量计算然后存入数据库实时 API 适合延迟敏感的场景比如对话审核、实时推荐嵌入式推理则适合端侧或离线环境比如手机端应用、边缘盒子。选型的核心评估维度是延迟、吞吐和更新频率需求。我的建议是能用批处理解决的不要上实时服务。实时服务意味着你必须处理高并发、限流、熔断、模型热加载、监控告警这些基础设施的成本往往是模型本身的好几倍。如果业务场景允许延迟几分钟先把批处理跑起来观察线上效果确认有价值之后再花资源上实时服务这个节奏最稳妥。对于必须上实时服务的场景我给一个基础技术栈组合参考推理框架选 ONNX Runtime比原始框架的推理性能高不少而且不绑定训练框架服务层用官方长期维护的异步框架配合 gunicorn 等多进程部署模型热加载用文件监听触发版本发布避免每次升级都要重启服务。我的第一版线上服务就吃了每次模型更新要停机 5 分钟的亏后来改成热加载方案模型更新不停服秒级生效体验完全不一样。6.2 特征一致性线上和训练必须完全对齐部署时最容易出的事故就是训练时的特征处理逻辑跟线上不一致。我以前做文本特征时训练代码里有个去特殊符号的正则但线上的预处理代码是另一个人写的少处理了一个符号类型上线后这部分样本的特征分布直接变了预测结果一塌糊涂。后来我规定特征处理的代码必须打包成同一个模块训练时导入这个模块处理数据上线服务也导入同一个模块处理请求从源头上杜绝分叉。特征一致性检查还有一层特征缺失时的默认值。训练时缺失值用均值填充线上缺失时也要用同一个均值不能直接用 0 填充否则模型拿到的分布完全不同。我建议在服务里写一个单元测试拿训练集的样本跑一遍线上特征处理然后对比特征输出是否一致不一致立刻报警。这个测试虽然简单但在我的项目里拦住过三次因重构代码导致的事故。6.3 模型监控与告警配置模型上线后并不代表任务结束恰恰相反持续维护的挑战才刚刚开始。模型监控要做三层第一层是服务监控看延迟、错误率、QPS这是传统运维那套第二层是特征监控比对线上输入特征的分布和训练时是否有漂移第三层是业务效果监控看模型实际产出带来的业务指标变化比如审核率、通过率、用户反馈率。特征漂移的检测最简单有效的方式是定期按天统计线上特征的关键百分位和训练基线做对比偏差超过阈值就触发告警。业务效果监控则需要定一个可量化指标例如推荐系统的点击率、审核系统的误报率这类指标能直接反映模型是否仍然适应当前环境。第三个容易被忽略的指标是无预测占比也就是模型输出的置信度极低或直接失败的比例这个比例异常爬升往往意味着遇到了分布外的新数据需要及时补充样本或触发再训练流程。7. 常见问题与排障经验7.1 训练不收敛排查顺序训练不收敛时的排查顺序比排查方法本身更重要乱试参数只会浪费大量时间。我按以下顺序排查第一步检查数据管道确认喂进模型的张量形状对不对、标签有没有错位我遇到过大约 30% 的训练异常是数据管道 bug第二步检查损失函数看是不是用错了损失函数的变体或者标签类型和损失函数不匹配第三步检查优化器参数学习率过大是最常见的不收敛元凶第四步才考虑模型结构看初始化、归一化层、残差连接这些结构性问题。有个实际的坑值得单独说多分类任务用交叉熵损失时如果标签从 1 开始而不是从 0 开始模型会一直学不正损失高居不下。这类小细节定位起来特别费劲因为代码逻辑看起来完全没问题。后来我会在每次训练启动时打印一小批输入和标签的样例肉眼核对一遍再开长训练这个习惯帮我节省了大量试错时间。7.2 线上效果不如测试的 3 个常见原因线上效果与测试集效果差距大问题通常逃不出三处。一是训练测试分布不一致测试集没能代表真实线上数据的分布这属于数据采集时的覆盖面问题二是特征不一致就是第四节讲的训练线上特征逻辑没对齐三是数据延迟问题模型用到的特征在线上拿到的时间点比训练时拿到的晚得多这在实时推荐场景特别典型训练时特征都是事后补齐的而线上推理时用到的是不完整实时特征信息量天然打折。第三类问题的解法是在训练时就模拟线上可获取的特征集宁可用线上能拿到的数据训练也不要用事后才能拿到的完整数据训练。很多团队把全部精力放在调模型上却忽略了模拟线上推理环境做训练结果一上线效果直接对半砍。这个点可以说是线上效果保障里最容易被低估的一环。7.3 排查知识库速查表我把这些年踩过的典型问题整理成一张速查表遇到问题可以按图索骥去排查。症状最可能原因快速验证方法解决方案训练损失不降学习率过大或数据管道出错打印首批输入标签肉眼核对降低学习率修数据管道验证损失先降后升过拟合看训练与验证损失间距加数据或加正则、早停训练集指标极高测试集崩塌数据泄露或评估集过小检查特征是否用了未来信息修正特征处理逻辑扩评估集线上效果明显弱于测试特征不一致或数据延迟跑单测对比特征输出统一特征代码模拟线上推理某类样本全预测错标注噪声或该类样本过少对错误样本聚类分析重新标注补该类训练数据7.4 一个从“垃圾效果”到“放心交付”的实战复盘最后一个复盘想认真写下来。去年接了一个文档分类项目刚开始第一版基线效果很差准确率只有 71%业务方根本不愿意用。我当时按老思路调模型连续调了一个多月勉强到 79%卡死了怎么做都上不去。后来停下来做了个决定不做任何模型调参花两周时间去逐条看模型错误的样本找规律。这一看发现了真问题。第一标注文档的标准里有歧义三个标注员对求助帖和讨论帖的边界理解不一致有一大批标签本身就是错的第二某些类别的文档极少模型相当于没学过第三文本里大量使用了表格数据纯文本截断后丢了大半信息。发现这三个问题后我重新召集业务方统一标注口径修正了一千多条标签把对表格类文档的解析能力补上专门写了解析模块处理表格文本为稀缺类别从历史库捞数据并做了针对性增强。这次改动之后准确率直接跳到 88%而且这次涨上去的指标非常坚挺不像之前调参调出来的虚高连续几周都稳定在 87% 以上。那次复盘让我彻底确认了一件事AI 工程的瓶颈通常不在模型而在数据理解和问题定义。会调参是加分项能把数据问题找出来并摆平才是决定项目生死的关键能力。8. 扩展方向与个人体会8.1 以这个项目为底座还能延伸出什么从零搭完这套 AI 工程链路后能力是可以复用的更换模型和数据形态环节一个都不会变。我第一个做完的项目是文档分类接下来我把同一套框架迁移到了用户意图识别、内容风险检测和个性化推荐任务上每个新项目至少省去了 60% 的基建时间。数据工程、评估体系、监控告警、部署流程这些环节的代码和最佳实践能沉淀成公司的内部工具包让团队里其他成员起步就站在一个相对可靠的基础上。目前我个人的重点方向是数据版本管理的进一步完善。模型和代码有版本管理是标配但数据版本的管理在团队里还不够严格已经发生过两次因为数据集悄无声息变了导致评估结果无法对齐的情况。我准备引入统一的元信息登记在每次训练时把数据集版本、字段说明、清洗规则都固化成一份信息文件并纳入团队上线发布流程中检查。8.2 我在整个过程中最深的三个感受一是不要急于上复杂方案先把简易方案跑通许多高级技巧是在基线不够用时才会发挥价值过早引入只会增加排查范围。二是学会用数据说话不要靠感觉调模型任何调整都先想清楚验证集指标能不能反映这次变化不能反应就重新设计评估。三是务必要有工程底线模型效果再好没有监控告警就别上生产没有回滚方案就别做版本更新这是对自己也是对用户负责。回顾最初从零开始做 AI 工程这个决定我不后悔这一路踩过的每个坑现在看都是学费学到了课本里不会写的经验。如果你也正站在这个起点上建议先把本文提到的最后一个里程碑——负责线上稳定运行的那套机制——当成你交付模型的基本前提去实践能少走很长一段弯路。