dbaplus社群公众号文章

长文详解本体论如何驱动智能问数:痛点、路线、建模、应用及趋势

它最大的遗产不是问数准确率,而是那批被迫显式化、资产化、被治理起来的企业语义。

dbaplus社群

公众号 · 35 篇文章


先说结论:本体论增强问数的真正价值,不在于"让 NL2SQL 更准"这个表层,而在于迫使企业第一次把散落在文档、口头传统、SQL 脚本里的指标口径显式化、集中化、资产化。问数的准确率提升是这场数据治理运动的副产品。反过来说,那些本体建得好的企业,即使不用 LLM 问数,BI 系统本身也早已受益,口径统一了,报表打架就消失了。


而从演进视角看,本体其实本身也在瘦身:词汇映射(同义词表)这部分工作正被 LLM 的语义理解能力逐步吸收,三年前需要同义词表才能链接的概念,今天的大模型直接就能对上;真正不可替代的只剩两块:指标口径(治理资产)与维度层级(计算依赖)。所以,根本的根本,其实还是在数据治理上。


本文从5个大点逐步来拆解本体论如何增强问数:


  • 现实痛点:先从当前智能问数存在的问题说起

  • 当前路数:再看智能问数的4种路线

  • 离线基建:本体论驱动智能问数的本体如何建模?

  • 在线执行:本体论驱动智能问数的本体如何应用?

  • 未来趋势:终看本体论驱动智能问数的技术审视,把这件事讲清楚。


本文较长,东西很多,但可以细读,批判、辩证地看,一起深度思考,总会有更多的收获,更好的指引。


一、现实痛点:先从当前智能问数存在的问题说起


先看一个真实场景(细节做了脱敏,模式在多家企业 ChatBI 项目中反复出现)。某零售企业的数据仓库里有三张核心表:dim_customer(客户维表)、fact_order(订单事实表)、dim_product(商品维表)。业务分析师向一个基于大模型的问数系统提问:


"上个月华南区钻石客户在美妆品类的客单价,跟再上个月比怎么样?"


没有做任何本体增强的 LLM 直接面对 schema 生成 SQL,典型错误有四类:


  • 类型1:字段猜错


把"客单价"实现为 AVG(pay_amount)(平均订单金额),而企业口径是总销售额 / 去重客户数。这两个算法结果可能差 2~3 倍,而报表上看起来都是"一个数";


  • 类型2:维度值猜错


"华南区"在 LLM 的常识里可能包含广东、广西、海南、福建,但该企业的区域划分里福建属于华东。LLM 不知道,因为这是企业的私有约定;


  • 类型3:时间边界算错


"上个月"是自然月还是滑动 30 天?月初跑批时"上个月"是否已完整?环比的分母用哪个口径?


  • 类型4:状态过滤漏掉


fact_order.status 里混着已支付、已取消、退款中的订单,算销售额应该只取已支付。这个业务常识不在任何字段注释里。


可以看到,这四类错误没有一类是"SQL 写得不好",而都是"语义不知道",所以说,问数系统的瓶颈不在 SQL 生成能力,而在语义理解。所以,现在会有这种讲法,本体论增强(Ontology-Enhanced)。


二、当前路数:再看智能问数的4种路线


从具体实现路线上看,可以分成4种路线,如下:



先说结论:纯LLM最简单,但幻觉、长schema问题突出;SchemaLinking是工业主流,但解决不了业务口径;OBDA本体方案口径可控,但构建成本高、泛化差;本体增强混合,融合LLM与本体各自优势,但前提是要有本体资产,整体架构最复杂。


  • 路线1


纯LLM直译,将数据库Schema(表结构)放入提示词prompt中,直接交给大模型输出SQL语句。不需要建模成本,任意自然语言提问都可以覆盖。但是,Schema过长会产生上下文溢出;模型容易产生幻觉,统计口径的正确性靠模型猜测,稳定性差。


  • 路线2


