想象你去一座藏书十万册的图书馆,想找一本机器学习入门书。如果图书管理员只把书往架子上堆,不编号、不登记作者、不记录借阅流转,你大概要翻到天黑。可现实中,许多 ML 团队管理实验的方式正是这样:几十上百次实验的超参数、数据集版本、评测指标散落在每个人的终端和 CSV 文件里,想复现三个月前的某次实验,比大海捞针还难。 实验元数据管理,就是给机器学习和深度学习实验建一座“图书馆”。它用一套编目规则(元数据模型)登记每次实验的身份信息;用自动化管道(采集接入)让新实验一“到馆”就被录入;把编好的卡片按合理布局存入书库(存储架构);记录一本书被哪些论文引用、又被谁借走(血缘追踪);给每个版本留档存档(版本管理);制定借阅与修改规范(治理策略);最后打开检索台让读者轻松查书(查询服务)。这套体系是 MLOps 平台的地基——没有它,实验追踪只剩一堆日志文件名,团队协作和模型复现都无从谈起。

岗位关联

掌握实验元数据管理,你将能把散落的实验记录升级为可查询、可追溯、可复现的工程资产,成为 MLOps 平台上最懂实验来龙去脉的人。

目录
  1. 可视化演示
  2. 元数据模型设计:先定编目规则
  3. 元数据采集接入:新书自动登记
  4. 元数据存储架构:书库如何布局
  5. 元数据血缘追踪:一本流转账本
  6. 元数据版本管理:留档不覆盖
  7. 元数据治理策略:图书馆的规矩
  8. 查询服务与集成:打开检索台
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示元数据模型设计、三层存储架构与血缘追踪关系网络,通过模式切换理解MLOps平台中实验元数据系统化管理的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

元数据模型:核心实体与关系定义 实验(Exp)关联运行(Run)、参数(Param)、指标(Metric)和产物(Art) 统一schema定义实体属性,确保跨团队数据一致性 Exp → {Run → [Param, Metric, Art]} 元数据模型是实验管理平台的基石

元数据模型设计:先定编目规则

一座图书馆能高效运转,最早就靠一张标准化的编目单:书名、作者、分类号、书架位置,每本书都按同一格式登记。如果每本书的卡片各写各的,管理员速度再快也白搭。构建实验元数据体系的第一步,同样是定这套“编目规则”——元数据模型。

元数据模型回答三个问题:要记录哪些对象、每个对象有哪些字段、对象之间是什么关系。实践中常用实体-属性-关系(EAR)建模:实验、数据集、模型、指标是实体;超参数、代码版本、切分比例是属性;“实验 A 消费数据集 D、产出模型 M”就是关系。

具体落地时,元数据通常分三层设计:实验级元数据记录超参数、代码 commit、启动时间与运行环境;数据集级元数据记录来源、版本哈希、切分与统计信息;模型级元数据记录网络结构、权重地址、评测指标。层与层之间通过实验 ID 关联成网。每个字段还要明确定义类型、单位、取值范围与是否必填,防止不同团队各说各话。

编目单统一了,新书登记、书库排架、读者检索才有共同语言。同理,元数据模型是所有后续环节的“宪法”——采集照着它记,存储照着它放,查询照着它找。

M=(E,A,R)\mathcal{M} = (\mathcal{E}, \mathcal{A}, \mathcal{R})
元数据模型就是三张清单:有哪些对象(实体)、每个对象的什么信息(属性)、对象之间什么来往(关系)。
  1. 实体集合把实验、数据集、模型等核心对象抽象为实体,构成全集
    E={e1,e2,…,em}\mathcal{E} = \{e_1, e_2, \dots, e_m\}
  2. 属性集合每个实体携带的字段,如超参、指标、版本号
    A={a(e,f)∣e∈E, f∈Fields}\mathcal{A} = \{a(e, f) \mid e \in \mathcal{E},\ f \in \text{Fields}\}
  3. 关系集合实体间依赖、继承与流转的有类型关系
    R={(ei,ej,t)∣ei 与 ej 存在关系,类型为 t}\mathcal{R} = \{(e_i, e_j, t) \mid e_i \text{ 与 } e_j \text{ 存在关系,类型为 } t\}

元数据采集接入:新书自动登记

图书馆若靠管理员手工抄卡片,一天进几百本书根本忙不过来。现代化的做法是扫码枪“嘀”一声,书的信息自动入库。实验每天都在发生,元数据采集接入要解决的就是“如何自动登记每一次实验”。

