API-first 多方言安全问数 Skill:语义就绪度评估 -> 分层指纹同步 -> 按需建字典 -> 确认口径 -> 候选值发现 -> SQL 安全检查 + 语义审查 -> 置信度评级 -> 答案溯源 -> 债务闭环持续优化。
nl2sql-analyst 不是"用户一问就直接写 SQL",而是:
先评估数据库元数据质量 -> 建立语义字典 -> 让用户确认业务口径 -> 问数前校验指纹和补全槽位 -> 候选值发现锁定实际值 -> SQL 安全检查 + 语义二次审查 -> 只读查询 -> 输出结果 + 置信度 + 溯源记录 -> 低置信度自动通知维护人员补备注 -> 修复后验证闭环。
| 能力 |
说明 |
| 语义就绪度评估 |
接入新库时自动评估元数据质量(6 维度评分),判断能否支撑 AI 问数 |
| 双路径建字典 |
注释好的库 AI 自动建字典;注释差的库输出待补充清单让维护人员改库 |
| 分层指纹同步 |
三层指纹(结构/枚举/行数)自动检测库表变更,不同变更走不同处理流程 |
| 候选值发现 |
用户提到的名称/简称先查实际值再锁定,杜绝 AI 猜值 |
| SQL 确定性安全检查 |
11 节约 25 条机械检查规则,不通过不执行 |
| SQL 语义二次审查 |
独立审查者视角检查 SQL 是否忠实于用户问题和已确认口径 |
| 置信度评级 |
每次查询结果附带 5 维度置信度评分,让用户知道结果有多可信 |
| 答案结果溯源 |
每个数字可追溯到具体 SQL 和执行结果行,溯源存文件,用户看查询逻辑说明 |
| 债务闭环 |
低置信度问题自动聚合、通知维护人员、修复后验证回升,持续优化准确率 |
| 多数据库方言 |
支持 MySQL、ClickHouse、Doris、Hive、PostgreSQL |
| 大库支持 |
1000+ 表按模块按需建字典,不全库加载 |
| 安全只读 |
只执行 SELECT,默认脱敏,不保存敏感凭据 |
nl2sql-analyst/
├── SKILL.md # 主规则文件(20 条硬规则 + 6 阶段状态机)
├── README.md # 本文件
├── TECH_ARCHITECTURE.html # 技术架构文档(HTML)
├── references/
│ ├── semantic_readiness_assessment.md # 语义就绪度评估标准(6 维度评分体系)
│ ├── fingerprint_sync.md # 分层指纹计算与变更同步机制
│ ├── candidate_value_discovery.md # 候选值发现与绑定锁定
│ ├── sql_safety_checklist.md # SQL 确定性安全检查清单
│ ├── sql_semantic_review.md # SQL 语义二次审查
│ ├── answer_traceability.md # 答案结果溯源
│ ├── confidence_scoring.md # 置信度评分标准(5 维度评分)
│ ├── confidence_debt_registry.md # 置信度债务管理与闭环验证
│ ├── confirmation_playbook.md # 确认流程(双路径机制)
│ ├── query_clarification.md # 追问补槽流程
│ ├── large_schema_memory.md # 大库三层架构(1000+ 表)
│ ├── metadata_api_backend.md # API 后端规范
│ ├── database_dialects.md # 多数据库方言识别
│ ├── dialect_query_guide.md # SQL 方言适配指南(含 ClickHouse 安全规则)
│ └── jdbc_dictionary_builder.md # JDBC 建字典工具(可选)
└── scripts/
└── jdbc_dictionary_builder/
└── JdbcDictionaryBuilder.java # Java 只读元数据读取工具
用户:帮我连这个库问数,JDBC 是 jdbc:mysql://host:3306/mydb,用户名 readonly
AI:
1. 识别数据源类型和方言(MySQL)
2. [可选] 询问是否配置通知渠道(飞书webhook/企微机器人)
3. 读取 information_schema,全库画像
4. 执行语义就绪度评估(6 维度评分)
5. 输出评估报告 + 等级(S/A/B/C/D)
6. 根据等级走双路径:
- S/A 级:AI 本地建字典草稿 -> 输出确认问题 -> 用户确认
- B/C/D 级:输出待补充备注清单 -> 维护人员改库 -> 重新评估
7. 确认完成后写入 confirmed_semantics + 绑定指纹
8. 进入稳定问数
用户:昨天日报提交情况怎么样?
AI:
1. 定位涉及的表(rep_daily_reports)
2. 校验三层指纹(结构/枚举/行数)-> 全部一致
3. 检查槽位 -> 完整
4. [候选值发现] "昨天"= 2026-07-26 -> 锁定为 report_date 原值
5. 生成 SQL -> SQL 安全检查 -> 语义二次审查 -> 只读执行
6. Sanity check
7. 计算置信度(5 维度)-> 🟢 92/100(S 级)
8. 生成答案 + 溯源记录写入文件
9. 输出结果 + 置信度评估 + 查询逻辑说明
10. [后处理] 置信度 >= B 级 -> 无债务写入
用户:库存周转率是多少?
AI:
1. 定位表(fin_inventory)-> 校验指纹 -> 查询
2. 计算置信度 -> 🟠 58/100(C 级)
3. 扣分原因:fin_invoice.invoice_type 枚举值未确认(C1 -18)
4. 输出结果 + 置信度评估(标注低可信)
5. [后处理] 写入置信度债务表
6. 影响次数 >= 2 -> 触发通知
7. 已配置飞书 webhook -> 推送通知:
"表 fin_invoice 的字段 invoice_type 枚举值未确认,
建议执行 ALTER TABLE ... COMMENT '发票类型:1=增值税,2=普通...'"
8. 状态变 notified
维护人员执行 ALTER TABLE fin_invoice MODIFY invoice_type INT COMMENT '发票类型:1=增值税专票,2=普通发票';
↓
用户下次查询涉及 fin_invoice 时
↓
AI 指纹校验 -> 结构指纹变了 -> 读取最新元数据 -> 发现注释变好了
↓
自动更新字典 -> 债务状态变 resolved
↓
计算置信度 -> 🟡 82/100(A 级,回升)
↓
债务状态变 verified ✅ 闭环完成
用户:帮我连这个库问数...(未提供通知渠道配置)
AI:
1. 正常完成初始化和建字典
2. 低置信度债务写入 confidence_debt.md,状态 pending_unnotified
3. 在问数结果中提示:
"字段 sys_users.enable 已第 3 次导致低置信度。
当前未配置通知渠道。可手动查看 confidence_debt.md,
或配置飞书webhook后由 AI 自动推送。"
用户(后期):配置飞书通知,webhook 地址是 https://xxx
AI:
1. 更新 notification_config.md
2. 扫描 pending_unnotified 债务
3. 达到阈值的批量推送
4. 回复:"已配置飞书通知,已推送 3 条历史未通知债务"
阶段 0 识别数据源 + 元数据后端 + [可选]通知渠道配置
↓
阶段 0.5 语义就绪度评估(6 维度评分 -> S/A/B/C/D 级)
↓
阶段 1 建立实时结构证据层(大库走三层架构)
↓
阶段 2 STOP-1 确认口径(双路径:A 本地建字典 / B 输出待补充清单)
↓
阶段 3 写入确认口径 + 绑定三层指纹
↓
阶段 4 问数前分层指纹校验(只校验涉及表)+ 槽位补全
↓
阶段 5 候选值发现 -> SQL 安全检查 -> 语义审查 -> 只读查询
-> 置信度评级 -> 答案+溯源 -> 债务后处理 -> 输出结果
1. 读取确认口径
2. 按需读取结构证据
3. 候选值发现与锁定
4. SQL 证据闭环
5. SQL 确定性安全检查(约 25 条机械规则)
6. SQL 语义二次审查(6 维度独立审查)
7. 只读执行
8. Sanity check
9. 计算置信度(5 维度)
10. 生成答案 + 溯源记录写入文件
11. 输出结果 + 置信度 + 查询逻辑说明
12. 置信度后处理(债务写入/通知/闭环验证)
| STOP 门 |
位置 |
作用 |
| STOP-0.5 |
评估后 |
就绪度不达标(B/C/D 级)不进入建字典,先补备注 |
| STOP-1 |
建字典后 |
口径未确认不进入问数,必须用户确认 |
| STOP-2 |
问数前 |
槽位不完整必须追问,不猜着查 |
| 指纹层 |
检测什么 |
校验方式 |
| 结构指纹 |
字段增删改、类型变更、注释变更 |
一条 information_schema 查询 + 本地算 hash |
| 枚举指纹 |
状态/类型字段取值集合变化 |
SELECT DISTINCT(大表采样)+ 算 hash |
| 行数估计 |
数据量异常变化 |
information_schema.tables.table_rows |
| 维度 |
满分 |
评什么 |
| C1 口径确认度 |
30 |
用的业务口径是否全部已确认 |
| C2 结构证据度 |
20 |
SQL 中表/字段是否有实时元数据证明 |
| C3 指纹一致性 |
20 |
涉及表是否通过三层指纹校验 |
| C4 数据完整性 |
15 |
是否受 LIMIT 截断、数据延迟、空值影响 |
| C5 口径纯净度 |
15 |
是否存在未确认的假设 |
| 等级 |
分数 |
含义 |
| 🟢 S |
90-100 |
高可信,可直接用于决策 |
| 🟡 A |
75-89 |
较可信,注意查看假设 |
| 🟠 B |
60-74 |
一般可信,建议确认假设后使用 |
| 🔴 C |
40-59 |
低可信,不要直接用于决策 |
| ⛔ D |
0-39 |
不可信,必须确认口径后重查 |
pending_unnotified -> pending -> notified -> fixing -> resolved -> verified ✅
(未配置渠道) (达到阈值) (已通知) (修复中)(已修复)(置信度回升)
↓
(置信度未回升)
↓
重新 pending
| 数据库 |
元数据策略 |
备注 |
| MySQL |
information_schema + SHOW |
默认方言 |
| ClickHouse |
system.* 表 |
列式分析库,有专项安全规则 |
| Doris |
MySQL 协议 + Doris 特性 |
兼容 MySQL 但不是纯 MySQL |
| PostgreSQL |
information_schema + pg_catalog |
标识符大小写敏感 |
| Hive |
Metastore / DESCRIBE |
离线数仓,分区裁剪关键 |
- 只执行 SELECT,禁止任何写操作
- 默认脱敏:手机号、邮箱、密码、Token 不明文输出
- 凭据保护:密码/Token/webhook URL 不写入字典、脚本、长期记忆
- 本地 md 只是快照,不是事实源
- 枚举值变更必须人工确认,AI 不猜
- SQL 执行前必须通过 25 条确定性安全检查
- SQL 执行前必须通过语义二次审查
- ClickHouse 别名遮蔽检测(
sum(x) AS x 违规)
- 空集不用 coalesce 改写为 0,用 HAVING count() > 0 保持零行
- 答案中每个数字必须可追溯到具体 SQL 和执行结果行
用户提到的名称/简称/分类值,如果不是完整数据库原值,必须先用 SELECT DISTINCT 查实际值并锁定后再写正式 SQL。
用户说"张三的日报"
↓
SELECT DISTINCT staff_id, name FROM sys_users WHERE name LIKE '%张三%' LIMIT 50
↓
返回:[('ZS001','张三'), ('ZS002','张三丰')]
↓
追问用户选择 -> 锁定 staff_id='ZS001'
↓
正式 SQL 只能用 staff_id='ZS001',禁止猜值
- 答案中每个数字可追溯到具体 SQL 和执行结果行
- 溯源信息存文件(
semantic_memory/query_traceability/),不直接展示给用户
- 给用户看的是查询逻辑说明(用业务语言,不用技术术语)
- 用户看不懂的技术细节留存在溯源文件中
- 不全库建字典:按模块按需建,用到才建
- 不全库校验指纹:只校验当前查询涉及的 3-5 张表
- 三层架构:表注册表(全库轻量索引)-> 模块语义包(按需建字典)-> 表级指纹(只查涉及表)
- 大表枚举采样:
SELECT DISTINCT ... WHERE id > MAX(id) - 10000 LIMIT 50
| 依赖 |
何时需要 |
说明 |
| Java + JDBC Driver |
仅选择 direct_jdbc 建字典时 |
API-first 模式不需要 |
| Metadata API / Catalog API |
推荐默认 |
无本地依赖 |
| Python connector |
可选 fallback |
无 API 且不走 JDBC 时 |
| 飞书 webhook / 企微机器人 |
可选,用于通知 |
随时可配置 |
# 通过 SkillHub 安装
skillhub install nl2sql-analyst
# 或从 Git 仓库安装
git clone https://git-aimodel.gyyx.cn/gy-skills/skill-list.git
cd skill-list/nl2sql-analyst
在初始化时或日常使用中随时配置:
用户:配置飞书通知,webhook 地址是 https://open.feishu.cn/open-apis/bot/v2/hook/xxx
通知渠道配置存储在 semantic_memory/notification_config.md,不写入 SKILL.md 或长期记忆。
未配置时,低置信度债务存储在本地 semantic_memory/confidence_debt.md,可手动查看。配置后 AI 自动补推送历史未通知债务。
| 版本 |
日期 |
主要变更 |
| v2.1 |
2026-07-27 |
新增候选值发现、SQL 确定性安全检查、SQL 语义二次审查、答案结果溯源、ClickHouse 安全规则;硬规则从 16 条增至 20 条,阶段 5 从 8 步扩展到 12 步 |
| v2.0 |
2026-07-27 |
新增语义就绪度评估、分层指纹同步、置信度评级、债务闭环、双路径建字典、大库三层架构 |
| v1.0 |
2026-07-02 |
初始版本:API-first 架构、多方言支持、JDBC 建字典工具 |