Text-to-SQL 实测:420 次真实提问,95.7% 的失败不在 SQL 语法在业务口径

“把数据库接给大模型,业务同学自己查数就行了”——这是今年最容易被高管拍板的方案,也是最容易在第三个月悄悄下线的一个。我们帮三家中型公司搭过 text-to-SQL 分析系统,三家里有两家在半年内退回了”提需求给数据团队”的老路,只剩一家还在用,而且只敢给看三个固定看板。

这篇是这三个项目的复盘:420 次真实提问的准确率、成本,以及一个反直觉的结论——text-to-SQL 的失败几乎从不在 SQL 语法里,而在业务语义的歧义里。

一、先定义什么叫”查对了”

NL2SQL 类项目最容易骗自己的地方,是把”SQL 能执行”当成”答案正确”。我们定的验收标准是三层,一层比一层严:

  • 第一层,可执行:生成的 SQL 无语法错误、表和字段都存在。
  • 第二层,口径对:用的表、过滤条件、时间范围、聚合方式符合数据仓库的规范定义。
  • 第三层,答案对:执行结果和数据团队的正确答案一致(精确匹配或容差内)。

三家里,模型第一层的通过率都在 96% 以上——现在的大模型写 SQL 语法几乎没有问题。但第二层普遍只有 60% 出头,第三层掉到 45%–58%。从”能跑”到”对”,中间隔着整个业务口径。

我们用一个典型例子说明落差:业务同学问”上个月卖得最好的品类是哪个“。SQL 能跑,结果也返回一行。但这个问题的正确口径有至少四个歧义点:

  • “卖得最好”指 GMV、订单数、件数还是毛利?四个口径的冠军品类经常不是同一个。
  • “上个月”按自然月、近 30 天、还是财务月(25 日关账)?
  • 是否包含退款单、内部测试单、赠品单?
  • “品类”取叶子类目还是二级类目?

模型不会问,它会猜。而猜错的那个答案,业务同学自己是看不出来的——数字看着很合理,格式很规整,来源也标着一个数据库。这是 text-to-SQL 最危险的地方:错得静默,错得体面。

二、420 次真实提问的错因分布

我们让三家公司的业务同学连续两周真正常用,一共 420 次提问,逐条人工核对。错因分布如下:

失败层级 占比 典型表现 业务可自发觉
SQL 语法 / 字段不存在 4.3% 拼错字段、用错函数方言 能(报错)
关联表选择错误 11.2% 多路径关联时选错桥表,结果重复计算 不能
口径歧义猜错 38.6% “卖得最好”按件数算、时间按自然月算 不能
时间语义误解 19.4% “最近”理解成 7 天、用户想 30 天 不能
指标定义过时 13.7% 用了仓库里已被废弃的旧指标表 不能
结果解读误导 12.8% 数字对,但用户据此外推了错误结论 不能

只有 4.3% 是模型能力问题,剩下 95.7% 是信息不对称问题。模型缺的不是 SQL 能力,是”这家公司的 GMV 到底怎么定义”这类上下文。而这件事,公司内部的人也经常答不全——我们见过同一个指标在三个看板里有三个版本。

第三层通过率的最终成绩:

公司 库表规模 是否建指标层 420 问中第三层正确率 半年后状态
A 公司 1800 表 无 45.2% 已下线
B 公司 600 表 部分(仅 12 个常用指标) 58.1% 限三个看板使用
C 公司 450 表 完整(含口径文档) 71.3% 仍在用

三家的模型能力差别不大,甚至 A 公司用的模型更新。决定成败的是指标层的完整度,以及你敢开放多少表。

三、把正确率做上去的四个动作

1. 建”指标语义层”,而不是把全库 schema 塞进去。我们把 warehouse 里反复被查的 60 个指标,逐个写成包含”计算逻辑、时间口径、过滤条件、同义词、常见误用”的语义卡片,作为检索上下文注入。这一步单独把口径歧义错误从 38.6% 压到 14% 左右,是单项收益最大的改造。

2. 表范围做白名单,默认只开 30 张表。A 公司图省事开了全库 1800 张表,结果模型在大量相似的历史备份表里迷路。B 和 C 都做了白名单,且对”财务月””退款”这类高危口径表,要求模型强制引用语义卡而非自行推断。开放度和正确率在这里是负相关的,必须承认。

3. 强制”先反问再执行”。但凡检测到问题里有歧义信号(”最好””最近””大概””大概多少”这类词),系统不生成 SQL,先列出歧义选项让用户点选。这个交互加上以后,虽然多了一步点击,但口径歧义类错误降到 5% 以下。用户宁愿多点一次,也不想拿一个错数字去开会。

4. 答案必须带”口径回放”。每张结果表下方固定展示三行:用了哪几张表、时间范围怎么切的、指标定义是哪张语义卡。不让用户验算 SQL,让用户验算口径。这一条把”业务不可自发觉”的错误捞回来相当一部分——C 公司靠它把真实发现的错误率拉高一倍,那些原本会静静错下去的查询被拦下了。

四、成本账

项目 A 公司(全库开放) C 公司(白名单+语义层)
平均单次 token 数 约 21,000 约 6,400
单次查询模型成本 约 0.31 元 约 0.09 元
月查询量 约 3,200 次 约 4,100 次
正确查询的月成本 约 2,190 元 约 515 元
数据团队返工工时/月 约 55 小时 约 19 小时

“开放更多”既没换来更多正确,也没换来更省钱,只是换来更多返工。语义层让 token 消耗降了七成——这是最容易被忽略的收益:精准的少量上下文,胜过海量的全量 schema。

五、落地建议

  • 先盘点指标口径,再谈接数据库。如果公司自己都答不全”GMV 怎么算”,这个项目不要开。三家里最成功的那家,启动前花了一个半月写指标卡。
  • 从”高频、单一指标、时间维度”的场景切,不要从开放问答切。比如”某品类近 30 天销量趋势”,口径固定,成功率能到 90% 以上。
  • 歧义反问是必做交互,不是可选优化。
  • 结果页常驻口径回放,这是错误能被发现的唯一机制。
  • 别把 text-to-SQL 当”取数自助化”,当”指标查询的语义缓存器”——它加速的是重复的、口径明确的问题,而不是开放式探索。

总结

420 次提问的结论可以压成三句话:模型的 SQL 能力早就够用了,瓶颈在业务语义;开放度和正确率是负相关的,白名单不是保守是必须;静默错误比显式错误危险十倍,因为它会进会议纪要。

更重要的认知:text-to-SQL 项目本质上是一个”知识管理项目”,不是”技术接入项目”。它的成本大头不在模型调用,在把散落在各处的口径定义收敛成机器可读的语义层。这个工作没有捷径,而它一旦做完,收益是持续的。

最后一个判断:两年内”直接问数据库”会退居次要位置,主流形态会是”问指标层 + 少量权限内的下钻”。完全的自然语言到 SQL 只适合口径极其简单的小型库,中大型数据仓库一定会回归到受控的语义接口——不是因为模型不行,是因为组织不行。

互动提问:你们公司的”上个月卖得最好的品类”,数据团队、财务、运营三个部门给出的答案是一致的吗?如果三个部门给三个答案,text-to-SQL 该怎么判分?

互动提问:有没有人在生产环境真跑过 text-to-SQL?最常遇到的是报错型失败,还是那种”看着很合理但错了”的静默失败?

分享到:

微博
Twitter
LinkedIn

— IMAI 编辑部 | 2026-10-29

发表评论