ARTICLE DETAIL

资讯详情

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

从零搭建AI工程体系:数据、服务与反馈的完整指南

从零搭建AI工程体系:数据、服务与反馈的完整指南 1. 从零搭建AI工程体系为什么我劝你别一上来就搞模型“ai-engineering-from-scratch”这个标题第一次看到的时候我以为是又一个教你调包的教程。点进去翻了翻发现它讲的其实是另一件事怎么从零开始把AI工程当成一套完整的系统来搭建而不是只盯着模型那一层。这个定位很关键因为市面上大部分AI教程都在教你“怎么用某个框架跑通一个demo”但真正到了生产环境你会发现模型只是整个链路里最不值钱的一环。我自己带过几个AI项目从最早的推荐系统到后来的大模型应用踩过的坑基本都集中在“模型之外”的地方数据管道断了、特征对不上、推理服务扛不住并发、监控指标看不懂、回滚策略没做。这些问题没有一个能靠调参解决它们属于AI工程的范畴而不是机器学习的范畴。所以当我看到有人愿意从零开始讲这套东西第一反应是“终于有人把话说清楚了”。这篇文章适合谁看如果你已经会写Python、跑过几个sklearn或PyTorch的demo但一到要把模型塞进真实业务里就手足无措那这篇就是写给你的。如果你是完全零基础也没关系我会尽量用生活化的类比把每个环节讲透但你需要有一点编程基础至少知道什么是API、什么是数据库。整篇内容会围绕“从零搭建”这个核心把AI工程拆成几个关键模块每个模块讲清楚为什么需要它、怎么做、容易踩什么坑。2. 整体设计思路为什么AI工程不能只做模型2.1 模型只是冰山一角水面下才是真功夫很多人对AI工程的想象是这样的拿到数据训练模型部署上线完事。但真实情况是训练模型可能只占整个项目20%的工作量剩下80%全在数据清洗、特征管理、服务部署、监控告警、版本回滚这些“脏活累活”上。我见过太多团队花三个月调模型最后上线发现推理延迟太高不得不把模型砍掉一半层数精度掉了一大截但业务方根本感知不到——因为业务方要的是“能用”不是“论文级精度”。所以“ai-engineering-from-scratch”的核心思路应该是先搭骨架再填血肉。骨架就是数据流、服务框架、监控体系血肉才是模型。骨架搭好了换模型就像换发动机不影响整车运行骨架没搭好模型再强也跑不起来。2.2 从零开始的三个层次数据、服务、反馈我把AI工程从零搭建分成三个层次每个层次解决不同的问题数据层解决“数据从哪来、怎么存、怎么变”的问题。包括数据采集、清洗、特征工程、特征存储。这一层做不好后面全是空中楼阁。服务层解决“模型怎么跑、怎么扛、怎么管”的问题。包括模型训练、推理服务、API网关、负载均衡、版本管理。反馈层解决“模型跑得好不好、怎么变好”的问题。包括监控指标、日志采集、A/B测试、在线学习、回滚机制。这三个层次不是串行的而是并行的。你可以在数据层还没完全搞定的时候先用一个简单模型把服务层跑通然后再回头优化数据。这种“螺旋式推进”比“瀑布式开发”更适合AI项目因为AI的不确定性太高你很难一开始就把所有需求定死。2.3 技术选型的取舍逻辑别为了新而新从零搭建意味着你要做很多技术选型。我的原则是能用成熟方案就别自己造轮子除非你有明确的性能或成本理由。比如特征存储很多人一上来就想自己写一个结果发现要处理时间旅行、特征版本、在线离线一致性写到最后还不如直接用Feast或Tecton。再比如推理服务如果你只是跑一个BERT分类用FastAPI包一层就够了没必要上Triton或TorchServe除非你有GPU利用率或动态批处理的需求。但有些地方必须自己控制比如数据管道。因为数据管道跟业务逻辑绑得太紧用通用工具反而会限制你。我一般会用Airflow或Prefect做调度但具体的ETL逻辑还是自己写这样出问题好排查。3. 数据层从零搭建AI工程的地基3.1 数据采集别急着上Kafka先想清楚数据源数据采集的第一步不是选工具而是搞清楚数据从哪来。我见过一个团队上来就搭了一套Kafka集群结果发现数据源只有两个MySQL表每天增量不到10万条用Kafka纯属浪费。所以先做数据源盘点数据源类型典型工具适用场景注意事项业务数据库MySQL/PostgreSQL结构化数据增量更新注意binlog格式和时区日志文件Fluentd/Filebeat半结构化数据量大注意日志轮转和解析规则消息队列Kafka/RabbitMQ实时流数据注意消费组和offset管理第三方APIRequests/Scrapy外部数据频率低注意限流和重试策略对象存储S3/OSS非结构化数据如图片注意权限和生命周期盘点完之后再决定用什么工具。如果数据量不大直接用cronPython脚本就够了如果数据量大且实时性要求高再考虑KafkaFlink。别为了技术而技术。3.2 数据清洗80%的时间花在这里但值得数据清洗是AI工程里最枯燥但最重要的环节。我统计过自己经手的项目数据清洗平均占整个项目时间的40%到60%。清洗的核心目标就三个去重、补缺、纠错。去重不是简单的drop_duplicates因为很多重复是“逻辑重复”而不是“物理重复”。比如同一个用户在不同设备上登录产生了多条行为记录这些记录ID不同但业务含义重复。这时候需要根据业务规则定义“唯一键”比如用户ID时间窗口行为类型。补缺也不是简单的fillna。数值型缺失可以用均值、中位数或模型预测填充类别型缺失可以单独归为一类时间序列缺失可以用插值或前向填充。但补缺之前一定要先分析缺失模式是随机缺失还是系统性缺失如果是系统性缺失比如某个渠道的数据从来不上报那补缺反而会引入偏差。纠错更麻烦因为错误往往没有明显标志。我常用的方法是统计异常检测对每个字段算均值、方差、分位数超出3倍标准差或落在0.1%分位数之外的先标记出来人工审核。另外就是业务规则校验比如年龄不能为负、订单金额不能超过库存价值、时间戳不能晚于当前时间。注意数据清洗的每一步都要记录日志包括清洗了多少条、丢弃了多少条、填充了多少条。这些日志在后期排查模型问题时非常有用。3.3 特征工程与特征存储别让特征成为一次性消耗品特征工程是AI工程里最容易被低估的环节。很多人把特征工程当成“训练前的一次性操作”在Jupyter Notebook里算完就直接喂给模型结果上线后发现线上算的特征和线下不一致模型效果直接崩掉。这就是典型的训练-服务偏差。解决这个问题的核心是特征存储。特征存储的作用是把特征的定义、计算逻辑、存储方式统一管理起来确保离线训练和在线推理用的是同一套特征。具体来说特征存储要解决三个问题特征版本管理每次特征逻辑变更都要生成新版本旧版本保留方便回滚。在线离线一致性离线用Spark算在线用Redis查但计算逻辑必须一致。通常的做法是把特征计算逻辑抽象成UDF离线在线共用。时间旅行训练模型时不能用到未来的数据所以特征存储要支持“按时间点查询”比如查“2024年1月1日之前最近一次的用户画像”。我推荐用Feast作为特征存储的入门工具它轻量、开源、跟主流框架集成好。如果团队规模大、需求复杂可以考虑Tecton或自己基于RedisPostgreSQL搭一套。3.4 数据管道调度、监控、重试一个都不能少数据管道是把数据从源搬到特征存储的“传送带”。从零搭建数据管道我建议用Airflow或Prefect做调度因为它们都支持DAG有向无环图、重试、告警、回填。具体搭建步骤定义DAG每个DAG代表一条数据管道节点是任务边是依赖关系。配置调度周期根据数据更新频率设置比如每小时、每天。设置重试策略网络抖动、数据库连接失败这些临时错误自动重试3次每次间隔5分钟。配置告警任务失败或超时发邮件或钉钉通知。支持回填当发现历史数据有问题时能重新跑指定时间段的管道。实操心得数据管道最怕的是“静默失败”——任务显示成功但实际没产出数据。所以每个任务结束后都要做数据质量检查比如检查输出行数是否在合理范围内、关键字段是否为空、数值分布是否偏移。这些检查可以用Great Expectations或Deequ来做。4. 服务层让模型真正跑起来4.1 模型训练从单机脚本到分布式训练模型训练从零搭建第一步是把训练脚本工程化。很多人习惯在Notebook里训练但Notebook不适合生产环境因为它的执行顺序是乱的、状态是隐式的、版本是难管理的。正确的做法是把训练脚本写成Python模块用命令行参数控制配置用配置文件管理超参数。一个标准的训练脚本应该包含数据加载模块从特征存储或数据仓库读取数据支持分批、打乱、缓存。模型定义模块模型结构、损失函数、优化器。训练循环模块前向传播、反向传播、参数更新、日志记录。评估模块在验证集上计算指标保存最佳模型。检查点模块定期保存模型参数和优化器状态支持断点续训。如果数据量大或模型大单机跑不动就需要分布式训练。分布式训练有两种模式数据并行和模型并行。数据并行是把数据切分到多张卡上每张卡算梯度然后同步模型并行是把模型切分到多张卡上每张卡算一部分。大多数场景用数据并行就够了PyTorch的DistributedDataParallelDDP是首选。注意分布式训练时学习率要随batch size线性缩放。比如单卡batch size是32学习率是1e-4那么8卡batch size是256学习率应该调到8e-4。这个规则不是绝对的但可以作为起点。4.2 推理服务延迟、吞吐、成本的三方博弈推理服务是AI工程里最考验工程能力的环节。你要在延迟、吞吐、成本之间做权衡延迟用户等多久能拿到结果。通常要求P99延迟在100ms以内。吞吐每秒能处理多少请求。取决于GPU利用率和批处理策略。成本每千次推理花多少钱。取决于GPU型号、实例数量、批处理效率。从零搭建推理服务我推荐用FastAPI Uvicorn作为基础框架因为轻量、异步、生态好。如果模型是PyTorch可以用TorchScript或ONNX导出减少Python解释器开销。如果追求极致性能可以用Triton Inference Server它支持动态批处理、模型集成、多框架。具体搭建步骤模型导出把训练好的模型导出成TorchScript或ONNX格式。服务封装用FastAPI写一个/predict接口接收JSON请求返回JSON响应。批处理在服务内部维护一个请求队列攒够一批或超时后统一推理。并发控制用Uvicorn的worker数量控制并发通常设为CPU核数的2倍。健康检查加一个/health接口返回服务状态和模型版本。实操心得推理服务最怕的是冷启动。如果模型很大第一次请求可能要等几十秒。解决办法是预热服务启动后先跑几次空推理把模型加载到GPU显存里。另外如果流量波动大可以用Kubernetes的HPA做自动扩缩容但要注意扩容需要时间所以最好保留一定的冗余实例。4.3 API网关与负载均衡别让服务裸奔推理服务不能直接暴露给用户前面要加一层API网关。网关的作用是鉴权验证用户身份防止未授权访问。限流防止某个用户把服务打挂。路由根据请求路径或header转发到不同版本的服务。日志记录每个请求的输入输出方便排查问题。常用的网关有Kong、Traefik、Nginx。如果团队小直接用Nginx就够了如果需求复杂比如要做灰度发布、A/B测试可以用Kong或Istio。负载均衡是网关的下一个环节。如果推理服务有多个实例网关要把请求均匀分发。常用的策略有轮询、加权轮询、最少连接、一致性哈希。对于AI推理我推荐最少连接因为每个请求的处理时间可能差异很大轮询会导致某些实例过载。4.4 版本管理与回滚上线不是终点模型上线不是终点而是起点。因为模型效果会随着数据分布变化而衰减所以需要持续监控和迭代。版本管理要解决三个问题模型版本每次训练生成一个新版本记录训练数据、超参数、评估指标。服务版本每个模型版本对应一个服务版本支持多版本共存。流量切换能把流量从旧版本切到新版本也能切回来。我常用的做法是用模型注册表比如MLflow Model Registry管理模型版本用Kubernetes的Service管理服务版本用Istio的VirtualService做流量切换。具体流程训练新模型注册到模型注册表标记为“Staging”。部署新模型到Staging环境跑离线评估和在线小流量测试。如果指标达标把模型标记为“Production”把流量切到新版本。如果指标不达标把模型标记为“Archived”流量保持旧版本。注意回滚不是简单的“切回旧版本”因为旧版本可能已经不适应新数据了。所以回滚之前要先确认旧版本在当前数据上的表现如果也不行那就需要紧急训练一个新模型。5. 反馈层让AI工程持续进化5.1 监控指标别只看准确率AI工程的监控跟传统软件监控不一样。传统软件监控看CPU、内存、QPS、延迟AI工程还要看模型指标和数据指标。模型指标包括预测分布模型输出的分布是否偏移。比如分类模型如果突然某个类别的预测比例从10%涨到50%说明有问题。置信度分布模型对预测的置信度是否下降。如果平均置信度从0.9降到0.6说明模型遇到了不熟悉的数据。特征重要性哪些特征对预测贡献最大。如果某个特征的重要性突然变化说明数据管道可能有问题。数据指标包括特征缺失率每个特征的缺失比例。如果某个特征缺失率突然升高说明数据采集有问题。特征分布每个特征的均值、方差、分位数。如果分布偏移说明数据分布变了。数据延迟从数据产生到特征可用的时间。如果延迟变大说明数据管道堵了。我推荐用Prometheus Grafana做监控用Evidently做数据漂移检测。Evidently可以自动计算PSI、KL散度等指标并生成可视化报告。5.2 日志与追踪出问题时能快速定位AI工程的日志比传统软件复杂因为一次推理涉及多个环节请求进来、特征查询、模型推理、结果返回。如果某个环节慢了或错了你需要快速定位。所以要做分布式追踪给每个请求分配一个trace ID记录每个环节的耗时和状态。常用的追踪工具有Jaeger、Zipkin、OpenTelemetry。我一般用OpenTelemetry因为它跟主流框架集成好而且支持多种后端。具体做法在API网关生成trace ID放到请求header里。每个服务从header里读取trace ID记录自己的span。把span上报到Jaeger在Jaeger UI里查看完整调用链。实操心得日志要结构化别用print。用JSON格式记录每个字段有明确含义。比如{timestamp: ..., trace_id: ..., user_id: ..., model_version: ..., latency_ms: 45, status: success}。这样后期用ELK或Loki查询时可以按字段过滤和聚合。5.3 A/B测试与在线学习让模型自己进化A/B测试是验证新模型效果的标准方法。基本流程是把用户随机分成两组一组用旧模型一组用新模型跑一段时间后比较两组的业务指标。但AI的A/B测试有几个坑样本量要够模型效果差异通常很小需要足够样本才能统计显著。我一般用在线计算器算样本量确保power在0.8以上。实验周期要够有些模型效果有滞后性比如推荐模型用户可能需要几天才产生转化。所以实验周期至少一周。指标要选对别只看准确率要看业务指标比如点击率、转化率、留存率。在线学习是更高级的玩法模型在服务过程中不断接收新数据实时更新参数。这适合数据流大、变化快的场景比如新闻推荐、广告竞价。但在线学习风险高因为一旦数据有问题模型会快速学坏。所以要做好安全网设置学习率上限、异常检测、自动回滚。5.4 常见问题与排查技巧实录在从零搭建AI工程的过程中我遇到过很多问题这里整理成速查表问题现象可能原因排查方法解决方案线上效果比离线差很多训练-服务偏差对比线上线下特征分布统一特征计算逻辑用特征存储推理延迟突然升高模型变大或流量突增看GPU利用率和请求队列长度加实例、开启动态批处理、模型量化模型预测分布偏移数据分布变化算PSI、KL散度重新训练、加数据、调整阈值数据管道频繁失败数据源不稳定看失败日志和重试记录加重试、加告警、加数据质量检查模型版本混乱没有版本管理看模型注册表用MLflow或类似工具管理版本回滚后效果更差旧模型也不适应新数据在新数据上评估旧模型紧急训练新模型而不是简单回滚独家避坑技巧每次上线新模型之前先做影子模式——新模型和旧模型同时跑但只有旧模型的结果返回给用户新模型的结果只记录不返回。跑一周后对比两个模型的结果如果新模型确实更好再切流量。这样能避免直接上线导致的业务风险。6. 从零搭建的实操路线图如果你现在就想动手从零搭建一套AI工程体系我建议按以下路线走第一阶段最小可用系统1-2周用FastAPI写一个推理服务加载一个预训练模型。用Docker打包服务用Docker Compose启动。用Nginx做反向代理和负载均衡。用Prometheus Grafana做基础监控。第二阶段数据管道2-4周用Airflow定义数据管道DAG。用Pandas或Spark做数据清洗和特征工程。用Feast做特征存储确保线上线下一致。用Great Expectations做数据质量检查。第三阶段持续迭代4-8周用MLflow做模型版本管理。用Evidently做数据漂移检测。用Jaeger做分布式追踪。用Istio做流量切换和A/B测试。第四阶段优化与扩展8周以上用Triton做高性能推理。用Kubernetes做自动扩缩容。用在线学习做实时更新。用联邦学习做隐私保护。这个路线不是绝对的你可以根据团队规模和业务需求调整。但核心原则不变先跑通再优化先骨架再血肉。我个人在实际操作中的体会是从零搭建AI工程最难的不是技术而是心态。因为你会遇到无数个“为什么线上线下不一致”“为什么延迟这么高”“为什么模型效果突然掉了”的问题每个问题都可能让你卡好几天。但只要你坚持“数据第一、服务第二、模型第三”的原则把每个环节都做扎实最后一定能搭出一套稳定、可扩展、可迭代的AI工程体系。踩过几次坑之后你会发现那些曾经让你头疼的问题其实都是工程化的必经之路。
返回列表