一、项目简介

InnoAI SQL助手 是一套融合大模型与MySQL运维能力的智能工具。简单说就是:你用自然语言描述需求,它自动生成SQL、执行查询、还能给你做业务数据解读;你丢给它一条SQL,它自动跑EXPLAIN、分析性能瓶颈、输出索引优化和改写方案。

三大核心能力:

自然语言转SQL:说人话就能查数据,自动拦截增删改,只读安全

自动查询+AI解读:表格化输出结果,大模型秒变数据分析师

SQL性能调优:解析执行计划,直接给可执行的索引优化方案

技术栈: MySQL 8.0 + Python 3.11 + 腾讯云TokenHub(DeepSeek/Qwen大模型)+ Streamlit


二、整体架构

系统采用四层分层架构,每层职责清晰,方便维护和扩展:

层级核心文件职责
接入层终端 / Streamlit Web两种使用入口,适配不同场景
业务层main.py总调度,串联三大核心业务流程
能力层prompts.py / mysql_client.py提示词工程 + 数据库操作封装
基础设施层MySQL 8.0 / TokenHub大模型数据存储 + AI能力输出

5个核心文件分工:

  • main.py — 业务总调度 + 命令行交互入口

  • web_main.py — Streamlit Web可视化界面

  • prompts.py — 提示词统一管理 + SQL提取工具

  • mysql_client.py — MySQL连接/查询/执行计划封装 + 安全校验

  • .env — 数据库账号、API密钥等敏感配置(600权限加固)


三、核心功能实现

3.1 自然语言转SQL(NL2SQL)

处理流程:

自然语言输入 → 提示词模板 → 大模型生成SQL → 提取纯净SQL
     → 7层清洗标准化 → 安全校验 → 执行查询 → AI业务总结

提示词设计是关键,严格约束模型只输出SELECT、只用指定字段、用代码块包裹:

NL_TO_SQL_PROMPT = f"""
你是严谨的 MySQL 8.0 数据库开发工程师。
【表结构参考】
{TABLE_SCHEMA}
【强制输出规则】
1. 只能生成 SELECT 查询语句,禁止增删改
2. 只能使用列出的5个字段,禁止编造字段
3. SQL关键字统一大写,用中文别名
4. 最终SQL包裹在 ```sql ``` 代码块内
5. 只返回纯SQL,不输出任何解释文字
【用户需求】
{user_input}
"""

SQL清洗7层逻辑,解决各大模型输出格式不一致的问题:

  1. 特殊空格统一替换(全角/零宽/换行 → 普通空格)

  2. 不可见控制字符清除

  3. 中文标点批量转英文

  4. 多空格合并

  5. 别名内部空格精准清理

  6. 关键字粘连自动拆分补空格

  7. 关键字大写标准化

3.2 SQL性能调优分析

输入一条SELECT,系统自动跑EXPLAIN,然后大模型分析执行计划给出优化方案:

SQL_TUNE_PROMPT = f"""
你是资深 MySQL DBA 性能优化专家。
【待分析SQL】{sql_input}
【执行计划数据】{explain_data}
【输出要求】
1. 点明核心性能问题(全表扫描/无索引/文件排序等)
2. 给出可直接执行的建索引SQL
3. 提供SQL改写优化方案
4. 分点罗列,简洁明了
"""

能识别的典型问题:

  type=ALL 全表扫描

  key=NULL 无索引命中

  Using temporary 临时表开销 Using filesort 文件排序

  自动建议覆盖索引、联合索引

3.3 安全防护

双重安全机制:

  • 提示词层面:明确要求只生成SELECT语句

  • 代码层面:执行前正则匹配危险关键字(INSERT/UPDATE/DELETE/DROP/ALTER等),命中直接拦截

@staticmethod
def _check_sql_safety(sql: str) -> None:
    danger_keywords = ["INSERT", "UPDATE", "DELETE", "DROP", 
                      "ALTER", "CREATE", "TRUNCATE", "REPLACE"]
    for kw in danger_keywords:
        if re.search(r'\b' + re.escape(kw) + r'\b', sql_trim):
            raise Exception(f"安全拦截:禁止执行 {kw} 类型语句")

