跳转至

第28章:数据产品化与数据契约

刘中一(Zhongyi Liu);Ye Yu;杜文卓(Wenzhuo Du)

摘要

被登记在目录中的数据集仍可能被上游悄然改变字段语义或停止更新,从而沿数据链路放大为模型效果下降乃至线上事故。本章讨论如何把数据从一份份静态数据集,升级为可被消费者长期依赖的数据产品(data product),并以数据契约(data contract)约束生产者与消费者之间的权利与义务。首先借鉴数据网格(data mesh)思想,提出以数据产品画布刻画输入、输出、服务等级协议(Service Level Agreement,SLA)、负责人(Owner)与变更策略五要素;继而把契约拆解为 schema、quality、freshness、privacy、compatibility 五类可机读、可校验、可版本化的核心条款,并界定双向责任边界;随后讨论变更兼容性分类与消费者治理,说明字段变更、样本分布漂移、索引重建与评测集刷新如何经提前通知与灰度验证受控演进。最后以一次 interaction_type 枚举拆分引发训练与检索双重退化的事故复盘,展示 schema 校验、分布监控与版本化回滚如何把沉默失败化解于发布之前。


关键词

数据产品化与数据契约;数据资产;元数据治理;数据产品;数据契约

学习目标

  • 能够区分数据集思维与数据产品思维,并用数据产品画布刻画输入、输出、SLA、Owner 与变更策略五要素。
  • 能够设计 schema、quality、freshness、privacy、compatibility 五类可机读、可校验、可版本化的数据契约条款。
  • 能够界定数据生产者与消费者之间的双向责任边界,对字段变更、分布漂移、索引重建与评测集刷新做兼容性分类。
  • 能够设计提前通知与灰度验证机制,以受控、可回滚的方式治理消费者依赖。
  • 能够复盘 schema 沉默失败如何沿数据链路放大为训练与检索双重退化,并提出预防措施。

章节导读

在上一章中,我们讨论了如何通过数据资产目录与元数据治理,让组织内的数据从可见但不可达的状态,转变为可被发现、可被理解、可被信任的资产。然而,能够被发现和理解不等于能够被可靠地、长期地依赖。一个被登记在目录中的数据集,仍然可能被上游改变字段含义,或因为采集任务的一次故障而停止更新。当下游的训练流水线、RAG 知识库或评测系统正依赖这份数据稳定运转时,这类看似微小的变化,往往会沿着数据链路被层层放大,最终演变为模型效果下降、线上事故甚至合规风险(Sambasivan et al. 2021)。

这正是本章要解决的核心问题:如何让数据从"一份份静态的数据集",升级为"一项项可被消费者长期依赖的数据产品",并通过明确的数据契约(Data Contract)来约束数据生产者与消费者之间的权利与义务。与传统的数据交付不同,数据产品化强调的不是一次性地把数据交出去,而是像维护一个对外提供服务的软件产品一样,持续地保证数据的结构、质量、时效与隐私边界,并在变更发生时,以受控、可预期的方式通知和保护下游消费者。

在大模型数据工程的背景下,这一转变尤为关键。模型训练会把数据的特征固化进参数,RAG 系统会持续消费不断更新的知识源,评测系统则依赖数据分布的稳定性来保证评估结果可比。这些场景对数据的稳定性、可预期性和可追溯性提出了远高于传统报表分析的要求。一旦上游数据在下游毫不知情的情况下发生变化,其代价往往不是重新跑一遍查询那么简单,而可能意味着一次失败的训练、一批错误的线上回答,或一组失真的评测结论。

本章将围绕四个方向展开:首先讨论从数据集到数据产品的思维转变,引入输入、输出、SLA、Owner 与变更策略等产品要素;其次拆解数据契约的五类核心条款——schema、quality、freshness、privacy 与 compatibility;接着讨论变更兼容性与消费者治理,说明字段变更、样本分布变化、索引重建与评测集刷新如何提前通知并灰度验证;最后通过一次真实风格的事故复盘,展示当上游字段变化导致训练与检索效果下降时,数据契约与回滚机制如何及时止损。


28.1 从数据集到数据产品

28.1.1 数据集思维的局限

在大多数组织的早期阶段,数据的交付遵循一种朴素的数据集思维:某个团队需要数据时,由数据生产方导出一份文件或开放一张表,交付即告完成。这种模式在一次性分析、原型验证等场景中确实高效,但当数据需要被多个团队、多个应用长期依赖时,它的局限就会迅速暴露。

