3天从零搭建AI SQL智能助手:openEuler+MySQL8+TokenHub大模型,自然语言查订单+自动SQL调优
前言
做电商运维经常遇到两大痛点:
1. 业务运营、产品不懂 SQL,每次查订单报表都要排队找开发,沟通成本极高;
2. DBA 日常重复分析慢查询 EXPLAIN 执行计划,判断全表扫描、索引缺失、文件排序等瓶颈,机械工作占用大量精力。
为此我基于openEuler + MySQL 8.0.45 + 腾讯云 TokenHub 大模型聚合平台,单人 3 天完成一套「InnoAI SQL 助手」,实现自然语言一键生成只读 SQL、自动查询出报表、AI 解读业务数据、自动解析执行计划输出索引优化方案,同时提供命令行 + Web 可视化双入口,敏感配置隔离、SQL 危险操作拦截,兼顾易用性与数据安全。
本文完整分享架构设计、环境部署、分层代码实现、功能实测、线上后台部署与踩坑总结,全部代码可直接复用。
一、项目整体概述
1.1 核心能力
1. NL2SQL 自然语言查询
- 仅生成 SELECT 只读语句,拦截 INSERT / UPDATE / DELETE / ALTER 等所有危险操作;
- 自动执行 SQL,表格化展示结果,大模型输出通俗易懂的业务总结;
- 严格绑定订单表结构,杜绝模型编造字段产生幻觉。
2. SQL 智能性能调优
- 自动获取 SQL 的 EXPLAIN 执行计划,解析全表扫描、临时表、文件排序等性能缺陷;
- AI 输出可直接复制执行的联合 / 覆盖索引 SQL、优化后重写语句、分级性能问题说明。
3. 双端交互入口
- 命令行终端:openEuler 服务器直接运行脚本,适合运维批量调试;
- Streamlit Web 可视化面板:浏览器访问,零前端代码,提供输入校验、代码一键复制、数据表格渲染;
4. 安全管控机制
- 数据库账号、LLM 密钥存放独立 .env 文件,设置 600 文件权限,代码无硬编码;
- SQL 前置安全校验,关键词黑名单拦截篡改类语句;
- 程序不打印明文密钥、数据库账号,异常捕获不崩溃。
1.2 技术栈清单
| 分层 | 技术选型 | 作用 |
|---|---|---|
| 底层系统 | openEuler 2203 SP4 | 国产企业级服务器操作系统 |
| 数据库 | MySQL 8.0.45 InnoDB | 存储电商订单测试表 order_info |
| 开发语言 | Python 3.11.9(源码编译) | 项目主体开发 |
| 数据库驱动 | pymysql | MySQL 连接封装 |
| 大模型服务 | 腾讯云 TokenHub | 兼容 OpenAI 标准接口,支持 Qwen3.5-Plus、DeepSeek V4-Pro |
| LLM 调用 | langchain-openai | 标准化大模型请求封装 |
| Web 可视化 | Streamlit | 快速搭建交互网页,无需前端开发 |
| 配置管理 | python-dotenv | 读取 .env 环境变量,隔离敏感信息 |
| 表格美化 | tabulate | 终端格式化打印查询结果 |
1.3 四层整体架构
1. 接入交互层
- 终端 CLI:main.py 交互式菜单;
- Web 页面:web_main.py Streamlit 可视化界面;
2. Python 核心业务层(分层解耦)
- main.py:总调度,封装 NL2SQL、SQL 调优公共逻辑,CLI / Web 共用;
- mysql_client.py:数据库统一封装,连接、查询、EXPLAIN、SQL 安全校验;
- prompts.py:统一管理两套提示词,内置 SQL 提取清洗工具;
- .env:独立配置文件,存放数据库、大模型密钥;
3. 数据持久层
openEuler 虚拟机 MySQL 8.0,testdb 库 order_info 订单测试表;
4. AI 大模型服务层
腾讯云 TokenHub 聚合网关,一套代码无缝切换多款开源大模型,统一鉴权计费。
1.4 3 天开发周期规划
- Day1:openEuler 系统初始化、Python 源码编译、MySQL 8 部署建表、TokenHub API 申请、梳理运维知识点;
- Day2:四层脚本开发、数据库连接封装、NL2SQL 提示词、SQL 调优逻辑、Web 页面联调;
- Day3:多场景业务测试、提示词优化、权限安全加固、systemd 后台服务部署、全量验收。
二、环境完整部署实操(openEuler)
2.1 系统初始化优化
关闭防火墙、SELinux、配置时间同步、安装编译依赖
# 关闭 SELinux
sed -i '7s/enforcing/disabled/' /etc/selinux/config
关闭防火墙并开机禁用
systemctl disable --now firewalld
修改主机名
hostnamectl set-hostname server
bash
配置阿里云时间同步
vim /etc/chrony.conf
server ntp.aliyun.com iburst
systemctl restart chronyd
chronyc sources
安装编译全套依赖
dnf install -y gcc gcc-c++ make cmake zlib-devel openssl-devel ncurses-devel readline-devel wget vim net-tools
2.2 源码编译 Python 3.11.9
避免系统自带 Python 版本过低,源码编译独立环境
cd /usr/local/src
上传 Python-3.11.9 源码包
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
验证
python3 -V
pip3 -V
配置阿里 pip 源
mkdir ~/.pip
vim ~/.pip/pip.conf
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
安装项目依赖
pip3 install pymysql python-dotenv tabulate langchain langchain-openai streamlit
2.3 MySQL 8.0.45 部署初始化
1. 解压安装、创建 mysql 用户、初始化数据库;
2. 修改 root 密码、新建 my.cnf 配置、配置 systemd 自启;
3. 创建 testdb 库、order_info 订单业务表,导入 20 条测试数据。
核心建表语句:
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 COMMENT='电商订单业务表';
插入 20 条电商订单测试数据,覆盖用户、金额、时间、商品品类多维度查询场景。
2.4 腾讯云 TokenHub 大模型配置
1. 腾讯云实名认证,进入 TokenHub 平台创建 API Key;
2. 推荐模型:Qwen3.5-Plus、DeepSeek-V4-Pro(无多余思考链,减少 SQL 解析报错);
3. 记录 API Key、统一 BaseURL 填入 .env 配置文件。
三、项目分层代码设计(核心模块讲解)
项目目录结构
/opt/mysql_ai_tools
├── .env # 敏感配置(权限600)
├── main.py # 核心业务调度+CLI终端入口
├── mysql_client.py # MySQL数据库封装层
├── prompts.py # 提示词管理+SQL提取工具
├── web_main.py # Streamlit Web可视化页面
└── __pycache__
3.1 .env 配置文件(安全加固)
# MySQL 配置
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=123456
MYSQL_DB=testdb
TokenHub 大模型配置
LLM_API_KEY=sk-xxxx
LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1
LLM_MODEL_NAME=qwen3.5-plus
LLM_TEMPERATURE=0
加固权限,防止其他用户读取密钥:
chmod 600 /opt/mysql_ai_tools/.env
3.2 mysql_client.py 数据库安全封装
核心亮点:
1. 静态 SQL 安全校验,黑名单拦截增删改、DDL 语句;
2. 封装 execute_query 执行只读查询、get_explain_plan 获取执行计划;
3. 统一异常捕获,自动释放数据库连接,避免连接泄露。
关键安全校验代码片段:
@staticmethod
def _check_sql_safety(sql: str) -> None:
sql_trim = sql.strip().upper()
danger_keywords = ["INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "TRUNCATE"]
for kw in danger_keywords:
if re.search(r'\b' + re.escape(kw) + r'\b', sql_trim):
raise Exception(f"安全拦截:禁止执行{kw},仅支持SELECT查询")
3.3 prompts.py 提示词工程层
两套标准化 Prompt 模板:
1. NL_TO_SQL_PROMPT:约束模型仅生成 SELECT、使用给定表字段、SQL 包裹在 ```sql ``` 代码块;
2. SQL_TUNE_PROMPT:传入表结构 + 原始 SQL + EXPLAIN 数据,输出性能问题、建索引语句、优化 SQL;
内置 extract_sql 工具函数,三层正则匹配提取纯净 SQL,兼容各类模型输出格式,解决模型多余文字干扰执行。
3.4 main.py 核心业务调度
两大核心对外函数(CLI / Web 共用无重复代码):
1. nl2sql_query(user_input)
- 流程:自然语言传入 LLM → 提取清洗 SQL → 数据库执行查询 → 调用大模型生成业务总结;
- 返回标准化字典:生成 SQL、查询表头、数据列表、业务解读、错误信息;
2. sql_tune_analyze(raw_sql)
- 流程:清洗 SQL → 获取 EXPLAIN 执行计划 → 传入大模型分析性能瓶颈;
- 返回执行计划明细、完整调优建议、可直接执行索引语句;
内置 clean_sql_spacing 工具,修复中文空格、全角标点、关键字粘连等模型输出语法 bug。
3.5 web_main.py Streamlit 可视化页面
无需前端开发,纯 Python 实现双功能面板:
1. 侧边栏展示项目名称、当前模型、功能切换导航;
2. 面板 1:自然语言转 SQL 查询,输入校验、生成 SQL 代码块、表格展示数据、业务解读;
3. 面板 2:SQL 性能调优,输入 SELECT 语句,展示完整 EXPLAIN 表格、AI 优化方案;
4. 自定义全局 CSS:优化代码复制按钮、表格排版、页面宽度,解决 Streamlit 原生 UI 简陋问题。
四、功能实测演示
4.1 场景 1:自然语言统计用户订单消费
输入需求:1001、1002、1003 每个用户的订单总消费金额与订单笔数,按总消费从高到低排序
AI 自动生成合规 SQL:
SELECT
user_id AS 用户ID,
SUM(pay_amount) AS 总消费金额,
COUNT(id) AS 订单笔数
FROM order_info
WHERE user_id IN (1001, 1002, 1003)
GROUP BY user_id
ORDER BY 总消费金额 DESC
查询结果表格展示,AI 自动输出业务总结:区分高价值用户、分析复购行为、提示样本数据特征。
4.2 场景 2:SQL 性能自动调优
输入上述统计 SQL,工具自动执行 EXPLAIN,识别三大性能问题:
1. type=ALL 全表扫描(user_id 无索引);
2. Extra 存在 Using temporary、Using filesort(分组排序消耗 CPU);
3. 无覆盖索引,查询需回表读取 pay_amount;
AI 直接输出可落地优化方案:
ALTER TABLE order_info ADD INDEX idx_user_id_pay_amount (user_id, pay_amount);
同时给出优化改写 SQL,遵循 COUNT(*) 索引最优实践。
4.3 Web 页面访问效果
服务器 IP:8501 浏览器直接打开,侧边栏切换功能,输入框提交后自动渲染表格、代码块,支持一键复制 SQL 语句。
五、后台常驻部署(systemd 服务)
将 Streamlit 网页配置开机自启,后台持续运行
vim /etc/systemd/system/mysql-ai-web.service
[Unit]
Description=InnoAI SQL Streamlit Web 助手
After=network.target mysqld.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/mysql_ai_tools
ExecStart=/usr/local/python3.11/bin/python3 -m streamlit run web_main.py --server.address 0.0.0.0 --server.port 8501 --server.headless true
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
启动并设置开机自启
systemctl daemon-reload
systemctl enable --now mysql-ai-web
查看运行状态
systemctl status mysql-ai-web
六、开发踩坑与解决方案
1. 模型输出带思考链,SQL 提取失败
解决:选择无思考链模型(Qwen3.5-Plus),Prompt 强制仅输出 SQL 代码块,多层正则清洗过滤多余文字;
2. 模型生成中文全角逗号、空格导致 MySQL 语法报错
解决:编写 clean_sql_spacing 统一替换全角符号、合并多余空白,标准化关键字格式;
3. .env 密钥明文泄露风险
解决:文件权限设 600,代码全程不打印配置明文,仅内存读取;
4. 数据库连接频繁泄露
解决:封装 close() 方法,所有业务逻辑放在 finally 块强制关闭连接;
5. Streamlit 代码复制按钮失效
解决:自定义 CSS 提升复制按钮层级,修复遮挡问题;
6. MySQL 8 编译 Python 缺失 ssl 模块,大模型 API 调用失败
解决:编译 Python 时安装 openssl-devel 依赖,编译后校验 ssl 模块可用性。
七、项目拓展优化方向
1. 增加 RAG 知识库,注入企业业务口径、表注释,降低模型幻觉;
2. 增加用户登录权限,区分只读 / 管理员账号;
3. 慢查询日志自动采集,批量分析多条慢 SQL;
4. 支持多表关联查询,扩展订单详情、商品表关联场景;
5. 增加 SQL 执行结果缓存,高频查询减少大模型与数据库请求;
6. 支持私有化本地大模型部署,不依赖第三方 API。
八、总结
本项目打通「国产 openEuler 系统 + MySQL 运维 + LLM 大模型 + Web 可视化」完整链路,用极低开发成本解决企业数据库两大高频痛点:业务人员自助查数、DBA 自动化 SQL 性能诊断。
整套工具轻量化、3 天即可落地,安全机制完善,同时提供命令行与网页双交互模式,适合中小企业运维、数据团队直接复用二次开发,是大模型落地数据库运维场景的典型实战案例。
#NL2SQL #MySQL性能优化 #openEuler #Streamlit #大模型实战 #数据库运维 #AI SQL助手 #Python实战
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)