四、大模型接入方案

选用腾讯云TokenHub大模型聚合平台,兼容OpenAI接口标准,一套代码可切换多款模型。

优势:

一个密钥调用DeepSeek、Qwen等多款主流模型

兼容OpenAI SDK,开发成本几乎为零

统一计费、统一运维

腾讯云基础设施保障高可用

踩坑提醒:尽量选不带"思考链"的模型(如deepseek-v4-pro、qwen3.5-plus),否则思考内容会混入输出,导致SQL提取失败。

.env配置示例:

# MySQL配置
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=123456
MYSQL_DB=testdb
​
# 大模型配置
LLM_API_KEY=sk-你的密钥
LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1
LLM_MODEL_NAME=deepseek-v4-pro
LLM_TEMPERATURE=0

五、环境搭建速览

5.1 基础环境

# 系统初始化
sed -i '7s/enforcing/disabled/' /etc/selinux/config
systemctl disable --now firewalld
​
# 安装编译依赖
dnf install -y gcc gcc-c++ make cmake zlib-devel openssl-devel \
  ncurses-devel sqlite-devel readline-devel libffi-devel

5.2 Python 3.11 源码编译

tar -zxvf Python-3.11.9.tgz && cd Python-3.11.9
./configure --prefix=/usr/local/python3.11 --enable-shared
make -j$(nproc) && make install
​
# 配置动态链接库和软链接
echo "/usr/local/python3.11/lib" > /etc/ld.so.conf.d/python311.conf
ldconfig
ln -s /usr/local/python3.11/bin/python3.11 /usr/local/bin/python3
ln -s /usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3

5.3 MySQL 部署

# 初始化
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
​
# 启动并改密码
bin/mysqld_safe --user=mysql &
bin/mysql -u root -p
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
​
# 建测试表
create table order_info(
  id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
  user_id INT COMMENT '用户ID',
  order_name VARCHAR(200) COMMENT '商品名称',
  pay_amount DECIMAL(10,2) COMMENT '支付金额',
  create_time DATETIME COMMENT '下单时间'
) ENGINE=InnoDB;

5.4 安装Python依赖

pip3 install pymysql python-dotenv tabulate langchain langchain-openai streamlit

六、Web可视化界面

创建 systemd 后台常驻服务并且启动服务

Streamlit 把命令行工具一键变成Web面板,纯Python开发,不用写一行前端。左侧侧边栏切换功能,右侧展示结果,支持代码复制、表格渲染、AI解读卡片。

两大功能页面:

  • 🔍 数据查询与总结 — 输入自然语言 → 生成SQL → 表格展示 → AI解读

  • ⚙️ SQL性能调优 — 输入SQL → EXPLAIN分析 → 输出索引/改写方案


七、效果实测

测试1:自然语言查数据

输入1001、1002、1003每个用户的订单总消费金额与订单笔数,按总消费从高到低排序

生成SQL并且查询结果:

AI总结: 用户1002为核心高价值用户,客单价约为1003的3倍,建议VIP维系;3位用户订单笔数均为2单,复购节奏相似。

测试2:SQL性能调优

输入上面那条SQL,分析结果:

  • ❌ 全表扫描(type: ALL),user_id无索引

  • ❌ Using temporary + Using filesort,分组排序消耗额外资源

  • ✅ 建议建覆盖索引:ALTER TABLE order_info ADD INDEX idx_user_id_pay_amount (user_id, pay_amount);


八、总结与扩展

项目核心亮点:

  1. ✅ 四层分层架构,代码清晰易维护

  2. ✅ 双重安全防护(提示词约束 + 代码拦截)

  3. ✅ 兼容多款大模型,一套代码无缝切换

  4. ✅ 命令行 + Web双模式,开箱即用

可扩展方向:

        多表JOIN查询支持

        对话式多轮数据探索

        慢查询日志自动批量优化

        用户权限管理与数据隔离

更多推荐