数据集思维的第一个问题,是它把数据当作静态的交付物,而非持续的服务。一份导出的 CSV 文件,在交付的那一刻就与上游脱钩了:上游 schema 演化、口径调整、质量波动,下游都无从感知。第二个问题,是它没有明确的责任主体。当数据出问题时,消费者往往不知道该找谁,生产者也不认为自己对下游的使用负有持续责任。第三个问题,是它缺乏对变更的约束。上游可以随时修改字段、调整含义、停止更新,而这些变更对下游的影响完全不可预期。这种自由对生产者是便利,对消费者却是灾难——它意味着任何一份被依赖的数据,都可能在任意时刻悄然失效。

这些问题的根源在于:数据集思维只关心"数据是否被交付",而不关心"数据能否被持续、可靠地使用"。在生产级机器学习系统中,这种忽视会以技术债的形式不断累积——未经治理的数据依赖会在系统内部以隐蔽的方式蔓延,最终显著抬高维护成本,并在出问题时才被发现(Sculley et al. 2015)。要从根本上解决这些问题,就必须把数据交付,从给一份文件升级为提供一项产品。

28.1.2 数据产品:交付稳定能力,而非一次性文件

数据产品(Data Product)这一概念,近年来随着数据网格(Data Mesh)架构的兴起而被广泛讨论(Dehghani 2022; Machado, Costa and Santos 2022)。其核心主张是:数据应当像面向用户的软件产品一样被对待——它有明确的消费者、有承诺的服务质量、有专门的负责人,并以可预期的方式演进。

把数据当作产品,意味着一系列思维方式的转变。数据产品交付的不是某一时刻的数据快照,而是一种可被长期依赖的稳定能力:消费者可以预期它的结构不会无故改变、质量不会无故下降、更新不会无故停止。这种稳定性不是免费的,它需要生产方主动承担起对下游的持续责任,需要明确的服务等级承诺,也需要在变更发生时遵守既定的沟通与灰度流程。换言之,数据产品的核心不在于数据本身的规模和丰富度,而在于围绕数据建立起的一整套可预期性保障。

这一视角与机器学习系统工程中的普遍经验相呼应:部署在真实环境中的 ML 系统,其可靠性往往不取决于模型本身,而取决于围绕数据建立的工程纪律是否扎实(Paleyes, Urma and Lawrence 2022; Lwakatare et al. 2020)。当数据被当作产品来运营时,这种工程纪律就有了明确的载体。

28.1.3 数据产品画布:输入、输出、SLA、Owner 与变更策略

要把一份数据真正打造成数据产品,需要清晰地回答一组结构化的问题:它消费哪些上游输入?它对外提供什么输出?它承诺怎样的服务质量?谁为它负责?它将如何演进?这些问题可以汇总为一张数据产品画布(Data Product Canvas),作为定义和评审数据产品的统一模板。

如图28-1 所示,数据产品画布把一个数据产品的关键要素组织在一张视图中,使生产者、消费者与治理团队能够在同一语境下讨论这个产品的边界与承诺。

数据产品画布

图28-1:数据产品画布。

画布中的几个要素值得展开说明。输入一般用来说明这个数据产品依赖哪些上游数据源与资产。这一项把数据产品的血缘上游显式化,使得当上游发生变化时,能够立即判断本产品是否受影响。输出定义对外提供的数据接口,包括输出的 schema、粒度、字段语义和访问方式。输出接口一旦发布,就成为面向消费者的承诺,不能随意改动。SLA(服务等级协议)是数据产品区别于普通数据集的关键标志。借鉴站点可靠性工程中对服务等级的定义方式(Beyer et al. 2016),数据产品的 SLA 通常包括:数据的更新频率与延迟上限(如"每日 08:00 前完成更新")、可用性(如"全年可用率 99.5%")、质量底线(如"完整率不低于 0.98")以及故障响应时效。SLA 把"尽力而为"的模糊承诺,转化为可度量、可问责的明确指标。Owner(负责人)明确谁对这个数据产品的质量、稳定性和演进负最终责任。没有明确 Owner 的数据产品,迟早会因无人维护而退化。除 Owner 外,通常还设有数据管家(Steward)负责日常运维。变更策略(Change Policy)规定这个数据产品将如何演进:哪些变更是允许的、需要怎样的提前通知、是否需要灰度、消费者如何被告知。变更策略是数据产品"可预期性"的制度保障,也是后续 28.3 节的核心议题。

