湖仓一体:为 AI 训练构建数据基础设施
## AI 训练对数据的新要求
传统数据仓库的设计目标是**支撑报表与分析**:数据经过清洗、聚合,结构规整,供 BI 查询使用。
但大模型训练对数据的要求完全不同:
| 要求 | 传统数仓 | AI 训练需求 |
|------|---------|------------|
| 数据形态 | 结构化表格 | 文本、图像、音视频多模态 |
| 数据规模 | GB - TB | TB - PB |
| 使用方式 | 聚合查询 | 全量扫描与随机采样 |
| 更新频率 | 周期性 ETL | 流式持续更新 |
| 数据保真 | 清洗后即可 | 需保留原始语料与清洗链路 |
## 传统数仓的三个短板
### 短板一:不支持非结构化数据
数仓以表和列为基本单位,难以存储和查询原始文本、图像、视频。虽然部分数据库支持 JSON 字段,但缺乏针对多模态数据的处理与检索能力。
### 短板二:存储成本高
数仓通常基于高性能存储,成本显著高于对象存储。而 AI 训练语料往往是「写一次读多次」,且冷数据占比高,用数仓存储性价比极低。
### 短板三:难以保留数据血缘
AI 训练需要可复现性:同一个模型版本,用了哪个版本的语料、经过哪些清洗步骤,必须可追溯。传统 ETL 管道往往是「黑盒」,难以回答「这条数据是怎么来的」。
## 湖仓一体架构
湖仓一体(Data Lakehouse)结合了数据湖的低成本存储与数据仓库的事务能力,核心是**开放表格式**(Iceberg / Hudi / Delta Lake)。
### 分层设计(AI 场景)
```
ODS 层 — 原始语料落地(对象存储,保留原始格式)
↓
DWD 层 — 清洗、去重、脱敏(标准化处理)
↓
DWS 层 — 按主题聚合(如按领域分类的语料集)
↓
ADS 层 — 训练数据集(按版本固化,供训练直接读取)
```
### 关键能力
**1. 多模态统一管理**
对象存储承载原始文件,表格式记录文件元数据与索引。查询时可按元数据过滤,只读取相关文件。
**2. 时间旅行(Time Travel)**
Iceberg 支持查询历史快照。这意味着可以精确复现「上周三训练时用的数据集」,满足模型可复现性要求。
**3. 增量处理**
流式写入 + 增量读取,新语料可以在分钟级进入训练数据集,无需全量重跑。
**4. 数据血缘**
每个表快照记录了写入来源与处理作业,可以追溯到原始语料,构建完整血缘图。
### 语料清洗流水线示例
```python
# 1. 原始语料落地 ODS
spark.read.json(raw_path).writeTo("ods.corpus_raw").create()
# 2. 清洗:去重、过滤低质、敏感内容检测
cleaned = (
spark.table("ods.corpus_raw")
.transform(dedup) # MinHash 去重
.transform(filter_quality) # 语言/长度/困惑度过滤
.transform(mask_pii) # 隐私信息脱敏
)
cleaned.writeTo("dwd.corpus_clean").create()
# 3. 按领域分类聚合
dwd = spark.table("dwd.corpus_clean")
dwd.groupBy("domain").writeTo("dws.corpus_by_domain").create()
# 4. 固化训练集版本
build_dataset(version="v2025.03", sources=["dws.corpus_by_domain"])\
.writeTo("ads.train_dataset").create()
```
## 落地建议
湖仓一体不是纯技术选型问题,而是**数据治理体系的升级**。建议分步推进:
1. 先解决多模态数据的统一存储与元数据管理
2. 再引入表格式实现增量处理与时间旅行
3. 最后构建自动化语料清洗流水线与数据集版本管理
启数AI教育 AI 大数据课程第三、四阶段完整覆盖湖仓一体架构与 AI 语料工程,学员需完成端到端数据平台搭建。
