作为程序员,咱平时跟数据库打交道的时候,估计都遇到过这种糟心事儿:想从超大表里查点数据、做个分析,要么得硬着头皮写 SQL(要是表结构复杂,join 个七八张表能把人绕晕),要么碰到数据量太大,SQL 跑半天出不来结果,更别说想做个 PCA 降维、异常检测这种复杂分析了 ——SQL 根本不支持啊!
最近看到 CSIRO Data61 团队搞的一个新框架,直接把自然语言转换成查询计划,不用再死磕 SQL,还能轻松搞定大表和复杂分析,简直是咱们这些不想在 SQL 上耗时间的人的福音。今天就跟大伙儿好好唠唠这个框架,到底牛在哪儿。
(图 1 里左边是 SQL 执行计划,右边是 TSO 的树形计划,对比一下就能看出来,TSO 早过滤早轻松,中间表体积小多了)
当然,想生成这种高效的查询计划,不是拍脑袋就能成的。因为要确定最优的操作顺序,本质上是个 NP-hard 问题 —— 可能的操作组合太多,根本不可能穷举。所以 TSO 用了大模型(LLM)加 ReAct 框架的思路,让模型一步步 “思考”:先看当前有哪些表和中间结果,判断下一步该做什么操作(比如该关联哪两张表,该过滤哪个条件),做完再观察结果对不对,不对还能回溯调整。这种迭代的方式,既不用让模型一次性想出所有步骤(避免上下文爆炸),又能保证每一步都朝着目标走。
(图 2 能清楚看到三级向量检索的流程:从用户查询到表、聚类、列的匹配,再到 ReAct 框架生成查询计划,整个链路很清晰)
光说不练假把式,咱们看看实验结果。团队用了两个数据集测试:一个是经典的 Spider 数据集(测传统表查询),一个是农业数据集(26 万行、8000 多列,测大表和复杂分析)。
先看 Spider 数据集的结果,对比了 TSO 和目前排名靠前的 DIN-SQL。表格里能看到,用 GPT-4o 的 TSO,在 Easy 难度下准确率 93.02%,比 DIN-SQL 还高;Extra Hard 难度 47.69%,虽然比 DIN-SQL(43.40%)稍高一点,但要知道,TSO 没用到 Spider 的训练数据,完全靠模型的通用能力 —— 这已经很能打了。而且要是不给模型看表结构(TSO⁻),准确率直接掉一大截,比如 GPT-4o 从 70.34% 掉到 45.75%,这也说明,让模型知道表结构有多重要。
表 1:Spider 数据集上的实验结果,加粗是最优,下划线是次优,TSO 在 Easy 和 Extra Hard 上表现很亮眼
再看农业数据集,这个更能体现 TSO 的优势。团队设计了 20 个查询,从简单的 “计算平均谷物产量” 到复杂的 “用卫星数据做 PCA 降维” 都有。结果 16 个查对了,4 个错了,错的原因也挺有意思,能帮咱们避坑:
比如有个问题是 “列出种植前 1 年记录的不同作物轮作情况”,本来该找 “METADom_Crop_rotation_minus_1_sub_cropWheat” 这列,但模型给这列的描述写成了 “种植前 1 天”—— 差了个 “年” 和 “天”,直接找错列了。这说明列描述的准确性太重要了,以后做类似系统,得加个校验步骤,避免这种低级错误。
还有个问题是 “种植后前 80 天的累积蒸散量和谷物产量有什么关系”,用户没说清楚要关联哪几个产量列,模型只找了一个,漏了两个 —— 这就是自然语言的歧义问题,要是能让模型主动问用户 “你指的是哪几个产量指标?”,准确率肯定能再提一提。
最难的两个问题,比如 “评估高涝害试验中土壤特性的影响”,模型想用 Python 代码解决,但卡在调试上了,没在最大迭代次数内出结果。这说明复杂分析场景下,代码生成的稳定性还得加强,可能需要加个代码模板或者错误重试机制。
不过总的来说,能在 8000 多列的大表上搞定 PCA、异常检测这些操作,还能保持这么高的准确率,TSO 已经甩传统方法几条街了。
最后再唠两句,这个框架给咱们的启发其实挺多的:以后做数据查询系统,不一定非得盯着 SQL 不放,查询计划这种更灵活的方式,既能兼容传统数据库,又能扩展复杂分析;而且大模型的迭代思考能力,比让它一次性出结果靠谱多了,尤其是处理复杂问题的时候。对咱们程序员来说,以后不管是自己做工具,还是给业务同事搭查询平台,这个思路都能用得上 —— 毕竟谁不想少写点 SQL,多省点时间摸鱼呢?