Retrieval/SchemaLinking(检索/库表链接),先检索召回和问题相关的表、字段,缩小输入范围,再生成SQL;经常搭配模型微调fine‑tune使用。是目前业界主流方案,能明显提升SQL准确率,压缩模型需要处理的候选库表子空间。只能解决“找对表和字段”,没法解决业务统计口径对齐、跨领域语义一致性问题。


  • 路线3


经典OBDA/语义映射。自然语言NL先转为SPARQL,通过本体映射,再转换成SQL。过程可解释、可审计,业务统计口径被本体固定。不在本体覆盖范围内的查询全部失效;本体构建维护工作量巨大。


  • 路线4


本体增强混合方案。大模型负责理解用户意图、做库表链接、产出SQL草稿;本体用来产出检索候选、展开业务口径、做结果约束校验、提供few‑shot示例。兼顾泛化能力和结果准确性,查询链路可追溯。系统复杂度最高;依赖已经建设完备的本体知识资产。


本体论增强智能问数的本质,是把问数从"一次翻译"重构为"两次翻译",本体承担第一次翻译(语义解析:消歧、映射、口径补全),LLM 承担第二次翻译(SQL 生成)。确定性归本体,模糊性归 LLM。基于此,可以分成如下架构:



然后,在这个架构之下,有一些术语可以了解下:



三、离线基建:本体论驱动智能问数的本体如何建模?


本体建模这块,本体到底长啥样、都有啥、怎么表示、都涉及到啥、怎么实现可以单独拿出来看,讲个明白。


这里先给一句话定调:本体建模,本质是把散落在 SQL 脚本、BI 报表、业务文档、老员工脑子里的"业务语义",显式化成一份可被程序读取、可被校验、可被版本的"企业语义契约"。它不是把数据搬过来,而是把"什么叫销售额""什么叫华南""哪些订单算数"这些本来只有人懂的约定,变成结构化记录。


1、本体长啥样,可以拆分为七大构件


工程落地时,一个可用的本体通常由七类构件组成,如下:



这里特别需要注意:这七类不是学术 OWL 的翻新,而是"为了问数能用"做的务实裁剪:砍掉了描述逻辑推理,保留了映射、口径、层级这三根最能产生收益的主干。所以,在这里,适当地离学术术语远一些。


这里给一个完整的本体文件: 零售领域本体(工程可用版),用于本体增强智能问数的知识底座,设计原则是确定性口径外置;概念与物理 schema 显式映射;可版本化、可审计。



其中,拆开看,一个meta信息,对当前的本体做个定义:



然后接着走几个元素:


元素1-实体映射:把"物理表"登记进本体。实体回答的是"查什么表、怎么定位到一行"。粒度(grain)是这里最重要的字段,它定义了指标聚合的边界。订单表的粒度是"一行一笔订单",客户表是"一行一个客户",粒度错了,聚合就会翻倍或漏算。



元素2-关系:join 路径的确定性。纯 LLM 经常 join 错表或漏 join。关系把"客户和订单通过 customer_id 关联"明确写死,问数系统直接用,不再让模型猜。type 标注基数(1:N / N:1),下游据此决定去重策略。



元素3-指标:口径即公式。这是本体里价值最高的部分。指标不是"销售额"这三个字,而是"已支付订单的 pay_amount 求和"这个公式。synonyms 解决"营收/进账/流水"都指向它;filter 把"退款不算"固化;owner 让每个口径有人负责(治理抓手)。



元素4-维度:层级展开与概念值映射。维度解决两类微妙问题:一是"华南到底含哪些省"(层级展开,杜绝常识瞎猜);二是"钻石客户在库里其实是字符串 'DIAMOND'"(概念值到物理值的映射)。开放维度(如品类)则用 values 枚举当前已知值,新增时触发告警。



元素5-规则:规则(Rules)是可执行的断言,供校验层拦截错误 SQL;



