数据管道 · 训练数据集与版本化
🏠 返回 README | ⬅️ 04-MLOps-CI-CD-CT流水线.md | ➡️ 09-批量推理-离线打分与回填.md
风格说明 :本篇为 Staff/Architect 级 ------Great Expectations 数据契约、训练集 Snapshot 、Feature Store 与 Lineage 、Data Catalog、GDPR/CCPA 删除 、LabelOps (主动学习、IAA)、Model Unlearning;含 Mermaid、大厂口播题、STAR-M-P、Checklist。前置阅读 :
01-特征平台-Feature-Store设计.md、04-MLOps-CI-CD-CT流水线.md。后续展开 :
09-批量推理-离线打分与回填.md。
L1 是什么 · 训练数据作为一等公民
1.1 一句话定义
训练数据集 不是某次 Spark job 导出的 CSV,而是带 契约(Contract) 、不可变快照(Snapshot) 、血缘(Lineage) 与 合规生命周期 的可审计制品;与 Model Registry 的 data_snapshot_id 绑定后,才能回答「这个 prod 模型到底吃了什么数据」。
1.2 与 Feature Store / 离线仓库的关系
#mermaid-svg-VdN20Mf8hcC9F5Ri{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VdN20Mf8hcC9F5Ri .error-icon{fill:#552222;}#mermaid-svg-VdN20Mf8hcC9F5Ri .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VdN20Mf8hcC9F5Ri .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .marker.cross{stroke:#333333;}#mermaid-svg-VdN20Mf8hcC9F5Ri svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VdN20Mf8hcC9F5Ri p{margin:0;}#mermaid-svg-VdN20Mf8hcC9F5Ri .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster-label text{fill:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster-label span{color:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster-label span p{background-color:transparent;}#mermaid-svg-VdN20Mf8hcC9F5Ri .label text,#mermaid-svg-VdN20Mf8hcC9F5Ri span{fill:#333;color:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .node rect,#mermaid-svg-VdN20Mf8hcC9F5Ri .node circle,#mermaid-svg-VdN20Mf8hcC9F5Ri .node ellipse,#mermaid-svg-VdN20Mf8hcC9F5Ri .node polygon,#mermaid-svg-VdN20Mf8hcC9F5Ri .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .rough-node .label text,#mermaid-svg-VdN20Mf8hcC9F5Ri .node .label text,#mermaid-svg-VdN20Mf8hcC9F5Ri .image-shape .label,#mermaid-svg-VdN20Mf8hcC9F5Ri .icon-shape .label{text-anchor:middle;}#mermaid-svg-VdN20Mf8hcC9F5Ri .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .rough-node .label,#mermaid-svg-VdN20Mf8hcC9F5Ri .node .label,#mermaid-svg-VdN20Mf8hcC9F5Ri .image-shape .label,#mermaid-svg-VdN20Mf8hcC9F5Ri .icon-shape .label{text-align:center;}#mermaid-svg-VdN20Mf8hcC9F5Ri .node.clickable{cursor:pointer;}#mermaid-svg-VdN20Mf8hcC9F5Ri .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .arrowheadPath{fill:#333333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VdN20Mf8hcC9F5Ri .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VdN20Mf8hcC9F5Ri .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VdN20Mf8hcC9F5Ri .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster text{fill:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri .cluster span{color:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VdN20Mf8hcC9F5Ri .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VdN20Mf8hcC9F5Ri rect.text{fill:none;stroke-width:0;}#mermaid-svg-VdN20Mf8hcC9F5Ri .icon-shape,#mermaid-svg-VdN20Mf8hcC9F5Ri .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VdN20Mf8hcC9F5Ri .icon-shape p,#mermaid-svg-VdN20Mf8hcC9F5Ri .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VdN20Mf8hcC9F5Ri .icon-shape .label rect,#mermaid-svg-VdN20Mf8hcC9F5Ri .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VdN20Mf8hcC9F5Ri .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VdN20Mf8hcC9F5Ri .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VdN20Mf8hcC9F5Ri :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} metadata
metadata
原始数据湖
Bronze
清洗 Silver
训练 Gold 表
Dataset Snapshot
immutable
Feature Store
point-in-time
训练 Job
Model Registry
Data Catalog
Lineage Graph
1.3 Staff 面试定位
| 层级 | 候选人常答 | Staff 应采分 |
|------|-----------|-------------|
| 工具 | 「我们用 GE」 | Contract 进 CI Gate、失败阻断 promote |
| 版本 | 「按日期分区」 | Snapshot ID + manifest 哈希 与 run 绑定 |
| 合规 | 「删 DB 行」 | Catalog 逻辑删 → 物理 purge → 再训练/unlearn 验证 |
| Label | 「外包标注」 | IAA κ、主动学习闭环、偏置审计 |
2. Great Expectations · 数据契约
2.1 为什么 GE 不够,还要 Contract
GE 解决 单次 batch 是否满足断言 ;Contract 解决 schema + 语义 + 所有者 + 变更流程 跨团队可执行。
yaml
dataset_contract:
name: fraud_training_v3
owner: risk-data@corp.com
schema_version: '2026-05-01'
partitions:
- event_date
expectations:
- expect_column_values_to_not_be_null: user_id
- expect_column_values_to_be_between:
column: amount
min: 0
max: 1000000
- expect_column_pair_values_A_to_be_greater_than_B:
column_A: label_time
column_B: feature_cutoff_time
sla:
freshness_hours: 26
row_count_min: 5000000
2.2 CI 集成模式
#mermaid-svg-aSYhzUF0NrNP72FY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aSYhzUF0NrNP72FY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aSYhzUF0NrNP72FY .error-icon{fill:#552222;}#mermaid-svg-aSYhzUF0NrNP72FY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aSYhzUF0NrNP72FY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aSYhzUF0NrNP72FY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aSYhzUF0NrNP72FY .marker.cross{stroke:#333333;}#mermaid-svg-aSYhzUF0NrNP72FY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aSYhzUF0NrNP72FY p{margin:0;}#mermaid-svg-aSYhzUF0NrNP72FY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aSYhzUF0NrNP72FY .cluster-label text{fill:#333;}#mermaid-svg-aSYhzUF0NrNP72FY .cluster-label span{color:#333;}#mermaid-svg-aSYhzUF0NrNP72FY .cluster-label span p{background-color:transparent;}#mermaid-svg-aSYhzUF0NrNP72FY .label text,#mermaid-svg-aSYhzUF0NrNP72FY span{fill:#333;color:#333;}#mermaid-svg-aSYhzUF0NrNP72FY .node rect,#mermaid-svg-aSYhzUF0NrNP72FY .node circle,#mermaid-svg-aSYhzUF0NrNP72FY .node ellipse,#mermaid-svg-aSYhzUF0NrNP72FY .node polygon,#mermaid-svg-aSYhzUF0NrNP72FY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aSYhzUF0NrNP72FY .rough-node .label text,#mermaid-svg-aSYhzUF0NrNP72FY .node .label text,#mermaid-svg-aSYhzUF0NrNP72FY .image-shape .label,#mermaid-svg-aSYhzUF0NrNP72FY .icon-shape .label{text-anchor:middle;}#mermaid-svg-aSYhzUF0NrNP72FY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aSYhzUF0NrNP72FY .rough-node .label,#mermaid-svg-aSYhzUF0NrNP72FY .node .label,#mermaid-svg-aSYhzUF0NrNP72FY .image-shape .label,#mermaid-svg-aSYhzUF0NrNP72FY .icon-shape .label{text-align:center;}#mermaid-svg-aSYhzUF0NrNP72FY .node.clickable{cursor:pointer;}#mermaid-svg-aSYhzUF0NrNP72FY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aSYhzUF0NrNP72FY .arrowheadPath{fill:#333333;}#mermaid-svg-aSYhzUF0NrNP72FY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aSYhzUF0NrNP72FY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aSYhzUF0NrNP72FY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aSYhzUF0NrNP72FY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aSYhzUF0NrNP72FY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aSYhzUF0NrNP72FY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aSYhzUF0NrNP72FY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aSYhzUF0NrNP72FY .cluster text{fill:#333;}#mermaid-svg-aSYhzUF0NrNP72FY .cluster span{color:#333;}#mermaid-svg-aSYhzUF0NrNP72FY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aSYhzUF0NrNP72FY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aSYhzUF0NrNP72FY rect.text{fill:none;stroke-width:0;}#mermaid-svg-aSYhzUF0NrNP72FY .icon-shape,#mermaid-svg-aSYhzUF0NrNP72FY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aSYhzUF0NrNP72FY .icon-shape p,#mermaid-svg-aSYhzUF0NrNP72FY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aSYhzUF0NrNP72FY .icon-shape .label rect,#mermaid-svg-aSYhzUF0NrNP72FY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aSYhzUF0NrNP72FY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aSYhzUF0NrNP72FY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aSYhzUF0NrNP72FY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} fail
pass
特征/ETL PR
GE Checkpoint
阻断合并
合并 main
夜间 Snapshot 构建
manifest.json 哈希
3. 训练集 Snapshot · 不可变与可复现
3.1 Snapshot 语义
text
snapshot_id = hash(manifest)
manifest = {
tables: [{ uri, version, row_count, checksum }],
feature_views: [{ name, version, as_of }],
label_table: { uri, version },
filters: { start, end, sampling_seed },
created_at, created_by
}
不可变 :snapshot 一旦发布,禁止原地 overwrite;修正用 snapshot_id_v2 + 下游 run 重绑。
3.2 Delta / Iceberg 实现要点
| 能力 | Delta Lake | Iceberg | 面试一句 |
|------|------------|---------|----------|
| Time travel | VERSION AS OF | snapshot-id | 训练取 as-of 防泄露 |
| ACID | ✅ | ✅ | 并发写与 snapshot 一致 |
| 分区演进 | 有限 | 较强 | 改分区 = 新 snapshot 契约 |
3.3 Point-in-Time 与标签时间轴
sql
-- 错误:用当前特征表 join 历史标签
-- 正确:asof join feature event_time <= label_time
SELECT l.*, f.spend_30d
FROM labels l
ASOF JOIN feature_history f
ON l.user_id = f.user_id
AND f.event_time <= l.label_time
WHERE l.snapshot_partition = '2026-05-19'
4. Feature Store 与训练集衔接
Trainer Snapshot Builder Feature Store Spark/dbt Trainer Snapshot Builder Feature Store Spark/dbt #mermaid-svg-CpSf3mSQLJgd9F35{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CpSf3mSQLJgd9F35 .error-icon{fill:#552222;}#mermaid-svg-CpSf3mSQLJgd9F35 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CpSf3mSQLJgd9F35 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CpSf3mSQLJgd9F35 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CpSf3mSQLJgd9F35 .marker.cross{stroke:#333333;}#mermaid-svg-CpSf3mSQLJgd9F35 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CpSf3mSQLJgd9F35 p{margin:0;}#mermaid-svg-CpSf3mSQLJgd9F35 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CpSf3mSQLJgd9F35 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-CpSf3mSQLJgd9F35 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-CpSf3mSQLJgd9F35 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-CpSf3mSQLJgd9F35 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-CpSf3mSQLJgd9F35 .sequenceNumber{fill:white;}#mermaid-svg-CpSf3mSQLJgd9F35 #sequencenumber{fill:#333;}#mermaid-svg-CpSf3mSQLJgd9F35 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-CpSf3mSQLJgd9F35 .messageText{fill:#333;stroke:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CpSf3mSQLJgd9F35 .labelText,#mermaid-svg-CpSf3mSQLJgd9F35 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .loopText,#mermaid-svg-CpSf3mSQLJgd9F35 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-CpSf3mSQLJgd9F35 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-CpSf3mSQLJgd9F35 .noteText,#mermaid-svg-CpSf3mSQLJgd9F35 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-CpSf3mSQLJgd9F35 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CpSf3mSQLJgd9F35 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CpSf3mSQLJgd9F35 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-CpSf3mSQLJgd9F35 .actorPopupMenu{position:absolute;}#mermaid-svg-CpSf3mSQLJgd9F35 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-CpSf3mSQLJgd9F35 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-CpSf3mSQLJgd9F35 .actor-man circle,#mermaid-svg-CpSf3mSQLJgd9F35 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-CpSf3mSQLJgd9F35 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物化 feature_view v12 get_historical_features(entity_df, as_of) 写 manifest + Parquet 读取 snapshot_id 训练 + 上报 lineage
| 模式 | 优点 | 风险 |
|------|------|------|
| FS 主导 PIT join | 防泄露内建 | entity_df 必须含 event_timestamp |
| 预物化宽表 | 训练 IO 简单 | 与在线特征 双份逻辑 |
| 混合 | 核心特征 FS,宽表补充 | 血缘要 两条边 都记录 |
5. Lineage · 端到端血缘
5.1 最小血缘图
#mermaid-svg-4LpvuSrudVeNdCQh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4LpvuSrudVeNdCQh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4LpvuSrudVeNdCQh .error-icon{fill:#552222;}#mermaid-svg-4LpvuSrudVeNdCQh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4LpvuSrudVeNdCQh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4LpvuSrudVeNdCQh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4LpvuSrudVeNdCQh .marker.cross{stroke:#333333;}#mermaid-svg-4LpvuSrudVeNdCQh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4LpvuSrudVeNdCQh p{margin:0;}#mermaid-svg-4LpvuSrudVeNdCQh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4LpvuSrudVeNdCQh .cluster-label text{fill:#333;}#mermaid-svg-4LpvuSrudVeNdCQh .cluster-label span{color:#333;}#mermaid-svg-4LpvuSrudVeNdCQh .cluster-label span p{background-color:transparent;}#mermaid-svg-4LpvuSrudVeNdCQh .label text,#mermaid-svg-4LpvuSrudVeNdCQh span{fill:#333;color:#333;}#mermaid-svg-4LpvuSrudVeNdCQh .node rect,#mermaid-svg-4LpvuSrudVeNdCQh .node circle,#mermaid-svg-4LpvuSrudVeNdCQh .node ellipse,#mermaid-svg-4LpvuSrudVeNdCQh .node polygon,#mermaid-svg-4LpvuSrudVeNdCQh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4LpvuSrudVeNdCQh .rough-node .label text,#mermaid-svg-4LpvuSrudVeNdCQh .node .label text,#mermaid-svg-4LpvuSrudVeNdCQh .image-shape .label,#mermaid-svg-4LpvuSrudVeNdCQh .icon-shape .label{text-anchor:middle;}#mermaid-svg-4LpvuSrudVeNdCQh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4LpvuSrudVeNdCQh .rough-node .label,#mermaid-svg-4LpvuSrudVeNdCQh .node .label,#mermaid-svg-4LpvuSrudVeNdCQh .image-shape .label,#mermaid-svg-4LpvuSrudVeNdCQh .icon-shape .label{text-align:center;}#mermaid-svg-4LpvuSrudVeNdCQh .node.clickable{cursor:pointer;}#mermaid-svg-4LpvuSrudVeNdCQh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4LpvuSrudVeNdCQh .arrowheadPath{fill:#333333;}#mermaid-svg-4LpvuSrudVeNdCQh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4LpvuSrudVeNdCQh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4LpvuSrudVeNdCQh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4LpvuSrudVeNdCQh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4LpvuSrudVeNdCQh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4LpvuSrudVeNdCQh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4LpvuSrudVeNdCQh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4LpvuSrudVeNdCQh .cluster text{fill:#333;}#mermaid-svg-4LpvuSrudVeNdCQh .cluster span{color:#333;}#mermaid-svg-4LpvuSrudVeNdCQh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4LpvuSrudVeNdCQh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4LpvuSrudVeNdCQh rect.text{fill:none;stroke-width:0;}#mermaid-svg-4LpvuSrudVeNdCQh .icon-shape,#mermaid-svg-4LpvuSrudVeNdCQh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4LpvuSrudVeNdCQh .icon-shape p,#mermaid-svg-4LpvuSrudVeNdCQh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4LpvuSrudVeNdCQh .icon-shape .label rect,#mermaid-svg-4LpvuSrudVeNdCQh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4LpvuSrudVeNdCQh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4LpvuSrudVeNdCQh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4LpvuSrudVeNdCQh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Kafka 交易
S3 Bronze
dbt Silver
feature_view:tx_30d
dataset_snapshot: fraud_20260519
mlflow.run:abc
model:fraud/v12
inference:prod
5.2 OpenLineage / Marquez / DataHub
| 产品 | 强项 | Staff 选型一句 |
|------|------|----------------|
| Marquez | OpenLineage 标准 | 开源、K8s 友好 |
| DataHub | 元数据 + 搜索 | 大厂常用 Catalog+Lineage |
| Databricks Unity | 湖仓一体 | 已上 Databricks 可买 |
5.3 审计字段(晋升 prod 必填)
yaml
lineage_record:
upstream_snapshot: fraud_20260519
feature_views: [tx_30d@12, device_risk@3]
training_code_digest: sha256:...
hyperparams_hash: sha256:...
evaluator_version: v2.1
approver: staff@corp.com
6. Data Catalog · 发现、所有权、分级
6.1 Catalog 解决什么
-
发现:「有没有用户 90 天活跃特征?」
-
所有权:谁对数据质量负责(on-call 路由)
-
分级:PII / 财务敏感 / 公开衍生
-
契约链接:表 → contract → snapshot 列表
6.2 与 ML Metadata 的映射
| Catalog 实体 | ML 实体 |
|--------------|---------|
| Table / Dataset | Training Snapshot |
| Column tags | Feature definition |
| Policy | Training eligibility |
| Lineage edge | Feature → Model |
7. GDPR / CCPA · 删除权与留存
7.1 删除不是 DELETE 一行
#mermaid-svg-SwUapqYLVCYoZxvC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SwUapqYLVCYoZxvC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SwUapqYLVCYoZxvC .error-icon{fill:#552222;}#mermaid-svg-SwUapqYLVCYoZxvC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SwUapqYLVCYoZxvC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SwUapqYLVCYoZxvC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SwUapqYLVCYoZxvC .marker.cross{stroke:#333333;}#mermaid-svg-SwUapqYLVCYoZxvC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SwUapqYLVCYoZxvC p{margin:0;}#mermaid-svg-SwUapqYLVCYoZxvC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SwUapqYLVCYoZxvC .cluster-label text{fill:#333;}#mermaid-svg-SwUapqYLVCYoZxvC .cluster-label span{color:#333;}#mermaid-svg-SwUapqYLVCYoZxvC .cluster-label span p{background-color:transparent;}#mermaid-svg-SwUapqYLVCYoZxvC .label text,#mermaid-svg-SwUapqYLVCYoZxvC span{fill:#333;color:#333;}#mermaid-svg-SwUapqYLVCYoZxvC .node rect,#mermaid-svg-SwUapqYLVCYoZxvC .node circle,#mermaid-svg-SwUapqYLVCYoZxvC .node ellipse,#mermaid-svg-SwUapqYLVCYoZxvC .node polygon,#mermaid-svg-SwUapqYLVCYoZxvC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SwUapqYLVCYoZxvC .rough-node .label text,#mermaid-svg-SwUapqYLVCYoZxvC .node .label text,#mermaid-svg-SwUapqYLVCYoZxvC .image-shape .label,#mermaid-svg-SwUapqYLVCYoZxvC .icon-shape .label{text-anchor:middle;}#mermaid-svg-SwUapqYLVCYoZxvC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SwUapqYLVCYoZxvC .rough-node .label,#mermaid-svg-SwUapqYLVCYoZxvC .node .label,#mermaid-svg-SwUapqYLVCYoZxvC .image-shape .label,#mermaid-svg-SwUapqYLVCYoZxvC .icon-shape .label{text-align:center;}#mermaid-svg-SwUapqYLVCYoZxvC .node.clickable{cursor:pointer;}#mermaid-svg-SwUapqYLVCYoZxvC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SwUapqYLVCYoZxvC .arrowheadPath{fill:#333333;}#mermaid-svg-SwUapqYLVCYoZxvC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SwUapqYLVCYoZxvC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SwUapqYLVCYoZxvC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SwUapqYLVCYoZxvC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SwUapqYLVCYoZxvC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SwUapqYLVCYoZxvC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SwUapqYLVCYoZxvC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SwUapqYLVCYoZxvC .cluster text{fill:#333;}#mermaid-svg-SwUapqYLVCYoZxvC .cluster span{color:#333;}#mermaid-svg-SwUapqYLVCYoZxvC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SwUapqYLVCYoZxvC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SwUapqYLVCYoZxvC rect.text{fill:none;stroke-width:0;}#mermaid-svg-SwUapqYLVCYoZxvC .icon-shape,#mermaid-svg-SwUapqYLVCYoZxvC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SwUapqYLVCYoZxvC .icon-shape p,#mermaid-svg-SwUapqYLVCYoZxvC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SwUapqYLVCYoZxvC .icon-shape .label rect,#mermaid-svg-SwUapqYLVCYoZxvC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SwUapqYLVCYoZxvC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SwUapqYLVCYoZxvC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SwUapqYLVCYoZxvC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户删除请求
法务工单
Catalog 标记 subject_id 删除
分区物理 purge / 加密粉碎
Feature Store TTL 剔除
禁止新 snapshot 含该 id
触发 CT 或 block 旧模型
合规证明报告
7.2 留存与 anonymization
| 策略 | 适用 | 注意 |
|------|------|------|
| Hard delete | 明确要求 erasure | 备份链、WORM 桶要可粉碎 |
| Pseudonymize | 统计仍需要 | hash 加盐轮换 |
| Aggregate only | 报表 | 不可逆聚合才可豁免部分场景 |
7.3 删除 SLA 口述
「P0 账户:72h 内完成在线特征剔除 + 新 snapshot 不含;30 天内完成再训练或 unlearning 验证报告。」
8. LabelOps · 主动学习与 IAA
8.1 标注流水线
#mermaid-svg-uhtipvS6ZZTbhTTH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uhtipvS6ZZTbhTTH .error-icon{fill:#552222;}#mermaid-svg-uhtipvS6ZZTbhTTH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uhtipvS6ZZTbhTTH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uhtipvS6ZZTbhTTH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uhtipvS6ZZTbhTTH .marker.cross{stroke:#333333;}#mermaid-svg-uhtipvS6ZZTbhTTH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uhtipvS6ZZTbhTTH p{margin:0;}#mermaid-svg-uhtipvS6ZZTbhTTH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster-label text{fill:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster-label span{color:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster-label span p{background-color:transparent;}#mermaid-svg-uhtipvS6ZZTbhTTH .label text,#mermaid-svg-uhtipvS6ZZTbhTTH span{fill:#333;color:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH .node rect,#mermaid-svg-uhtipvS6ZZTbhTTH .node circle,#mermaid-svg-uhtipvS6ZZTbhTTH .node ellipse,#mermaid-svg-uhtipvS6ZZTbhTTH .node polygon,#mermaid-svg-uhtipvS6ZZTbhTTH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uhtipvS6ZZTbhTTH .rough-node .label text,#mermaid-svg-uhtipvS6ZZTbhTTH .node .label text,#mermaid-svg-uhtipvS6ZZTbhTTH .image-shape .label,#mermaid-svg-uhtipvS6ZZTbhTTH .icon-shape .label{text-anchor:middle;}#mermaid-svg-uhtipvS6ZZTbhTTH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uhtipvS6ZZTbhTTH .rough-node .label,#mermaid-svg-uhtipvS6ZZTbhTTH .node .label,#mermaid-svg-uhtipvS6ZZTbhTTH .image-shape .label,#mermaid-svg-uhtipvS6ZZTbhTTH .icon-shape .label{text-align:center;}#mermaid-svg-uhtipvS6ZZTbhTTH .node.clickable{cursor:pointer;}#mermaid-svg-uhtipvS6ZZTbhTTH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uhtipvS6ZZTbhTTH .arrowheadPath{fill:#333333;}#mermaid-svg-uhtipvS6ZZTbhTTH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uhtipvS6ZZTbhTTH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uhtipvS6ZZTbhTTH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uhtipvS6ZZTbhTTH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uhtipvS6ZZTbhTTH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uhtipvS6ZZTbhTTH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster text{fill:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH .cluster span{color:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uhtipvS6ZZTbhTTH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uhtipvS6ZZTbhTTH rect.text{fill:none;stroke-width:0;}#mermaid-svg-uhtipvS6ZZTbhTTH .icon-shape,#mermaid-svg-uhtipvS6ZZTbhTTH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uhtipvS6ZZTbhTTH .icon-shape p,#mermaid-svg-uhtipvS6ZZTbhTTH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uhtipvS6ZZTbhTTH .icon-shape .label rect,#mermaid-svg-uhtipvS6ZZTbhTTH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uhtipvS6ZZTbhTTH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uhtipvS6ZZTbhTTH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uhtipvS6ZZTbhTTH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} κ<0.7
pass
未标注池
主动学习采样
标注任务
质检 IAA
返工
Gold 标签集
进入 snapshot
8.2 主动学习(Uncertainty / Diversity)
python
# 伪代码:每轮选 1% 高价值样本
scores = model.predict_proba(unlabeled_pool)
uncertainty = 1 - scores.max(axis=1)
diversity = cluster_distance(embeddings)
priority = 0.7 * uncertainty + 0.3 * diversity
batch = unlabeled_pool.nlargest(k, priority)
8.3 IAA(Inter-Annotator Agreement)
| 任务类型 | 指标 | 及格线(示例) |
|----------|------|----------------|
| 分类 | Cohen's κ | κ ≥ 0.75 |
| 边界框 | IoU 一致率 | ≥ 85% |
| 序列标注 | Krippendorff α | α ≥ 0.8 |
Staff 点 :κ 低不是标注员问题,先查 指南模糊 / 类定义重叠 / 样本噪声。
9. Model Unlearning · 机器遗忘
9.1 何时需要 unlearning vs 全量重训
| 条件 | 推荐 |
|------|------|
| 小模型 + 月级重训 | 全量重训 不含已删主体 |
| 大模型 + 删比例极小 | 近似 unlearning + 审计 |
| 法规明确要求证明 | SISA / certified removal 文献方案 + 第三方评估 |
9.2 工程化三步
-
数据层:snapshot 闭包证明 deleted_id ∉ manifest
-
训练层:retrain 或 influence-based 更新
-
验证层 :membership inference 探测 + holdout 上 deleted 子集指标不应优于随机
9.3 与 GDPR 闭环
text
证明包 = Catalog 删除记录 + purge 日志 + 新 snapshot_id +
新 model_id + eval_report(unlearning_test_pass=true)
10. 平台架构 · 数据管道总图
#mermaid-svg-9UZP91Kb77kQB06I{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9UZP91Kb77kQB06I .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9UZP91Kb77kQB06I .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9UZP91Kb77kQB06I .error-icon{fill:#552222;}#mermaid-svg-9UZP91Kb77kQB06I .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9UZP91Kb77kQB06I .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9UZP91Kb77kQB06I .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9UZP91Kb77kQB06I .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9UZP91Kb77kQB06I .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9UZP91Kb77kQB06I .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9UZP91Kb77kQB06I .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9UZP91Kb77kQB06I .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9UZP91Kb77kQB06I .marker.cross{stroke:#333333;}#mermaid-svg-9UZP91Kb77kQB06I svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9UZP91Kb77kQB06I p{margin:0;}#mermaid-svg-9UZP91Kb77kQB06I .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9UZP91Kb77kQB06I .cluster-label text{fill:#333;}#mermaid-svg-9UZP91Kb77kQB06I .cluster-label span{color:#333;}#mermaid-svg-9UZP91Kb77kQB06I .cluster-label span p{background-color:transparent;}#mermaid-svg-9UZP91Kb77kQB06I .label text,#mermaid-svg-9UZP91Kb77kQB06I span{fill:#333;color:#333;}#mermaid-svg-9UZP91Kb77kQB06I .node rect,#mermaid-svg-9UZP91Kb77kQB06I .node circle,#mermaid-svg-9UZP91Kb77kQB06I .node ellipse,#mermaid-svg-9UZP91Kb77kQB06I .node polygon,#mermaid-svg-9UZP91Kb77kQB06I .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9UZP91Kb77kQB06I .rough-node .label text,#mermaid-svg-9UZP91Kb77kQB06I .node .label text,#mermaid-svg-9UZP91Kb77kQB06I .image-shape .label,#mermaid-svg-9UZP91Kb77kQB06I .icon-shape .label{text-anchor:middle;}#mermaid-svg-9UZP91Kb77kQB06I .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9UZP91Kb77kQB06I .rough-node .label,#mermaid-svg-9UZP91Kb77kQB06I .node .label,#mermaid-svg-9UZP91Kb77kQB06I .image-shape .label,#mermaid-svg-9UZP91Kb77kQB06I .icon-shape .label{text-align:center;}#mermaid-svg-9UZP91Kb77kQB06I .node.clickable{cursor:pointer;}#mermaid-svg-9UZP91Kb77kQB06I .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9UZP91Kb77kQB06I .arrowheadPath{fill:#333333;}#mermaid-svg-9UZP91Kb77kQB06I .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9UZP91Kb77kQB06I .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9UZP91Kb77kQB06I .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9UZP91Kb77kQB06I .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9UZP91Kb77kQB06I .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9UZP91Kb77kQB06I .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9UZP91Kb77kQB06I .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9UZP91Kb77kQB06I .cluster text{fill:#333;}#mermaid-svg-9UZP91Kb77kQB06I .cluster span{color:#333;}#mermaid-svg-9UZP91Kb77kQB06I div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9UZP91Kb77kQB06I .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9UZP91Kb77kQB06I rect.text{fill:none;stroke-width:0;}#mermaid-svg-9UZP91Kb77kQB06I .icon-shape,#mermaid-svg-9UZP91Kb77kQB06I .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9UZP91Kb77kQB06I .icon-shape p,#mermaid-svg-9UZP91Kb77kQB06I .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9UZP91Kb77kQB06I .icon-shape .label rect,#mermaid-svg-9UZP91Kb77kQB06I .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9UZP91Kb77kQB06I .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9UZP91Kb77kQB06I .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9UZP91Kb77kQB06I :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ML Data
Transform
Ingest
Govern
Catalog
Policy
Lineage
Erasure Service
Kafka
Bronze
dbt/Spark
GE Contract CI
Feature Store
Snapshot Builder
Registry binding
11. 大厂口播题 · 高频满分结构
题 1:🟦 字节 - "训练集为什么要 Snapshot 而不是直接用 Hive 分区?"
采分点
- 不可变 manifest + 哈希绑定 run
- 防 ETL 重跑覆盖导致不可复现
- 审计与合规需要「当时吃了啥」
60~90s 口播骨架
- 分区会原地 overwrite;2) snapshot 是逻辑制品;3) Registry 绑 snapshot_id 才能回溯。
追问收口
- Q: 分区按天不够吗? → A: 不够------同天多次 ETL、回刷会改变行集
- Q: Iceberg 呢? → A: 用 snapshot-id / version as of 固化到 manifest
深链 → §3
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 2:🟧 阿里/蚂蚁 - "Point-in-Time join 泄露怎么在平台防?"
采分点
- entity_df 必含 event_timestamp
- ASOF join 内建到 Snapshot Builder
- CI 检查 label_time > feature_time 违规率
60~90s 口播骨架
平台强制 PIT API;禁止宽表直 join 当前特征;违规 expectation 进 Gate。
追问收口
- Q: 业务抱怨慢? → A: 预聚合 + 正确时间轴,不是去掉 PIT
深链 → §3.3
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 3:🟡 美团 - "GDPR 删除如何落到 ML?"
采分点
- Catalog 标记 → purge → FS TTL → 新 snapshot
- 旧模型 block 或 CT 重训
- unlearning 验证报告
60~90s 口播骨架
五步闭环;72h 在线剔除;30d 模型侧证明。
追问收口
- Q: 只删 OLTP 行吗? → A: 不行------特征与 snapshot 闭包都要清
深链 → §7
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 4:🟢 腾讯 - "Lineage 和 Catalog 区别?"
采分点
- Catalog=元数据目录;Lineage=有向图
- 二者通过 dataset URN 关联
60~90s 口播骨架
Catalog 回答「有什么」;Lineage 回答「从哪来、到哪去」。
追问收口
- Q: OpenLineage? → A: 事实标准,Marquez/DataHub 消费
深链 → §5
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 5:🟪 微软 - "Great Expectations 如何进 CI?"
采分点
- PR 跑 checkpoint
- 夜间 snapshot 再跑全量
- 失败阻断 model promote
60~90s 口播骨架
三层:开发态 PR、发布态 nightly、晋升态 registry gate。
追问收口
深链 → §2
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 6:🔴 支付 - "标注 IAA 低怎么处理?"
采分点
- 查指南与类定义
- 分层质检与黄金集
- 主动学习改采样
60~90s 口播骨架
先修定义再修人;κ<0.7 阻断进 snapshot。
追问收口
深链 → §8
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 7:🟦 滴滴 - "Model unlearning 和重训怎么选?"
采分点
- 成本、法规、模型大小
- 验证 membership inference
60~90s 口播骨架
默认重训;大模型+小比例删除才谈近似遗忘。
追问收口
深链 → §9
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 8:🟧 京东 - "Feature Store 与训练 snapshot 双写一致?"
采分点
- 统一 feature definition
- 离线 online 一致率监控
- manifest 记录 feature_view version
60~90s 口播骨架
一份定义;snapshot 记录 version;日检一致率。
追问收口
深链 → §4
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 9:🟡 快手 - "数据契约变更如何演进?"
采分点
- schema_version bump
- 兼容期双跑 expectation
60~90s 口播骨架
契约版本化;旧 snapshot 不追溯改。
追问收口
深链 → §2
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 10:🟢 百度 - "Bronze/Silver/Gold 与 ML Gold 关系?"
采分点
- ML Gold = 训练就绪宽表或 entity_df
- 不等同于分析 Gold
60~90s 口播骨架
分析 Gold 偏 BI;ML Gold 必含时间轴与 label 契约。
追问收口
深链 → §1
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 11:🟦 小红书 - "如何证明模型未使用已删用户数据?"
采分点
- manifest 无 deleted_id
- lineage 闭包
- eval 探测
60~90s 口播骨架
三线证据:数据 manifest、血缘、遗忘测试。
追问收口
深链 → §9
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
题 12:🟧 Staff - "数据平台 SLO 你怎么定?"
采分点
- freshness、row_count、contract pass rate
- snapshot 构建 P95
60~90s 口播骨架
日批 7:00 前 snapshot;contract 失败 <0.1%;构建 P95<2h。
追问收口
深链 → §10
60→95 递进 :60 分答主干;满分补 量化数字 + 权衡 + 反问引导面试官场景。
12. STAR-M-P 事故复盘
STAR-M-P:训练集回刷导致百万用户特征泄露
| 维度 | 内容 |
|---|---|
| S | 风控月模型 AUC 从 0.82 跳到 0.95,上线前 shadow 发现异常。 |
| T | 定位是否标签/特征时间轴错误。 |
| A | 对比 snapshot manifest;发现 feature 表用了 T+0 全量而非 PIT;回滚 snapshot_id;GE 新增 label_time≤feature_time 约束进 CI。 |
| R | 重训后 AUC 0.83;晋升 Gate 增加 时间泄露 expectation;类似 job 全库扫描 12 个,修 3 个。 |
| M | 监控:数据质量 SLI、snapshot 滞后、血缘断链告警 |
| P | Snapshot Builder 强制 ASOF;禁止 bypass PIT 的「宽表捷径」文档化。 |
30 秒电梯版 :风控月模型 AUC 从 0.82 跳到 0.95,上线前 shadow 发现异常。... → 对比 snapshot manifest;发现 feature 表用了 T+0 全量而非 PIT;回滚 snapshot_id;GE 新增 label_time≤feature_time 约束进 CI... → 重训后 AUC 0.83;晋升 Gate 增加 时间泄露 expectation;类似 job 全库扫描 12 个,修 3 个。
STAR-M-P:GDPR 删除未进 Feature Store 导致合规审计失败
| 维度 | 内容 |
|---|---|
| S | 欧盟用户投诉;法务发现在线推荐仍有个性化痕迹。 |
| T | 72h 内完成 erasure 闭环证明。 |
| A | Catalog erasure API → Redis feature purge → 阻断含该 user 的 snapshot;紧急 CT 重训 v13;出具 purge 日志+新 model eval。 |
| R | 72h 内在线剔除;14 天出具合规包;审计通过。 |
| M | 监控:数据质量 SLI、snapshot 滞后、血缘断链告警 |
| P | Erasure 与 FS TTL、snapshot 构建编排进同一工单模板;季度演练。 |
30 秒电梯版:欧盟用户投诉;法务发现在线推荐仍有个性化痕迹。... → Catalog erasure API → Redis feature purge → 阻断含该 user 的 snapshot;紧急 CT 重训 v13;出具 purge 日志+新 model ev... → 72h 内在线剔除;14 天出具合规包;审计通过。
13. 面试前夜 Checklist
- 能画:Bronze→Silver→Gold→Snapshot→Registry 数据流
- 能述:GE vs Contract vs CI Gate 三层
- 能述:snapshot manifest 字段与不可变语义
- 能述:PIT/ASOF 防泄露一句
- 能述:Lineage vs Catalog 分工
- 能述:GDPR 删除五步闭环 + SLA
- 能述:主动学习 + IAA 指标
- 能述:unlearning vs 重训决策
- 准备 1 个数据泄露或合规删除 STAR-M-P
- 能反问:贵司 snapshot 是否绑定 mlflow run
14. 全知识点 Checklist(自测)
附录深度 1 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #1:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 2 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #2:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 3 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #3:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 4 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #4:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 5 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #5:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 6 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #6:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 7 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #7:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 8 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #8:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
附录深度 9 · Staff 追问备忘
| 维度 | 要点 |
|---|---|
| 架构权衡 | 一致性 vs 成本 vs 合规;用 RPO/RTO 与 审计字段 收口 |
| 量化 | 用 snapshot 大小、行数、重训周期、删除 SLA 说话,避免「我们上了 GE」 |
| 边界 | 明确 平台 vs 业务 职责:Catalog 元数据谁维护、删数谁审批 |
| 反模式 | 无版本训练集、无 point-in-time、删用户不删特征、Label 无 IAA |
| 面试反问 | 「贵司训练数据是否 immutable snapshot?」「GDPR 删除是否触发 unlearning?」 |
text
口述金句 #9:
「训练数据不是文件夹,是带 contract 的 snapshot + lineage 闭包。」
「删用户三步:Catalog 标记 → 物理分区 purge → 再训练/遗忘验证。」
官方文档与源码(一级依据)
See registry · 正文机制应来自下方 官方文档(L1) 与 官方源码仓库(L2) ;
禁止用教程站/博客充当机制依据。本章 QPS/延迟/STAR 为面试示意。
L1 · 官方文档