数据管道-训练数据集与版本化

数据管道 · 训练数据集与版本化

🏠 返回 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设计.md04-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 工程化三步

  1. 数据层:snapshot 闭包证明 deleted_id ∉ manifest

  2. 训练层:retrain 或 influence-based 更新

  3. 验证层 :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 口播骨架

  1. 分区会原地 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 为面试示意。

写作规范:docs/official-sources-registry.md §0

L1 · 官方文档

相关推荐
Summer-Bright1 天前
AI 芯片简报 07.21-07.24:NVIDIA Vera 亮剑、AMD 2nm GPU、Google 叛逃 CoWoS
大数据·人工智能·ai·自然语言处理·芯片·agi
workflower1 天前
供应链分销网络选址问题
人工智能·机器学习·设计模式·自然语言处理·机器人
狂奔solar2 天前
漫话Word2Vec:从离散符号到语义向量空间
人工智能·自然语言处理·word2vec
就是一顿骚操作2 天前
词嵌入 word2vec:Skip-Gram 与 CBOW 经典解读
人工智能·自然语言处理·word2vec·论文解读
学习中.........2 天前
从 Karpathy 手写 BPE 到 CS336 `train_bpe` 作业实现
人工智能·机器学习·语言模型·自然语言处理
可触的未来,发芽的智生2 天前
发现-元认知技能,激起神经符号系统跃变
javascript·人工智能·python·程序人生·自然语言处理
大模型任我行3 天前
蚂蚁:智能体安全护栏SingGuard-NSFA
人工智能·语言模型·自然语言处理·论文笔记
蓦然回首却已人去楼空3 天前
Build a Large Language Model (From Scratch) 第五章 在无标签数据上进行预训练
人工智能·语言模型·自然语言处理
我登哥MVP3 天前
Headroom 深度指南:AI Agent 上下文压缩实战
人工智能·python·深度学习·神经网络·机器学习·自然语言处理·pip