你的 RAG 系统没有报错,但它的回答已经悄悄变差了------问题不在模型,在你上游的一个字段改了类型。
开篇:一个凌晨三点的故事
我先讲一个真实发生过的场景。
某天凌晨三点,我被告警叫醒。不是因为服务挂了,也不是因为模型超时。告警的内容是:线上一个 Agent 系统的「客户情绪判断准确率」在过去 6 小时内从 91% 掉到了 63%。
排查了两个小时,最后定位到的原因让人哭笑不得------上游业务系统在前一天做了一次「无害的重构」,把工单表里的 priority 字段从字符串("high", "medium", "low")改成了整数编码(1, 2, 3)。业务系统那边一切正常。BI 报表那边因为有一层 mapping 也没炸。但 RAG 的 chunk 里引用了这个字段做上下文拼装,Agent 的 tool 调用拿到的参数类型也变了。模型不知道 1 是什么意思,于是开始瞎猜。
没有任何显性报错。pipeline 正常跑完。日志全是绿的。
这就是我想在开头说清楚的一件事:在 AI 时代,数据层最危险的事情不是报错,而是悄悄变差。
而数据契约(Data Contract),就是为了解决这个问题而生的。
一、数据契约到底是什么?别被名字唬住
先把概念讲透。
「数据契约」这个词听起来很正式,很重,好像是法务要参与的东西。其实不是。你可以把它理解成:数据生产者和消费者之间的一份技术协议,明确说清楚"我给你的数据长什么样、保证什么质量、什么时候更新、变了怎么通知你"。
它通常是一个 YAML 文件。没有什么黑科技。
举个最简单的例子:
yaml
models:
- name: fct_order_events
contract:
enforced: true
columns:
- name: order_id
data_type: string
constraints:
- type: not_null
- type: unique
- name: event_type
data_type: string
- name: amount_usd
data_type: numeric
- name: created_at
data_type: timestamp
这段 YAML 说的事情很简单:这张表有四个字段,类型分别是什么,哪些不能为空,哪些需要唯一。如果你在 build 阶段产出的数据不符合这个定义,直接失败,不准进入下游。
就这么多。
但就是这么简单的东西,在实际的企业数据平台里,绝大多数团队没有做。结果就是:上游改了个字段,下游的报表、模型、RAG、Agent 全部在不知情的情况下慢慢劣化。
DataHub 在 2026 年的指南里给了一个我很认同的区分:schema 只是契约的一部分。完整的数据契约还应该包括质量规则、新鲜度 SLA、违反后的处理方式、以及数据的语义说明。 DDL 定义的是数据库接受什么;契约定义的是消费者可以信赖什么。这两件事不一样。
二、为什么现在必须谈数据契约?因为消费者变了
数据契约不是一个新概念。早在 2010 年代,一些大型互联网公司内部就有类似的实践。PayPal 是最早公开谈数据契约的公司之一,他们在 Data Mesh 实践中把契约做成了跨团队协作的基石。
但为什么到了 2025、2026 年,这个话题突然又热起来了?
原因很简单:数据的消费者变了。
过去十年,数据管道的下游消费者主要是人。分析师写 SQL,看报表,做决策。数据格式变了,他有经验,能看出来。字段含义变了,他能判断。最差的情况,他打电话问一下上游。
但现在不一样了。RAG 系统、Copilot、Workflow 自动化、Agent------这些东西都是「无声的消费者」。它们不会打电话问你「这个字段的含义是不是变了」。它们只会照着拿到的数据继续工作,错了也不吭声。
这就是为什么传统的数据质量方法论开始力不从心:
传统路径是「事后检测」:数据到了仓库,跑一遍质量检查,发现问题再告警。这个模式在 BI 时代够用,因为延迟几个小时发现问题,人可以手动干预。但在 Agent 时代,你的系统可能在这几个小时里已经给 200 个客户做了错误的建议。
数据契约的核心转变是「事前约定」:不是等数据进来再检查,而是在生产阶段就定义好「这个数据应该长什么样」。不符合,直接拦住。进不了管道,到不了模型。
用一个比喻来说:传统数据质量像是在高速公路出口设检查站,车已经开了一百公里才发现问题。数据契约像是在入口就设 ETC 和安检------不合格的,直接不让上路。
三、从工程视角拆解:数据契约的技术架构
讲完了 why,我们来讲 how。一个可落地的数据契约体系,通常包含以下几层:
3.1 Schema 层:结构保证
这是最基础的一层。定义字段名、数据类型、是否可空、主键约束、枚举范围。
dbt 的 model contracts 是目前最成熟的实现之一。它的逻辑很直接:你在 YAML 里声明一个模型的 contract 为 enforced,然后列出所有字段的 name 和 data_type。build 的时候 dbt 会做一个「预检」------如果你的 SQL 查询返回的列跟契约定义不一致,直接报错,模型不会被物化。
这件事看起来简单,但解决了一个很大的问题:确定性。下游消费者可以放心地依赖这个模型的输出结构,因为它不可能偷偷变形。
3.2 语义层:含义保证
Schema 只告诉你「这个字段是什么类型」,但不告诉你「这个字段是什么意思」。
而语义歧义在企业里是非常非常常见的。一个简单的例子:revenue 这个字段,到底是含税还是不含税?是确认收入还是开票金额?是包含退款的还是不包含的?
在传统 BI 时代,这种歧义靠文档和口口相传来消解。但在 AI 时代,你不可能让模型去问人。你需要把语义直接写进契约。
ODCS(Open Data Contract Standard)在 v3.1 版本中对这一点做了很好的支持。你可以在每个字段上附加 description、logicalType、examples、业务规则说明,让契约不仅定义结构,还定义含义。
这对 RAG 和 Agent 的意义尤其大。当一个 Agent 需要调用某个数据源时,它看到的不应该只是一个字段名,而应该是一段完整的语义说明。这段说明本身就可以作为 context 被注入到 prompt 中,帮助模型正确理解数据。
3.3 质量层:行为保证
一个字段的类型是对的,含义也清楚了,但数据质量可能依然有问题。比如:
order_id应该全局唯一,但出现了重复created_at应该单调递增,但出现了跳回amount应该 >= 0,但出现了负数- 最近一小时应该至少有 1000 条数据,但只有 3 条
这些是质量规则,也应该被写进契约。ODCS v3 支持多种质量定义方式------可以用纯文本描述、SQL 断言、或者预定义的质量属性(如 rowCount、unique、freshness)。
关键在于:这些规则不应该只是文档,而应该是可执行的检查。Data Contract CLI 这样的开源工具可以直接拿着你的契约 YAML,连上 Snowflake、Databricks、BigQuery 等数据源,自动跑校验。
3.4 SLA 层:时效保证
数据不只是要对,还要按时到。
对于一个每天需要最新库存数据的采购 Agent 来说,数据延迟两小时跟数据缺失没有本质区别------都会导致决策失误。
所以成熟的数据契约会包含 SLA 定义。比如:
- 新鲜度:数据延迟不超过 30 分钟
- 可用性:99.5% 的时间窗口内可访问
- 恢复时间:出现故障后 4 小时内修复
有人说过一句话我很喜欢:一个没有被监控的 SLA,其实就是一个许愿。 契约里定义的 SLA,必须有配套的监控和告警才有意义。
3.5 版本层:变更保证
最后一层,也是很多团队容易忽略的:版本管理。
数据契约不是定了就不动的。业务会变,schema 会变,规则会变。但变更必须是受控的、可追溯的、有窗口期的。
语义化版本(Semantic Versioning)是目前行业里比较推荐的做法:
- Major 版本:有 breaking change,消费者必须显式确认升级
- Minor 版本:只增不减,向后兼容
- Patch 版本:只改 metadata,不影响数据结构
Data Contract CLI 可以自动比较两个版本的契约,检测是否有 breaking change。如果有,可以在 CI/CD 中直接拦截,要求开发者显式标记版本升级并通知下游消费者。
把数据契约放进 Git,把变更检查放进 CI/CD。 这不是什么先进理念,这是软件工程做了二十年的事情。数据工程只是终于跟上了。
四、数据契约在 AI 时代的新角色
讲到这里,如果你觉得数据契约只是「数据治理的一个最佳实践」,那你对它的理解还不够深。
在 AI 时代,数据契约正在扮演一个全新的角色:它是 AI 系统的稳定性边界。
让我展开说。
4.1 RAG 的命门:上下文质量
一个 RAG 系统的输出质量,本质上取决于三件事:检索到的内容是不是对的、上下文拼装是不是合理的、模型的推理是不是靠谱的。
第一件事------检索质量------直接依赖于数据层。如果你的知识库 chunk 中嵌入了某个结构化字段作为 metadata(比如文档的部门归属、产品线、时间戳),而这个字段的格式在上游悄悄变了,你的检索结果就会出问题。metadata filter 失效了,该召回的文档召回不了,不该出现的文档混了进来。
数据契约的作用就在于:确保这些被 RAG 系统依赖的数据源,其结构和语义不会在没有通知的情况下发生变化。如果变了,build 阶段就会失败,pipeline 会停在那里等人处理,而不是把脏数据推到向量库里。
4.2 Agent 的地板:工具调用的可靠性
Agent 比 RAG 更复杂,因为它不仅仅是读数据,它还要调用工具。而每一个 tool call,都有参数。参数的类型、范围、含义,直接影响调用的正确性。
举个例子:一个采购 Agent 调用「查询库存」的工具,参数是 warehouse_id(整数)和 sku(字符串)。如果上游的商品主数据把 sku 从纯数字字符串改成了带前缀的格式(从 "12345" 变成 "SKU-12345"),Agent 的 tool call 就会开始报错或者返回空结果。
但如果 sku 字段有数据契约的保护------定义了它的类型、格式、枚举规则------那这个变更在 build 阶段就会被拦住。上游团队要么回滚,要么走版本升级流程,通知所有下游消费者。
数据契约在这里的角色,就是给 Agent 提供一块不会随便移动的地板。 没有这块地板,Agent 就是在一个持续漂移的地面上跑,今天能跑不代表明天还能跑。
4.3 dbt 作为 AI 的上下文层
dbt Labs 在 2025-2026 年的动作非常值得关注。他们不只是在做数据转换工具,而是在把 dbt 定位成 AI 系统的「上下文层」(context layer)。
他们推出了 dbt MCP Server,让 AI Agent 可以直接通过 MCP 协议访问 dbt 的模型定义、血缘关系、语义层、测试结果、ownership 等元数据。还推出了 dbt Agents 套件------Developer Agent、Discovery Agent、Observability Agent、Analyst Agent------全部构建在 dbt 的结构化上下文之上。
这意味着什么?意味着 dbt model contracts 不再只是防止 pipeline break 的工具,它同时成了 AI Agent 的信任基础。 Agent 通过 MCP 拿到的模型元数据,天然就带着契约的保证:这个模型的结构是稳定的,质量是有检查的,变更是有版本的。
这是一个很深刻的变化:数据契约从「数据工程的内部纪律」升级为「AI 系统的外部承诺」。
五、行业现状:两套标准,一个方向
数据契约领域目前有两个主要的开放标准,值得了解一下:
ODCS(Open Data Contract Standard)
由 Linux Foundation AI & Data 下的 Bitol 项目维护,当前最新版本 v3.1.0。ODCS 最早源自 PayPal 的 Data Mesh 实践,后来被捐赠给了 Linux Foundation。它的特点是:
- 用 YAML 定义,可版本化,可 Git 管理
- 覆盖 schema、质量规则、SLA、定价、基础设施位置等多个方面
- v3 开始支持复杂数据结构(JSON、Avro 等嵌套模型)
- 有对应的 JSON Schema,可以在 IDE 中做实时校验
- 作为 Linux Foundation 项目,有较强的社区治理和企业背书
Data Contract Specification (DCS)
这是另一个社区驱动的标准,设计上更侧重简洁性和工具链集成。Data Contract CLI 同时支持 DCS 和 ODCS 两种格式。
两个标准的维护者之间关系不错,长期方向是逐步统一。目前来看,如果你更在意企业级治理和标准化,选 ODCS;如果你想快速上手、工具链简洁,两个都可以用。 核心理念是一致的。
工具生态
值得关注的工具包括:
- dbt model contracts:构建阶段的 schema 强制执行
- Data Contract CLI:开源,支持 lint、测试、breaking change 检测、多格式导出
- Atlan:元数据平台,支持契约的血缘追踪、ownership 管理、自动校验
- DataHub:开源数据目录,可以作为契约的注册中心
- Monte Carlo / Soda:数据可观测性工具,可以配合契约做监控
- 各大云平台的原生能力:Databricks Unity Catalog 的列级约束、Snowflake 的数据共享策略、BigQuery 的数据质量监控等
生态正在快速成型。
六、怎么落地?一个过来人的建议
讲了这么多理论和架构,最后说说落地。
我见过很多团队,听完数据契约的概念觉得很好,回去就想搞全面推广。结果不出三个月,项目就搁浅了。原因通常是:覆盖面太广、契约写得太严、上游团队不配合。
所以我有几个比较实际的建议:
6.1 从最痛的那张表开始
别一开始就试图给所有表都加契约。找那个最经常出问题的、跨团队依赖最多的、每次出问题影响最大的表或者模型,先给它加契约。你会发现,一个高价值的契约比一百个没人看的契约有用得多。
6.2 从已有元数据自动生成,再手动补充
Data Contract CLI 支持从 Unity Catalog、dbt manifest、DDL 等现有元数据源直接导入,自动生成契约的基础结构。这比从零手写要快得多。拿到自动生成的框架后,再手动补充质量规则、语义说明和 SLA。
6.3 先做 lint,再做 enforce
不要一上来就 enforced: true。先让契约以「文档模式」存在,跑 lint 检查看看有多少违反。给团队一个适应期。等大家理解了规则、修复了存量问题之后,再切换到强制模式。否则一上来就卡住所有构建,会招致很大的组织阻力。
6.4 把契约变更检查放进 CI/CD
这是我认为最有杠杆的一步。当 PR 修改了契约相关的文件时,CI 自动运行 breaking change 检测。如果发现了不兼容的变更,直接标记,要求开发者确认版本升级并通知下游。这个动作一旦自动化,契约就从「大家都知道但没人遵守」变成了「不遵守过不了门禁」。
6.5 找到上游团队的价值点
推动数据契约最难的部分不是技术,是组织。上游团队通常会觉得「这是你下游的事,跟我有什么关系」。
你需要让他们看到价值。比如:有了契约,他们发布 schema 变更时不会半夜被人追着问「你是不是改了什么」。有了版本管理,他们可以安全地迭代而不用担心不知道谁在用他们的数据。有了质量规则,他们可以更早发现自己系统的 bug,而不是等到下游告诉他们。
契约不是给上游加负担,是帮上游减少事故和沟通成本。 这个叙事很重要。
七、未来展望:数据契约 × AI,三个值得期待的方向
最后聊聊未来。
方向一:AI 自动生成和维护数据契约
现在写契约还是手动的。但未来完全可以由 AI Agent 来做这件事------扫描现有的表结构和数据分布,自动推断质量规则,自动补充语义说明,自动检测 drift 并建议更新。dbt 的 Observability Agent 已经在往这个方向走了。
方向二:契约作为 Agent 的「可信数据源注册中心」
想象一下这个场景:一个 Agent 需要查库存数据。它不是硬编码地知道该去哪张表,而是去一个「数据契约注册中心」查询------哪些数据源声明了自己可以提供库存信息、它们的 SLA 是什么、质量保证是什么、当前状态是否正常。Agent 根据这些信息动态选择最佳数据源。
这就是数据契约与 MCP、Data Product 概念的交汇点。数据不再是静态的管道终点,而是有自我描述能力的「可发现、可信赖的服务」。
方向三:契约驱动的自动化测试和质量门禁
未来的 AI 系统发布流程应该是这样的:
- 上游数据源通过契约声明自己的保证
- AI pipeline 在构建阶段自动验证所有输入数据源的契约是否被满足
- 评测框架基于契约中定义的质量标准自动生成测试用例
- 发布门禁检查所有依赖的契约状态,全部 pass 才允许上线
这不是科幻,这是软件工程在 API 领域已经做了十年的事情。数据工程和 AI 工程只是在沿着同一条路往前走。
写在最后
回到开篇的那个凌晨三点的故事。
那次事故之后,我们做的第一件事不是加模型层的兜底,也不是给 Agent 加更多的 prompt 防护,而是给那张工单表加了数据契约。定义了 priority 字段的类型、枚举范围和变更策略。
从那以后,类似的事情没有再发生过。
不是因为上游不再改 schema 了------他们还是会改。而是因为每次变更都会在 build 阶段被拦住,等到双方确认、版本升级、迁移完成之后才会放行。
这就是数据契约最朴素的价值:把「悄悄变差」改造成「尽早暴露、尽早拦截、尽早修复」。
在一个模型能力越来越强、但数据基础越来越脆弱的时代,数据契约不是锦上添花。它是 AI 系统能稳定工作的地板。
参考资料:
- 1. dbt Labs, Model Contracts documentation (2025-2026)
- 2. Bitol / Linux Foundation, Open Data Contract Standard (ODCS) v3.1.0
- 3. DataHub, "The What, Why, and How of Data Contracts" (March 2026)
- 4. Atlan, "Data Contracts Explained" (2025-2026 Guide)
- 5. Data Contract CLI, open-source tooling for contract validation
- 6. dbt Labs, "Agentic AI: Data Requirements" (2025)
- 7. dbt Labs, dbt Agents & MCP Server documentation (2025-2026)
- 8. Monte Carlo, "Data Contracts Explained" (2026)
- 9. PipelinePulse, "Data Contracts for Data Engineers" (2026)
作者是一名长期从事 Data + AI 系统落地的架构师,关注数据工程、上下文工程、Agent 系统和企业级 AI 治理。欢迎讨论交流。