1、Text2Sql目标
Text2SQL 的核心目标,是把自然语言问题转成可执行的 SQL。它并不是简单地把一句话"翻译"成 SQL,而是要同时理解用户意图、数据库结构、业务口径和数据库方言。
2、基本流程
Text2SQL 通常包含几个关键环节:
-
**Schema 准备:**把数据库中的表名、字段名、字段类型、注释、外键关系整理成模型可理解的结构化信息。Schema 越规范,模型生成 SQL 的准确率越高。
-
**意图理解:**从用户问题中识别查询目标、过滤条件、聚合方式、排序规则、时间范围和分组维度。例如"上周华东区销售额"需要解析出时间范围、区域条件和指标口径。
-
**Schema Linking:**从大量表和字段中召回与当前问题相关的对象,并确定它们之间的关联路径。这是联表查询能否正确生成的关键。
-
**SQL 生成:**在限定 Schema 范围内生成符合目标数据库方言的 SQL,例如 MySQL、PostgreSQL、Oracle、ClickHouse 等。
-
**执行校验:**对生成的 SQL 做语法检查、字段存在性检查、权限检查和执行计划评估,避免笛卡尔积、慢查询或越权访问。
-
**自纠错:**如果执行失败,把数据库返回的错误信息回传给模型,让它根据错误修正 SQL。
3、联表查询如何实现
联表查询的难点在于:模型需要先知道"查哪些表",再知道"这些表怎么连"。
例如用户问:
查询每个部门的员工人数和平均工资。
系统会先召回 employees 和 departments 两张表,再根据外键或字段命名确定关联条件,例如:
SELECT
d.name AS department,
COUNT(e.id) AS employee_count,
AVG(e.salary) AS avg_salary
FROM departments d
LEFT JOIN employees e ON d.id = e.dept_id
GROUP BY d.name;
如果 Schema 中缺少外键信息,模型可能会根据字段名猜测关联关系,比如 employees.dept_id = departments.id。但这种猜测并不稳定,所以生产环境中最好显式维护外键关系或表关联元数据。
4、为什么不能直接把问题丢给模型
直接让大模型生成 SQL 有几个风险:
- 模型可能编造不存在的表或字段;
- 可能生成不符合数据库方言的语法;
- 可能产生笛卡尔积,导致查询极慢;
- 可能绕过权限限制,访问敏感数据;
- 业务口径不一致,例如"销售额"是否含税、是否扣除退款。
因此,Text2SQL 不能只靠模型本身,还需要 Schema 管理、检索、校验、执行控制和自纠错机制共同配合。
其中最关键的一步,就是 Schema Linking:它决定了模型到底能看到哪些表、哪些字段,以及这些表之间如何连接。如果这一步做不好,后面提示工程写得再好,模型也容易因为上下文噪声太多而生成错误 SQL。下一篇就专门拆解 Schema Linking 的主流技术路线。