15

AI/ML 系统的数据架构

特征工程与模型服务

阅读量:2 · 预计 21 分钟读完

特征存储模型服务MLOps向量数据库
关联层级:L7 应用抽象
阅读进度4%

第十五章 AI/ML 系统的数据架构 - 特征工程与模型服务

导读

人工智能和机器学习正在深刻地改变软件系统的设计。从推荐系统到自然语言处理,从计算机视觉到自动驾驶,AI/ML 应用已经成为数据密集型系统的重要组成部分。

然而,构建一个生产级的 AI/ML 系统远不止训练一个模型。数据获取、特征工程、模型训练、模型评估、模型部署、在线推理、模型监控——每一个环节都需要精心设计的数据架构来支撑。MLOps(Machine Learning Operations)正是为了解决这些工程挑战而诞生的实践。

本章将深入探讨 AI/ML 系统的数据架构:特征存储(Feature Store)、训练数据管道、模型服务(Model Serving)、模型监控与再训练,以及大语言模型(LLM)时代的数据架构变革。


核心概念详解

15.1 ML 系统的数据挑战

15.1.1 数据质量

AI/ML 系统对数据质量的要求极高——"Garbage in, garbage out"(垃圾进,垃圾出)。

数据质量的维度:

  • 准确性:数据是否反映了真实世界的状态?
  • 完整性:是否有缺失值?缺失的比例是多少?
  • 一致性:不同数据源的数据是否一致?
  • 时效性:数据是否足够新?是否反映了最新的状态?
  • 相关性:数据是否与预测目标相关?

数据质量问题的影响:

  • 训练数据有偏差 → 模型预测不准确。
  • 特征计算错误 → 训练和服务不一致(Training-Serving Skew)。
  • 标签错误 → 模型学习到错误的模式。

15.1.2 数据规模

现代 ML 系统通常需要处理海量数据:

  • 训练数据:数百万到数十亿条样本,每条样本包含数百到数千个特征。
  • 特征数据:需要从多个数据源聚合和转换,计算量巨大。
  • 推理数据:在线推理需要处理高并发的实时请求。

数据规模的挑战:

  • 存储和计算成本。
  • 数据处理的速度和效率。
  • 数据的版本管理和可追溯性。

15.1.3 数据漂移

数据漂移(Data Drift)是指生产环境中的数据分布与训练时的数据分布发生变化的现象。

数据漂移的类型:

  • 特征漂移(Feature Drift):输入特征的分布发生变化。例如,用户行为模式随时间变化。
  • 标签漂移(Label Drift):预测目标的分布发生变化。例如,经济环境变化导致消费模式改变。
  • 概念漂移(Concept Drift):特征与标签之间的关系发生变化。例如,新的竞争对手出现改变了市场格局。

数据漂移的影响:

  • 模型性能逐渐下降。
  • 预测结果变得不可靠。
  • 需要定期监控和再训练模型。

15.2 特征工程与特征存储

15.2.1 特征工程

特征工程(Feature Engineering)是将原始数据转换为模型可以使用的特征的过程。

特征工程的步骤:

特征提取:从原始数据中提取有意义的信息。例如,从时间戳中提取小时、星期几、是否节假日。

特征转换:对特征进行数学变换。例如,对数变换、标准化、归一化。

特征组合:将多个特征组合为新特征。例如,特征交叉(Feature Cross)。

特征选择:选择对预测最有用的特征,去除冗余和无关特征。

特征工程的挑战:

  • 领域知识:好的特征需要对业务领域有深入理解。
  • 计算成本:复杂特征的计算可能很耗时。
  • 一致性:训练和服务时的特征计算必须一致。

15.2.2 特征存储(Feature Store)

特征存储(Feature Store)是 ML 系统中的核心组件,负责特征的存储、管理和服务。

特征存储的核心功能:

特征注册(Feature Registry):

  • 定义特征的元数据:名称、描述、数据类型、计算逻辑。
  • 版本管理:追踪特征定义的变更历史。
  • 特征发现:帮助数据科学家找到可复用的特征。

离线存储(Offline Store):

  • 存储用于模型训练的历史特征数据。
  • 通常使用数据湖或数据仓库(如 S3 + Parquet、BigQuery)。
  • 支持大规模批处理查询。

在线存储(Online Store):

  • 存储用于在线推理的实时特征。
  • 通常使用低延迟的 KV 存储(如 Redis、DynamoDB)。
  • 支持毫秒级的点查。