表28-1 概括了数据集与数据产品在这些维度上的根本区别。

表 28-1:数据集与数据产品的对比。

维度 数据集(Dataset) 数据产品(Data Product)
交付形态 一次性文件或快照 可长期依赖的稳定服务
责任主体 不明确 明确的 Owner 与 Steward
服务承诺 明确的 SLA(时效、质量、可用性)
变更管理 可随意变更 受变更策略与契约约束
消费者关系 松散、不可见 注册、可追踪、可通知
演进方式 不可预期 版本化、灰度、向后兼容

28.1.4 本节小结

从数据集到数据产品本质上是从静态文件到稳定能力的转变。数据产品通过明确输入、输出、SLA、Owner 与变更策略,把数据的可预期性建立在制度而非个人记忆之上。数据产品画布为定义和评审这种可预期性提供了统一模板。然而,画布只是描述了数据产品应该是什么样,要让这些承诺真正可被执行、可被校验、可被问责,还需要一份更正式、更可机读的约定——这就是下一节要讨论的数据契约。


28.2 Data Contract 的字段与边界

28.2.1 什么是数据契约

如果说数据产品画布回答的是"这个产品承诺了什么",那么数据契约(Data Contract)回答的就是"这些承诺如何被精确定义、被机器校验、被双方共同遵守"。数据契约是数据生产者与消费者之间一份正式的、版本化的、可执行的约定,它把原本隐含在口头沟通和个人记忆中的期望,固化为结构化、可校验的规约。

数据契约与传统的 schema 定义有本质区别。schema 只描述数据的结构(有哪些字段、什么类型),而数据契约描述的是关于数据的一整套承诺,其不仅包括结构,还包括质量、时效、隐私和兼容性。从这个意义上说,数据契约可以看作面向数据集的规范文档(如 Datasheets for Datasets)的可执行版本,后者以文档形式记录数据集的构成、用途与局限(Gebru et al. 2021),而前者进一步把这些约定固化为可被流水线自动校验、可随版本演进的工程构件。更重要的是,数据契约是双向的:它既约束生产者必须提供什么,也明确消费者可以期待什么、不能依赖什么。这种双向约定,使得当数据出问题时,责任归属变得清晰:是生产者违反了契约,还是消费者依赖了契约之外的隐含行为。

数据契约的思想,与机器学习数据校验领域的实践高度一致。在生产级 ML 系统中,对进入流水线的数据进行 schema 与统计特征的自动校验,已被证明是拦截低质量数据、防止故障向下游传导的有效手段(Breck et al. 2019)。数据契约可以看作把这种校验前移、并制度化为生产者与消费者之间正式约定的产物。

28.2.2 五类核心契约条款

一份完整的数据契约通常包含五类核心条款,分别覆盖数据可靠性的不同侧面。表28-2 概括了这五类契约的关注问题与典型条款。

表 28-2:五类数据契约的关注点与示例。

契约类型 回答的问题 典型条款示例
Schema 契约 数据长什么样 字段名、类型、是否可空、枚举取值范围、主键
Quality 契约 数据有多可信 完整率 ≥0.98、有效率 ≥0.97、去重率、异常值上限
Freshness 契约 数据有多新 每日 08:00 前更新、延迟 ≤2 小时、断更告警
Privacy 契约 数据能给谁、怎么用 PII 字段清单、脱敏要求、访问范围、合规标签
Compatibility 契约 变更如何不伤害下游 向后兼容承诺、变更通知期、版本弃用周期

Schema 契约约定数据的结构:字段名称、数据类型、是否可空、枚举字段的取值集合、主键约束等。Schema 契约的关键,是把取值范围这类约束显式化。例如,一个 interaction_type 字段如果被声明为只能取 {click, like, collect, share} 这一封闭集合,那么上游一旦新增或拆分枚举值,就会立即违反契约而被检测到——这一点在本章 28.4 节的事故复盘中将成为关键。Schema 契约还需要明确字段的语义,而不仅是类型,因为类型相同、语义漂移的字段是最隐蔽的故障源(Rahm and Bernstein 2001)。

Quality 契约约定数据的质量底线。它把抽象的"数据质量好"拆解为一组可度量的指标:完整率、有效率、去重率、异常值比例、分布稳定性等(Wang and Strong 1996; Redman 1998)。Quality 契约通常与自动化质量校验工具结合,由流水线持续度量并在违约时告警(Schelter et al. 2018)。需要强调的是,质量是相对于用途而言的——同一份数据,用于粗粒度统计与用于模型训练,其质量门槛可能截然不同,因此 Quality 契约应当反映消费者的实际需求(Strong, Lee and Wang 1997)。

