news 2026/8/17 19:07:33

为什么你问「上月华东区销量」ChatBI 秒懂?衡石 ChatBI 语义理解与查询改写技术解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么你问「上月华东区销量」ChatBI 秒懂?衡石 ChatBI 语义理解与查询改写技术解析

引言

你对着 ChatBI 输入一句「上月华东区销量 top 5 的产品是什么」,系统在不到两秒内就返回了一张带数字的图表。这背后看似简单,其实隐藏着一个极其复杂的工程问题:如何让机器把一句充满歧义、省略、口语化的人类语言,准确翻译成可在数据库上执行的查询语句。

传统 BI 的做法是「人写 SQL、机器执行」。ChatBI 的革命在于把这一步彻底翻转——人说话、机器写查询。但这恰恰是难度最高的环节。一句「上个月卖得最好的」可能指销量、也可能指销售额;「华东」在有的企业是销售大区,在有的企业只是地理标签;「top 5」到底是按绝对值还是按同比增长排序,用户自己都没说清。

衡石 ChatBI 构建了一套以语义层(Metrics Layer)为核心的查询理解引擎,把「自然语言 → 可执行查询」拆解为语义解析、意图消歧、Query 改写、安全校验四个阶段。本文将深入拆解这套引擎的底层技术。


一、ChatBI 查询理解为什么难?

1.1 人类语言的三个天然陷阱

歧义性。同一个词在不同语境下指向完全不同。「增长」可能是绝对值增长,也可能是增长率;「用户」可能是注册用户、付费用户或活跃用户。没有业务背景,纯语言模型无法判断。

省略与指代。用户不会每次都把条件说全。「和上个月比怎么样」——「上个月」是相对哪个基准?「比怎么样」比的是总量还是增速?口语交流依赖上下文,但机器默认没有记忆。

同义与口语化。「GMV」「成交额」「流水」在业务里是同一个东西,但字面完全不同;「卖得火」「爆款」「畅销」指向「销量高」,但没有任何一个词直接出现在数据库字段里。

这三个陷阱决定了:ChatBI 不能靠「大模型直接生成 SQL」就完事。直接让 LLM 写 SQL 的典型准确率只有 50%-65%,而且错误往往很隐蔽——查询能执行、返回了数字,但数字的含义和用户想问的根本不是一回事。

1.2 衡石的解法:语义层优先

衡石 ChatBI 的核心设计哲学是:不让大模型凭空猜数据库结构,而是让它在一个「业务语义层」之上做选择。

语义层是一张「业务概念 ↔ 物理字段」的映射表。它提前定义好了:

  • 哪些业务术语对应哪些指标(如「销量」= sales_volume 指标的求和)

  • 哪些维度可用(时间、地区、产品、渠道)

  • 指标之间的计算关系(「毛利率」= (销售额-成本)/销售额)

  • 维度的层级关系(「地区」下面有「华东/华北/华南」等成员)

大模型面对用户问题时,不再需要猜测数据库里有什么,而只需要从语义层里「挑选」正确的指标、维度和过滤条件。这一步把开放式的「生成 SQL」问题,降级成了一个可控的「从候选集中做选择题」问题——准确率因此从六成跃升到九成以上。


二、第一阶段:语义解析——把句子拆成结构化意图

2.1 实体识别(NER):圈出关键信息

当用户问「上月华东区销量 top 5 的产品」,语义解析的第一步是实体识别,把句子拆成四类结构化要素:

指标实体:「销量」——映射到语义层的 sales_volume 指标。维度实体:「华东区」——映射到地区维度下的「华东」成员;「产品」——映射到产品维度。时间实体:「上月」——解析为相对时间,转换为具体的日期区间(如 2026-06-01 至 2026-06-30)。修饰实体:「top 5」——解析为排序限制(按销量降序取前 5)。

衡石采用「规则 + 模型」混合的实体识别方案。对于时间表达式(上周、本季度、近 30 天),用专门的时间解析规则库保证精确;对于指标和维度,则结合语义层的候选词表做模糊匹配——即使用户写的是「卖了多少货」,也能通过同义词表命中「销量」指标。

2.2 意图分类:判断用户到底要什么