采集发生在实验执行的关键事件点:训练启动时抓超参数与代码版本,数据加载时记录数据集哈希,每个评估周期抓取指标,训练结束时登记产物路径。实现手段是框架钩子——在 ML 训练框架的生命周期回调中注入采集逻辑,例如把 SDK 包进训练入口,用户几乎无感。

采集管道要“实时+批量”双轨运行:实时管道对关键事件低延迟入库,实验一结束即可查询;批量管道定期扫描日志与产物清单做兜底,补上漏采的边角数据。两者之间用消息队列缓冲,当几百个实验同时上报时不会把存储打垮。

有了自动扫码枪,元数据不再依赖工程师的记忆和自觉。登记一旦成为机制,规模化的实验管理才可能发生。

Ccov=NcapNtotal×100%C_{\text{cov}} = \frac{N_{\text{cap}}}{N_{\text{total}}} \times 100\%
采集覆盖率 = 实际收进馆的书 ÷ 应该到馆的书。它衡量扫码枪有没有漏扫。
  1. 已采集事件数统计实际成功进入元数据平台的事件总数
    Ncap=count(采集成功的事件)N_{\text{cap}} = \text{count}(\text{采集成功的事件})
  2. 应采集事件数统计全部实验理论上应产生的事件总数
    Ntotal=count(全部应产生事件)N_{\text{total}} = \text{count}(\text{全部应产生事件})
  3. 覆盖率计算两者之比转换为百分比,越接近 100% 说明登记越完整
    Ccov=NcapNtotal×100%C_{\text{cov}} = \frac{N_{\text{cap}}}{N_{\text{total}}} \times 100\%

元数据存储架构:书库如何布局

图书馆不会把所有书堆在一个大房间里:畅销书放前台附近,旧刊进闭架书库,珍本单独上锁。元数据也一样,不同特点的数据要放到不同的“书库”,才能既省钱又查得快。

单一数据库很难同时满足所有查询。主流方案是混合存储:关系型数据库保存实验、数据集、指标等结构化记录,支持按 ID 的强一致查询;图数据库保存血缘关系,擅长多跳深度遍历;对象存储或冷存储保存大块原始元数据、产物清单等低频数据。

细节上有四个常用手段:宽表设计把同类型实验聚成一张大表,减少 JOIN;按时间或团队分区,让查询只扫必要分片;对高频字段建索引,让“按超参找实验”秒回;冷热分层则把近期活跃数据放高速存储、历史数据归档到低成本存储,控制总成本。

书库布局决定读者找书的体验,存储架构决定元数据平台的查询体验。布局合理,下游系统才能流畅地取用记录。

Cost=Chot×Vhot+Ccold×Vcold\text{Cost} = C_{\text{hot}} \times V_{\text{hot}} + C_{\text{cold}} \times V_{\text{cold}}
存储总成本 = 热库单价 × 热数据量 + 冷库单价 × 冷数据量。把旧书挪进廉价书库,总开销自然下降。
  1. 热数据成本近期高频访问的数据存放在高速存储上产生的费用
    Costhot=Chot×Vhot\text{Cost}_{\text{hot}} = C_{\text{hot}} \times V_{\text{hot}}
  2. 冷数据成本历史低频数据归档到低成本存储上产生的费用
    Costcold=Ccold×Vcold\text{Cost}_{\text{cold}} = C_{\text{cold}} \times V_{\text{cold}}
  3. 总成本热冷两段之和,可按访问频率动态调整分层阈值来最小化它
    Cost=Chot×Vhot+Ccold×Vcold\text{Cost} = C_{\text{hot}} \times V_{\text{hot}} + C_{\text{cold}} \times V_{\text{cold}}

元数据血缘追踪:一本流转账本

你从图书馆借到一本被涂改过的书,如果馆里没有借阅与修订流水,谁都说不清改动从哪来。实验世界里,模型效果突然变差、指标对不上,都需要回答“这份数据到底从哪来、被谁用过”——这就是血缘追踪。

血缘在数据产生的瞬间被捕获:数据集生成时记录来源管道;实验启动时声明父实验与输入数据集;模型注册时绑定训练它的实验。这些“谁消费谁、谁产出谁”的边构成一张有向图,节点是数据集、实验与模型。

