Text2SQL 破局技术解析之二:MQL 实现与复杂性

( 上一篇: Text2SQL 破局技术解析之一:规范文本与灵活性 )

在基于 "规范文本" 的 NLQ 架构中,MQL(Metrics Query Language)作为规范文本的确定性编译目标,承担着关键使命。本文作为 "规范文本" 篇的延续,将继续解析 MQL 的设计逻辑及其实现机制。

MQL:精确语义的承载者

规范文本作为自然语言形式,仍可能存在语义边界模糊的情况。MQL 的引入,正是为了建立精确的语义基准。

MQL 承担着承上启下的作用。作为规范文本的确定性编译目标,需要建立精确的语义基准,消除自然语言中可能存在的残余歧义。同时通过精心设计的语法结构,在保持对企业级复杂查询足够表达力的前提下,将查询能力限制在合理范围内,确保可控性与准确性。

这种平衡体现在 MQL 的四类查询范式中:单表明细查询、单表汇总查询、多表明细查询、多表汇总查询。这些范式基本覆盖了 BI 场景下的典型查询模式,为从规范文本到精确查询的转换提供了系统的表达框架。

单表明细查询:基础数据筛选

规范文本:“订单金额不低于 1 千元的订单”

MQL 实现

SELECT 订单金额 as 订单金额,订单编码,客户名称,签单日期,发货日期,收货日期 
FROM orders
WHERE 订单金额>=1000

这是最简单的查询范式,基于单一数据源不涉及聚合计算。MQL 在此场景中的作用主要体现在:

  • 字段精确映射:将“订单金额”、“客户名称”等自然语言词汇准确对应到数据库字段

  • 条件准确转换:将“不低于 1 千元”转换为精确的数值比较条件订单金额 >=1000

  • 结果集规范:明确指定需要返回的字段集合

此类查询常见于基础数据检索和简单条件过滤,为其他查询提供基础能力支撑。

单表聚合查询:维度聚合分析

规范文本:“各城市发货总金额”

MQL 实现

SELECT orders.sum(订单金额) as 总金额 
ON city as 城市 
FROM orders
BY 发货城市

这里引入了维度聚合的概念,体现了 MQL 的核心价值:

  • 维度建模:通过 ON city as 城市明确定义分析维度

  • 聚合计算:使用 sum(订单金额) 实现指标汇总

  • 分组逻辑:BY 发货城市 指定了分组依据字段

此类查询是 BI 分析的基础,MQL 通过清晰的语法结构将业务分析需求转换为准确的数据聚合逻辑。

多表明细查询:关联信息整合

规范文本:“订单数大于 5 的客户信息以及总订单金额”

MQL 实现

SELECT
    客户编码,
    客户名称,
    联系人,
    联系人职务,
    城市编码,
    orders.count(DISTINCT 订单编码) AS 订单数,
    orders.sum(订单金额) AS 总订单金额
FROM
    customer 
JOIN
    orders 
HAVING
    (订单数> 5)

这个例子展现了 MQL 处理复杂数据关系的能力:

  • 多表关联:通过 JOIN orders 实现客户表与订单表的关联

  • 混合查询:在主表明细基础上挂载子表聚合结果

  • 自动关联:基于元数据自动推导 customer 与 orders 间的关联条件

  • 结果集过滤:通过 HAVING 对结果集进行过滤

此类查询满足了在主体信息基础上附带相关统计指标的业务需求,体现了 MQL 在复杂场景下的表达能力。

多表汇总查询:多项指标对齐

规范文本:“各个类别的订单总数和在线订单数”

MQL 实现

SELECT orderdetail.count(DISTINCT 订单编码) as 订单总数,
       website_event.sum(在线订单()) as 汇总在线订单数 
ON ProductType as 类别 
FROM orderdetail
BY 产品类别 
JOIN website_event
BY 产品分类

这是更复杂的指标查询范式,展现了 MQL 的高级特性:

  • 多源整合:从 orderdetail 和 website_event 两个独立数据源分别计算指标

  • 维度对齐:通过 ON ProductType as 类别实现不同来源数据按统一维度对齐

  • 复杂指标:付款数 () 代表可预定义的业务指标计算

此类查询常见于跨主题的综合分析场景,MQL 通过统一的维度模型和指标体系,实现了数据关系的简洁表达。

这四项查询范式能够清晰描述从简单筛选到复杂跨源分析的各类 BI 场景,为自然语言查询提供了较全面的表达能力。同时,MQL 采用类 SQL 的语法设计,具备严谨的规范性,将查询能力进行限制,杜绝过于随意的查询请求,但仍保持了足够的复杂度,在表达力与规范性之间做出了有效平衡。

DQL:透明化表间关联

仔细观察上面的 MQL 语法,多表查询的语句只是处理了聚合后的对齐,SQL 中经常出现的多对一的外键关系并没有出现。比如在订单中引用其客户地址,也就是主查询表是订单表,但要和客户表 JOIN 获取其地址信息。

MQL 可以应对这种外键关联场景吗?如何应对呢?

