SQL Agent 为何在生产环境中失败:针对实时关系型数据库的 LLM Grounding
Spider 基准测试看起来很棒。GPT-4 在数百个测试查询中的 text-to-SQL 转换得分超过 85%。团队看到这些数字,配置好 LangChain 的 SQLDatabaseChain,然后上线“询问你的数据”功能。两周后,一位分析师关于按地区划分收入的无心提问触发了全表扫描,导致报表系统宕机 30 分钟。
基准测试数字是真实的。问题在于,基准测试不使用你的模式 (schema)。
Spider 1.0 在包含 5–30 个表和 50–100 个列的数据库上测试模型。而你的生产数据仓库有 200 个表、700 多个列,根据你查询的系统有三种 SQL 方言,以及在四年前编写代码的工程师看来有意义,但对其他任何人来说都毫无意义的列名。当研究人员推出 Spider 2.0——一个具有企业级规模 schema 和现实复杂性的基准测试时——GPT-4o 的成功率从 86.6% 下降到 10.1%。这种断崖式下跌才是生产环境的真实写照。
这篇文章讨论的是安全部署 SQL Agent 所需的工程设计——不是作为一个模型调用的包装器,而是一个具有 schema 基础化 (grounding)、运行时验证和分层权限的系统 。如果其中任何一个环节出错,你要么会得到极其自信的错误答案,要么更糟,在实时数据库上运行了非预期的查询。
SQL 访问不是文档 RAG
当你构建文档 RAG 系统时,近似答案是可以接受的。检索缺失会返回一段相关性稍低的文章;模型用合理的推理填补空白。用户得到一个足够接近的响应,最糟糕的失败模式也只是一个模糊的答案。
SQL 则完全不同。查询要么映射到正确的表名和列名,要么无法执行——或者更糟,它针对错误的数据成功执行。一个混淆了 user_events 和 user_sessions,或者使用 order_date 而不是 created_at 的 Agent,不会返回一个略显不精确的答案。它会返回一个充满自信但完全错误的任务。分析师信任它。决策据此做出。
根本区别在于确定性。文档 RAG 在检索时容忍语义近似。SQL 生成则需要精确的 schema 映射——表名、列名、连接条件、过滤语义——而且没有“同情分”。一个“几乎”能写对 SQL 查询的 LLM,生成的查询看起来很合理,解析也正确,但会静默地返回错误结果。
交付过 text-to-SQL 系统的生产团队一致报告了这一差距。Pinterest 发现,生产环境中的初次尝试接受率约为 20%,而基准测试数字则显示性能要高得多。这些查询并非无法执行——它们执行了并返回了结果,然后被用户标记为错误。