血缘图支撑两类核心分析:上游溯源从任一模型向上递归,找出所有输入与祖先实验,用于定位问题根因;下游影响分析从任一数据集向下枚举所有受影响任务,用于评估“改这个表会炸几个下游”。实现时用递归遍历配合缓存,避免重复计算拖垮查询。

流转账本记全了,任何结果都能追溯来源。团队排查问题时,再也不用“开会问一圈数据哪来的”。

Anc(v)={v}∪⋃u:(u,v)∈EAnc(u)\displaystyle \text{Anc}(v) = \{v\} \cup \bigcup_{u: (u, v) \in E} \text{Anc}(u)
一个节点的“祖先集合”等于它自己,加上它所有直接上游的祖先。像家谱一样,一路向上追到没有记录的先祖为止。
  1. 血缘图定义节点集合与有向边集合构成一张血缘图
    G=(V,E)G = (V, E)
  2. 祖先集合递归自身并上所有直接上游节点的祖先,形成完整上游
    Anc(v)={v}∪⋃u:(u,v)∈EAnc(u)\text{Anc}(v) = \{v\} \cup \bigcup_{u: (u, v) \in E} \text{Anc}(u)
  3. 递归终止没有上游边的节点,祖先集合只剩它自己
    Anc(v)={v},if∄ u, (u,v)∈E\text{Anc}(v) = \{v\}, \quad \text{if} \quad \nexists\, u,\ (u, v) \in E

元数据版本管理:留档不覆盖

教材出到第五版,老版本依然留在图书馆里可供查证,而不是被新版的印刷机销毁。元数据同样会变:指标算错了要修正、标签漏了要补录。版本管理就是对每一条记录建立“版次”,而不是直接抹掉旧的。

核心原则是“不可变、追加式”:已有记录禁止原地修改,任何变更都作为新版本写入,系统自动记下 changelog——谁在什么时间改了哪个字段、旧值是什么、新值是什么。

查询默认返回最新版本;要复现某次实验时,可按版本号取回当时的完整快照:超参数、数据集哈希、代码 commit 全部定格在实验执行那一刻。版本号常用递增整数,重大不兼容变更则升级主版本号,让“回滚”变成一次普通的查询操作。

“留档不覆盖”让历史永不丢失。就像图书馆保留修订记录,实验的任何时刻状态都能被精确重建,这是复现与审计的根基。

Vlatest=Vbase+∑i=1nΔiV_{\text{latest}} = V_{\text{base}} + \sum_{i=1}^{n} \Delta_i
最新版本 = 第一版快照 + 之后每一次修改的增量。想回到任意历史时刻,把增量叠到那一点即可。
  1. 基础快照记录首次入库时的完整状态,是版本演化的起点
    VbaseV_{\text{base}}
  2. 变更增量每次修改追加一条旧值到新值的差异记录
    Δi=Vi−Vi−1={旧值→新值}\Delta_i = V_{i} - V_{i-1} = \{\text{旧值} \rightarrow \text{新值}\}
  3. 最新版本基版本叠加全部增量即得当前值,任意时刻可由前缀和重建
    Vlatest=Vbase+∑i=1nΔiV_{\text{latest}} = V_{\text{base}} + \sum_{i=1}^{n} \Delta_i

元数据治理策略:图书馆的规矩

图书馆有借阅规则,有破损淘汰制度,有珍本特藏审批。没有规矩的元数据平台会逐渐变成数据沼泽:命名混乱、字段缺失、权限失控。治理策略就是为元数据定“馆规”。

治理有四个支柱:质量校验在写入时检查必填字段、类型与取值,异常数据直接拦截或告警;权限与合规按角色控制访问,敏感元数据留审计日志;标准字典统一命名与枚举值,让 lr 与 learning_rate 不再混用;生命周期管理让过期的数据集元数据按时归档删除。

治理效果可以用质量评分量化:完整性看必填字段填充比例,准确性看抽样比对正确率,时效性看采集延迟。定期跑分并公示,低于阈值的团队收到整改通知,治理就从“喊口号”变成“可度量”。

馆规让图书馆几十年不乱,治理让元数据平台长期可用。没有治理的元数据,短期能跑,长期必乱。

