智能问数 Text2SQL 卷准确率其实没意义,90% 也没法用

卷到 90% 也没用,因为你不知道这一次是不是落到那剩下 10% 了

准确率这个指标,从一开始就问错了方向

几乎所有 Text2SQL 产品都在卷准确率,隔三差五就有人宣布又提升了多少个百分点,从 70% 涨到 90% 甚至 95%,看起来一片繁荣。

但这只是一个“看起来很美”的指标。数字不是重点,逻辑才是:即便准确率达到 90%,用户怎么知道这一次有没有落在那 10% 里?

数据决策不是抽奖。一个语法正确、语义完全跑偏的 SQL,执行成功返回一个漂亮的结果,但根本不是用户想问的。这种错误,SQL 层面检查不出来,只有用到现实业务中才会发现错得离谱。

这是因为智能问数的用户是业务人员,不是 DBA。他们不懂 SQL,也看不懂 JSON、XML 或任何技术化的中间格式。不管后台技术多复杂,用户面对的就是一个黑箱,他只能输入问题,然后得到一个结果,中间过程完全不可见,也就无从验证对错。

无法验证的结果,再高的准确率也没有决策价值

准确率不是“够不够高”的问题,是“能不能确认”的问题

一个错配的逻辑:准确率从 80% 提到 90%,系统就更可用了。

实际上,从“不可用”到“可用”,跨越的不是 10 个百分点,而是一个质的变化:从“黑箱”变成“透明”

80% 准确率的黑箱和 90% 准确率的黑箱,对用户来说没有本质区别。反正都看不懂中间过程,都不知道这一次对不对,只能赌这次运气好,落在了正确的那一边。

反过来,如果用户能在执行前发现并剔除错误,那 80% 的准确率就已经足够好用了,剩下的 20% 错误能被识别和拦截,用户只要说一声“这不对”,系统就重新来。准确率从 80% 到 90% 的意义,远不如“用户能不能发现那 10% 的错误”来得重要。

在严肃的经营决策场景里,没人敢于去赌。

这就是为什么 90% 的准确率也没用。不是 90% 不够高,是“不可确认”本身就不可接受。

正确的方向:不是卷准确率,而是“可确认性”

问题的本质不是“能不能做对”,而是“做错了能不能被发现”。

破局方法:在查询执行之前,加一层用户能读懂的中间表示,让用户自己确认意图

这层中间表示必须同时满足两个条件:

一、人类可读。用接近自然语言的形式,不用技术培训就能看懂。比如“2023 年北京发往青岛的订单金额汇总”,而不是 JSON、XML、自定义 DSL 或者 SQL。

二、机器可解析。有明确可用规则描述的结构,能确定性转换成 SQL,不依赖模型猜测。

就这么简单。验证方法也不复杂:随机拿几个真实业务问题,让用户看中间结果。能一眼确认“对,这就是我要问的”,方案就过了底线。看不懂,别的指标再漂亮也没用。

为什么大多数方案在卷准确率,而不是解决可确认性

不是不想,是做不到。

SQL 以及这些方案的中间层是机器导向的,用结构化的中间语法约束 LLM 的输出空间,减少幻觉。JSON 也好、自定义 MQL 也罢,有了约束,准确率确实提高了,但和 SQL 一样仍然是人看不懂。看不懂,校验环节就永远缺失。

中间层还有更糟的是恶性循环:设计得越复杂,LLM 越容易语法出错;为了保准确率,不得不把中间层做得很简单,有些甚至简单到只支持单表查询,把多表关联、子查询、复杂指标全部丢弃。企业级场景根本不够用。

业界在卷准确率,是因为大多数厂家只会卷准确率。中间层做不到人读,就谈不上“可确认性”。

润乾 NLQ:不卷准确率,解决“人能确认”

润乾 NLQ 走的是另一条路:LLM 做翻译,规则做决策,人做确认

LLM 不做复杂推理,只做语义转写,把五花八门的口语整理成标准化的规范文本。后续查询逻辑的准确性,交给规则引擎和人类确认。LLM 不需要生成 SQL 或中间层,只做它最擅长的自然语言理解。