特征计算管道:

  • 从原始数据源计算和更新特征。
  • 同时写入离线存储和在线存储。
  • 保证训练和服务时的特征一致性。

15.2.3 特征存储的代表产品

开源特征存储:

  • Feast(Gojek/Google):最流行的开源特征存储,支持离线和在线存储。
  • Hopsworks:企业级特征存储平台,包含完整的 MLOps 功能。
  • Feathub(蚂蚁集团):支持流批一体的特征计算。

商业特征存储:

  • AWS SageMaker Feature Store:AWS 的托管特征存储服务。
  • Google Vertex AI Feature Store:Google Cloud 的特征存储服务。
  • Tecton:由 Feast 创始团队创建的商业特征存储平台。

15.3 训练数据管道

15.3.1 训练数据的构建

构建训练数据是 ML 系统中最耗时的环节之一。

训练数据管道的步骤:

数据收集:从多个数据源收集原始数据(数据库、日志、API)。

数据清洗:处理缺失值、异常值、重复数据。

特征计算:根据特征定义计算特征值。

标签获取:获取训练标签(人工标注、自动标注、弱监督)。

数据合并:将特征和标签合并为训练样本。

数据验证:检查数据质量、分布、偏差。

数据存储:将训练数据写入存储(如 TFRecord、Parquet)。

15.3.2 训练-Serving 一致性

训练-Serving 一致性(Training-Serving Consistency)是 ML 系统中的一个关键挑战:训练时使用的特征必须与在线推理时使用的特征完全一致。

不一致的原因:

  • 代码差异:训练和服务使用不同的代码计算特征。
  • 数据差异:训练使用历史数据,服务使用实时数据,数据源可能不同。
  • 时间差异:训练时可以看到未来的数据(数据泄漏),服务时不能。

保证一致性的策略:

  • 统一特征计算:使用特征存储,训练和服务从同一个特征存储读取。
  • 代码复用:训练和服务使用同一份特征计算代码。
  • 时间点特征(Point-in-Time Features):训练时只使用在预测时间点之前可用的数据。

15.3.3 数据版本管理

ML 实验需要可追溯性——需要知道哪个数据集训练了哪个模型,产生了什么结果。

数据版本管理的工具:

  • DVC(Data Version Control):使用 Git 管理数据版本。
  • LakeFS:为数据湖提供 Git-like 的版本管理。
  • Delta Lake / Iceberg:内置时间旅行功能,支持数据版本管理。
  • MLflow / Weights & Biases:ML 实验跟踪平台,记录数据集和模型的对应关系。

15.4 模型服务

15.4.1 模型服务模式

模型服务(Model Serving / Model Inference)是将训练好的模型部署为在线服务的过程。

常见的模型服务模式:

批量推理(Batch Inference):

  • 定期(如每小时、每天)对批量数据运行模型预测。
  • 预测结果写入数据库或数据湖。
  • 适合不需要实时预测的场景(如推荐系统的候选排序)。

在线推理(Online Inference):

  • 接收实时请求,立即返回预测结果。
  • 延迟要求通常在毫秒到秒级。
  • 适合需要实时预测的场景(如搜索排序、风控)。

流式推理(Streaming Inference):

  • 消费事件流,对每个事件进行实时预测。
  • 延迟要求在毫秒级。
  • 适合实时风控、异常检测等场景。

边缘推理(Edge Inference):

  • 在终端设备(手机、IoT 设备)上运行模型。
  • 延迟要求极低,需要模型压缩和量化。
  • 适合离线场景和隐私敏感场景。

15.4.2 模型服务架构

典型的在线模型服务架构:

请求路由:

  • API Gateway 接收请求,路由到对应的模型服务。
  • 支持 A/B 测试、灰度发布。

特征服务:

  • 从特征存储的在线存储中获取实时特征。
  • 延迟要求在毫秒级。

模型推理:

  • 加载模型,执行推理计算。
  • 可以使用 GPU 加速。
  • 支持模型版本管理和热更新。

结果缓存:

  • 缓存常见请求的预测结果,减少重复计算。
  • 使用 Redis 或本地缓存。

结果存储:

  • 将预测结果写入数据库,供业务系统使用。
  • 记录推理日志,用于监控和审计。

15.4.3 模型服务框架