Q=wc⋅C+wa⋅A+wt⋅TQ = w_c \cdot C + w_a \cdot A + w_t \cdot T
元数据质量分 = 完整性 × 权重 + 准确性 × 权重 + 时效性 × 权重。就像给图书馆的编目质量打分,查漏补缺有据可依。
  1. 完整性指标必填字段中实际被填满的比例
    C=FfilledFrequiredC = \frac{F_{\text{filled}}}{F_{\text{required}}}
  2. 准确性指标抽样比对中与真实情况一致的记录占比
    A=RcorrectRsampledA = \frac{R_{\text{correct}}}{R_{\text{sampled}}}
  3. 加权总分三类指标按团队侧重点加权求和,权重之和为 1
    Q=wc⋅C+wa⋅A+wt⋅T,wc+wa+wt=1Q = w_c \cdot C + w_a \cdot A + w_t \cdot T, \qquad w_c + w_a + w_t = 1

查询服务与集成:打开检索台

编目、书库、流转、版本、馆规,最终都为了一个目标——读者能快速找到想要的书。元数据体系的最后一环,是把前面六层能力封装成公开的“检索台”:统一查询服务。

平台提供三类接口:detail 按 ID 查单条详情;search 按标签、时间、指标区间组合筛选;lineage 拉取血缘子图。接口同时支持 RESTful 与 SDK 两种调用方式,返回结构统一携带版本号与时间戳,保证下游拿到的是带上下文的数据。

查询服务向上对接 MLOps 面板、自动调参系统与 CI/CD 流水线:实验页面展示指标趋势,对比功能并行展示多次实验,血缘视图让“点一个模型、看全链路”成为可能。查询性能上,配合存储层的索引与分区,让 90% 的检索在几百毫秒内返回。

检索台一开,读者不必再钻进书库翻找。查询服务把整个体系汇成一个出口,实验元数据从此成为人人可用的工程资产。

topk(search(q))=sort({r∣match(r,q)})[0:k]\displaystyle \text{top}_k(\text{search}(q)) = \text{sort}(\{ r \mid \text{match}(r, q) \})[0 : k]
检索台的工作:先筛出所有符合条件的记录,再按时间或相关度排序,最后取前 k 条展示给读者。
  1. 匹配判定记录在每个查询字段上都满足条件才算命中
    match(r,q)≡⋀f∈q(r.f=q.f)\text{match}(r, q) \equiv \bigwedge_{f \in q} (r.f = q.f)
  2. 结果集所有命中记录构成候选结果,交给排序环节
    search(q)={r∣match(r,q)}\text{search}(q) = \{ r \mid \text{match}(r, q) \}
  3. 排序截断按时效或相关性排序后截取前 k 条返回
    topk(search(q))=sort(search(q))[0:k]\text{top}_k(\text{search}(q)) = \text{sort}(\text{search}(q))[0 : k]

AI 应用场景

大规模实验血缘事故排查

阶段:实验追踪与问题定位

解决的问题:线上模型效果突然回退时,传统做法靠工程师记忆和零散日志排查,效率极低。有了血缘追踪,从模型反查训练实验、输入数据集、特征管道,几分钟锁定可疑的数据变更——如同顺着图书馆的借阅流水,查出是哪位读者弄脏了书。

具体案例:某推荐系统团队发现线上 CTR 下降 2%,通过血缘图反查到两周前特征管道更换了数据源版本,顺藤摸瓜定位到上游数据集切分比例变化,快速回滚到旧版本,指标次日恢复。

模型发布复现与合规审计

阶段:模型发布与审计归档

解决的问题:金融风控模型上线后,监管要求说明“这个模型用了哪些数据、谁训练的、何时发布”。传统方式需人工整理大量信息且经常缺失。元数据版本管理让每次发布自动绑定实验、数据、代码的三元组快照——如同图书馆为每本珍本留下完整的版次档案。

具体案例:银行风控建模团队通过元数据平台一键导出模型发布审计单,包含训练数据哈希、代码 commit、超参数版本,审计准备从一周缩短到半小时。

新实验自动化接入与检索

阶段:实验初始化与结果查询

解决的问题:新成员每次跑实验都要手动填一堆配置,容易填错漏填。自动采集钩子让实验一启动信息就入库;统一查询 API 让算法同学用一行代码拉取任意历史实验对比——如同读者再也不用翻卡片柜,检索台直接给出答案。

具体案例:算法团队在训练框架中集成采集 SDK 后,元数据覆盖率从 40% 提升到 98%,查询实验平均耗时从小时级降到秒级,新人上手时间缩短一半。

Python 演示

