Text2SQL 第一周复盘:Schema 召回、行话对齐与安全沙箱的三道防线

在 9 月第一周的 Text2SQL 实录(A4)专栏中,我们将自然语言转 SQL 取数助手从一个简单的 Demo,一步步推向面对数千张表、几十万字段的复杂企业级数仓真实工况。
在过去六天里,我们先后攻克了数仓巨量元数据下的 Schema 召回(Schema Linking)、业务“行话”同义词语义对齐与指标映射、4000 Token 预算内的紧凑 Prompt 序列化、5 表以上复杂关联翻车归因,以及物理只读与 AST 语法树拦截的安全沙箱体系。
这一系列深水区攻坚,帮我们彻底理清了 Text2SQL 在大厂工业级落地的三道核心生死防线。
[Text2SQL 工业级落地的三道核心生死防线]
[用户自然语言提问]
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 第一道防线:输入理解与资产召回 (Schema & Glossary) │
│ - 混合检索 (Dense Embedding + BM25) │
│ - 指标资产中心行话对齐 (业务行话 -> 物理计算口径) │
│ - 剪除系统无用字段,保留主外键拓扑与典型枚举样例 │
└────────────────────────┬────────────────────────────────────┘
│ 构造小于 2000 Token 紧凑上下文
▼
┌─────────────────────────────────────────────────────────────┐
│ 第二道防线:生成质量与模式纠偏 (CTE & AST Guardrail) │
│ - 模块化 CTE 结构约束 (强制预聚合,消除多对多扇出膨胀) │
│ - 本地 AST 校验: 修复 LEFT JOIN WHERE 穿透退化 │
│ - ONLY_FULL_GROUP_BY 语法完整性静态审计 │
└────────────────────────┬────────────────────────────────────┘
│ 生成标准化只读 SQL
▼
┌─────────────────────────────────────────────────────────────┐
│ 第三道防线:安全隔离与执行沙箱 (Security Sandbox) │
│ - 编译器级拦截一切 DDL/DML 与多语句堆叠注入 │
│ - 强制行级租户隔离 (RLS) 与 LIMIT 1000 安全截断 │
│ - 数据库连接账号仅授予只读视图权限,配置 3s 执行超时 │
└────────────────────────┬────────────────────────────────────┘
│
▼
[安全执行并返回精准数据]
第一道防线:输入理解与精准资产召回
大模型本身不是数仓字典。面对企业内部五花八门的业务缩写与历史命名,直接丢 DDL 只会引发灾难性的注意力稀释。
- Schema 召回率决定了生成的上限:通过“向量检索 + 表共现图谱”精准召回 4~6 张强相关表;
- 样例数据(Value Examples)消除了取值幻觉:为枚举列提供真实样例(如
eg: [0, 2]),让模型在零微调下精准写出状态过滤。
第二道防线:模块化生成与 AST 闭环纠偏
面对 5 表以上的复杂跨域关联,单次直接生成长 SQL 的翻车率高达 68%。
- 强制 CTE 拆解:让模型先对多对多关联的子表进行预聚合,彻底消除扇出导致的“假成交额”翻倍;
- 本地编译期规则兜底:利用 AST 静态检查器,自动拦截
LEFT JOIN条件写在WHERE导致的隐式退化,并在本地毫秒级重写修复。
第三道防线:物理与逻辑双重安全沙箱
安全是智能工具在企业内部生存的底线。
- 逻辑层:AST 解析器强制注入
tenant_id过滤与LIMIT 1000截断,阻断任何破坏性 DML; - 物理层:底座连接账号强制仅授予脱敏只读视图权限,并配置会话级硬超时,从底层杜绝内存打满与数据越权。
class Text2SQLEngineWorkflow:
"""第一周沉淀的标准 Text2SQL 执行流水线"""
def __init__(self, schema_retriever, aligner, llm, ast_guard, db_proxy):
self.retriever = schema_retriever
self.aligner = aligner
self.llm = llm
self.guard = ast_guard
self.db = db_proxy
def execute_user_query(self, user_text: str, user_context: dict) -> dict:
# 1. 第一道防线:词典对齐与精简 Schema 召回
aligned_terms = self.aligner.align(user_text)
compact_schema = self.retriever.retrieve(user_text, aligned_terms)
# 2. 第二道防线:LLM 生成与 AST 静态校验重写
raw_sql = self.llm.generate_sql(user_text, compact_schema)
safe_sql = self.guard.validate_and_repair(raw_sql, user_context['tenant_id'])
# 3. 第三道防线:受限只读代理安全执行
return self.db.execute_safe_query(safe_sql)
下周演进:生成评测基准与复杂 SQL 评测
三道防线筑牢后,下周(W2)我们将进入复杂 SQL 的系统化评测与回归测试——搭建包含 500 组生产真实高难度业务题目的自动化评测流水线,量化评估不同模型在窗口函数、多层嵌套子查询和复杂指标计算上的准确率与执行效率。
把工程做深,把安全筑牢,Text2SQL 才能真正成为一线业务人员离不开的生产力倍增器。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/guoyizhongxing/article/details/164426283