Freshness 契约约定数据的时效性:多久更新一次、更新延迟的上限、断更如何告警。在 RAG 等场景中,时效性直接关系到答案的正确性——一份过期的知识源会让模型基于陈旧信息作答。Freshness 契约把"数据应该多新"从模糊期望变为可监控的硬指标。

Privacy 契约约定数据的隐私与合规边界:哪些字段是 PII、是否已脱敏、可被哪些角色和用途访问、受哪些法规约束。Privacy 契约把上一章讨论的权限与合规要求,固化为数据产品对外承诺的一部分,确保敏感数据不会在交付链路中被无意泄露或越权使用。

Compatibility 契约约定数据产品如何演进而不伤害下游:哪些变更被视为向后兼容、变更需要多长的提前通知期、旧版本的弃用周期等。兼容性的概念借鉴自数据密集型系统中的 schema 演化理论——向后兼容意味着新版本生产的数据仍能被按旧 schema 编写的消费者正确读取,向前兼容则反之(Kleppmann 2017)。Compatibility 契约是连接静态约定与动态变更的桥梁,也是 28.3 节的核心。

28.2.3 数据契约模板

把上述五类条款组织在一起,就构成一份完整的数据契约。如图28-2 所示,一份数据契约模板通常包含元信息(名称、版本、Owner)、五类条款,以及契约的生效与变更信息。

Data Contract 模板:五类条款的结构

图28-2:数据契约模板。

下面给出一份精简的数据契约示例:

代码清单28-1给出了YAML 配置示例。

contract: user_interaction_feedback
version: 2.0.0
owner: data-platform-team@company.com
consumers: [preference_training, rag_feedback, analytics]

schema:                                    # 结构与取值约束
  - user_id:          string, required, hashed
  - interaction_type: enum{click,like,collect,share}, required   # 封闭枚举
  - event_time:       timestamp(UTC, ms), required
quality:                                   # 质量底线,由流水线持续校验
  completeness: ">=0.98"
  validity:     ">=0.97"
  interaction_type_distribution: "click 占比 0.4~0.6(突变即告警)"
freshness:                                 # 时效承诺
  update: "每日 08:00 UTC 前", max_delay: "2h", on_miss: alert
privacy:                                   # 隐私与合规边界
  pii_fields: [user_id], handling: hashed, access: internal
compatibility:                             # 演进规则
  policy: backward_compatible
  notice_period: "14 天", deprecation: "旧版本保留 1 个版本周期"

代码清单28-1:YAML 配置示例。

这份契约的价值在于,它是可机读、可校验、可版本化的。它可以被纳入版本控制,随数据产品一同演进;可以被 CI 流水线在数据发布前自动校验;也可以在违约时自动触发告警和阻断。契约不再是一份单薄的文档,而是嵌入数据生产流程、持续发挥作用的工程构件。

28.2.4 契约的执行与责任边界

数据契约只有被执行才有意义。执行机制通常分布在数据生命周期的多个节点:在数据发布前,CI 流水线校验新数据是否符合 schema 与 quality 契约,不符合则阻断发布;在数据运行时,监控系统持续度量质量与时效指标,违约时告警;在数据变更时,兼容性检查自动判断变更是否违反 compatibility 契约,并触发相应的通知与灰度流程。

契约同时也划定了清晰的责任边界。契约之内,生产者承诺的内容若未兑现,责任在生产者;而消费者若依赖了契约未声明的隐含行为(例如假设某个可空字段总是非空、假设枚举值的顺序固定、假设某个未承诺的字段会一直存在),则风险自负。这一边界至关重要,因为生产环境中大量的数据事故,恰恰源于消费者对契约之外行为的隐性依赖(Polyzotis et al. 2018; Shankar et al. 2022)。明确"什么被承诺、什么不被承诺",本身就是一种强有力的故障预防手段。

28.2.5 本节小结

数据契约把数据产品的承诺从模糊的口头约定,转化为精确、可机读、可校验的正式规约。schema、quality、freshness、privacy 与 compatibility 五类条款,分别覆盖了数据可靠性的结构、质量、时效、隐私与演进五个侧面。契约的双向性明确了生产者与消费者各自的权利与义务,划定了清晰的责任边界。然而,再完善的静态契约,也必须面对一个不可回避的现实——数据产品终将变更。如何让变更不伤害下游消费者,是下一节要解决的核心问题。