python50 行
class MetaCatalog:    def __init__(self):        self.records = {}        self.lineage = []        self.history = []     def register(self, exp_id, name, tags, parents=None):        record = {'id': exp_id, 'name': name, 'tags': tags, 'version': len(self.history) + 1, 'parents': parents or []}        self.records[exp_id] = record        for p in record['parents']:            self.lineage.append((p, exp_id))        self.history.append(record)        return record     def snapshot(self):        return {k: dict(v) for k, v in self.records.items()}     def ancestors(self, exp_id):        result = set()         def walk(node_id):            if node_id in result:                return            result.add(node_id)            for p, c in self.lineage:                if c == node_id:                    walk(p)         walk(exp_id)        return result     def query(self, tag=None, name=None):        hits = []        for r in self.records.values():            if tag and tag not in r['tags']:                continue            if name and name not in r['name']:                continue            hits.append(r['id'])        return hits  if __name__ == '__main__':    cat = MetaCatalog()    cat.register('exp-001', 'baseline_lr', ['v1', 'baseline'])    cat.register('exp-002', 'tuned_lr', ['v1', 'tuned'], parents=['exp-001'])    cat.register('exp-003', 'tuned_xgb', ['v2', 'tuned'], parents=['exp-002'])    print('血缘祖先:', cat.ancestors('exp-003'))    print('标签查询:', cat.query(tag='tuned'))    print('快照版本数:', len(cat.history))
目的:用约百行代码实现一个迷你实验元数据目录——登记实验、记录血缘边、追加版本历史、递归溯源与组合查询,对应正文中的模型、血缘、版本、查询四大能力。
  1. record = {'id': exp_id, 'name': name, 'tags': tags, 'version': len(self.history) + 1, 'parents': parents or []}把一次实验展平成结构化元数据字典,version 由历史长度自动递增,象征“追加式”。
  2. self.lineage.append((p, exp_id))以“父实验 → 子实验”二元组记录一条血缘边,对应正文中的流转账本。
  3. self.history.append(record)只追加不覆盖,新版本永远进入历史栈,旧记录得以保留。
  4. result.add(node_id)祖先集合用 set 去重,防止环状依赖导致无限递归。
  5. for p, c in self.lineage:遍历全部血缘边,找出以当前节点为子节点的那些父节点,再向上递归。
  6. cat.register('exp-003', 'tuned_xgb', ['v2', 'tuned'], parents=['exp-002'])声明父依赖,血缘图自动扩张,复现实验时就能一路溯源。

常见误区

误区“我每天把训练日志和结果 CSV 放到共享网盘,定期归档,这不就是元数据管理吗?”

正解日志是原始、非结构化的流水记录,元数据是“关于数据的结构化描述”。图书馆里,图书正文不等于编目卡片。元数据要按模型设计采集字段、可查询可关联,共享网盘里的日志无法回答“哪次实验用了哪个数据集版本”这类问题。

为何常见:实验日志最直观、最容易获取,初学者容易把“存下来的日志”误认为“可用的元数据”。

误区“我在数据库里存了两列:父实验 ID 和子实验 ID,这就是血缘。”

正解记录依赖只是第一步。真正的血缘追踪需要把关系组织成可查询的图,支持上游溯源与下游影响分析两类递归查询,还要保存时间维度(关系何时建立)。就像借阅记录不仅要写“A 借给 B”,还要能回答“B 的书最早追溯到谁”。

为何常见:表的父子关系实现直观,容易让人误以为图查询同样简单,忽略了递归路径与时间维度。

误区“指标算错了,我直接改数据库里那行记录不就行了?”

正解直接覆盖会丢失历史,复现实验时无法还原当时状态。正确做法是不可变追加式:旧记录留着,新记录以新版本写入,查询默认取最新。就像书籍修订不销毁旧版,读者才能对照版本差异。

为何常见:传统 CRUD 应用开发习惯让人默认“更新就是覆盖”,没有意识到元数据兼具档案属性。

误区“我们做了 RBAC,只有指定人能改元数据,治理这块算完成了吧?”

正解权限只是治理四支柱之一。质量校验(字段完整、取值合法)、标准字典统一(命名和枚举一致)、生命周期管理(过期数据归档删除)同样关键。只有权限没有质量校验,平台照样会被脏数据污染。

为何常见:权限是“看得见的治理”,容易操作和演示;质量与生命周期治理是无形的长期工程,容易被忽视。

面试题

Q1. 在实验元数据管理体系中,“元数据”最准确的指代是?

单选题 · easy

  • A.训练硬件运行日志
  • B.模型权重备份文件
  • C.实验信息结构化描述← 正确答案
  • D.代码仓库版本快照