元素6-词汇:词汇层专门登记歧义,比如 gmv 在运营和财务口径不同,必须显式标注"需追问",而不是让模型二选一。



元素7-派生指标:派生指标把复杂查询表达为已有指标的组合,避免重复定义口径。



2、具体如何做呢?


本体的构建过程是一个pipeline的过程,如下图所示:



从工程化的思路来看,如下:


输入:数据库 schema + 字段注释、历史 SQL 仓库(BI 平台积累的已验证查询)、业务文档(指标定义文档、口径说明会纪要)、数仓建模文档。


输出:YAML 结构所描述的本体知识库。这个工业界 ChatBI 产品(以及阿里 Quick BI、火山引擎 ChatBI、Tableau Pulse 等产品的语义层)实际使用的是轻量级领域知识库,通常以 YAML/JSON/图数据库存储,包含五类要素:



从中可以看到,"语义层(Semantic Layer)+ 同义词词典 + 维度层级树 + 指标口径库"的合体。


那么这个具体怎么做?普遍采用 "LLM 抽取 + 人工校验"的半自动流水线,可以分成如下步骤:


  • Step1.候选指标抽取


把历史 SQL 仓库喂给 LLM,抽取所有 SELECT 中的聚合表达式,聚类后得到候选指标清单(例如发现 300 条历史 SQL 里有 47 条在做 SUM(amount)/COUNT(DISTINCT customer_id),聚成"客单价"候选)。这一步利用了一个事实:历史 SQL 是企业语义最密集的沉淀,口径早已被数据分析师反复敲定。


  • Step2.词汇归并


对候选概念做同义词聚类("客单价/ATV/人均消费"),用嵌入向量 + LLM 判别双重确认,人工审核边界案例。


  • Step3.维度层级构建


从维度表的实际数据值自动归纳层级(GROUP BY 大区/省/市,检查数据是否严格构成树),异常(一个省出现在两个大区)转人工裁决,这类"脏维度"恰是企业数据治理欠账的暴露点。


  • Step4.口径审定


LLM 生成每个指标的口径草案(名称、公式、过滤条件、适用维度),数据团队评审后签名入库。owner 字段强制填写,没有 owner 的指标口径在治理上是"孤儿资产"。


  • Step5.持续运营


每周跑一次"漂移检测",新出现的历史 SQL 模式无法被现有本体覆盖时告警,触发增补流程。


这个又可以看到,这个本质上就是一次数据治理工程,借 AI 之名完成。实际项目中 60%~70% 的工作量在这里。


3、具体该如何存储呢?


本体构建好之后,怎么表示是个问题,这里有三种对照形式:


还是一个具体的例子来看,同一个概念"客单价",在三种表示形式里长得完全不同。理解它们的差别,才能选对存储与工具。


  • 方案1:工程 YAML(最常用,人读人改),也有json的方案。



  • 方案2:学术 OWL/Turtle(形式化、可推理)。


OWL 强调公理与推理,适合需要一致性检查的场合,但工业问数主链路几乎不用它跑推理,仅作文档级规范。



  • 方案3:属性图(Neo4j,适合实体-实例稠密场景)。


当本体要同时承载"谁是谁"(实例,如张三=钻石客户)和"什么是"(概念,如钻石的定义)时,属性图把两者统一在同一张图里,便于图查询。



所以,再做个系统对比,就是:



然后实际工程上,大多数的问数系统用 YAML/JSON 就够,推理需求靠程序逻辑(如报告里的 validate 函数)替代 OWL 推理机;只有在"本体+实例一体化、且需要图遍历"时才上属性图。过度上 OWL 是"技术自嗨",不是工程需要。


4、本体建模这块需要注意的点