实体识别之后,需要判断用户的「分析意图」属于哪一类。常见的意图包括:

  • 明细查询(「列出所有华东的订单」)

  • 聚合统计(「华东区总销量是多少」)

  • 排名分析(「top 5 产品」)

  • 同环比(「和上个月比增长多少」)

  • 趋势分析(「最近半年的销量走势」)

  • 贡献度/占比(「华东占整体多少」)

意图分类决定了后续的查询模板。比如「top 5」命中排名意图,引擎会自动附加排序和截断逻辑;「走势」命中趋势意图,引擎会强制带上时间维度并选择折线图作为默认可视化。


三、第二阶段:意图消歧——解决「哪个口径」的问题

3.1 指标歧义的消解

当一句问话命中多个候选指标时,引擎需要消歧。衡石的消歧策略分三层:

第一层:上下文优先。如果当前会话之前一直在问「销量」,那么后续省略主语的「增长多少」默认继承「销量增长」,而不是跳到「销售额」。

第二层:语义层默认口径。语义层为每个指标配置了默认口径。比如「收入」默认指「主营业务收入」而非「其他业务收入」,在用户未明确指定时采用默认值,并在回答中显式标注「按主营业务收入口径」。

第三层:主动追问。当歧义无法通过上述两层消解(例如用户同时提到了两个都可能成立的指标且上下文无偏好),引擎不会瞎猜,而是向用户发起澄清式反问:「您指的是「合同额」还是「回款额」?」这种「宁可多问一句,绝不答错一次」的设计,是 ChatBI 可信度的关键保障。

3.2 维度成员消歧

「华东」在某些企业是标准销售大区,在某些企业只是地理分区,还可能和「上海」「江苏」等省级成员存在包含关系。衡石的做法是:在语义层中为维度成员建立层级树和同义词表。当「华东」出现时,引擎先查层级树确认它的成员范围和父子关系,再决定查询的过滤粒度——是只查华东大区汇总,还是下钻到省级明细,由用户问题中的粒度线索决定。

3.3 时间歧义消歧

「上月」是相对时间,但需要锚定「当前月」。更棘手的是「财年」——有的企业财年从 4 月开始,有的从 1 月。衡石在语义层配置每个租户的财年起始月和时区,时间解析模块据此把「本季度」「上年度」等相对表达转换为绝对日期区间,避免跨时区、跨财年导致的口径错误。


四、第三阶段:Query 改写——从语义计划到可执行查询

4.1 语义计划(Semantic Plan)

消歧完成后,引擎生成一份「语义计划」——一种介于自然语言和 SQL 之间的中间表示。它长这样(用自然语言描述,而非代码):

「对 sales_volume 指标按 product 维度分组,过滤 region = 华东且 date 在 2026-06,按指标降序排序,取前 5 条,返回 product 名称和 sales_volume 值。」

这份计划是 ChatBI 可解释性的核心载体:它既能被机器翻译成 SQL,也能被人类读懂和确认。

4.2 计划到 SQL 的翻译

语义计划到 SQL 的翻译是确定性的、可验证的,不像让 LLM 直接写 SQL 那样充满随机性。翻译器根据语义层的物理映射,把每个抽象概念替换成具体的表名、字段名和聚合函数,自动拼接出标准 SQL。由于映射关系由语义层严格定义,生成的 SQL 在语法和语义上都有保障。

4.3 查询优化与下推

生成的 SQL 并非直接甩给数据库。衡石引擎会在执行前做一轮查询优化:

  • 分区裁剪:根据时间过滤条件,只扫描相关分区,避免全表扫描。

  • 预聚合命中:如果语义层配置了物化视图或汇总表,且用户查询粒度匹配,直接走预聚合结果,响应从秒级降到毫秒级。

  • 权限注入:自动在 SQL 中追加行级权限过滤(如当前用户只能看自己负责的区域),保证「用户问得出来的,都是他有权看的」。


五、第四阶段:安全校验——答得准还要答得合规

5.1 三层校验门禁

Query 改写完成后、执行之前,还要经过三层校验:

指标权限校验:用户是否有该指标的查看权限?没有则直接拒答并说明原因。参数白名单校验:排序、过滤、时间区间是否在允许范围内?例如禁止查询超出授权时间窗的历史数据。资源熔断校验:查询涉及的数据量、预估扫描行数是否超过阈值?超限则降级为抽样或异步执行,防止单条问数拖垮整个集群。