28.3 变更兼容性与消费者治理

28.3.1 数据变更

数据产品不是一成不变的。业务在演化,上游系统在升级,数据的结构、口径和分布都会随之改变。变更本身是健康和必要的,真正的风险不在于变更,而在于未经治理的变更,即在消费者毫不知情的情况下改变了他们所依赖的数据。

数据变更的危险性,源于数据产品的一个根本特性:它的下游消费者往往是不可见的、众多的、且彼此独立的。一次看似局部的字段调整,可能同时影响一个训练流水线、一个 RAG 索引和三个分析报表,而生产者甚至不知道这些消费者的存在。这与软件接口的变更有相似之处,但又更为隐蔽——软件接口变更通常会立即导致调用报错,而数据变更往往不会报错,只会变错:流水线照常运行,结果却悄然失真,这正是数据事故难以被及时发现的根本原因(Sambasivan et al. 2021)。

因此,变更治理的目标,是把变更从可能引发沉默失败的风险源,转化为受控、可预期、可灰度验证的常规操作。这需要三件事:一是对变更进行分类,区分哪些变更安全、哪些危险;二是建立提前通知与灰度验证机制;三是维护对消费者的可见性,从而能够做影响分析。

28.3.2 变更分类与兼容性

并非所有变更都同等危险。按对下游的影响,数据变更可以分为三类,如表28-3 所示。

表 28-3:字段变更类型与兼容性。

变更类型 示例 兼容性 处理方式
向后兼容变更 新增可空字段、放宽取值范围、补充文档 安全 通知即可,无需灰度
潜在破坏性变更 新增枚举值、字段含义微调、分布漂移 风险 提前通知 + 灰度验证
破坏性变更 删除/重命名字段、改类型、改单位、收紧约束 危险 走版本升级,旧版并存过渡

向后兼容变更指那些不会破坏现有消费者的变更,例如新增一个可空字段、放宽某个字段的取值范围。按照向后兼容的定义,按旧 schema 编写的消费者仍能正确读取新数据(Kleppmann 2017)。这类变更相对安全,通常只需通知,无需灰度。

破坏性变更指那些必然破坏现有消费者的变更,例如删除字段、重命名字段、修改数据类型或单位、收紧取值约束。这类变更绝不能就地覆盖,而必须走版本升级流程:发布新版本,让新旧版本并存一段过渡期,给消费者充分的迁移时间。

最危险的其实是中间地带——潜在破坏性变更。它们在 schema 层面看似兼容(类型没变、字段没删),但在语义或分布层面已经改变。新增一个枚举值、微调一个字段的计算口径、数据分布因上游采样策略调整而漂移,都属于此类。这些变更不会触发类型错误,却会让下游的过滤逻辑、特征计算或检索权重悄然失效。识别并妥善处理这类变更,是变更治理中最考验工程纪律的部分。

为了在工程实践中快速、一致地判断一个变更应当如何处理,可以使用一棵变更兼容性决策树,如图28-3 所示。

变更兼容性决策树

图28-3:变更兼容性决策树。

28.3.3 提前通知与灰度验证

对于潜在破坏性和破坏性变更,仅靠分类是不够的,还需要一套提前通知与灰度验证机制,把变更的风险在真正影响下游之前暴露出来。这里以本节关注的四类典型变更为例。

  1. 字段变更。 当 schema 发生变更时,系统应根据 compatibility 契约自动判断兼容性等级,并在约定的通知期内(如 14 天)通过既定渠道告知所有注册消费者。对于破坏性变更,新字段应先以新版本形式与旧版本并存,消费者逐个迁移确认后,旧版本才进入弃用周期。这种双版本并存的做法,本质上是用空间换取迁移的安全窗口。

  2. 样本分布变化。 分布漂移是最隐蔽的变更,因为它不改变结构,只改变数据的统计特征。例如,上游调整了反爬策略,使得某类用户的样本占比骤降。这类变化无法通过 schema 校验发现,只能通过 quality 契约中的分布监控来捕捉。当某个关键字段的取值分布偏离基线超过阈值时,触发告警(Breck et al. 2019; Schelter et al. 2018)。对于训练数据,分布漂移可能直接改变模型学到的先验;对于评测数据,它会让评测结果不再可比。

  3. 索引重建。 在 RAG 等场景中,知识源更新后往往需要重建向量索引。索引重建是一类特殊的变更:它可能引入新的切分策略、新的 embedding 模型,从而改变检索行为。索引重建应当灰度进行——先在影子环境用新索引服务一部分流量,对比新旧索引的检索质量指标(如召回率、引用准确率),确认无退化后再全量切换,而非直接覆盖线上索引。

  4. 评测集刷新。 评测集本身也是一种需要治理的数据产品。刷新评测集会改变评测基线,使得刷新前后的模型分数不再直接可比。因此评测集刷新应当版本化,并在刷新时同步记录新旧评测集的差异;关键模型的回归测试应在新旧两套评测集上都运行一段时间,确保分数变化来自模型本身而非评测集变化。此外,必须严防评测集泄露进训练数据,一旦泄露,评测结果将系统性失真。