当然,本题不是一次建完就结束了,其实一个动态更新的过程,如果要量化区分,本体建模的劳动强度,60% 在对齐(把"营收"和"销售额"归并为一个概念,还是两个?靠指标公式聚类 + 人工拍板。这是语义收敛,不是算法问题)与裁决(当"规模"在 A 部门指 AUM、B 部门指份额,谁对?必须 owner 签字,这是组织行为,无法自动化)、30% 在运营,真正"画本体"只占 10%。它本质是治理工程,不是建模技巧。衡量它成功的标准不是"本体多完整",而是"口径吵架少了多少、报表打架少了多少、问数错误是否可拦截"。


基于这个点,可以细化成需要做多个注意点:


其一,版本与治理。本体是"语义契约",必须版本化。推荐语义化版本:破坏性口径变更(如客单价口径调整)升 minor,新增概念升 patch。每次变更走 PR + 评审;配套的回归测试集必须跟着跑,否则本体腐烂(口径过期)无人知晓。


其二,服务暴露。从 prompt 注入到工具调用。当前主流是把本体通过 MCP 等协议暴露为工具:list_metrics()、get_metric_definition("客单价")、expand_dimension("华南")、validate_sql(sql)。Agent 在工具接口上规划查询,而不是把整份本体塞进 prompt。这一步把"本体"从项目内组件升级为企业级数据基础设施。


其三,切勿过度建模。试图把一切形式化,结果本体比代码还复杂、没人维护。正确做法是"最小可用本体"。只建高频、可形式化、有明确 owner 的概念,长尾留给 LLM 兜底。


其四,把 LLM 抽取当全自动。抽取能自动化,但"口径谁说了算"永远是人。自动化生成 100 条候选,最终拍板的必须是业务 owner,否则口径冲突会炸在治理层。


其五,和 schema 脱节。建完不管,新表/新字段上线后本体不更新,错误是系统性、静默的(本体腐烂)。必须有漂移检测和季度年审。


其六,与LLM的协同时分工明确。本体的价值最大化,靠"检索 + 校验"两头夹:上行检索(命中概念给上下文)、下行校验(拦截错误)。注意LLM 负责"理解语言",本体负责"锚定语义",分工清晰。


四、在线执行:本体论驱动智能问数的本体如何应用?


在线本体构建之后,要进行在线的执行,整个的步骤会如下:



1、语义解析


这一步最重要的是Schema Linking 模块(mention → concept),输入:用户 query。输出:结构化的语义表示(命中了哪些本体概念、什么意图、哪些槽位)。


中间步骤分成三个子任务:



把"人话里的词"对准"本体概念 + 本体概念对准"物理列"的双跳。


具体实现上,可以细分几步:


  • step1. 候选召回(召回优先)


用 NER + embedding 双向召回,把问句里的 mention 映射到本体概念,同时命中别名层。宁可召回过度(recall 高),交给下一步消歧。


  • step2. 本体约束消歧(精度优先)


当多个候选概念同词命中,用本体的相关性/排他约束与问题上下文做重排;question decomposition 在 linking 阶段先拆句,再逐子句精确对齐。


  • step3.概念→物理列映射用


OBDA(Ontology‑Based Data Access,基于本体的数据访问,属于传统语义驱动的 Text‑to‑SQL 方案,不靠大模型猜,靠本体 + 映射规则做翻译) mapping 把选中的概念落到具体表/列/join on 条件上,这一层因为是确定性的映射表,天然具备审计能力。


其中,实体链接的产出是关键中间产物,如下:



结果就是:"客单价"以 0.97 置信度链接到指标本体;"环比"被识别为 compare_period_over_period 意图;时间槽解析为 2026-07 对 2026-06。


2、上下文组装


这一层回答的问题是:在有限的上下文窗口里,放什么、不放什么。全量 schema 塞进去(大企业数仓上千张表)不仅爆 token,还会让 LLM 被无关表干扰选错 join。


可以看下常用的策略:


1)schema 裁剪