答案:C。元数据是“关于数据的数据”,是对实验的结构化描述;权重文件是产物,日志是原始记录,代码仓库是代码资产,三者都不是描述实验信息的核心载体。如同图书的编目卡片是书的元数据,书的正文不是。

Q2. 血缘追踪里的“下游影响分析”主要用途是?

单选题 · easy

  • A.评价模型最终精度
  • B.评估变更的下游影响← 正确答案
  • C.压缩节省存储空间
  • D.自动调整超参组合

答案:B。下游影响分析面向“我这个变更会影响谁”,从变更节点向下递归;评估精度、压缩存储、调参都不是血缘的职责。就像图书馆要知道某本书下架会影响哪些参考文献的读者。

Q3. 元数据记录采用“不可变追加式”的价值主要在?

单选题 · mid

  • A.提升磁盘写入速度
  • B.简化数据库表结构
  • C.保证历史可回溯审计← 正确答案
  • D.降低索引维护成本

答案:C。不可变追加保证了任何时刻的状态都可重建,是复现与审计的前提;提升写入速度、简化表结构、降低索引成本都是次要甚至相反的代价。如同书籍修订保留旧版而非销毁。

Q4. 血缘图祖先递归计算中,递归终止条件是?

单选题 · mid

  • A.节点没有下游节点
  • B.节点没有上游依赖← 正确答案
  • C.节点已经被访问过
  • D.图的深度超过百层

答案:B。递归在“没有上游边”处停止,此时祖先集合只剩自己;有下游不终止,已访问是防环措施而非终止条件,深度限制是保护性手段。如同家谱追溯到没有记录的先祖为止。

Q5. 冷热数据分层存储的核心收益是什么?

单选题 · hard

  • A.用低成本存储承载历史← 正确答案
  • B.每条记录都能实时更新
  • C.彻底消除元数据冗余
  • D.让血缘查询无需索引

答案:A。冷热分层用低成本存储承载历史低频数据,从而降低总成本;实时更新、消除冗余、免索引都不是分层的目的。如同图书馆把旧刊移入廉价闭架库。

Q6. 统一查询 API 中“组合条件检索”指?

单选题 · easy

  • A.连接多个数据库实例
  • B.用 SQL 直达训练日志
  • C.多模型融合提升精度
  • D.多字段条件同时过滤← 正确答案

答案:D。组合条件检索是多个字段条件同时施加过滤;连接数据库、SQL 直查日志、模型融合都不是查询 API 的正确含义。如同检索台同时按书名、作者、分类查书。

Q7. 元数据质量评分中的“完整性”衡量?

单选题 · easy

  • A.存储节点可用数量
  • B.血缘边数的多少
  • C.必填字段填充比例← 正确答案
  • D.查询接口响应时长

答案:C。完整性衡量必填字段的填充比例;节点数量、血缘边数、响应时长分别属于可用性、血缘丰富度与性能,与质量评分中的完整性不是一个维度。如同编目卡片缺了作者栏就是残缺。

Q8. 下列哪些属于实验级元数据的典型字段?

多选题 · mid

  • A.超参数配置信息← 正确答案
  • B.代码提交哈希← 正确答案
  • C.训练启动时刻← 正确答案
  • D.部门绩效评级

答案:ABC。超参、代码哈希、启动时刻都是实验级元数据的典型描述;绩效评级与实验无关。如同编目单记录书名、作者、版次,不记录读者工资。

Q9. 哪些措施符合元数据治理最佳实践?

多选题 · hard

  • A.写入时校验必填字段← 正确答案
  • B.建立统一标准字典← 正确答案
  • C.敏感元数据访问审计← 正确答案
  • D.允许随意覆盖旧记录

答案:ABC。校验必填字段、统一字典、审计敏感访问都是治理最佳实践;允许随意覆盖旧记录违背不可变原则,会破坏可追溯性。如同图书馆不允许读者撕掉修订记录。

Q10. 血缘关系通常发生在哪些对象之间?

多选题 · mid

  • A.实验消耗数据集← 正确答案
  • B.模型源自某实验← 正确答案
  • C.数据集由管道产出← 正确答案
  • D.日志与告警关联

答案:ABC。实验消耗数据集、模型源自实验、数据集由管道产出都是图上的血缘边;日志与告警的关联只是运维事件,不是数据流转关系。如同借阅账本只记录书与读者的流转,不记录灯管维修。