灰度验证的共同思想,是在变更全量生效之前,先在受控范围内验证其影响。这与软件工程中的灰度发布(canary release)一脉相承:用小范围、可回退的方式先行验证,把风险控制在可承受的范围内。

28.3.4 消费者治理与影响分析

要做提前通知和影响评估,前提是知道谁在消费这个数据产品。这就要求把消费者关系从不可见变为可追踪。成熟的数据平台通常要求消费者在使用一个数据产品前进行注册,声明其使用场景、依赖的字段和对 SLA 的要求。这份消费者注册表,结合上一章讨论的血缘追踪,构成了消费者影响分析的基础。

当一个变更被提出时,影响分析回答的是:这个变更会影响哪些消费者?影响有多严重?需要哪些消费者确认?借助消费者注册表与血缘图,系统可以自动列出受影响的消费者清单,并根据每个消费者依赖的字段、使用场景和 SLA 要求,评估影响等级。这种把变更前的盲目猜测转化为基于数据的精确评估,正是 28.4 节事故复盘中将要展示的关键能力。

28.3.5 本节小结

变更是数据产品不可回避的现实,未经治理的变更会对数据产品造成较大影响。通过把变更分为向后兼容、潜在破坏性和破坏性三类,并用决策树指导处理方式,团队可以一致地判断每个变更的风险。对于有风险的变更,提前通知与灰度验证机制能把风险在影响下游之前暴露出来。而这一切的前提,是把消费者关系变为可注册、可追踪,从而支撑精确的影响分析。下一节将通过一次具体的事故复盘,展示当这些机制缺失时会发生什么,以及契约与回滚如何止损。


28.4 数据契约失败复盘

28.4.1 事故背景

理解数据契约价值的最好方式,是复盘一次它缺位时发生的事故。本节描述一个具有代表性的事故(综合了多个真实案例的典型特征),展示一次上游字段变化如何沿数据链路传导,最终导致训练与检索效果同时下降,以及契约和回滚机制本应如何止损。

事故涉及的数据产品是 user_interaction_feedback——一份用户交互反馈数据,同时被两个下游消费:一是偏好模型的训练流水线(preference_training),二是 RAG 系统的相关性反馈模块(rag_feedback)。这份数据中有一个关键字段 interaction_type,原本是一个取值为 {click, like, collect, share} 的枚举,其中 click(点击)是占比最高、最重要的正向信号。

28.4.2 时间线:上游字段变化如何传导

事故的演变可以拆解为以下几个阶段。

第一阶段:上游"无害"变更。 上游日志团队为了更精细地分析用户行为,决定把 click 这一笼统的事件,拆分为 click_card(点击卡片)和 click_detail(点击详情)两个更细的枚举值。在他们看来,这是一次纯粹的"增强"——信息更丰富了,且没有删除任何字段,schema 的字段列表没有任何变化。变更直接上线,未做任何对外通知。

第二阶段:下游沉默地失效。 下游两个消费者都依赖 interaction_type == "click" 来识别正向信号。变更上线后,数据中 click 的占比骤降至接近于零(因为它被拆成了两个新值),但流水线没有报任何错:字段还在,类型还对,查询照常执行。训练流水线照常产出了模型,RAG 反馈模块照常更新了权重——只是它们处理的"正向样本"几乎消失了。

第三阶段:效果下降被察觉。 几天后,新训练的偏好模型上线,推荐效果出现明显下滑;与此同时,RAG 系统的答案相关性也开始变差。两个团队最初都从自己的模型和算法入手排查,更换超参、回滚模型版本、调整检索策略,耗费数天却收效甚微——因为问题根本不在模型,而在它们共同依赖的那份数据(Sculley et al. 2015; Shankar et al. 2022)。