只保留命中概念涉及的表和列。案例中命中的概念涉及 dim_customer、fact_order、dim_product 三张表,就只给这三张。裁剪本身就是一次消歧,LLM 不可能 join 到不该碰的表。


2)Join 路径注入


从本体的实体关系子图计算最短 join 路径,直接以文字形式写进 prompt("dim_customer JOIN fact_order ON customer_id,fact_order JOIN dim_product ON product_id"),不让 LLM 自己推导。


3)口径注入


命中指标的公式原文、过滤条件、适用维度清单。注意要同时注入"不适用维度"(例如某比率型指标不适用"日"粒度,因为分母日均会失真)。


4)维度值展开


"华南"根据本体层级展开为省份列表,或直接注入维度值映射表。这消灭了"LLM 用常识猜区域划分"的错误。


5)few-shot 检索


从"已验证 query-SQL 对"库里检索语义最相近的 2~3 对作为示例,这些示例本身就是本体的一部分(经过校验的翻译样本资产)。



3、SQL 生成


工业界的实际做法是混合:高频模式(top 指标 × top 维度组合)走 IR 编译保证确定性,长尾 query 回落到端到端 LLM。在实际做的时候,通常是混着来。


可以看下主流的两种策略:



最终得到的sql如下:



4、验证修正


这一层做的是校验验证,在实现上,通常做三级校验,从便宜到昂贵依次执行:


  • 第一级:本体规则校验(编译期)


SQL 里出现的指标表达式与本体的口径公式做模式匹配,LLM 若把客单价写成 AVG(pay_amount),与本体公式不符,直接打回重生成并附上正确公式。过滤条件同理(漏掉 status='PAID' 就违反了"退款单不计入销售额"规则)。


  • 第二级:执行校验(运行期)


语法检查、EXPLAIN 看执行计划(是否全表扫描、join 顺序是否合理)、空结果检测(返回 0 行大概率是过滤条件写死写错了,触发自检重试)。


  • 第三级:结果合理性校验(语义期)


用 LLM 判断结果量级是否符合常识,"客单价 380 万元"显然违背业务常识,多半是聚合粒度错了(把总额当均值);对比历史缓存中同一指标的历史值区间,偏差超过阈值标黄提示。


继续上面的例子,结果就是:指标表达式与本体口径模式匹配通过;status='PAID' 过滤在位;维度值列表与本体展开一致;执行返回两个非空数值,且落在历史客单价区间(300~500 元)内,放行。最终回答用户:"7 月客单价 412 元,6 月 389 元,环比上升 5.9%。"


这个可以再多讲一些但是,需要注意的是,修正策略遵循"最小干预":能改表达式的改表达式(确定性补丁),改不了的带错误说明回到生成层重试,重试两次仍失败则降级为"向用户澄清"。敢于说'我不确定,请问你指的是 A 还是 B',是问数系统可靠性的必要条件。这个其实就是,回答不知道总比胡说八道要好的多。


五、未来趋势:终看本体论驱动智能问数的技术审视


如前所证,瓶颈在私有语义知识缺失,本体是能显式承载这类知识的工程形式。few-shot 和微调只能把知识"压"进参数(隐性、不可审计、不可继承),本体外置为资产(显性、可版本化、跨模型复用)。当企业换底座模型时,本体资产原封不动地保留,这是资产与模型的解耦,长期看比任何单点准确率提升都值钱【这就是大家要做数据的原因】。


但是,实际在做的时候,并不是说的那样轻松,归根到底还是会涉及到成本、覆盖度、腐烂更新、知识边界等缺陷。



1、4个缺陷


  • 缺陷一:构建成本悖论


效果上限由本体质量决定,但高质量本体需要领域专家 + 数据工程师长期投入。历史上专家系统就是因为知识获取瓶颈被统计学习取代的。现在 NL2SQL 绕了一圈又回到知识工程,只是这次知识获取有 LLM 辅助(成本下降一个量级,但没有消失)。中小团队的真实处境是:建不起完整本体,只能建"指标口径 + 同义词"的骨架,效果打折。


  • 缺陷二:覆盖度天花板