答案是 MQL 和 SQL 之间还有一个中间层DQL(Dimensional Query Language),一种基于维度的查询语言。DQL 通过 "外键属性化" 特性,巧妙地解决了表间关联的复杂性。我们通过具体实例说明这一机制:

比如用户输入“请帮我查一下北京发往青岛的订单”,首先会由 LLM 转换成标准文本“北京 发往 青岛 订单”,接下来 NLQ 引擎解析后生成 MQL:

SELECT 发货城市 as 发货城市,收货城市 as 收货城市,订单编码,客户名称,签单日期,发货日期,收货日期,订单金额
FROM orders 
WHERE (发货城市=30101) AND (收货城市=20201)

到这一步还只有订单表,不涉及客户表。

然后,这一句 MQL 将会被进一步转换为 DQL:

SELECT shipcity, customerid.citycode,ordered,customerid,signdate,shipdate,receivedate,amount
FROM orders 
WHERE shipcity=30101 and customerid.citycode=20201

这时候还是没有出现客户表,但收货城市被转换成了一个对象形式:customerid.citycode。cutstomerid 是订单表的字段,而 citycode 则是客户表中的字段。

DQL 引擎会再生成可执行的 SQL:

SELECT o.shipcity, c.citycode, o.ordered, o.customerid, o.signdate, o.shipdate, o.receivedate
FROM orders o
JOIN customer c ON o.customerid = c.id
WHERE o.shipcity = 30101 AND c.citycode = 20201

这个最终执行的 SQL 有了显式的 JOIN 子句,关联了 orders 和 customer 两个表。

DQL 仍然基于单表查询,但在获取客户表的收货城市时使用了customerid.citycode,即外键. 外键字段(类似对象. 属性)的方式。这种将多对一的外键关系抽象为对象属性的访问方式称为“外键属性化”,这样无论有多少层表间关联,都可以通过点操作符逐级访问到,而 FROM 后面只有一个单表,这样就巧妙地建立了表间关联,但语法中消除了显式的 JOIN。DQL 之所以可以使用外键属性化,是因为数据之间的关系已经在数据模型层面定义好了,直接使用即可。模型定义很简单,一般技术人员就能完成。

DQL 为 MQL 以单表查询实现多表关联奠定了基础,MQL 中 FROM 子句中的一个单表,在 SQL 并不是单表,它很可能是个关联很多层维表的复杂 JOIN。

SPL:复杂指标计算引擎

尽管 MQL 和 DQL 能够覆盖大部分 BI 查询场景,但在处理复杂业务指标时仍存在局限。诸如股票连涨天数、用户留存率等需要多步计算或特殊算法的场景,SQL 的实现会非常复杂而且难以被嵌入复用,这时候需要引入更专业的计算能力,也就是SPL(Structured Process Language)

SPL 作为专门处理复杂计算的语言,在架构中扮演着计算引擎的角色:

  • 时序计算:支持移动平均、周期对比、连续增长等复杂时间序列分析

  • 集合运算:处理分组排名、TopN 分析、集合交并差等操作

  • 流程计算:实现漏斗分析、路径挖掘、归因分析等业务场景

  • 数学计算:提供统计分布、相关性分析等高级功能

MQL 可以直接使用 SPL 定义的指标,比如要计算大订单数量,大订单是指订单金额超过最大金额 50% 的订单。这时就可以定义 SPL 计算指标:

(x=?1.max(订单金额)/2,?1.count(订单金额>=x))。

MQL 碰到用 SPL 定义的指标时,将会先生成读数用的 DQL(再转换成 SQL)执行后再用 SPL 在结果集上继续计算出这些复杂指标。如果 MQL 中没有 SPL 定义的指标,那将会被转换成 DQL 继续解析掉关联生成完整的 SQL 执行。

到这里润乾 NLQ 架构的各个组件均已呈现:

  • LLM 保障灵活性:处理自然语言的多样性

  • 规范文本确保准确性:通过可确认的中间层解决语义幻觉

  • MQL 提供规范性:建立精确的查询语义基准

  • DQL 处理数据关联:通过维度建模简化复杂的数据关系

  • SPL 实现复杂计算:专业处理高级分析需求

各组件在保持独立性的同时,通过清晰的接口定义实现无缝衔接,形成了一个既灵活又可靠、既强大又可控的解决方案。

润乾 NLQ 通过 MQL、DQL、SPL 的协同设计,构建了一个层次清晰、职责分明的 Text2SQL 架构。MQL 作为规范文本的精确编译目标,在保持足够表达力的同时确保了查询的规范性;DQL 通过维度建模和关联透明化,降低了数据访问的复杂度;SPL 则专注于复杂指标计算,扩展了系统的分析能力。

这种分层架构解决了 "灵活性、准确性、复杂性" 的三难困境,也为企业级 BI 应用提供了可靠的技术基础。在接下来的文章中,我们将继续深入探讨基于词典的 NLQ 引擎如何将规范文档准确地编译成 MQL。