第四阶段:定位根因。 直到有工程师比对了数据的历史分布,才发现 click 占比的断崖式下跌,并最终追溯到上游那次"无害"的枚举拆分。从变更上线到根因定位,前后经过了将近一周,期间线上推荐与问答质量持续受损。

28.4.3 消费者影响分析

这次事故清晰地暴露了沉默失败的代价。如果当时具备消费者注册表与影响分析能力,上游在提出变更时,就能立即得到一张受影响消费者的清单。表28-4 展示了这样一份事后补做的消费者影响分析。

表 28-4:消费者影响分析表(interaction_type 枚举拆分)。

消费者 依赖字段 使用方式 影响等级 后果 应对
preference_training interaction_type 过滤 ==click 作为正样本 严重 正样本几近消失,模型质量下降 阻断变更,先迁移
rag_feedback interaction_type 按 click 加权 chunk 严重 反馈权重失效,相关性下降 阻断变更,先迁移
analytics_daily interaction_type GROUP BY 统计各类型占比 中等 报表口径断裂,趋势失真 通知 + 更新口径

这张表把一次变更的影响从模糊的担忧,变成了可逐行评估的清单:谁受影响、怎么受影响、有多严重、该怎么应对。其中 analytics_daily 这类虽受影响但后果较轻的消费者也被纳入,体现了影响分析的完整性。如图28-4 所示,这种分析的本质,是沿着血缘把一次上游变更映射到所有下游消费者,并按影响严重程度分级。

消费者影响分析

图28-4:消费者影响分析。

28.4.4 契约与回滚如何止损

现在设想同样的变更,发生在一个有数据契约保护的环境中,事故的走向将完全不同。

第一道防线:schema 契约拦截。 interaction_type 在契约中被声明为封闭枚举 {click, like, collect, share}。当上游试图引入 click_cardclick_detail 这两个契约外的新值时,发布前的 CI 校验会立即检测到"枚举取值超出契约范围",阻断变更上线。此时变更被识别为潜在破坏性变更,必须走提前通知与灰度流程,而非直接覆盖。

第二道防线:quality 契约的分布监控。 即便某种原因绕过了 schema 校验,契约中"click 占比应在 0.4~0.6 之间"的分布约束,也会在 click 占比骤降时立即告警(Schelter et al. 2018)。这意味着问题会在变更当天、数据进入训练之前就被发现,而不是在模型上线、效果下降数天之后。

第三道防线:版本化与回滚。 由于数据产品是版本化的,下游消费者可以固定依赖某个已验证的版本(version pinning),而非盲目跟随最新数据。一旦发现新版本有问题,消费者可以立即回滚到上一个稳定版本继续运行,把止损时间从"数天"压缩到"分钟级"。与此同时,可以通过一个兼容性映射层(compatibility shim),临时把新枚举值 click_cardclick_detail 映射回旧值 click,让下游在不修改代码的情况下平滑过渡,等迁移完成后再正式启用细分语义。

这三道防线的共同作用,是把一次本可演变为持续数天的线上事故的变更,转化为发布前被拦截、可灰度、可回滚的常规操作。这正是数据契约的核心价值:它不消除变更,而是让变更变得安全。

28.4.5 复盘启示

这次复盘可以提炼出几条普适的启示。

第一,schema 不变不等于语义不变。最危险的变更往往是 schema 层面看似兼容的语义漂移,它不会报错,只会让结果悄然变错。封闭枚举、分布监控等约束,正是为了捕捉这类隐蔽变化。

第二,沉默失败比显式报错更危险。数据事故的高昂代价,很大程度上来自其难以被及时察觉。把数据应该满足什么显式声明为可校验的契约,本质上是把潜在的沉默失败转化为可见的、提前的告警。

第三,版本化是回滚能力的前提。没有版本化,就没有可回退的上一个稳定状态,止损就无从谈起。数据产品的版本化与消费者的 version pinning,是事故发生时最后也最可靠的安全网。

第四,消费者可见性决定了影响分析的能力。上游之所以敢做无害变更,正是因为它看不到下游。消费者注册与血缘追踪,把不可见的依赖关系显性化,使变更前的精确影响评估成为可能。

28.4.6 本节小结