开源模型服务框架:

  • TensorFlow Serving:TensorFlow 模型的专用服务框架。
  • TorchServe:PyTorch 模型的专用服务框架。
  • Triton Inference Server(NVIDIA):支持多种框架(TF、PyTorch、ONNX)的通用服务框架。
  • Seldon:Kubernetes 原生的模型服务平台。
  • BentoML:轻量级的模型打包和服务框架。

商业模型服务:

  • AWS SageMaker:端到端的 ML 平台,包含训练和服务。
  • Google Vertex AI:Google Cloud 的 ML 平台。
  • Azure ML:Microsoft Azure 的 ML 平台。

15.5 模型监控与再训练

15.5.1 模型监控

模型部署后需要持续监控,确保模型性能不下降。

监控的维度:

系统指标:

  • 推理延迟(p50、p95、p99)。
  • 吞吐量(QPS)。
  • 错误率。
  • 资源使用率(CPU、GPU、内存)。

数据指标:

  • 输入特征的分布(均值、方差、分位数)。
  • 特征缺失率。
  • 特征异常值比例。

模型指标:

  • 预测结果的分布。
  • 准确率、精确率、召回率(如果有真实标签)。
  • 数据漂移检测(与训练数据的分布比较)。

15.5.2 数据漂移检测

数据漂移检测是模型监控的核心功能。

检测方法:

  • 统计检验:使用 KS 检验、卡方检验等比较训练数据和服务数据的分布。
  • 距离度量:计算 PSI(Population Stability Index)、KL 散度等距离指标。
  • 机器学习:训练一个分类器区分训练数据和服务数据,如果分类器性能好说明分布差异大。

漂移处理的策略:

  • 告警:漂移超过阈值时发送告警。
  • 自动再训练:检测到漂移后自动触发模型再训练。
  • 回滚:如果新模型性能下降,自动回滚到旧模型。

15.5.3 模型再训练

模型再训练是保持模型性能的关键。

再训练的触发条件:

  • 定期再训练:按固定周期(如每天、每周)再训练。
  • 性能驱动:当模型性能下降到阈值以下时再训练。
  • 漂移驱动:当检测到数据漂移时再训练。
  • 事件驱动:当有新的训练数据可用时再训练。

再训练的挑战:

  • 增量学习 vs 全量训练:增量学习快但可能遗忘,全量训练慢但更准确。
  • 数据选择:选择哪些数据进行再训练?全部数据还是最近的数据?
  • 模型版本管理:管理多个模型版本,支持回滚。
  • A/B 测试:新模型上线前需要 A/B 测试验证效果。

15.6 LLM 时代的数据架构

15.6.1 LLM 应用的数据需求

大语言模型(LLM)的兴起带来了新的数据架构需求:

训练数据:

  • LLM 训练需要 TB 级的文本数据。
  • 数据来源:网页、书籍、代码、论文、对话。
  • 数据质量至关重要——低质量数据会降低模型能力。

推理数据:

  • 用户输入(Prompt)需要预处理和后处理。
  • 上下文窗口有限,需要检索相关信息(RAG)。
  • 对话历史需要存储和管理。

评估数据:

  • 需要高质量的评估数据集来衡量模型性能。
  • 评估数据需要覆盖各种场景和能力。

15.6.2 RAG(检索增强生成)

RAG(Retrieval-Augmented Generation)是一种结合检索和生成的架构,用于增强 LLM 的知识。

RAG 的工作流程:

索引构建:将知识库文档切分为片段,计算每个片段的向量嵌入(Embedding),存入向量数据库。

检索:用户提问时,计算问题的向量嵌入,在向量数据库中检索最相关的片段。

生成:将检索到的片段作为上下文,与用户问题一起发送给 LLM,生成回答。

RAG 的数据架构:

  • 文档处理管道:解析、切分、清洗文档。
  • 向量嵌入服务:使用 Embedding 模型将文本转换为向量。
  • 向量数据库:存储和检索向量。代表:Pinecone、Weaviate、Milvus、Qdrant。
  • LLM 服务:生成最终回答。代表:OpenAI API、Claude API、通义千问。

15.6.3 LLM 的数据治理

LLM 应用引入了新的数据治理挑战:

数据隐私:

  • 用户输入可能包含敏感信息。
  • 需要在发送给 LLM 之前进行脱敏处理。
  • 对话历史需要安全存储和访问控制。

