ARTICLE DETAIL

资讯详情

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

AI工程化从零开始:构建稳定高效生产级机器学习系统

AI工程化从零开始:构建稳定高效生产级机器学习系统 1. 为什么我把“AI工程化”当作一门独立学科来学先讲个真实经历。两年前我团队要上线一个商品推荐功能算法同学两周就训好了模型离线指标 AUC 涨了三个点。结果呢上线之后整整一个月都在跟“模型为什么没生效”作斗争——特征线上和离线不一致、推理延迟把接口拖到超时、模型文件版本被覆盖、数据回流断了一整天没人发现。最后指标不但没涨反而掉了一个点。那段经历让我彻底想明白一件事**训练一个模型是科研把一个模型稳定地跑进生产系统里是工程。**这两件事之间的鸿沟远比大多数人想象的大。而市面上的教程、课程、开源项目几乎全在讲怎么调参、怎么训模型真正讲“怎么把模型做成产品的一部分”并且长期稳定运行的内容少得可怜。所以当我看到 ai-engineering-from-scratch 这个项目主题时第一反应是这名字起得实在太好了。它强调的不是 AI 算法本身而是AI EngineeringAI 工程化而且是从零开始from scratch。换句话说它不假设你已经有完整的机器学习经验也不假设你已经在大厂待过、见过成熟的 AI 基础设施长什么样它要带你从第一行代码开始把 AI 系统的完整链路走通。这个定位对应的人群非常清晰有软件开发经验、但没有系统接触过 AI 落地全流程的后端工程师刚入门机器学习、想搞明白“模型之外的东西”到底有哪些的算法新人在小团队或创业公司里需要一个人承担“算法工程”两条线的技术负责人想系统补齐 AI 工程能力、为转型 AI 架构师做准备的中级开发者接下来这篇内容我就围绕 AI Engineering 的完整能力地图来展开结合我在实际项目里踩过的坑和验证过的方案把从零到一搭建 AI 工程能力的关键环节拆开讲清楚。这不是一篇“看完就会”的速成指南但我可以保证里面的每个环节都是真实生产环境中绕不开的问题。2. AI Engineering 到底是什么它和普通后端开发的边界在哪2.1 先给 AI 工程画一张能力地图我见过不少人把 AI 工程简单理解成“会调几个 Python 库、能跑通训练脚本”。但真到了生产环境事情远不止这么简单。我自己习惯把 AI 工程的能力范围画成下面这张地图每个区域都对应着一类独立的技术栈和问题域第一块是数据工程。模型是吃数据长大的数据的质量、分布、时效性直接决定模型的上限。这块涉及数据管道的搭建、特征的计算与存储、数据质量监控、训练/线上数据一致性保障等。很多项目死在前期不是模型不行而是喂给模型的数据根本不对。第二块是模型开发与训练。这就是大家最熟悉的领域包括模型选型、特征工程、训练调优、评估验证。这部分能力相对成熟开源社区和课程资源都非常丰富但恰恰因为它“最容易学”很多人的工程能力就止步于此误以为 AI 工程的全部就是这些。第三块是模型服务化。把训练好的模型变成线上可调用的服务涉及到推理引擎的选择ONNX Runtime、TensorRT、Triton 等、接口设计、批处理策略、缓存机制、降级方案。这一块是后端工程师最容易上手、也最容易踩坑的地方因为模型推理和普通 HTTP 服务有本质区别——它需要专门的资源管理和性能调优手段。第四块是MLOps/LLMOps。包括实验跟踪、模型版本管理、CI/CD 流水线、A/B 测试、模型监控与告警、模型回滚机制。这块的核心目标只有一个让模型的迭代和上线更可控、更可重复。第五块是AI 应用架构与产品化。模型服务只是零件如何把它嵌入到产品流程里如何处理用户输入的上下文、如何控制模型的输出质量、如何设计人机协作界面这些偏应用层的工程问题往往是决定 AI 功能是否真的好用的关键。看到这里你应该能感觉到AI 工程本质上是一个跨学科的交叉领域。它要求你同时具备数据工程的严谨、后端的稳定、算法的审美和产品的敏感度。这也是为什么这个主题值得单独拿出来系统学习而不是简单报一个“机器学习课程”就能覆盖。2.2 为什么“从零开始”是最快的学习路径我自己的体会是AI 工程这东西不完整走一遍永远是碎片化的经验。你单独学 Docker、学 Kubernetes、学 FastAPI、学 PyTorch每样都懂一点但真正面对“把一个模型从训练环境搬到生产环境”这个完整命题时还是会手足无措。因为知识的排列组合方式远比知识本身重要。举个例子模型训练推荐用 GPU 机器环境要装 CUDA 还得配好 Python 依赖生产服务通常跑在 CPU 机器上资源紧张得多还需要水平扩展。那么问题来了——如果没有完整的工程化封装你怎么保证模型在 GPU 训练环境和 CPU 生产环境之间的行为一致性这背后牵涉到环境复制、依赖锁定、模型序列化格式、推理引擎的算子兼容性、数值精度设置等一串连锁问题。从零开始走一遍完整链路的价值就在于此你会被迫面对每一个环节的真实约束在解决问题的过程中建立起真正的全局观。而不是在教程的舒适区里永远只看到被处理好的局部。2.3 一个合格 AI 工程师的能力清单这里整理一份我面试候选人时常用的能力清单分为基础层、核心层和进阶层方便你对照自查基础层Python 熟练、Linux 基础操作、Docker 容器化、Git 版本管理、SQL 数据查询、基础的概率统计与线性代数核心层机器学习/深度学习基础、PyTorch 或 TensorFlow 的模型训练流程、特征工程与数据管道构建、FastAPI/Flask 服务开发、模型推理优化、API 接口设计、单元测试与集成测试进阶层分布式训练与推理、Kubernetes 部署与弹性伸缩、模型监控与告警体系设计、A/B 测试与灰度发布、RAG 架构与 LLM 应用模式、系统性能分析与成本优化如果你现在处于基础层往上走的阶段这套清单基本就是你的学习路线图。我在后面的内容里会沿着这份清单的骨干逐块拆解实际落地中的重点。3. 数据工程模型质量的隐形天花板3.1 特征管道设计时最容易忽略的坑特征管道是整个 AI 系统里最“脏活累活”的部分但它直接决定模型的上限。我在第一个生产项目里就栽过大跟头——离线训练时特征来自数据仓库线上推理时特征来自实时计算两边分别开发维护结果特征分布对不上模型上线后预测结果明显偏差。后来排查了整整一周才确认是离线特征和在线特征的计算逻辑存在细微差异。那次教训让我形成了一个到现在都在用的原则一套特征代码离线在线两用。实现方式有两种主流选择一种是特征平台方案使用 Feast、Tecton 这类专有工具来统一特征的定义、存储和在线/离线访问。优点是标准化程度高适合大型团队缺点是引入额外基础设施学习成本和运维成本都不低。另一种是轻量级封装方案在项目内部抽象出一个特征计算模块同一份 Python 代码既在离线批处理里跑也在在线推理服务里跑。这个方案对中小团队更友好核心就是把特征的逻辑定义与数据的存取方式解耦。我自己在中小型项目里通常用第二种方案核心代码结构大致如下# feature_defs.py class UserFeatureCalculator: 用户特征计算器离线和在线共用同一套逻辑 def __init__(self, profile_store, behavior_store): self.profile_store profile_store # 用户画像数据源 self.behavior_store behavior_store # 行为序列数据源 def compute(self, user_id: str, current_ts: int) - dict: 计算指定用户在某一时刻的特征向量 profile self.profile_store.fetch(user_id) recent_behaviors self.behavior_store.query( user_id, start_tscurrent_ts - 7 * 86400, end_tscurrent_ts ) return { user_age: profile[age], user_gender: profile[gender], click_7d_cnt: len([b for b in recent_behaviors if b[type] click]), buy_7d_cnt: len([b for b in recent_behaviors if b[type] buy]), # ... 更多特征 }这套代码在离线管道中以 Spark 或 Pandas 批处理方式跑在在线服务中作为一个普通函数被调用。唯一的区别只是数据源接口的不同实现——离线时读的是 Hive/数仓表在线时查的是 Redis/OLTP 库。同一份计算逻辑保证了两侧特征的一致性。3.2 数据质量监控应该做在多早数据质量监控这块很多团队的觉悟来得太晚通常是线上出了事故才想到要补。我在经历过一次“数据管道静默失败三天模型还在用旧数据预测”的事故之后把数据质量监控的优先级提到了最高。我的建议是至少要做三类监控第一类是时效性监控。定时检查数据管道是否在期望时间内完成更新。比如离线特征每天凌晨两点必须产出如果四点还没产出告警就应该拉响。这类监控实现成本低只要用调度系统的告警能力即可但价值巨大。第二类是完整性监控。检查每天产出的数据量是否在合理区间。比如正常情况下每天有 100 万活跃用户特征突然某天只有 80 万说明上游数据源可能出现了采集异常。简单的方式是实现一个统计任务对比当日数据量与前 7 日均值的偏差比率超过阈值就告警。第三类是分布漂移监控。比较近期数据与历史数据的特征分布差异。这个稍微复杂一些常见做法是用 PSIPopulation Stability Index这个指标来衡量分布变化程度。PSI 的直觉理解是如果某个特征的分布在最近一周和过去一个月相比产生了明显偏移说明用户行为或者数据采集逻辑发生了变化模型可能需要重新评估甚至重新训练。# data_quality_monitor.py import numpy as np def calculate_psi(expected: np.ndarray, actual: np.ndarray, bins: int 10) - float: 计算 PSI 指标衡量实际分布与期望分布的差异 # 对期望分布分箱统计每箱占比 expected_percents np.histogram(expected, binsbins, densityFalse)[0] / len(expected) # 按期望分布的箱边界统计实际分布占比 actual_percents np.histogram(actual, binsnp.histogram(expected, binsbins)[1], densityFalse)[0] / len(actual) # 用平滑因子防止除零 epsilon 1e-6 psi_values (actual_percents - expected_percents) * np.log( (actual_percents epsilon) / (expected_percents epsilon) ) return np.sum(psi_values)经验阈值方面通常认为 PSI 小于 0.1 说明分布稳定0.1 到 0.25 之间说明有轻度漂移需要关注超过 0.25 则说明分布发生了重大变化必须介入处理。4. 模型训练与评估别让“准确率”骗了你4.1 离线评估指标的合理选择模型训练本身我不过多展开因为这部分资料太多了但有一个问题值得单独拿出来说离线评估指标的选择直接决定你上线后的感受。很多人习惯只看准确率Accuracy但在绝大多数真实业务场景里准确率是一个会骗人的指标。举个例子一个推荐系统历史平均点击率是 1%你做一个模型对 10000 个样本全部预测为“不点击”准确率也能到 99%。这个模型在离线指标上看起来“完美”但线上毫无价值。正确的做法是根据业务场景选择更有区分度的指标。二分类问题看AUCArea Under the ROC Curve、Precision/Recall/F1排序问题看NDCGK、RecallK回归问题看MAE/RMSE。其中 AUC 的优势在于它不受正负样本比例的影响能够比较好地衡量模型对正负样本的区分能力我通常把它作为二分类场景的第一参考指标。但即便 AUC 很高也不能代表线上就一定好。一个重要原因是离线分布和线上分布天然存在差异——离线时你有准确的用户真实行为标签线上时你只有模型自己的预测结果这种“训练-推理分布偏差”是系统性存在的。这里分享一个我用过很多次的有效手段离线评估模拟线上决策流程。具体来说如果线上是“模型一周推理一次然后把排序结果缓存下来供用户访问”那么离线评估时就应该使用同一时间切片的数据来做验证而不是随意交叉验证。这样才能让离线评估尽可能接近线上真实行为。4.2 训练、验证、测试三套数据的“隔离”纪律数据泄露是模型评估失真最常见的原因而且经常是隐蔽发生的。比如你做时间序列预测不小心把实验结果里未来时间段的真实数据拿去做了特征相当于考试时看了答案离线指标虚高上线立刻现形。我自己在项目里定的纪律是训练集负责拟合模型参数范围是时间上较早的数据验证集负责模型选择和超参数调优紧接训练集之后的时间段测试集负责最终评估必须是模型从未见过的、时间上最晚的数据这三套数据的隔离必须物理级严格。实现上可以这样控制先按时间排序所有样本取前 70% 做训练再取接下来 15% 做验证最后 15% 做测试。如果做的是用户行为相关模型还要保证同一用户在同一个集合内避免用户数据在训练集和测试集之间泄漏。4.3 从离线指标到线上表现的“惊险一跳”我见过太多团队在离线指标上投入大量精力却忽略了“模型上线后如何评估线上效果”这件事。结果上线之后只有一个监控面板上面是 CPU 使用率和内存占用完全没有业务效果指标。正确的做法是在模型设计阶段就定义好线上评估方案。上线前想清楚几个问题线上用什么指标衡量效果怎么获取对照组数据流量怎么分配观察周期多长一个务实的方案是采用shadow mode影子模式。新模型和当前线上模型并行运行但新模型的预测结果只记录不决策用一段时间积累新模型在真实流量上的表现数据和线上模型做离线对比。这种方式风险最低适合对业务效果模型做上线前验证。流量直接随机分配做 A/B 测试则更快但要注意最小样本量的问题——如果业务的转化率本身很低你可能需要跑几周才能得到统计学上显著的结果。5. 模型服务化从模型文件到稳定在线服务的最后一公里5.1 模型打包的格式选择与版本管理模型训练完成后第一步是把模型文件变成可部署的产物。这件事听起来简单不就是存个文件吗但实际生产环境里坑不少。模型格式的选择上原生 PyTorch 的.pt/.pth文件很方便但它的问题是推理时需要完整的 Python 环境和对应版本的 PyTorch 依赖这在工程上不够轻。为了更好的跨平台兼容性和推理性能常见的做法是导出成 ONNX 格式。# export_onnx.py import torch # 假设 model 是已经训练好的 PyTorch 模型 model load_trained_model(model_checkpoint.pt) model.eval() # 构造一个人为的输入张量用于确定模型的计算图 dummy_input torch.randn(1, 3, 224, 224) # 导出为 ONNX 格式 torch.onnx.export( model, dummy_input, model.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}}, opset_version17 )导出之后要用 ONNX Runtime 或 TensorRT 这类推理引擎来加载运行。相比原生 PyTorch 推理ONNX Runtime 在 CPU 上有明显的性能优势而且能脱离训练框架独立部署。版本管理方面我在项目里坚持一个原则模型和代码一样需要版本管理。最简单可靠的方案是模型文件存到对象存储比如 AWS S3、MinIO路径上包含版本信息同时用数据库或 DVC 记录每个版本对应的代码版本、训练数据集、评估指标。这样线上部署的任何一个模型你都能够随时回溯到它的“出生档案”。5.2 推理服务接口设计的几个实战建议服务化最直接的实现方式是用 FastAPI 包一层 HTTP 接口。网上有大量相关教程我不重复这里单独说说那些教程里通常不会提到的几个实战建议。第一个建议是区分同步推理和异步推理。如果模型的单次推理耗时在几十毫秒以内直接同步返回即可。但如果你的模型是 AIGC 类比如生成一张图、生成一段文本单次耗时可能长达几秒甚至十几秒就必须用异步任务队列。客户端提交请求后立刻拿到一个 task_id稍后再通过另一个接口轮询结果。这个模式在长耗时场景下几乎是必须的用 FastAPI Celery 或者 ARQ 都可以实现。第二个建议是输入验证一定不能省。线上模型服务的输入来自各种不可控的客户端如果不做严格的类型、范围、格式校验一个异常请求就可能导致推理崩溃。我在生产环境里遇到过模型输入维度不匹配导致的全量推理失败教训非常深刻。FastAPI 的 Pydantic 模型天然支持声明式校验务必把输入 schema 定义得足够严格。第三个建议是推理结果要带版本和置信度信息。每个响应里带上模型的版本号以及推理的置信度分数这样出了问题能快速定位是哪个模型在服务也能帮助你在产品端做阈值控制。# inference_service.py from fastapi import FastAPI from pydantic import BaseModel, Field class PredictRequest(BaseModel): user_id: str Field(..., min_length1, max_length64) item_id: str Field(..., min_length1, max_length64) class PredictResponse(BaseModel): score: float model_version: str duration_ms: float app FastAPI() app.post(/v1/predict, response_modelPredictResponse) async def predict(req: PredictRequest): # 实际推理逻辑省略... return PredictResponse( score0.87, model_version20240601-r2, duration_ms23.5 )5.3 性能优化的三个优先方向模型服务性能优化我建议按下面的优先级顺序来做务求每一分投入都花在刀刃上第一优先是批处理batching。GPU 或者 CPU 推理引擎对批量数据的处理效率远高于单条逐个处理。如果你的业务允许积攒请求可以用 NVIDIA Triton 这样的专用推理服务器自带动态批处理能力也可以自己在服务层实现一个微批收集器。我在实际项目里把单条推理的吞吐从每秒 50 次提升到每秒 300 次靠的就是简单的动态批处理。核心逻辑是请求进入队列后攒够 n 条或者等待 t 毫秒就触发一次批量推理。第二优先是模型量化。把 FP32 的模型权重转成 INT8 精度模型体积缩小到原来的四分之一推理速度能提升 2 到 3 倍。代价是精度会有一点损失通常可以控制在可接受的范围内。大多数推理引擎ONNX Runtime 和 TensorRT 都支持提供了自动量化工具调用起来并不复杂。第三优先是缓存。如果业务中存在大量相同或相似的请求比如同一个用户的推荐请求短时间重复到达用 Redis 做一层结果缓存能极大降低推理负载。缓存 key 的设计需要注意特征完整性和组合多样性避免缓存命中率过高导致推荐结果长时间不变。6. MLOps 与 LLMOps模型上线之后的长期生存之道6.1 实验追踪与模型仓库的搭建进入生产环境之后你会很快发现手写一个实验记录表是撑不住的。当模型迭代到第十版不同版本之间的训练参数、数据集、评估结果混在一起没有任何体系化的记录时你连“为什么线上版本比上一个版本效果差”都无从查起。实验追踪工具我推荐 MLflow 或 WBWeights Biases。如果团队基础设施比较轻用 MLflow 更合适——开源、自托管、和 PyTorch 集成友好。基本工作流是import mlflow # 设置实验名每次运行自动记录 mlflow.set_experiment(recommendation-v2) with mlflow.start_run(): # 记录超参数 mlflow.log_param(learning_rate, 0.001) mlflow.log_param(embedding_dim, 128) # 训练模型... # 记录指标 mlflow.log_metric(auc, 0.832) mlflow.log_metric(ndcg10, 0.451) # 保存模型产物 mlflow.pytorch.log_model(model, model)这样每一次实验跑完都自动留下完整档案。后续要做模型对比、回溯都可以直接在 MLflow 的界面上操作不用再翻聊天记录和本地文件名。模型仓库的搭建更偏工程一些我一般的做法是训练产出的模型文件同步存到对象存储目录结构按“项目名/模型名/版本号/”组织同时在 MLflow 里登记对应的元数据。部署时从模型仓库拉取指定版本而不是从训练机直接传文件——这条纪律能避免很多环境不一致导致的线上问题。6.2 模型上线与回滚的流程设计模型上线的流程设计目标只有一个任何一次变更要么成功要么可以快速无痛地回到之前的状态。我常用的流程分三步第一步是预发布验证。新模型部署到预发布环境用生产环境的流量副本做回归测试确认推理结果没有因为框架版本、输入分布差异等问题产生异常。第二步是灰度发布。流量按比例切到新模型从 1% 开始观察一段时间可以是几小时到一天确认线上指标稳定后再逐步放大。关键的观察指标既包括业务效果指标推荐点击率、任务完成率等也包括系统稳定性指标推理延迟、错误率、CPU 使用率。第三步是快速回滚预案。在发布之前就写好回滚脚本如果灰度期间异常指标触发阈值一键把所有流量切回旧模型。这个预案可以写在部署平台的发布流程里也可以写成一个独立的运维脚本保障它随时可用、被反复演练过。6.3 大模型LLM场景下的 AI 工程新挑战LLM 兴起后AI 工程的外延又扩大了一圈。传统的“训一个模型然后部署”范式变成了“基于大模型构建应用”的范式工程实践也随之变化。LLM 应用的核心模式是 RAGRetrieval-Augmented Generation即“检索增强生成”。简单理解用户的问题先经过检索系统找到相关知识片段然后把问题知识片段作为上下文一起发给大模型让模型基于检索结果生成回答。这套模式的技术栈包括向量数据库Milvus、Weaviate、pgvector、嵌入模型Embedding Model、Prompt 管理、上下文切分与召回策略等。和传统模型相比LLM 应用的工程难点在于结果不确定性更难控制同一个 Prompt 每次输出都可能有差异需要设计更精细的输出校验和兜底逻辑成本与延迟显著更高单次请求可能消耗大量 token必须引入缓存、模型分级、答案复用等策略评估体系更复杂大模型的回答质量难以用简单的数值指标衡量RAG 场景还需要分别评估检索质量和生成质量安全问题更突出Prompt 注入、越狱攻击、敏感信息泄漏等风险需要系统性的防护这部分的工程实践还在快速演进中但底层逻辑和传统模型服务化的思路是一脉相承的——先保障稳定可用再谈效果优化。我见过不少团队一上来就追逐最新最强的模型和框架结果连最基本的“接口延迟达标”“错误率可控”“检索召回稳定”都没做到项目自然难以持续推进。7. 常见问题与排查技巧实录AI 工程链路长、环节多问题出现时往往表现复杂、原因隐蔽。下面梳理几个我在实践中遇到最多且最有代表性的问题给出排查思路和解决路径。7.1 训练和线上结果不一致现象离线评估 AUC 0.83上线后业务指标纹丝不动甚至负向。排查步骤按顺序来先确认离线评估的时间口径和线上数据的时间窗口是否一致。如果离线用过去一个月的用户行为训练和评估线上只积累了三天的数据分布本来就不同。检查特征是否完全一致。重点对比特征计算逻辑这是我遇到过的最常见原因。离线从数据仓库取数计算特征线上从业务库实时计算特征两边很可能代码不同、语义不同。检查模型推理时输入数据的预处理是否一致。比如归一化的均值方差是否用同一个文件、文本分词器版本是否一致。检查推理引擎的算子兼容性。PyTorch 导出的 ONNX 在某些算子实现上与训练时的数值精度存在细微差异可以通过对比同一输入在两边推理的结果来定位。7.2 推理服务的内存泄漏问题现象服务刚启动时延迟正常运行数小时后延迟持续升高最终触发 OOM 重启。排查方向优先检查批处理队列是否有未被消费的数据累积。很多推理服务的内存泄漏问题本质上不是编程层面的泄漏而是积压导致的无界增长。检查模型推理引擎的显存/内存分配是否被正确释放。有些版本的推理框架在使用 GPU 时存在已知的内存未释放问题要确认推理框架版本并查看相关 issue。使用内存分析工具如 Python 的 tracemalloc、Memray定位内存增长点的调用栈。如果增长点集中在模型推理的调用路径大概率是模型或框架层面的问题而不是业务代码的问题。7.3 特征数据延迟导致预测失效现象模型还在跑但预测结果明显变差观察数据后发现近期特征大面积缺值。原因与对策这种情况十有八九是上游数据管道出了问题而你的监控体系没能及时感知。我前面提到的数据完整性监控就是专门应对这类问题的。除了监控之外推理服务还需要设计特征缺失的兜底逻辑比如特征缺失时回退到默认值或历史均值同时标记该次预测为低置信度让下游业务感知到这次结果不可靠。7.4 模型效果持续退化现象模型刚上线时表现不错一个月后逐步下滑看起来没有明显异常事件。原因用户行为发生了变化、外部环境变化比如推荐内容的供给结构变了、或者数据采集逻辑悄然改了。“静默退化”是最难察觉的模型问题之一。对策就是建立持续监测机制监控业务指标的趋势变化同时定期用最近的数据评估模型性能设置每周或每月的模型效果回顾机制及时发现趋势性下滑。8. 基于项目实践的工具选型建议AI 工程涉及的工具链非常庞杂很多刚入门的朋友会在选型上消耗大量精力。我给自己项目的工具选型定了一条原则优先选择经过验证、社区活跃、学习成本低的方案不追新不追奇。下面把常用的工具按模块整理一个速查表方便你参考。工程模块推荐工具适用场景备注实验追踪MLflow中小团队自托管元数据与模型产物统一管理特征平台Feast开源需要统一离线在线特征也可用轻量级自研方案模型推理ONNX Runtime / TritonCPU/GPU 通用Triton 适合高吞吐场景模型服务框架FastAPI标准 HTTP 接口异步长耗时任务配合 Celery向量数据库Milvus / pgvectorRAG 应用的检索存储数据量小可用 pgvector编排调度Airflow / Prefect数据管道周期性调度轻量场景也可直接用 cron部署平台Docker Kubernetes标准化部署与弹性伸缩小团队可从单机 Compose 开始监控告警Prometheus Grafana系统指标监控可视化业务指标需要另行定义采集这里特别说明一下 K8s 的问题。很多初学者一上来就上 Kubernetes结果被集群运维本身折磨得够呛反而忘了最初的目的。部署方案的选择取决于团队规模和业务体量几十万日活的模型服务一台配置合理的单机跑 Docker Compose 完全足够等到确实需要水平扩展、滚动更新、资源隔离时再迁移到 Kubernetes 也不迟。工程本质是解决实际问题不是为了炫技。9. 给从零开始的你一份可执行的路线图这套路线图是在前面的能力地图基础上整合出来的按周为单位规划建议每天投入 2-3 小时周末可以集中攻关。第一阶段第 1-4 周环境与基础工具链搭好 Python 开发环境掌握虚拟环境venv/conda的使用掌握 Docker 基础镜像构建、容器运行、docker-compose 编排熟悉 Git 工作流和基本的 CI 配置GitHub Actions 或 GitLab CI 均可完成一个简单的 FastAPI 服务并容器化部署这个阶段的目标是建立“代码不只是本地跑而是打包、分发、部署”的工程直觉。很多 AI 背景的朋友在这一步就开始卡壳但这是工程化思维的第一块基石。第二阶段第 5-8 周打通一个端到端的模型服务用 PyTorch 训练一个简单的模型比如文本分类或 CTR 预估记录实验指标到 MLflow导出 ONNX 模型用 ONNX Runtime 做推理用 FastAPI 封装服务加入输入校验、批处理、缓存本地用 Docker Compose 跑完整链路服务数据库监控等这个阶段最重要的收获是“完整走通”带来的全局感。经过这一轮你对每个环节的约束条件都会产生亲身体验。第三阶段第 9-12 周服务上云与性能优化选择一家云厂商搭建一个最小的部署环境虚拟机或托管 K8s部署模型服务并配置负载均衡和健康检查实现灰度发布与一键回滚对模型做量化和性能压测对比优化前后的吞吐与延迟接入 Prometheus Grafana建立基本监控告警这个阶段的价值在于让你体验真实生产环境的运作方式。云上的部署和本地跑的体验差异是巨大的安全和稳定性在这些场景下变得特别重要。第四阶段第 13-16 周扩展到 LLM 应用学习 Prompt Engineering 基础和不合理输出规避手段掌握向量化召回的基本流程文本切分、Embedding、向量检索搭建一个 RAG 应用接入你前面做好的模型服务链路设计一套针对 LLM 应用的评估方案和质量监控有了前三个阶段的基础第四阶段你会发现自己上手 LLM 应用的速度明显快于大多数直接跳到这个领域的同行。因为 AI 工程的核心——数据管理、服务封装、监控、评估、部署——在 LLM 场景下并没有本质变化只是换了一批具体的工具和技术细节。10. 写在最后的个人体会如果让我总结 AI Engineering 从零开始这条路最核心的认知我想说三句话。第一系统性大于碎片化。零散的学习让你了解了工具但只有完整走完从数据到模型、从模型到服务、从服务到监控的闭环你才能真正具备“搞定问题”的能力。第二线上的每一秒稳定都来自线下的提前设计。模型上线前多花两小时把回滚方案、监控指标、降级策略想清楚好过上线后手忙脚乱排查一整晚。第三保持亲手搭一遍的习惯。不管社区里的最佳实践怎么写、教程里的架构图画得多漂亮只有自己亲手把每一步都做一遍、踩一遍坑那些知识才是你的。我至今还记得最开始那个推荐项目失败后的复盘会议上技术总监说的一句话“算法是矛工程是盾你们之前只会抡矛没想到还要举盾。”这句话我一直记到现在。希望这篇内容能帮你把盾牌也打造起来。
返回列表