NL2SQL 有一个听起来很完美的推介版本:用户用自然语言提问,智能体生成 SQL,数据返回。更少的界面,更少的查询,更少的代码。简单。
然后你再多想五分钟。
演示中没人提的问题
模式(Schema)不是为了解释事物而设计的。 晦涩的表名、不一致的列名、在没有额外谓词的情况下语义上无效的技术有效关系——这在企业数据库中很常见。这些不是 bug,只是业务变更积累的历史。但当你要求模型从一个并非为传达意图而设计的模式中推断意图时,模型还是会尝试。它不会放弃。它会生成最佳查询并自信地返回结果。
模型是非确定性的。 对同一个数据库问同一个问题两次,你可能会得到不同的 SQL。模型在计算概率,上下文中的细微变化会产生不同的输出。你无法通过测试获得智能体总是生成正确查询的保证。
用户审查无法扩展。 “执行前只需审查每个查询"听起来很安全。但这假设用户既是数据模型又是 SQL 的专家——恰恰是那些不需要自然语言界面的人。它还引入了认知过载和新型确认偏差,被查询复杂性压倒的用户会批准无效查询而不是去调查它们。
然后还有注入。 在传统 SQL 开发中,参数化解决了注入问题,因为用户输入填充的是参数,而不是 SQL 结构。在 NL2SQL 中,模型本身生成 SQL。提示词、模式上下文、对话历史和检索的数据都会影响执行的内容。如果有人精心设计一个改变模型生成内容的提示,那就是注入——不是在参数级别,而是在查询生成级别。与 DROP TABLE(明显、可恢复)不同,NL2SQL 注入会产生在没有可见错误的情况下返回错误结果的查询。业务决策基于错误数据做出。
SQL MCP Server 究竟解决了什么
这里文章提出了最有用的实用观点。SQL MPC Server 不是给智能体任意的模式访问权限并期待最好的结果,而是暴露了一个建立在 Data API builder 之上的精心策划的 API 表面。
差异很重要:智能体不生成 SQL。它调用返回预定义结果形状的命名端点。SQL 由开发人员编写一次,是确定性的。智能体的非确定性被限制在选择调用哪个端点,而不是组合任意查询。
这类似于参数化在传统应用模型中对 SQL 注入所做的——消除了从不受信任的输入构建任意查询的能力。
正确的问题
这篇文章不是说"永远不要使用 NL2SQL”。它说:对在哪里应用它以及暴露什么要有意识。对于在受控环境中、具有有限范围模式和只读访问权限的探索性分析,NL2SQL 可能没问题。对于业务决策依赖于结果的生产系统,经过精心策划的 API 层要安全得多。
说实话:有些问题确实更适合用命名端点后面的结构化查询来解决,而不是自然语言到 SQL。SQL MCP Server 为你提供了这个选项,而不必完全放弃智能体界面。
原文链接:Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?