内容安全:

  • LLM 可能生成有害、偏见或不准确的内容。
  • 需要内容过滤和安全对齐。
  • 需要审计日志追踪生成内容。

知识产权:

  • 训练数据可能包含受版权保护的内容。
  • 生成内容可能侵犯他人知识产权。
  • 需要数据溯源和许可证管理。

重要知识点

知识点 1:特征存储的架构设计

特征存储的架构需要考虑以下因素:

离线存储:

  • 使用数据湖(S3 + Parquet/Iceberg)或数据仓库(BigQuery)。
  • 支持大规模批处理查询(如全量训练数据的生成)。
  • 支持时间点查询(Point-in-Time Query)——获取某个时间点之前的最新特征值。

在线存储:

  • 使用低延迟的 KV 存储(Redis、DynamoDB、Cassandra)。
  • 支持毫秒级的点查。
  • 数据从离线存储同步到在线存储。

一致性保证:

  • 离线和在线存储的数据必须一致。
  • 使用 CDC 或事件驱动同步数据。
  • 处理延迟和冲突。

知识点 2:ML 系统的可复现性

ML 实验的可复现性是一个重要但经常被忽视的问题。

影响可复现性的因素:

  • 数据版本:训练数据是否相同?
  • 特征版本:特征计算逻辑是否相同?
  • 代码版本:模型代码和超参数是否相同?
  • 环境版本:依赖库的版本是否相同?
  • 随机性:随机种子是否相同?

保证可复现性的策略:

  • 使用 DVC 或 MLflow 追踪数据和模型的版本。
  • 使用容器化(Docker)固定运行环境。
  • 记录所有超参数和随机种子。
  • 使用特征存储确保特征的一致性。

知识点 3:向量数据库

向量数据库是 LLM 应用中的关键组件,用于存储和检索向量嵌入。

向量数据库的核心功能:

  • 向量存储:高效存储高维向量(如 768 维、1536 维)。
  • 近似最近邻搜索(ANN):快速检索与查询向量最相似的向量。
  • 混合查询:支持向量搜索 + 标量过滤的组合查询。

ANN 算法:

  • HNSW(Hierarchical Navigable Small World):基于图的索引,查询速度快,内存占用大。
  • IVF(Inverted File Index):基于聚类的索引,内存占用小,查询速度较慢。
  • PQ(Product Quantization):向量压缩算法,减少内存占用。

向量数据库的选择:

  • Pinecone:全托管的向量数据库,易于使用。
  • Weaviate:开源向量数据库,支持混合查询。
  • Milvus:开源向量数据库,高性能,支持大规模部署。
  • Qdrant:开源向量数据库,Rust 实现,高性能。
  • pgvector:PostgreSQL 扩展,适合已有 PG 生态的团队。

知识点 4:MLOps 成熟度模型

MLOps 的成熟度可以分为三个级别:

级别 1:手动流程

  • 数据准备、特征工程、模型训练、模型部署都是手动的。
  • 代码和数据版本管理不完善。
  • 模型监控缺失或有限。

级别 2:ML 管道自动化

  • 训练管道自动化(数据准备 → 特征计算 → 模型训练 → 模型评估)。
  • 模型部署自动化(CI/CD for ML)。
  • 基本的模型监控和告警。

级别 3:CI/CD/CT 自动化

  • 持续集成(CI):自动测试代码和数据处理逻辑。
  • 持续部署(CD):自动部署模型到生产环境。
  • 持续训练(CT):自动检测数据漂移并触发再训练。
  • 完整的模型监控、审计和治理。

常见误区

误区 1:"模型训练是最重要的,数据不重要"

纠正:在 ML 系统中,数据比模型更重要。一个好的模型在差的数据上表现很差,而一个简单模型在好的数据上可以表现很好。业界有句话:"数据是新的石油"——数据的质量和规模决定了模型性能的上限,模型算法只是逼近这个上限。

误区 2:"训练一次模型就够了"

纠正:由于数据漂移,模型性能会随时间下降。需要持续监控模型性能,定期再训练模型。在快速变化的领域(如电商、金融),可能需要每天或每周再训练。

误区 3:"特征存储只是一个数据库"

纠正:特征存储不仅仅是一个数据库,它是一个完整的特征管理平台。除了存储,还包括特征注册、特征发现、特征计算管道、在线/离线一致性保证等。没有特征存储,ML 团队容易陷入"特征重复开发"和"训练-服务不一致"的问题。

