你的 RAG 系统没有报错,但它的回答已经悄悄变差了——问题不在模型,在你上游的一个字段改了类型。
开篇:一个凌晨三点的故事
我先讲一个真实发生过的场景。
某天凌晨三点,我被告警叫醒。不是因为服务挂了,也不是因为模型超时。告警的内容是:线上一个 Agent 系统的「客户情绪判断准确率」在过去 6 小时内从 91% 掉到了 63%。
排查了两个小时,最后定位到的原因让人哭笑不得——上游业务系统在前一天做了一次「无害的重构」,把工单表里的 priority 字段从字符串("high", "medium", "low")改成了整数编码(1, 2, 3)。业务系统那边一切正常。BI 报表那边因为有一层 mapping 也没炸。但 RAG 的 chunk 里引用了这个字段做上下文拼装,Agent 的 tool 调用拿到的参数类型也变了。模型不知道 1 是什么意思,于是开始瞎猜。
没有任何显性报错。pipeline 正常跑完。日志全是绿的。
这就是我想在开头说清楚的一件事:在 AI 时代,数据层最危险的事情不是报错,而是悄悄变差。
而数据契约(Data Contract),就是为了解决这个问题而生的。
一、数据契约到底是什么?别被名字唬住
先把概念讲透。
「数据契约」这个词听起来很正式,很重,好像是法务要参与的东西。其实不是。你可以把它理解成:数据生产者和消费者之间的一份技术协议,明确说清楚"我给你的数据长什么样、保证什么质量、什么时候更新、变了怎么通知你"。
它通常是一个 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 治理。欢迎讨论交流。