本体天然只能覆盖高频、显式、已形式化的语义。临时性分析("帮我看看上周那个活动带来的人后续复购怎么样")、模糊探索("这数据感觉不太对")落在本体之外,仍然依赖 LLM 的猜。本体增强把问数从 60 分提到 85 分,但最后 15 分的长尾恰恰是最难形式化的部分,边际收益急剧递减。


  • 缺陷三:本体腐烂


业务变化 → schema 变化 → 本体必须同步更新,否则本体给出的口径就是错的。更糟的是:本体错误是系统性、静默的。纯 LLM 猜错时用户对结果保持警惕(知道 AI 会错),而本体加持的系统给出错误答案时带着"权威感",用户反而丧失怀疑。一个口径过时的本体,比没有本体更危险:它把随机错误升级成了系统性误导。缓解放法只有重运营:漂移检测、口径年审、错误回流,又回到缺陷一的成本问题。闭环成立,代价是持续燃烧人力。


  • 缺陷四:默会知识的表达边界


很多业务语义其实是组织内的默会知识(tacit knowledge):"高价值客户"在市场部和风控部定义不同,且两边都认为自己的定义不言自明。本体构建强行统一口径时,第一个暴露的不是技术问题而是组织政治问题,谁的口径是"对的"?实践中这类冲突往往以"本体里登记两个指标、各挂各的 owner"告终,本质是把矛盾从自然语言层转移到了治理层,并没有消灭它。


2、最后来看方向


当前架构把本体知识"注入 prompt"喂给 LLM,这是过渡形态,prompt 是拥挤的、有 token 预算的、一次性的。正在发生的范式迁移是:本体从 prompt 的组成部分变成工具接口本身。


这个其实是正确的,后续具体形态会变成:语义层(本体的工程化身)通过标准协议(MCP 等)暴露为一组工具:list_metrics()、get_metric_definition("客单价")、expand_dimension("华南")、execute_metric_query(metric, dims, filters) 。Agent 在工具接口上做规划(先查有什么指标 → 取口径 → 下查询 → 校验结果),而不是在 prompt 里做翻译。


但是,顺着这个方向推到底,会得到一个略显反直觉的结论:"本体论增强智能问数"这个命题本身会消解,当语义层成为企业的标准基础设施、Agent 生态的标准工具后,"问数"不再是一个需要专门增强的独立系统,而是任何 Agent 调用数据工具的自然结果。本体论增强问数,是通往这个终局路上的一段必要过渡:它最大的遗产不是问数准确率,而是那批被迫显式化、资产化、被治理起来的企业语义。


但是,站在当下,需要明白一些叙事泡沫,因为总会听到一些话,挑几个重点的看:


一言 "本体推理带来能力跃迁" 。工业主链路上也不会很主流地跑 OWL 描述逻辑推理,推理被 LLM 的 in-context 能力替代了。叙事里的"推理机"更多存在于架构图里;


二言 "一次本体构建,长期受益" 。这句话忽视了本体腐烂的持续维护成本,真实成本曲线估算起来会是构建占40%、持续运营占60%;


三言 "本体让系统理解业务" 。系统并没有"理解",它只是查询了被结构化的业务定义。把检索说成理解,是营销话术对工程事实的覆盖;


四言 "全自动化本体构建" 。LLM 抽取候选可以自动化,但口径审定(谁说了算、冲突怎么裁决)天然是人的事,无法自动化。


作者丨刘焕勇
来源丨公众号:老刘说NLP(ID:Laoliushuo_NLP)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:[email protected]

前往微信阅读全文

内容来自公众号,可前往微信查看原文。

查看作者的更多文章 →订阅更新、RSS 与阅读指南 →