误区 4:"LLM 不需要数据工程"

纠正:LLM 应用同样需要精心设计的数据架构。RAG 需要文档处理管道、向量嵌入服务、向量数据库。微调需要高质量的训练数据。评估需要全面的评估数据集。数据治理在 LLM 时代更加重要——隐私、安全、版权问题都需要认真处理。

误区 5:"MLOps 只是 DevOps 的延伸"

纠正:MLOps 比 DevOps 更复杂,因为 ML 系统有额外的维度:数据版本、特征管理、模型版本、实验跟踪、数据漂移监控等。传统的 DevOps 工具(如 Jenkins、GitHub Actions)不足以覆盖这些需求,需要专门的 ML 工具链(MLflow、Kubeflow、Feast 等)。


实践应用

实践 1:设计特征存储

设计特征存储的步骤:

识别特征:与数据科学家合作,识别需要的特征。

定义特征 Schema:为每个特征定义名称、类型、描述、计算逻辑。

选择存储:离线存储使用数据湖(S3 + Parquet),在线存储使用 Redis 或 DynamoDB。

构建计算管道:使用 Spark 或 Flink 计算特征,写入离线和在线存储。

提供 SDK:为训练和服务提供特征读取的 SDK。

监控:监控特征计算管道的延迟、数据质量、存储成本。

实践 2:构建训练数据管道

构建训练数据管道的最佳实践:

数据源管理:统一管理多个数据源的连接和认证。

数据验证:在管道的每个阶段验证数据质量(Schema、范围、分布)。

特征计算:使用特征存储保证训练和服务的一致性。

标签管理:管理标签的来源、质量和版本。

数据版本:使用 DVC 或 LakeFS 管理训练数据的版本。

实验跟踪:使用 MLflow 或 W&B 记录数据集、模型、指标的对应关系。

实践 3:部署模型服务

部署模型服务的步骤:

模型打包:将模型、依赖、预处理/后处理代码打包为容器镜像。

选择服务模式:根据延迟需求选择在线推理、批量推理或流式推理。

部署到 K8s:使用 Seldon 或 KServe 部署模型服务到 Kubernetes。

配置自动扩缩容:根据 QPS 或 GPU 使用率自动扩缩容。

A/B 测试:使用流量分割测试新模型。

监控:监控系统指标、数据指标、模型指标。

实践 4:构建 RAG 系统

构建 RAG 系统的步骤:

文档处理:解析 PDF、Word、HTML 等格式,切分为合理大小的片段。

向量嵌入:使用 Embedding 模型(如 OpenAI、通义千问)将文本转换为向量。

向量存储:将向量和原文存入向量数据库。

检索优化:调整检索策略(Top-K、相似度阈值、混合检索)。

Prompt 工程:设计 Prompt 模板,将检索到的上下文和用户问题组合。

评估:使用评估数据集测试 RAG 系统的准确性和相关性。


本章小结

本章深入探讨了 AI/ML 系统的数据架构:

数据挑战:

- 数据质量、数据规模、数据漂移是 ML 系统的核心挑战。

- 需要专门的数据架构来应对这些挑战。

特征工程与特征存储:

- 特征工程是将原始数据转换为模型输入的过程。

- 特征存储管理特征的存储、计算和服务,保证训练和服务的一致性。

- 离线存储用于训练,在线存储用于推理。

训练数据管道:

- 从数据收集到训练数据生成的完整流程。

- 训练-Serving 一致性是关键挑战。

- 数据版本管理保证实验的可复现性。

模型服务:

- 批量推理、在线推理、流式推理、边缘推理。

- 模型服务框架:TensorFlow Serving、Triton、Seldon。

- 需要监控延迟、吞吐量、错误率。

模型监控与再训练:

- 监控系统指标、数据指标、模型指标。

- 数据漂移检测触发模型再训练。

- MLOps 成熟度从手动流程到全自动化。

LLM 时代的数据架构:

- RAG 结合检索和生成,增强 LLM 的知识。

- 向量数据库是 RAG 的核心组件。

- 数据治理在 LLM 时代更加重要。

AI/ML 系统的数据架构是一个快速发展的领域。理解特征存储、训练管道、模型服务、模型监控等核心概念,是构建生产级 ML 系统的基础。随着 LLM 的兴起,数据架构的重要性进一步提升——好的数据架构是 AI 应用成功的基石。