本体 vs 语义层(Ontology vs Semantic Layer):基本概念和区别
概述
数据圈里有两个词,过去十年一直在词汇表里进进出出:ontology(本体)和 semantic layer(语义层)。最近它们开始被塞进同一句话里,仿佛可以互换使用。作者 Michael Petrillo 在这篇文章里把话挑明了------它俩不是一回事,而且把两者搞混的代价,是一个看起来自洽、实则漏洞百出的数据栈。
一个描述的是「你的业务用这些词到底指什么」,另一个是「夹在数仓和仪表盘之间的一块软件」。你可以只有其中一个------大多数公司也确实如此------但健康的数据实践迟早两个都需要。下面把这篇文章拆开讲清楚。
本体到底是什么
本体是一套形式化模型,描述某个领域里的概念、概念之间的关系,以及约束这些概念的规则。它回答的是这类问题:什么是客户?什么算一次「活跃订阅」?哪些实体能拥有一份合同?一笔交易什么时候才算「已关闭」?
关键点在于:本体活在任意具体数据库之上。它是一个「定义性产物」,用语言和图表写出来------有时用 OWL 或 RDF,但更多时候就是一篇白话散文,配上一张 ER 图。它会告诉你:Customer 是至少下过一次已付款订单的一方;Customer 要么是 Individual,要么是 Organization;每笔 Order 恰好属于一个 Customer。这些陈述为真,跟你今天数仓怎么搭毫无关系。
一个好本体有三条性质,缺一不可:
- 概念被命名、被定义。「活跃用户」不是想当然的自明词,它有一份写下来的定义,还覆盖了边界情况。
- 关系是显式的。 你知道哪些实体能互相关联、怎么关联(一对多、多对多、可选、必填)。
- 规则被明确陈述。「一个订阅不可能既活跃又已取消」是一条模型会强制执行的规则,而不是数据恰好满足的巧合。
还得注意,本体与其说是数据团队的,不如说它同样属于业务方。CFO 对「什么是客户」有看法,产品团队对「什么是活跃用户」有看法。本体就是把这些看法写下来、调和一致、并奉为唯一真相来源的地方。
语义层又是什么
语义层是你数据栈里的一块软件 。它夹在物理表(Snowflake、BigQuery、Databricks、DuckDB)和使用这些表的消费者(BI 工具、Notebook、AI 智能体、嵌入式分析)之间。它的活儿,是按需把数仓里的原始列翻译成业务概念,保证每个消费者问 monthly_recurring_revenue 时,拿到的都是用同一种算法算出来的同一个数。
说具体点,语义层本质上是配置:SQL 片段、连接(join)定义、维度和指标声明,通常用 YAML 或某种 DSL 表达。这个赛道的工具包括 dbt Semantic Layer / MetricFlow、Cube、AtScale、Looker(LookML),以及各家数仓自带的指标层。
一个语义层通常编码这样几样东西:
- 指标(Metrics) ------
revenue、active_users、churn_rate等唯一的、带版本控制的定义,表达为对数仓表的聚合。 - 维度(Dimensions)------切分轴,比如 region、plan、channel、signup_cohort,指标可以按它们分组。
- 连接(Joins)------表与表之间的规范关系,让消费者能直接问「按地区看的收入」,而不用每次都重新推导 join。
- 访问规则------哪些角色能看哪些维度或指标。
说白了,它就是一层薄薄的业务含义,用代码写出来,住在你数据基础设施的肚子里。
混淆是从哪儿开始的
这俩之所以被混为一谈,是因为语义层最终会表达本体的一部分------通常是那些可以量化的部分。MetricFlow 里的一个指标定义,说的是「revenue 在计算上是什么」;而本体对 revenue 的定义,说的是「业务用这个词到底指什么、在什么条件下一笔付款才算数」。语义层的定义,只是本体定义的一种可能实现而已。
这种混淆情有可原,但它掩盖了三个在实践中真正重要的差异。
1. 范围(Scope)
本体涵盖的概念不一定能量化,甚至不一定能拿来查询。「合同是什么?」「订单允许有哪些状态?」「客户『有风险』是什么意思?」------这些都可能影响指标,但本体本身更广:它是整个领域的模型,不是仪表盘的模型。
语义层则把自己限定在「能对数仓提问并得到答案」的范围内。它本质上是一个查询时刻(query-time)的抽象。
2. 与技术的耦合(Coupling to technology)
本体天生就是与技术无关的。同一套本体,无论你今天的数仓是 Snowflake、明天换成 Databricks,都应该同样成立。它不假设任何特定的表或列存在。
语义层则永远耦合到一个具体的物理模型(它的定义所引用的那些表和列),而且往往还耦合到某个具体的数仓或 BI 工具。Cube、AtScale 这类与数仓无关的工具能松开「数仓耦合」,但松不开「物理模型耦合」。从 Snowflake 迁到 BigQuery,语义层至少得重新指向(re-point);遇上 LookML 或数仓内置指标这种工具专属层,往往得推倒重写。指标这个概念 能扛过迁移,但它的语义层实现扛不过去。
3. 作者是谁(Authorship)
本体在理想状态下,由业务方和数据团队共同撰写:领域专家贡献定义,数据架构师把它形式化。结果是一套全组织能达成共识的共享词表。
语义层几乎总是由分析工程师(analytics engineer)撰写。它是一个软件产物,用 Git 仓库做版本控制,跟数据栈的其余部分一起部署上线。
并排对比
| 维度 | 本体(Ontology) | 语义层(Semantic Layer) |
|---|---|---|
| 它是什么 | 意义的形式化模型 | 数据栈里的一层软件 |
| 住在哪里 | 文档、图表、RDF/OWL、散文 | YAML / DSL / 某个指标服务 |
| 是否耦合到数仓 | 否 | 经常(并且永远耦合到物理模型) |
| 由谁撰写 | 业务方 + 数据架构师 | 分析工程师 |
| 范围 | 领域里的所有概念 | 你能在数仓里查询的概念 |
| 是否包含业务规则和公理 | 是 | 很少------基本只有指标、维度、连接,外加访问规则 |
| 能否扛过数仓迁移 | 能 | 部分------至少需要重新指向 |
| 产出物 | 定义、图表、约束 | 跨消费者一致的指标值 |
| 缺失时的失败模式 | 部落知识(只存在于人脑子里)、定义互相打架 | 每个 BI 工具把同一个指标算成不同的数 |
没有本体,会出什么乱子
当一个团队在没有任何底层本体的情况下搭语义层,这个语义层就变成了「分析工程师某天写 YAML 时随手编进去的定义」的记录。前三个指标通常没问题;到第四十个,指标定义之间就开始互相矛盾了------active_users 在一个指标里排除了试用账户,在另一个指标里又包含了它们------而全组织翻不出一份能当作唯一真相来源的上游文档。这个语义层在「代码能跑」这种微不足道的意义上是自洽的,但它已经不再忠实地表达业务了。
另一种常见失败:语义层编码了一个业务从未真正同意过的定义。有人在写指标时对边界情况做了个主观判断,结果这个判断被成倍放大到每一张仪表盘上。没人会察觉,直到某次季度复盘跳出一个数字,跟运营团队在线下实际测量的数对不上。
没有语义层,又会出什么乱子
反过来,一个团队把本体维护得漂漂亮亮,却没有语义层------那就是「本体是对的,仪表盘是错的」。每个 BI 工具各自独立实现指标:Looker 的 explore 用一种方式算 churn,分析师 Notebook 里那段即席 SQL 用另一种方式算,而高管 Deck 里用的又是别人半年前用 Excel 攒出来的第三个版本。本体文档是对的,可屋里人拿到的数字彼此打架。组织拿到了最糟的组合:一个清晰的真相定义,加上一套完全没法强制执行它的操作机制。
说得再直白点:本体本身没有任何「执行面」。它是一纸合同,却没有哪个系统有义务去遵守。
两者应该怎么配合
健康的关系是上游 / 下游:本体是源头,语义层是实现它的若干个下游产物之一。链路是这样的:
业务现实
↓
本体(定义、规则、关系)
↓
语义层(数仓上可查询的指标)
↓
BI、Notebook、智能体、嵌入式分析
落到实操,意味着三件事:
- 定义先在本体里写好、评审好。 一个新的指标需求,不该是「把这个指标加进 dbt」,而是「这个概念是什么、谁拥有它的定义、它的边界情况有哪些?」。语义层里的那条记录,是对一个已被回答的问题的实现,而不是问题本身。
- 当业务发生变化 ------一条新产品线、一个被重新定义的客户分群、一次监管政策变化------先更新本体,再更新语义层去对齐,并且两者之间的谱系(lineage)要是显式的。
- 当本体和语义层出现分歧时,本体说了算。 语义层被当作一个可能过时的实现,而不是权威定义。
有些团队会把这套关系形式化:直接从本体源生成语义层的 YAML,让两者没法悄悄分道扬镳。这是理想状态,但很罕见。大多数团队会把两者作为独立的产物来跑,再配上一套把二者拴在一起的评审流程。两种做法都行,只要顺序别搞反:本体负责定义,语义层负责实现。
你什么时候需要哪一个
- 只要不止一个人在产出分析,你就需要本体------哪怕是非正式的。缺少一个对「customer」的共享定义,其成本上升得比大多数团队预期得快,而这个成本通常以「开会争论为什么两张仪表盘对不上」的形式支付掉。
- 一旦你有超过两三个 BI 工具或 Notebook 环境在敲同一个数仓,你就需要语义层。 同一个指标开始在两个地方被计算的那一刻,你就有了一个光靠文档解决不了的「执行问题」。
- 你几乎从不需要那种带推理机、带 inference 的、完整的 OWL 形式化本体。 一份维护良好的术语表、一张 ER 图、一份覆盖了指标/实体/状态的定义文档,对绝大多数组织就够用了。把形式化本体工具当作「只有当你身处强监管领域、或者数据资产庞大到非正式文档已经撑不住了」时才去够的东西。
来自 Low Hanging Data 的观点
语义层是那个经常上头条的部分,因为它是能卖钱、有公司经营的软件。本体才是那个决定语义层到底值不值得跑的部分。没有本体兜底的语义层,是一套极其高效地把错误定义分发到全组织的机器;而只有本体、没有语义层,则是一份想得挺周到、却永远不会出现在 CEO 任何一张仪表盘上的文档。
所以正确的顺序是:先把本体搭起来,哪怕先从非正式的做起。 写下你的业务用这些词到底指什么、每个定义归谁管。然后再把语义层建成那套机制,让这些定义一致地出现在每一个来问数的工具里。这两者不是竞争关系,而是先后关系。跳过第一步,第二步只会把你的混乱放大。
总结
这篇文章最大的价值,是把两个被业界混着用、却分属不同层面的概念彻底切开:本体是「意义」的模型,回答「业务用词到底指什么」;语义层是「执行」的软件,保证同一个指标在所有消费者那里算出来都一样。 它们一个在上游、一个在下游,顺序不能颠倒。
我的理解是,作者其实在悄悄回击一种工程惯性------团队总是先冲去买/去搭那个看得见摸得着的语义层工具,因为它能立刻出数、能演示;而把「我们到底怎么定义客户」这种问题无限期往后拖。文章给出的判断很克制也很实用:别一上来就搞 OWL 推理机那套重装备,一份有人维护的术语表加 ER 图往往就够了,关键是你得先有那份「定义」,再让软件去忠实执行它。这对正在被 LLM/智能体浪潮重新带火的「本体」概念,也是个冷静的注脚------本体的价值不在形式有多华丽,而在它能不能真正约束下游的实现。
参考资料
- 原文:Ontology vs Semantic Layer: What Each One Actually Is --- Michael Petrillo,Low Hanging Data,2026 年 5 月 22 日
- 作者提到的后续相关文章(同一站点):
- The Silent Death of Orphan Data Pipelines(2026 年 4 月 10 日)
- Call Your Shot: Feedback Loops, Experiments, and Writing It Down First(2026 年 10 月 9 日)
- Physics Has Models. Machine Learning Has Black Boxes.(2026 年 7 月 31 日)