ARTICLE DETAIL

资讯详情

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

从零构建AI工程:数据、模型到部署运维全链路指南

从零构建AI工程:数据、模型到部署运维全链路指南 如果你是一个写过几年代码的工程师最近突然觉得“AI”这两个字铺天盖地但又总觉得那些教程要么停留在调用API的层面要么一上来就是整页的数学公式那你大概率会喜欢这类标题。《ai-engineering-from-scratch》听起来像是一个GitHub仓库名实际上它也确实是社区里很流行的一类项目的命名方式——它想表达的不是“再教你调一次接口”而是“把一个能跑、能上线、能维护的AI系统从头到尾亲手搭一遍”。这篇文章我打算从工程落地的角度把这个“from scratch”的过程拆开揉碎讲清楚。不局限于某个框架也不默认你已经会了PyTorch或Kubernetes而是把AI工程化这条链路里的每一个关键节点——需求定义、数据准备、模型训练、评估调优、部署运维、LLM应用开发——完整过一遍。适合谁看适合那种“代码能写、但还没完整交付过一个AI项目”的工程师也适合刚入门想建立全局视角的同学。1. 整体设计不要把“从零开始”误解成“从公式开始”1.1 从零构建AI工程能力到底在构建什么很多人一听“AI Engineering from Scratch”第一反应是“那我得先把线性代数、概率论、凸优化全啃一遍”。这个想法其实把顺序搞反了。我做过的几个落地项目告诉我AI工程的第一关从来不是模型原理而是“你能不能把一个模糊的业务问题翻译成一个可评估、可迭代的工程问题”。举个真实的例子。早年我接过一个需求业务方说“我们想搞一个智能推荐把用户喜欢的内容推给他”。这个需求扔给刚入行的同事他可能直接就去搜推荐算法了。但实际上你需要先问清楚用户行为数据有没有埋点数据存在哪里什么叫“喜欢”是点击、收藏、还是停留时长推荐结果展示在哪个位置一天有多少曝光量这些问题不落实后面不管是用DeepFM还是用BERT做内容理解都是空中楼阁。所以真正的“从零开始”第一步不是选模型而是建立一套工程思维的框架。这套框架包含三个层次数据层、模型层、交付层。数据层解决的是“有没有数据、数据干不干净、特征怎么来”模型层解决的是“用什么算法、怎么训练、怎么评估”交付层解决的是“模型怎么上线、怎么监控、怎么迭代”。三者的权重在真实项目里大约是4:3:3数据层的比重往往比大多数人想象的要高。1.2 为什么说“调包”和“工程化”之间隔着一道鸿沟现在网上随便一搜就能找到几十个教程教你怎么用几行代码跑通一个MNIST手写识别或者用transformers库调用一个BERT模型做情感分析。这些教程本身没问题但它们给人的错觉是“AI就这么简单”。等你真正开始做一个需要长期维护的项目才会发现事情远没有那么顺利。我见过太多类似的场景模型在Jupyter Notebook里跑得好好的准确率95%以上但是一准备上线就卡住了。为什么因为Notebook里的代码是线性的数据是一次性读进内存的模型训练完就扔在那里没有任何版本记录。而工程化的要求是数据变了怎么办特征和模型一起更新怎么保证一致性线上推理的延迟能不能扛住模型出错的时候怎么快速回滚这些问题的答案都不在算法本身而在工程体系里。这就是我说的那道鸿沟——调包解决的是“模型能不能跑通”工程化解决的是“系统能不能长期稳定地跑下去”。From scratch的意义就在于此你亲手把每一个环节都搭一遍踩过那些坑才能在后续的项目里知道问题出在哪儿。1.3 从零开始的学习路线一条主线三个支线基于我自己带项目和带新人的经验从零开始构建AI工程能力最好的路径不是按教科书顺序把数学补完而是以“端到端交付一个项目”为主线遇到什么补什么。主线就是定需求 - 采数据 - 清数据 - 做特征 - 选模型 - 写训练代码 - 评估 - 封装服务 - 部署上线 - 监控迭代。三个支线分别是编程基本功、机器学习基础、DevOps技能。编程基本功主要指Python的工程化写法不只是会写脚本而是懂得用虚拟环境管理依赖、用类型注解提升可读性、用pytest保证代码质量。机器学习基础至少要理解损失函数、梯度下降、过拟合、交叉验证这几个核心概念不需要推导所有公式但得知道它们分别在解决什么问题。DevOps技能则是容器化、CI/CD、日志监控这一套这些决定了你的模型能不能在别人机器上跑起来。这条路线走一遍大概需要三到六个月业余时间。走完之后你会发现之后再看到任何AI项目你都能快速拆解它由哪些部分组成而不是只盯着模型结构。2. 核心基础三大支柱与一套工具链2.1 Python工程化写脚本和写系统是两码事如果你是从数据分析转过来的或者一直用Notebook写代码那工程化Python可能是你第一个要迈过去的坎。我自己带过不少新人最明显的问题不是不会写Python而是写出来的代码没法维护、没法测试、没法复用。工程化Python的第一件事是依赖管理。很多初学者装包就用pip install xxx装完就完事。但过一个月再打开项目发现依赖冲突Python环境一团糟。正确做法是每个项目建独立虚拟环境用requirements.txt或poetry锁定依赖版本。推荐直接用uv或poetry它们的依赖解析速度比pip快很多而且锁文件能保证生产环境和开发环境一致。第二件事是项目结构。我常用的一个模板大概是这样的project/ ├── configs/ # 配置文件yaml或json ├── data/ # 数据存放原始数据与处理后数据分离 ├── features/ # 特征工程代码 ├── models/ # 模型定义与训练脚本 ├── services/ # 模型服务封装 ├── tests/ # 单元测试 ├── utils/ # 工具函数 └── main.py # 入口脚本这个结构不一定适合所有项目但它强制你区分“数据怎么流动”“代码怎么组织”“测试怎么放置”。一个判断标准是如果把你的代码交给另一个工程师他能不能不看你的解释就搞清楚每个文件是干什么的。如果不能说明结构还不够清晰。第三件事是学会写单元测试。很多人觉得AI项目没法写测试因为模型输出带有随机性。但测试不只是测模型的准确率更核心的是测数据处理的逻辑、特征的顺序、接口的输入输出。我习惯给特征工程代码写测试因为这是最容易因为数据格式变化而出错的地方——比如某个字段从字符串变成了数值、缺失值从空变成了NaN这类问题如果没有测试兜底上线后一定会暴露。2.2 机器学习核心概念不需要数学天才但需要直觉正确我见过不少完全没学过数学的人把模型调得不错也见过数学系毕业的人做的模型上线就崩。数学功底和工程能力确实没有必然联系但有几个核心概念我建议无论如何都要建立直觉层面的理解。第一个是损失函数。损失函数就是你告诉模型“什么叫错得离谱”的方式。拿推荐场景举例预测用户会不会点击一个商品你可以用交叉熵预测商品的销量你可能用均方误差。关键不是会背公式而是遇到一个新任务时能判断我该用什么损失函数来匹配业务目标。比如排序任务讲究的是顺序对不对那就要用能体现排序质量的损失而不是单纯看绝对值误差。第二个是过拟合。这个概念说起来人人都懂——模型在训练数据上表现太好到了新数据上表现拉胯。但真正在工程里识别过拟合并不容易因为它常常伪装成“这个模型效果真好”。我的体检方法是训练集和验证集的表现差距超过一定阈值就警惕同时观察训练曲线是否在后期出现剧烈震荡。更工程化的手段是交叉验证把数据切成多份轮流做验证集比单次划分靠谱得多。第三个是偏差与方差的权衡。简单理解偏差大是模型太简单连训练数据都拟合不好方差大是模型太敏感稍微换个数据分布结果就飘。工程上我们常常通过集成学习来压方差通过增加特征或模型复杂度来压偏差。这个权衡关系贯穿整个模型调优过程理解了它你就知道为什么加正则化、为什么做交叉验证、为什么集成模型通常比单模型稳。基础并不等于简单。拿梯度下降来说你不需要从头实现它但最好知道学习率太大导致震荡、太小导致收敛慢是怎么回事。这些直觉会在你调参的时候发挥巨大作用——尤其是当你面对几十个超参数不知道该动哪个的时候对基础概念的理解能帮你缩小搜索范围。2.3 工具链选型做AI工程不是比谁框架用得花哨工具链这块我的建议是“选熟不选新、选稳不选热”。AI工程里最核心的几类工具我用下来是比较固定的。编程语言与IDEPython是绝对主力配合VS Code或PyCharm都行。VS Code轻量插件生态好PyCharm对Python的支持更深度调试体验更好。看个人偏好不用纠结。数据处理pandas和polars是日常主力。polars在数据量大时比pandas快得多而且语法更现代化不过pandas生态更成熟教程也多。我的建议是中小数据集pandas就够了遇到千万行以上再考虑polars。模型训练PyTorch是当前事实标准生态最丰富。TensorFlow在部分生产环境还有存量但新项目直接用PyTorch基本不会错。Keras作为高级API适合快速原型但深入研究还是直接写PyTorch更灵活。实验管理MLflow是目前最通用的选择开源、支持多种框架能记录参数、指标、模型产物还提供模型注册功能。WandB的界面更好看但SaaS版有数据出境和费用问题团队内部用MLflow自建更可控。部署与运维Docker是底线要求Kubernetes是大规模部署的选择。如果项目还没到K8s的规模用Docker Compose串起服务就够用了。我特别想强调一点不要为了用某个工具而用某个工具。如果你的项目只有两个模型服务完全没有必要上一套复杂的K8s加Istio。工具的复杂度应该跟着项目的复杂度走否则光维护基础设施就能耗尽你的精力。3. 数据工程AI项目真正的分水岭3.1 数据获取与清洗决定模型上限的往往不是算法业内有一句话叫“垃圾进垃圾出”Garbage In, Garbage Out我做了这么多个项目对这句话的体会越来越深。模型算法的进步当然重要但在大多数真实业务场景里数据的质量对最终效果的影响远大于模型结构的细微差别。数据清洗看似是脏活累活但它对结果的影响非常直接。我自己的经验是80%的精力要花在数据理解和清洗上20%才轮到建模。具体来说第一步先做数据探查每个字段的类型对不对取值范围合不合理缺失率有多高分布长什么样。这一套下来你基本就能知道这个项目最大的风险在哪里——是缺数据、是标签噪声大还是特征分布太稀疏。第二个常见问题是标签的定义。很多业务系统不会直接给你一个“标签”字段需要你自己从业务规则里推导。比如做流失预测“流失”的定义是30天没登录还是90天没下单这个看似简单的定义问题直接影响样本的正负比例和模型学习的目标。如果定义不清模型学到的规律会与业务预期南辕北辙。第三个是数据版本管理。模型的训练数据不是一成不变的你今天在T1的离线表上训练明天换了一批数据模型的效果可能就会波动。所以数据版本与模型版本的对应关系必须能回溯。用DVC这类工具管理数据集的版本快照是工程化程度的一个重要标志。3.2 特征工程的三个层次从直接使用到自动生成特征工程在深度学习时代看起来没那么重要了——因为神经网络可以自动学习特征表示。但我要说的是这并不意味着你不需要做特征工程而是特征工程的形态变了难度也变了。最低的层次是直接用原始字段顶多做做缺失值填充和标准化。这种方式在数据量小或特征本身信息量大的时候够用。第二个层次是做业务特征比如在风控场景里计算用户的“近30天借款次数”“历史逾期率”这些特征携带了强烈的业务知识靠模型自己从原始数据里学往往学不出来因为模型不知道哪个统计窗口是业务上最有区分度的。第三个层次是自动化特征生成。像Featuretools这类库可以做深度特征合成Deep Feature Synthesis它会根据表之间的关联关系自动聚合出统计特征。不过在我实际用下来的体会是自动生成的很多时候是为了指标好看业务可解释性比较差。我的建议是业务规则明确的时候人工做特征业务规则不明确、数据量大的时候再考虑用算法自动生成。全自动特征工程大规模取代人工至少在很多垂直行业还没到来。有一个经验可以分享特征工程做得好的项目模型从V1到V2的提升往往比换更强的模型来得大。这背后的原因不难理解——特征是模型理解的“语言”你把业务知识翻译成特征模型就不需要自己从头猜。3.3 数据管道的搭建批处理与流处理的工程实践数据管道解决的是“数据怎么从源头流到模型训练和服务”的问题。在真实项目里最常见的数据管道形态有两种批处理Batch和流处理Streaming。批处理的代表是Airflow或更轻量的Prefect。它会按照调度计划定期从业务库抽取数据、清洗、计算特征、写入特征库或训练集。它的优点是逻辑简单、容易排查缺点是延迟高适合对实时性要求不高的场景——比如每日更新的推荐模型、每周重训的风控模型。流处理则是用Kafka加Flink或Spark Streaming数据一产生就被消费并实时计算特征适合风控实时拦截、实时个性化推荐这类需要毫秒级响应的场景。流处理的最大优势是数据新鲜度但代价是系统复杂度成倍上升还涉及时间窗口、数据乱序、状态管理这些麻烦问题。我见过不少团队一上来就搞流处理最后发现业务根本不需要那么高的实时性反而被复杂的运维拖累。我的建议是能批处理解决的问题绝不上流处理非要上流处理的场景一定要先明确延迟指标比如“用户点击到推荐结果更新延迟不超过5秒”这个指标推导出技术方案而不是看着“实时”两个字就激动。4. 模型训练与评估从跑通到可信4.1 实验管理谁跑过什么、效果如何、怎么复现如果你经历过“把模型调好了但忘记记录参数”的窘境就会明白实验管理的重要性。我早年管理过一段时间的重训练任务每次参数都是手动改、手动记结果就是一到复盘就变成“上次跑的效果很好但具体用的什么参数一时想不起来了”。MLflow就是在这样的痛点下成为标配工具的。它做的事情很简单每一次训练把代码版本、参数配置、数据集版本、评估指标、模型文件都打包记录。过了三个月回来你还能通过一条记录完整还原当时的实验环境。具体来说MLflow Tracking负责记录指标和参数MLflow Models负责模型打包和注册MLflow Registry管理模型的版本与状态Staging、Production、Archived。配合一个简单的约定——每次实验都在同一个项目仓库里跑用统一的入口脚本启动——就能保证实验的可复现性达到90%以上。再补充一个细节实验记录的命名规范也很重要。我习惯的命名格式是项目名_模型类型_特征版本_日期_序号比如recall_dssm_v3_feat20240901_01。这个命名能让你在一堆实验记录里快速找到可用版本而不是打开列表看到一片纯数字ID。4.2 训练过程的坑数据泄漏、样本不均衡、评估指标陷阱模型训练中的坑最常见也最隐蔽的是数据泄漏Data Leakage。这个词说的不是网络安全而是指模型在训练时“偷看”了本不该看到的信息导致训练指标虚高上线后效果暴跌。举一个具体例子。在做用户行为预测时如果特征里包含了用户“未来7天”的行为统计那么模型在训练时就已经知道了答案验证集准确率95%以上但线上完全不可用。这种泄漏一旦发生非常难察觉因为它只影响模型效果不报错。所以在做特征的时候我强烈建议每一步处理都问一句“这个特征在预测时刻真的能拿到吗”时间顺序必须严格遵循“只用过去预测未来”的原则。样本不均衡是另一个高频问题。比如风控场景正常样本可能是坏样本的几十倍甚至上百倍。直接用原始分布训练出的模型会倾向把所有样本都预测为正常因为这样整体准确率也很高。解决办法不外乎几种欠采样、过采样、调整损失函数中正负样本的权重、用AUC而不是准确率评估。这些方法各有利弊我的经验是先试类别权重再考虑SMOTE这类合成样本的方法最少改动往往带来最大的收益。评估指标的陷阱也很值得警惕。准确率Accuracy在样本均衡时看起来很直观但样本不均衡时就是误导性的指标。比如99.9%都是正常样本全预测为正常也能有99.9%准确率但这个模型没有任何价值。工程上要针对业务痛点选择指标——排序任务看AUC或NDCG异常检测看召回率和误报率信息检索看MRR。指标的设计本质上是在回答“模型在业务上到底好不好用”这个问题。4.3 超参数调优手动炼丹不如系统搜索调参是AI工程中最让人觉得“玄学”的部分。实际上它有成熟的方法论不需要完全靠经验和运气。最基础的是手动搜索Manual Search就是根据经验和直觉调整几个最重要的参数比如学习率、层数、Dropout比例。优点是灵活缺点是效率低、不可复现。网格搜索Grid Search会遍历所有参数组合是一种暴力但可靠的方式缺点是组合爆炸参数一多就扛不住。随机搜索Random Search在实践中往往比网格更好因为它能以更少的尝试覆盖更有价值的参数空间Bergstra和Bengio那篇论文已经证明了这一点。更高级的是贝叶斯优化用Optuna这类库实现。它会在已有的实验结果基础上预测下一个可能更好的参数组合收敛速度比随机搜索快不少。我在实际项目中用得最多的是Optuna配PyTorch的LightGBM这类模型几百组试验跑下来通常能找到比手动调参好5%-10%的组合。不管用什么搜索方法都要先明确搜索空间。比如学习率的范围定在1e-5到1e-1之间用对数尺度均匀采样比线性尺度更好——因为学习率这个参数本身对数量级敏感。这类细节听起来不起眼但对搜索效率的影响非常大。5. 部署运维模型上线只是开始5.1 模型服务的封装从离线到在线的跨越模型从训练完成到真正被业务使用中间隔着“服务化”这道工序。不是说把模型权重文件放服务器上加载就完事了而是要考虑并发、延迟、容错、版本更新这些工程问题。最常见的做法是把模型封装成HTTP API服务。PyTorch模型可以先用TorchScript或ONNX导出摆脱对Python运行时和训练代码的依赖。然后用FastAPI或Flask写一个轻量服务接收请求数据调用模型推理返回结果。FastAPI是我目前的首选原生支持异步和请求校验性能也比Flask好。封装服务时最容易被忽略的是输入预处理逻辑。在训练代码里数据清洗和特征计算是写在Notebook里的到了服务阶段这些逻辑必须在请求入口原样复现。如果特征是按“用户过去7天的行为”计算的那在线推理时也得能实时算出同一个特征。这就涉及训练/推理特征一致性Train-Serving Skew的问题。我的建议是把特征计算逻辑抽成独立的模块在训练和线上服务里共用同一个函数从根源上避免两套代码逻辑不一致。推理性能也需要提前摸底。加载一个几百MB的模型单次推理如果耗时100ms在高并发场景下可能直接打爆CPU。工程上常用的手段包括用GPU实例加速、用ONNX Runtime或TensorRT优化、做批推理Batch Inference、加缓存层。选择哪个方案取决于业务对延迟的要求和你能投入的资源。一开始不用上最复杂的方案先量化瓶颈在哪里。5.2 模型监控与CI/CD模型退化了怎么办模型上线后事情并没有结束甚至可以说才刚刚开始。因为模型会退化——数据分布会漂移Data Drift用户行为会变化特征的分布会偏移模型预测的质量会随之下降。如果没有人监控这个问题通常要等到业务指标暴跌时才会被发现。监控三层指标是我的标准做法。第一层是业务指标比如推荐系统的点击率转化率、风控系统的通过率逾期率。这些指标直接反映模型是否在为业务创造价值。第二层是模型指标比如预测的均值、方差、正样本占比这些指标能在没有真实标签的情况下快速感知模型行为是否异常。第三层是数据指标比如特征的分布、缺失率、取值覆盖度数据指标能帮你定位是上游数据问题还是模型本身问题。CI/CD在AI项目里和传统软件工程有差异。传统软件的CI是代码测试与构建AI项目的CI还要包括数据验证、模型评估、模型可解释性检查这些环节。我搭建过一套相对轻量的流水线代码合并触发单元测试和数据校验通过后自动训练模型用固定测试集评估指标指标达标则自动注册模型版本最后人工确认后部署上线。整个过程用GitLab CI或GitHub Actions加MLflow就能实现不一定要买商业平台。还有一个实操细节模型发布应该是灰度发布而不是一次性全量切换。我会先把新模型部署到一台实例让它承担5%的流量对比新老模型的线上表现如果新模型在业务指标上没有明显优势甚至更差立刻切回老模型。这套机制能有效防止带病上线的模型造成大面积影响。5.3 资源与成本优化不要让GPU在空转训练和部署AI模型算力成本是绕不开的话题。深度学习的训练阶段动辄用上几十上百张GPU卡部署阶段在线推理也需要常驻GPU实例。如果疏于管理成本会非常可观。训练阶段一个容易被忽视的点是数据加载效率。很多人训练速度慢卡在GPU利用率只有30%一查发现瓶颈在于CPU端数据加载跟不上——图片解码、数据增强、预处理都堆在CPU上。用DataLoader时把num_workers调大把batch_size增大配合prefetch_factorGPU利用率很容易就从50%拉到90%以上。这些都是不花一分钱就能获得的性能收益。部署阶段最常见的浪费是GPU常驻空闲。如果没有流量GPU实例也在那里烧钱。应对方案无非是弹性伸缩——根据请求量自动扩缩容或者用Serverless推理平台按调用次数计费。前者适合流量稳定的场景后者适合流量波动大、且延迟要求不苛刻的场景。另外模型的大小直接和推理成本挂钩。如果业务对精度要求没那么苛刻可以把模型蒸馏成小模型或者用量化手段把FP32转成INT8推理速度能提升好几倍显存占用大幅下降。我见过一个项目通过量化加小型化模型推理成本直接降了一半以上而业务指标只降了几个点这个取舍非常划算。6. LLM应用开发AI工程的新战场6.1 Prompt工程基础模型时代的必会技能大概从ChatGPT发布开始AI工程的重心发生了一个重要偏移。以前大家辛辛苦苦在领域数据上训练小模型现在可以基于大语言模型LLM快速搭建应用而“写Prompt”成了工程师必须具备的技能。很多人觉得Prompt就是“跟AI聊天时把话说清楚”这个理解太浅了。Prompt工程本质是对模型行为进行调控通过指令、示例、格式约束让模型输出符合预期的结果。它和传统特征工程有一个共同点——都需要深入理解模型是怎么工作的以及怎么才能让模型稳定地完成任务。比较实用的Prompt技巧包括给出明确的角色定位比如“你是一个有十年经验的专利审查员请根据以下文本判断其新颖性”提供几个输入输出示例Few-shot让模型模仿你的格式和风格要求模型一步步推理再给结论Chain-of-Thought这能显著提升复杂逻辑题的准确率用输出格式约束比如指定JSON输出便于后续程序解析。但Prompt工程目前还缺少完善的测试体系。一段Prompt在你本地试的时候效果不错换一批输入可能就拉胯了。所以做LLM应用时我强烈建议把测试用例沉淀下来构建一个回归测试集每次修改Prompt都跑一遍测试集对比新旧版本的输出质量。这本质上是把传统软件工程的测试思维搬过来。6.2 RAG架构解析把知识装进模型能力管道RAGRetrieval-Augmented Generation检索增强生成是目前LLM应用落地最热门的架构。它解决的问题很具体大模型训练数据有截止时间不知道你私有知识库里的最新内容而你要让模型基于这些内容回答问题时它往往会一本正经地胡编幻觉。RAG的思路很简单不是在模型生成时硬编知识而是先把用户问题转成向量表示在知识库中检索最相关的片段然后把检索到的片段放进Prompt里让模型基于这些片段生成答案。流程上分三步把知识文档切块、用Embedding模型向量化、存入向量数据库查询时做相似度检索把检索结果拼进Prompt交给LLM。但RAG真正落地时难点在于文档怎么切块最合理、Embedding模型选哪个、如何做混合检索向量加关键词、怎么判断检索结果是否靠谱。我踩过的坑是文档切块太粗导致一个chunk里包含多个主题检索精确度下降切得太细又导致上下文缺失模型回答缺乏完整性。这里没有标准答案只能用自己的知识文档做评测通过标注好的问答测试集反复调切块大小和检索策略。RAG架构还需要考虑缓存和更新机制。知识库不是静态的文档增删改之后对应向量也要更新。这一步如果做得粗糙用户会很快发现模型回答的内容已经过时。所以RAG系统本质上是数据管道和模型管道的深度融合谁的数据侧做得好谁的系统效果就稳。6.3 LLM应用的评估没有准确率怎么知道行不行LLM应用的评估比传统监督学习难得多。传统任务有确定标签算准确率就行但LLM应用追求的是“高质量回答”这个标准因人而异机器判断起来也很吃力。我的实践经验是把评估分两层。第一层是程序化评估用规则判断模型输出是否符合硬性约束比如JSON格式是否正确、关键词是否出现、答案是否为空、响应时间是否超标。这些能自动化直接在CI流水线里跑。第二层是模型化评估用另一个LLM当裁判按一套评分标准给输出打分。比如“回答是否忠实于检索到的文档”“是否回答出了用户问题的核心”“语气是否专业”。这层评估可以做成自动化也可以结合人工抽检。不要小看LLM-as-Judge这个思路。有人担心LLM当裁判会偏心但实际跑下来只要给出清晰的CoT评分标准LLM裁判的判断和人类评估的一致性在多数场景下可以做到80%以上。尤其适合做24小时持续监控用户输入变了模型回答变了LLM裁判能自动打分发现质量大幅下滑时自动报警。没有评估体系LLM应用就永远停留在“Demo阶段”。这也是我认为RAG项目最容易卡住的地方——大家都着急搭流程却忽略了“怎么证明系统在变好”。只有先从业务场景里抽象出评估维度构建一批高质量的评测样本迭代才算有了方向盘。7. 真实项目里的典型坑与排查技巧7.1 线上环境与开发环境的微妙差异AI项目经常会出现“开发环境好好的线上就出问题”的怪象。有一类特别隐蔽训练依赖的特征和在线服务取到的特征不一致。开发时用的是离线数据字段格式是处理好的线上可能是用户实时传上来的原始值格式不对、空值更多、枚举值超出预期。模型收到这种“没见过”的数据轻则预测偏差重则直接崩溃。排查这种问题我的经验是准备一套统一的、结构完全一致的测试请求样例在开发、测试、预发、生产四个环境都跑一遍对比特征计算前后的输出。任何一步输出跟预期不一致都要立刻追查。这个过程的本质是在做“逻辑一致性”验证但它比什么都重要。另一类常见的线上问题是环境依赖不一致。训练时用的numpy版本是1.x线上装成了2.x某个函数行为变了模型的输出可能就完全不同。所以容器化是基本要求——把训练和推理都打成Docker镜像锁死基础环境才能保证模型在“任何机器上行为一致”。7.2 排错记录的建立问题不可怕重复踩才可怕我见过太多团队在AI项目里反复犯同一个错。原因很简单——排错过程靠脑子记没有沉淀成文档。真正高效的团队会建立一本“排错手册”每条记录包含问题现象、影响范围、排查路径、根因分析、解决方案、如何避免。举例来说如果你某一次发现训练Loss突然变成NaN排了半天发现是学习率太大导致的梯度爆炸。那么这条记录就该写进排错手册现象是Loss变成NaN排查路径是先看学习率、再看数据里有无NaN、再看模型结构解决是把学习率调低或加梯度裁剪。下一次再遇到打开手册五分钟就能定位。排错手册的价值不止于此。它还是一个极好的团队培训材料——新成员通过它快速了解项目的“历史雷区”老成员因为写文档的过程把问题想得更透。一本好的排错手册跟代码库一样会越积越厚、越积越有价值。7.3 常见问题速查表结合我这些年的经验这里整理一张速查表方便你遇到问题时有方向地排查问题现象可能原因排查方向训练Loss为NaN学习率过大、数据含NaN、梯度爆炸调低学习率、检查数据、加梯度裁剪训练指标好但线上效果差数据泄漏、特征不一致、数据分布漂移检查特征时间窗、对比线上线下特征逻辑模型部署后响应超时模型过大、未用批推理、网络带宽量化模型、加缓存、优化推理框架GPU利用率偏低数据加载慢、batch_size太小调大num_workers和batch_size线上结果和离线评测不一致特征顺序不一致、依赖版本不同锁环境、统一特征代码LLM回答出现幻觉检索结果不相关、上下文不足优化embedding、混合检索、更好的切块新模型上线后指标变差样本分布变化、评估集过拟合灰度发布、回滚到旧版本这张表只是起步每个人的项目都会积累出属于自己的“易错点清单”。关键是养成习惯每次排查出根因都花十分钟把它记录到团队的知识库里。半年后你会回来感谢自己。8. 写在最后一条更快的路是亲手重建一遍这篇文章我尽量把AI工程的主干脉络讲清楚了——从需求定义到数据工程从模型训练到部署运维再到LLM应用的新玩法。但坦白说这些文字能起到的作用只是地图真正的“from scratch”还得靠你自己的双手去走一遍。我的建议很具体找一个你熟悉的业务场景哪怕小一点比如“给会议室预订系统做一个智能推荐排序”或者“给工单系统做一个自动分类”然后按照这篇文章里的链路从数据采集开始一路做到模型上线、监控迭代。不要用现成的开源项目直接改而是尽量自己写数据管道、自己封装服务、自己搭监控面板。这个过程会很痛苦——我第一次完整走完用了将近两个月中间无数次想放弃。但等你把整个链条亲手打通你会发现AI工程不再是一个抽象概念而是一套你拿到任何新问题都能套用的思维框架。最后分享一个我一直在用的小技巧每完成一个阶段就把“我这次踩了什么坑、怎么踩进去的、怎么爬出来的”写下来。这些记录比任何技术文档都珍贵因为它们是你自己的经验结晶。未来的某个深夜你一定会感谢当初那个愿意花时间记录的自己。
返回列表