本体与AI · 建模方法论
你的本体,是业务的镜子还是数据库的影子?
建模锚点之争:为什么锚点必须是业务对象,数据表该待在哪一层,以及一套能直接拿去用的五层参照系。
前阵子参加一个数据中台项目的评审。团队做得很利落,三个月拿出一套"本体",打开一看,一百多个类,规规矩矩:【客户】【订单】【物料】【供应商】。
负责人讲得挺自信。我插了一句:"如果明年你们把数据库换了、表结构重新设计,这套本体还成立吗?"
他愣了一下:"那……肯定得跟着改。"
会议室安静了几秒。
问题就出在这句话上。这套本体不是业务的镜子,是数据库的影子。
影子和镜子有什么区别?影子会跟着光源变——光源一动,影子就拉长、变形、甚至消失。镜子照的是实体本身,光源怎么动,镜子里的东西不变。
数据库就是那个光源。它会分库分表,会加冗余字段,会换国产库,会被新架构重构。而业务概念不一样:客户就是客户,订单就是订单,付款就是付款,十年不变。
所以本文的结论很直接:本体的建模锚点必须是业务对象,不是数据表结构。但表不能扔——它是映射目标,不是建模源头。
语义层(TBox) 业务对象:客户、合同、付款单 ← 稳定 ↓ 映射声明(R2RML / 语义视图) 数据层 ERP 表:KNA1、KNB1、KNVV ← 易变
换表,改映射;不换本体。这就是全部要点。
过去本体主要给人看。字段名难看点、类名带点表味,业务人员连蒙带猜也能用,忍一忍就过去了。
现在不一样了——本体是要给大模型看的。而大模型看 T_PAY.VENDOR_CODE 只能猜,看"付款单 —[支付给]→ 供应商"才真懂。
近期的一些实测数据也印证了这一点:把结构化图谱接入检索后,上下文开销能从约 38k token 压到 12k,同类问答准确率从 82.1% 提到 89.2%。差距不在模型,在于喂给它的东西是不是"有意义的结构"。
换句话说:表的影子在过去只是难看,在 AI 时代是致命的。
这不是审美问题,是工程问题。每一条都会在项目后期变成实打实的返工。
坑 | 表里看到什么 | 业务真相是什么 |
|---|---|---|
1. 存储决策冒充语义 | 客户被拆成三张表 | SAP 里 KNA1(主数据)、KNB1(公司代码视图)、KNVV(销售视图)——这是范式化的实现细节,不是三个业务概念。照着建,你的本体里就有了三个"客户" |
2. 同义异名无解 | Customer 和 Debtor 是两张表 | 销售叫客户,财务叫债务人,是同一个业务概念的两个视角。表结构里没有任何机制能表达这一点——而这恰恰是本体最该干的活 |
3. 外键不是语义关系 | ORDER.CUST_ID 引用 CUSTOMER.ID | 外键只说明"有个引用",方向性和业务含义全丢了。真相是"客户下达了订单",而外键不区分"下达""收货""投诉"——它们长得一模一样 |
4. 没有 is-a | 一个 type 字段写着 'VIP' | 本体要的是"VIP客户 ⊑ 客户 ⊑ 业务伙伴"这样的分类层次,能继承、能推理。type 字段只是个标签,推理机看不懂 |
5. 约束不在表里 | 表结构干干净净 | "科目余额必须在借方""超合同金额 10% 必须复审"这类规则,全藏在应用代码里。表结构一个字都没有,你照着建就永远建不出规则层 |
6. 把最稳的绑在最不稳的 | 表随时会重构 | 业务概念十年不变。本体跟着表走,等于把最稳定的资产绑在最易变的东西上——这是所有技术债里最贵的一种 |
一句话记牢表结构回答的是"数据怎么存",本体回答的是"业务是什么"。这两个问题的答案,从来就不该长一个样。
只讲好处不讲代价,那是卖课的。以业务对象为锚,你要付出这些:
所以要说清楚:不是"看表"错了,是"只按表建"错了。表在正确的环节里,价值巨大——下一节会讲到它该待在哪。
这是本文最实用的一节。建模时到底看什么?按优先级排,从上往下走:
优先级 | 参照什么 | 怎么用 |
|---|---|---|
① 最高 | 待答的业务问题 | 先列出本体要支撑的决策:这笔付款该不该批?这笔交易有没有围标嫌疑?没有问题就没有需求,没有需求就定不了边界 |
② | 可复用的标准本体 | 企业侧:REA(资源-事件-参与者,会计与供应链首选)、BORO、TOVE、UFO、EO;行业侧:FIBO(金融)、ISO 15926(流程工业)、GS1(供应链)、schema.org |
③ | 主数据清单 | 科目、组织、物料、业务伙伴、BOM、成本中心——主数据本身就是"跨部门共享的稳定业务概念",是现成的骨架 |
④ | 业务流程与事件 | 下单、收货、开票、付款这些事件,把静态对象串成动态链条。没有事件层,就没有推演能力 |
⑤ 最低 | 现有表结构 | 只用来校验与发现:这类有没有数据支撑?表里藏着哪些没被文档化的概念?它是证据,不是蓝图 |
一个没有待答问题的本体,等于一个没有用户的数据库——什么都能放,所以什么也不放。反过来,一旦问题清楚,边界自动就清楚了。
比如问题是"判断一笔付款是否异常",那么必须进本体的就有:付款单、合同、供应商、审批流、历史付款模式;可以暂缓的有:员工的培训记录、办公楼的能耗数据。边界是被问题切出来的,不是被表切出来的。
这是投入产出比最高、也最常被忽略的一层。自创的每一个类,都要在后续付出对齐成本——和其他系统对齐、和合作伙伴对齐、和未来的行业标准对齐。
几个值得先查的:
哪怕只是"参考它的分类思路",也比从白纸开始强得多。
表结构在这一层有三件事可做,都很实在:
道理讲完了,看点具体的。假设问题是"判断一笔付款是否异常",两种锚点建出来的东西完全不同。
类 T_PAY 字段:PAY_ID, VENDOR_CODE, AMT, STATUS 类 T_CONTRACT 字段:CT_ID, VENDOR_CODE, TOTAL 类 T_VENDOR 字段:VENDOR_CODE, NAME, TYPE 关系:T_PAY.VENDOR_CODE → T_VENDOR.VENDOR_CODE
看起来能用。但它答不了这三个问题:这笔付款依据哪份合同(表里有合同号,但"依据"这个语义没有)?这笔付款走了几级审批(审批记录可能在另一套 OA 表里)?这个供应商上次被拒付是什么时候(需要跨时间推理)?
付款单 —[依据]→ 合同 付款单 —[支付给]→ 供应商 付款单 —[经过]→ 审批事件 —[由...做出]→ 审批人 供应商 ⊑ 业务伙伴;关联供应商 ⊑ 供应商 规则:付款金额 > 合同金额 × 110% ⟹ 必须复审
差别不在形式,在能不能被推理。同一个问题,两种模型的表现:
业务问题 | 表结构模型 | 业务对象模型 |
|---|---|---|
这笔付款依据哪份合同? | 能查到合同号,但"依据"关系丢失,跨表拼接靠开发约定 | 沿 [依据] 关系一步到达 |
超合同金额了吗? | 规则在代码里,本体层面答不了 | 规则显式可推理,自动触发复审标记 |
这家供应商的关联公司也在付款吗? | 需人工判断"关联"怎么定义,写死 SQL | 关联供应商 ⊑ 供应商,一轮查询出全部 |
三个月前审批时的规则是这版吗? | 答不了,无时间维度 | 事件带时间、规则带版本,可回溯 |
最后一行是分水岭。前三个问题,表结构模型咬咬牙还能做;第四个问题,它根本答不了——因为表里没有时间维度,而合规审计恰恰最爱问这类问题。
不用等上线,现在就能测。四个问题,答不上来就说明本体偏了:
测试 | 怎么问 | 不通过说明什么 |
|---|---|---|
改名测试 | 把 Oracle 换国产库、表全部重设计,本体要改吗? | 要改 → 你建的是表的影子 |
新人测试 | 给懂业务、不懂数据库的人看,他读得懂吗? | 读不懂 → 术语被技术词汇污染了 |
删除测试 | 删掉这个类,业务方会问"那 XX 怎么看"吗? | 不会问 → 它多半是为迁就表而建的 |
跨系统测试 | MES、PLM 的数据挂得进来吗? | 挂不进来 → 本体太 ERP 特化了 |
知道理想状态,也得知道怎么走过去。三个阶段:
这个节奏和我们做本体构建流水线的思路一致:初抽取 → 模板化 → 业务专家冲突解决 → 本体输出。反向工程是初抽取,不是终点;专家冲突解决才是把"影子"扭成"镜子"的那一步。
写在最后
把本体建成数据库的影子,你得到的是一张随光源晃动的轮廓——光源一动,轮廓就变,你永远追不上。把它建成业务的镜子,你才第一次看清业务本来的样子:谁参与了什么,什么触发了什么,哪条规则约束着哪笔钱。而大模型需要的,从来都是后者——它能自己组织语言,但它没法凭空猜出你公司的业务长什么样。
下篇预告 · 也想听听你的
这篇其实只解决了一半问题:锚点选对了,映射层还得建起来。前文那句"换表只改映射",说得轻巧,做起来全是坑——R2RML、OBDA 虚拟映射、ETL 物化三条路线,各有各的翻车姿势:虚拟映射查询实时但性能吃紧,物化查询快但数据有延迟,R2RML 标准归标准,维护成本一点也不低。下一篇我们把这三条路拆开,配一张能直接拿去用的选型对照表。
在那之前,想先请教一句:你们现在的本体(或者知识图谱、数据中台),是照着业务建的,还是照着数据库表建的?如果拿不准,用文中的"改名测试"试一下——把库换了、表重新设计了,它还站得住吗?欢迎留言讲讲你踩过的坑,我会挑典型的在下一篇里回应。