5.2 与 RAG 的协同

在之前的技术文章中我们介绍过,衡石 ChatBI 引入了 RAG 检索增强来抑制幻觉。语义理解阶段正是 RAG 发挥作用的环节之一:当用户问到「我们的核心指标定义是什么」这类涉及业务知识的问题时,引擎先从指标知识库(术语表、指标口径文档)中检索相关内容,再结合语义层生成准确的回答,而不是让大模型凭训练记忆自由发挥。


六、一个完整例子:从一句话到一张图

用户问:「今年二季度华东和华北的销售额,跟去年比怎么样?」

语义解析:识别指标「销售额」、维度「地区」(成员:华东、华北)、时间「今年二季度」「去年」(同比)、意图「同环比」。

意图消歧:「销售额」命中语义层默认口径(主营业务收入);「今年二季度」根据租户财年配置转换为绝对日期;「去年」自动对齐为去年同期的二季度。

Query 改写:生成语义计划——「对销售额指标按地区分组,过滤地区∈{华东,华北}、时间∈今年Q2及去年Q2,计算同比增幅」。翻译为两段 SQL(今年、去年)或带年份分组的单条 SQL,并附加同比计算逻辑。

安全校验:确认当前用户有华东、华北的销售额查看权限,时间窗在授权范围内,预估扫描行数未超限。

执行与呈现:返回一张分组柱状图,横轴是地区,纵轴是销售额,并标注每个地区的同比增幅百分比。整个过程通常在 1-2 秒内完成。


七、技术选型对比

方案

准确率

可解释性

可控性

适用场景

LLM 直接生成 SQL

50%-65%

低(黑盒)

个人探索、非严肃场景

Text-to-SQL + Few-shot

70%-80%

单表简单查询

语义层 + 计划改写(衡石)

90%+

高(语义计划可读)

高(映射可控)

企业级严肃分析


八、FAQ

Q1:用户的问题太口语化、错别字很多,ChatBI 还能懂吗?能。语义层配置了同义词表和模糊匹配,加上大模型本身的容错能力,轻微的口语化和错别字不会影响实体识别。但完全跑题或语义不明的问题,引擎会选择追问而非硬猜。

Q2:语义层需要人工维护吗?成本高不高?需要一定的前期配置,但这是一劳永逸的投入。语义层建好后,所有 ChatBI 问数都受益,且指标口径统一带来的治理收益远超配置成本。衡石也支持从现有 BI 报表自动抽取指标定义,降低冷启动成本。

Q3:为什么不直接用更聪明的模型就不用语义层了?模型再聪明,也不了解你企业内部的指标口径和数据结构。语义层是把「企业私有知识」注入 ChatBI 的桥梁,这是通用大模型永远替代不了的部分。


九、总结

ChatBI 的「听懂人话」远不止调用一个大语言模型那么简单。衡石 ChatBI 通过语义解析 → 意图消歧 → Query 改写 → 安全校验四阶段流水线,把开放式的自然语言转化为可控、可解释、可审计的查询计划,再确定性地翻译为优化后的 SQL。

这套架构的核心思想是:用语义层把「猜」变成「选」,用计划把「黑盒」变成「白盒」。这正是 ChatBI 从玩具走向企业级严肃分析工具的关键一步。

下一篇我们将聊另一个容易被忽视、却直接决定体验的环节——当对话超过一轮,ChatBI 如何记住你前面说过的话。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 19:06:54

RSTP协议详解:原理、配置与实战优化

1. RSTP协议深度解析:从原理到实战在网络工程领域,生成树协议(STP)是构建冗余链路的基础技术,而它的进化版本RSTP(快速生成树协议)更是现代网络架构中不可或缺的组成部分。作为一名有十年网络运…

作者头像 李华
网站建设 2026/8/17 19:04:52

Flowable 事务与并发控制:保证流程一致性的关键机制

Flowable 事务与并发控制:保证流程一致性的关键机制 【免费下载链接】flowable-userguide Flowable最新中文文档,ai自动生成BPM体验地址:http://flow.je4.cn/#/login 项目地址: https://gitcode.com/gh_mirrors/fl/flowable-userguide 一、Flowabl…

作者头像 李华