整个流程分三步:自然语言 → LLM 翻译成规范文本(人机双向可读的 DSL)→ 用户确认 → 规则引擎确定性转换成 SQL。

..

第一步:LLM 把口语翻译成规范文本

LLM 只做一件事:把五花八门的口语表达,整理成标准化的“规范文本”(一种人机双向可读的 DSL)。

来看几个例子:

例 1:去掉口语废话

  • 口语输入:嗯…我想看看去年签的订单。

  • 规范文本:去年 订单

“嗯…我想看看”这类口语废话被去掉,只保留核心查询意图。

例 2:口语化条件转标准表达

  • 口语输入:零售价低于 50 元的零件。

  • 规范文本:零售价 小于 50 元 零件

“低于”被标准化为“小于”,更利于机器解析。

例 3:模糊时间转明确条件

  • 口语输入:去年秋天签了多少订单

  • 规范文本:签单日期 2025 年 9 月至 2025 年 11 月 订单数

“去年秋天”被识别为明确的时间范围。

例 4:复杂业务术语转标准条件

  • 口语输入:已售罄的商品。

  • 规范文本:库存量是 0 的商品

“已售罄”这种业务黑话,被翻译成明确的字段条件“库存量是 0”。

例 5:多条件组合查询

  • 口语输入:帮我看看上个月华北区单价超过 100 块的订单有多少

  • 规范文本:签单日期 上月 区域 华北 单价 大于 100 订单数

口语中的“帮我看看”“有多少”被过滤,“上个月”被识别为相对时间,“华北区”被映射到区域维度,“超过 100 块”被标准化为“大于 100”。

例 6:否定条件

  • 口语输入:去年没开单的女员工

  • 规范文本:签单日期 去年,没有 订单,女 员工

“没开单”被识别为否定条件,存在性判断,而不是“订单金额为零”。这是 LLM 语义理解能力的体现:它知道“没开单”不等于“订单金额 =0”,而是“不存在任何订单记录”。

这些规范文本的共同特点:一看就懂,不用翻译。用户不需要任何技术背景,扫一眼就知道“对,这就是我想问的”;或者“不对,这理解偏了”。

第二步:人类做确认

LLM 有幻觉,不一定每次都翻译对。所以必须加一道人类确认的关卡。

比如用户想问“北京客户下的订单”,LLM 可能翻译成:

  • 发货城市 北京 订单—— 把“客户在北京”理解成了“发货在北京”

..

用户想查的是客户所在地为北京的订单,而 LLM 理解成了发货地为北京,翻译出来的文本语法通顺、结构完整,但意思完全错了。

如果不确认直接执行,返回的就是“发货城市 = 北京”的订单数据,跟用户想查的“北京客户下的订单”是两回事。拿到结果可能还意识不到错了——因为结果本身是合法的、有数据的,只是不是他想要的。

有了“规范文本”这个中间层,问题在执行前就被拦截了。用户看到“发货城市 北京”,一眼就能发现“不对,我要的是客户在北京”,然后返回修改提问,重新走第一步。

..

人类能确认的,才是能用的。这正是本文反复强调的核心观点。

第三步:规则引擎转 SQL 查数据

用户确认规范文本无误后,进入确定性转换阶段。

规范文本 → SQL,每一步都基于确定的规则和词典,100% 可追溯、可调试。没有 LLM 的“发挥空间”,没有“大概率正确”,只有确定性的转换和确定性的结果。

这一步不能再指望 AI,否则幻觉只是换了个位置。必须用规则引擎做确定性的编译转换,才能保证“确认无误”之后的执行环节不出差错。

润乾 NLQ 把 Text2SQL 从“AI 猜你问什么”变成了“你确认 AI 理解对了再执行”。LLM 做它最擅长的翻译,人做他最擅长的是非判断,规则引擎做它最擅长的确定性转换。各司其职,各取所长。

润乾 NLQ 不去比谁的准确率高,它比用户到底敢不敢信

卷准确率是个无底洞。从 80% 卷到 85%,再卷到 90%,投入的成本指数级上升,但用户的信任度并没有同步提升,因为他还是看不懂、确认不了。

与其卷一个用户无法验证的指标,不如认真解决“用户能不能看懂、能不能确认”。

能确认,就能用。不能确认,90% 也没用。