Skip to content

Repository files navigation

NL2SQL Analyst

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 只读元数据读取工具

快速开始

场景 1:接入新数据库

用户:帮我连这个库问数,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. 进入稳定问数

场景 2:日常问数

用户:昨天日报提交情况怎么样?
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 级 -> 无债务写入

场景 3:低置信度触发通知

用户:库存周转率是多少?
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

场景 4:维护人员修复后自动验证

维护人员执行 ALTER TABLE fin_invoice MODIFY invoice_type INT COMMENT '发票类型:1=增值税专票,2=普通发票';
  ↓
用户下次查询涉及 fin_invoice 时
  ↓
AI 指纹校验 -> 结构指纹变了 -> 读取最新元数据 -> 发现注释变好了
  ↓
自动更新字典 -> 债务状态变 resolved
  ↓
计算置信度 -> 🟡 82/100(A 级,回升)
  ↓
债务状态变 verified ✅ 闭环完成

场景 5:未配置通知渠道

用户:帮我连这个库问数...(未提供通知渠道配置)
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 条历史未通知债务"

6 阶段状态机

阶段 0    识别数据源 + 元数据后端 + [可选]通知渠道配置
  ↓
阶段 0.5  语义就绪度评估(6 维度评分 -> S/A/B/C/D 级)
  ↓
阶段 1    建立实时结构证据层(大库走三层架构)
  ↓
阶段 2    STOP-1 确认口径(双路径:A 本地建字典 / B 输出待补充清单)
  ↓
阶段 3    写入确认口径 + 绑定三层指纹
  ↓
阶段 4    问数前分层指纹校验(只校验涉及表)+ 槽位补全
  ↓
阶段 5    候选值发现 -> SQL 安全检查 -> 语义审查 -> 只读查询
           -> 置信度评级 -> 答案+溯源 -> 债务后处理 -> 输出结果

阶段 5 内部流程(12 步)

 1. 读取确认口径
 2. 按需读取结构证据
 3. 候选值发现与锁定
 4. SQL 证据闭环
 5. SQL 确定性安全检查(约 25 条机械规则)
 6. SQL 语义二次审查(6 维度独立审查)
 7. 只读执行
 8. Sanity check
 9. 计算置信度(5 维度)
10. 生成答案 + 溯源记录写入文件
11. 输出结果 + 置信度 + 查询逻辑说明
12. 置信度后处理(债务写入/通知/闭环验证)

三道 STOP 门

STOP 门 位置 作用
STOP-0.5 评估后 就绪度不达标(B/C/D 级)不进入建字典,先补备注
STOP-1 建字典后 口径未确认不进入问数,必须用户确认
STOP-2 问数前 槽位不完整必须追问,不猜着查

三层指纹

指纹层 检测什么 校验方式
结构指纹 字段增删改、类型变更、注释变更 一条 information_schema 查询 + 本地算 hash
枚举指纹 状态/类型字段取值集合变化 SELECT DISTINCT(大表采样)+ 算 hash
行数估计 数据量异常变化 information_schema.tables.table_rows

置信度 5 维度

维度 满分 评什么
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/),不直接展示给用户
  • 给用户看的是查询逻辑说明(用业务语言,不用技术术语)
  • 用户看不懂的技术细节留存在溯源文件中

大库(1000+ 表)策略

  • 不全库建字典:按模块按需建,用到才建
  • 不全库校验指纹:只校验当前查询涉及的 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 建字典工具

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages