精简表结构上下文,单次调用做SQL生成
作者报告schemagate在BIRD开发集取得77.12%的执行准确率:先筛选相关表,再用约2100个提示词元生成SQL,仅一次触发报错修复。隐藏测试集已提交,结果尚未公布。
AI 深度解读
Text-to-SQL 想提高准确率,常见做法是让模型多写几条 SQL,再筛选、投票。schemagate 走了另一条路:先选表,只给模型必要的数据库结构,再让它生成查询。作者报告,这套流程在 BIRD 完整开发集上拿到了 77.12% 的执行准确率。
它值得看,不只是因为调用少。schemagate 原本解决的是数据库访问权限问题,这次实验想说明:限制模型能看到、能查询的表,也可以保留较强的 SQL 生成能力。不过,开发集成绩和隐藏测试集排名还得分开看。
一次调用,靠的是先把表选对
BIRD 是把自然语言问题转换成 SQL 的评测。开发集包含 11 个真实数据库上的 1,534 道题,按执行准确率计分,也就是看 SQL 执行结果是否符合参考答案,而不是逐字比较 SQL。
作者使用 Claude Opus 5.5,在完整开发集上通过 BIRD 官方评估器得到:
- 总体执行准确率为 77.12%。
- simple 类别为 80.97%。
- moderate 类别为 71.34%。
- challenging 类别为 71.03%。
流程很短:schemagate 先读取数据库结构,挑出问题需要的表;模型只接收这些表的 DDL,也就是表结构定义,以及 BIRD 提供的列说明;随后生成一条 SQL。
每题约消耗 2,100 个 prompt tokens,不生成多份候选,不投票,也没有 agent 循环。如果 SQLite 执行报错,就把错误交给模型修复。作者说,这种修复在 1,534 道题中只发生了 1 次。
所以,「每题一次调用」描述的是正常路径,报错后仍有修复调用。原文没有进一步拆分调用统计,也没有给出选表错误占比。
77.12% 能和排行榜直接比吗
不能直接拿它和主榜第一的 82.95% 做差。前者是开发集成绩,后者是隐藏测试集成绩,评测题目不同。
作者称,主榜头部系统通常每题调用模型 5–20 次。schemagate 的调用量更少,但原文没有给出同模型、同数据集下的多调用对照,也没有提供实际费用和延迟。因此,可以说它的流程更省调用,暂时不能量化它比其他系统省多少钱。
作者已经提交隐藏测试集评测,BIRD 对 API 类方法的处理周期为 1–5 天。原文发布时,隐藏测试集成绩尚未返回。
开发集数字还受两类因素影响。
一是运行波动。同一份代码在 Mini-Dev 上首次得到 81.00,重跑得到 80.20。作者建议把单次成绩按约 ±1 个百分点理解,但这只是经验提醒,不是统计置信区间。
二是参考答案质量。作者引用 Jin 等人在 VLDB 2026 的研究,称 Mini-Dev 约一半参考答案存在问题。所有系统使用同一套答案,确实便于比较,但「因此排名仍然成立」说得过满:错误答案可能对不同系统产生不同影响。
作者还报告,Mini-Dev 在 SQLite / PostgreSQL / MySQL 上分别得到 81.0 / 72.6 / 72.4,并称均高于当时对应第一名。这些记录位于待维护者处理的 PR #251。开发集和 Mini-Dev 属于自报成绩,隐藏测试集才由 BIRD 团队运行。
它真正想解决的是查询权限
schemagate 的目标不是刷榜,而是让调用者看不到无权读取的表,也不能执行涉及这些表的查询。
这里包含两道约束:生成前限制模型接触的结构信息,执行前限制查询能够访问的对象。只在 prompt 里告诉模型「别查某张表」,并不能替代后一道约束。
作者称,schemagate 在 RBAC Text-to-SQL 和 Spider-ACL 权限评测上取得了当时最佳已发表结果,8,128 次查询中没有出现未授权读取。BIRD 实验则用于说明,权限控制之外,它仍有可用的查询生成能力。
但原文没有展开权限检查的实现,也没有说明具体如何处理复杂查询,不能仅凭这篇短文复现其安全机制。
我的判断
我认同它的工程取向:先控制模型能接触什么,再控制 SQL 能执行什么。这比把全部表结构塞给模型、依赖提示词约束权限更有说服力,也值得和多候选生成路线放在一起评估。
不过,作者的「这一层不损失准确率」缺少直接证据。要证明这一点,需要在同一模型、同一数据集上,对比开启和关闭权限层的结果。77.12% 证明了这套组合能取得一定成绩,无法单独证明权限层没有代价。
同样,8,128 次查询零越权是有价值的评测结果,但覆盖范围仍取决于测试内容。原文没有给对照和实现细节的部分,应该保留判断。
能拿来做什么
- 给 Node 数据查询服务接入模型时,可以把「选表、生成 SQL、执行校验」分成明确步骤,并在执行侧落实访问权限。
- 给已有数据库做自然语言查询入口时,可以先尝试只提供相关表的 DDL 和列说明,再用自己的问题集验证选表遗漏与查询准确率。
- 比较单次生成和多候选方案时,应固定模型与数据集,同时记录准确率、调用数、tokens 和报错修复次数,避免只比较一个排行榜数字。