使用自然语言查询数据库安全吗?NL2SQL 只读部署与验证清单
NL2SQL 可以降低临时查询的门槛,但也将自然语言的不确定性引入了数据库。可靠的解决方案并非“让模型写出更好的 SQL”,而是构建一个涵盖术语、权限、验证、执行和审计的闭环。
可靠 NL2SQL 查询的关键步骤
- 确认用户意图是查询数据而非修改数据。
- 将业务术语映射到表、字段、时间范围和聚合方式。
- 生成 SQL 后,检查其语法、权限和资源风险。
- 通过只读连接执行,并对超时时间和返回结果的范围进行限制。
- 格式化结果的同时,保留原始问题、SQL 语句和执行状态以供审计。
多轮对话也必须明确哪些条件被继承下来。例如,“仅显示华东地区”通常会保留上一轮的指标,但系统应完整展示最终的所有条件。
为什么模式映射比模型规模更重要
当业务用户提到“新客户”时,这可能对应数据库中特定的状态和日期字段。仅提供表结构不足以传达业务定义。业务团队和数据负责人应共同维护术语、指标定义、允许的关联关系及示例查询,并为每项内容指定负责人。
安全基线:在模型外部添加确定性控制措施
| 风险 | 控制措施 |
|---|---|
| 意外修改数据 | 使用只读数据库账号,并拦截非查询语句 |
| 全表扫描 | 限制超时时间、扫描范围和返回行数 |
| 未授权查询 | 根据用户身份过滤表、行和列的访问权限 |
| 定义模糊 | 展示解读内容并要求用户确认 |
| 敏感结果泄露 | 应用数据脱敏、导出限制和审计日志 |
切勿将“模型通常不会生成危险语句”视为安全措施。即使模型出错,数据库权限和查询网关仍应防止产生副作用。
首先澄清模糊问题
“本月销售收入”可能涉及时区、退款、税费、手续费和订单状态等。智能体(Agent)应展示其解读内容,包括时间范围、指标公式、分组字段和过滤条件,然后请用户确认。如果无法确认,应返回候选解读方案,而不是直接执行查询。
上线前测试清单
- 具备单表查询、聚合、排序和多表连接的标准化测试用例。
- 未知字段、拼写错误和缺失的时间范围会触发澄清机制。
- 拦截非查询语句、范围过大的查询以及未授权的字段。
- 数据库超时、空结果和连接失败时会生成清晰的提示信息。
- 审计记录能够关联用户、自然语言请求、生成的 SQL 及执行结果。
常见问题
NL2SQL 会取代 BI 工具吗?
它更适合临时查询和数据探索,而具有固定定义的仪表板仍由 BI 工具处理更为合适。两者可以互补。
业务用户需要查看 SQL 吗?
可根据角色决定是否展示。至少数据负责人和审计人员应能查看最终的 SQL、参数和执行状态。
如何提高查询准确率?
首先优化业务术语和指标定义,随后补充经过审核的示例查询,并持续分析澄清请求和失败记录。
下一步行动
首先连接脱敏测试库或只读副本,并在 SmaugBrain 中验证查询与拦截路径。在权限、配额和审计测试全部通过之前,切勿连接生产数据。