通过一次 interaction_type 枚举拆分引发的训练与检索双重退化事故,本节展示了未经治理的变更如何沿数据链路沉默地传导,造成持续数天、难以排查的损失。同样的变更,在数据契约的保护下,会被 schema 校验拦截、被分布监控告警、被版本化与回滚机制兜底,从而从根本上解决问题。数据契约的价值,不在于阻止变更,而在于让变更对消费者透明、可控、可回退。


本章小结

从数据集到数据产品的转变,核心是从交付一份文件升级为提供一项可被长期依赖的稳定能力。数据产品通过明确输入、输出、SLA、负责人与变更策略,把数据的可预期性建立在制度而非个人记忆之上;数据契约则进一步把这些承诺固化为 schema、quality、freshness、privacy 与 compatibility 五类可机读、可校验的正式条款,并以双向约定划定生产者与消费者的责任边界。

变更是数据产品不可回避的现实,未经治理的变更的危险之处在于数据变更往往不报错、只变错。通过把变更分为向后兼容、潜在破坏性与破坏性三类,配合提前通知、灰度验证、消费者注册与影响分析,团队可把变更从沉默失败的风险源转化为受控、可回退的常规操作。本章的事故复盘表明,schema 不变不等于语义不变,版本化是回滚能力的前提,消费者可见性决定影响分析能力;数据契约的价值不在于阻止变更,而在于让变更对消费者透明、可控、可回退。

参考文献

Beyer B, Jones C, Petoff J, Murphy N R (2016) Site Reliability Engineering: How Google Runs Production Systems. O'Reilly Media, Sebastopol.

Breck E, Polyzotis N, Roy S, Whang S E, Zinkevich M (2019) Data Validation for Machine Learning. In: Proceedings of the 2nd SysML Conference (MLSys).

Dehghani Z (2022) Data Mesh: Delivering Data-Driven Value at Scale. O'Reilly Media, Sebastopol.

Gebru T, Morgenstern J, Vecchione B, Vaughan J W, Wallach H, Daumé III H, Crawford K (2021) Datasheets for Datasets. Communications of the ACM 64(12):86–92.

Kleppmann M (2017) Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O'Reilly Media, Sebastopol.

Lwakatare L E, Raj A, Crnkovic I, Bosch J, Olsson H H (2020) Large-scale machine learning systems in real-world industrial settings: A review of challenges and solutions. Information and Software Technology 127:106368. https://doi.org/10.1016/j.infsof.2020.106368.

Machado I A, Costa C, Santos M Y (2022) Data Mesh: Concepts and Principles of a Paradigm Shift in Data Architectures. Procedia Computer Science 196:263–271.

Paleyes A, Urma R-G, Lawrence N D (2022) Challenges in Deploying Machine Learning: A Survey of Case Studies. ACM Computing Surveys 55(6):1–29.

Polyzotis N, Roy S, Whang S E, Zinkevich M (2018) Data Lifecycle Challenges in Production Machine Learning: A Survey. ACM SIGMOD Record 47(2):17–28.

Rahm E, Bernstein P A (2001) A survey of approaches to automatic schema matching. The VLDB Journal 10(4):334–350.

Redman T C (1998) The Impact of Poor Data Quality on the Typical Enterprise. Communications of the ACM 41(2):79–82.

Sambasivan N, Kapania S, Highfill H, Akrong D, Paritosh P, Aroyo L M (2021) "Everyone wants to do the model work, not the data work": Data Cascades in High-Stakes AI. In: Proceedings of the 2021 CHI Conference on Human Factors in Computing Systems, pp 1–15.

Schelter S, Lange D, Schmidt P, Celikel M, Biessmann F, Grafberger A (2018) Automating Large-Scale Data Quality Verification. Proceedings of the VLDB Endowment 11(12):1781–1794.

Sculley D, Holt G, Golovin D, Davydov E, Phillips T, Ebner D, Chaudhary V, Young M, Crespo J-F, Dennison D (2015) Hidden Technical Debt in Machine Learning Systems. In: Advances in Neural Information Processing Systems 28, pp 2503–2511.

Shankar S, Garcia R, Hellerstein J M, Parameswaran A G (2022) Operationalizing Machine Learning: An Interview Study. arXiv preprint arXiv:2209.09125.

Strong D M, Lee Y W, Wang R Y (1997) Data Quality in Context. Communications of the ACM 40(5):103–110.

Wang R Y, Strong D M (1996) Beyond Accuracy: What Data Quality Means to Data Consumers. Journal of Management Information Systems 12(4):5–33.