logo
0
0
WeChat Login
Forkfromjaguarliu.cool/course/rookie-nl2sql, aheadmain20 commits

🗣️ NL2SQL - 自然语言转 SQL 智能查询系统

将自然语言问题自动转换为 SQL 查询,并生成友好的自然语言答案

Python 3.10+ LangGraph License: MIT

功能特性快速开始使用指南API 文档部署


📋 目录


✨ 功能特性

🎯 核心能力

功能描述
🤖 自然语言转 SQL使用 LLM 将中文问题自动转换为 SQL 查询
📊 Schema 感知动态加载数据库结构,避免幻觉字段
🔒 安全执行6 层沙箱防护,只允许 SELECT 查询
🔄 自动修复SQL 错误自动检测与 LLM 智能修复
📖 RAG 增强行业术语理解,黑话翻译
💬 多轮对话模糊问题智能澄清
🔗 多表联结自动生成最优 JOIN 路径
📝 自然语言答案查询结果转友好文本

📈 模块进度

M0 ████████████ 100% 基础框架 M1 ████████████ 100% SQL 生成 M2 ████████████ 100% 数据库执行 M3 ████████████ 100% Schema 感知 M4 ████████████ 100% SQL 校验与修复 M5 ████████████ 100% 安全沙箱 M6 ████████████ 100% RAG 增强 M7 ████████████ 100% 多轮对话 M8 ████████████ 100% 多表联结 M9 ████████████ 100% 答案生成 M10 ████████████ 100% 评测框架 M11 ████████████ 100% 可观测性 M12 ████████████ 100% Web API & 前端 M13 ████████████ 100% Docker 部署

🏗️ 系统架构

处理流程

用户问题 │ ▼ ┌─────────────────┐ │ 意图解析 │ 解析问题类型和关键信息 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ Schema 加载 │ 动态加载数据库结构 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 模糊检测 │ 判断是否需要澄清 └────────┬────────┘ │ ┌────┴────┐ │ 需要澄清? │ └────┬────┘ │ 是 ▼ ┌─────────────────┐ │ 生成澄清问题 │ 向用户询问更多信息 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ RAG 检索 │ 检索行业术语和 SQL 模板 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ SQL 生成 │ LLM 生成 SQL └────────┬────────┘ │ ▼ ┌─────────────────┐ │ SQL 校验 │ 语法/Schema/安全检查 └────────┬────────┘ │ ┌────┴────┐ │ 校验通过? │ └────┬────┘ │ 否 ▼ ┌─────────────────┐ │ LLM 自动修复 │ 智能修复错误 SQL └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 沙箱执行 │ 安全执行 SQL └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 答案生成 │ 转换为自然语言 └────────┬────────┘ │ ▼ 返回结果

项目结构

rookie-nl2sql/ ├── 📁 graphs/ # 核心图结构 │ ├── state.py # 状态定义 │ ├── base_graph.py # 主图实现 │ └── nodes/ # 各功能节点 ├── 📁 tools/ # 工具函数 │ ├── db.py # 数据库操作 │ ├── sandbox.py # 安全沙箱 │ └── rag_retriever.py # RAG 检索 ├── 📁 prompts/ # 提示词模板 ├── 📁 api/ # FastAPI 后端 ├── 📁 frontend/ # Streamlit 前端 ├── 📁 configs/ # 配置文件 ├── 📁 data/ # 数据库和向量存储 ├── 📁 eval/ # 评测框架 ├── 📁 docker/ # Docker 配置 └── 📁 deploy/ # 部署脚本

🚀 快速开始

1️⃣ 环境准备

# 克隆项目 git clone https://github.com/your-repo/rookie-nl2sql.git cd rookie-nl2sql # 创建虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt

2️⃣ 配置 API Key

# 复制配置模板 cp .env.example .env # 编辑 .env 文件

支持的 LLM 提供商:

提供商推荐度获取 API Key
🟢 Qwen (通义千问)⭐⭐⭐ 推荐阿里云 DashScope
🟡 DeepSeek⭐⭐⭐ 推荐DeepSeek 平台
🔵 OpenAI⭐⭐ 需科学上网OpenAI

配置示例:

# .env 文件 LLM_PROVIDER=qwen QWEN_API_KEY=sk-xxxxxxxxxxxxxxxx QWEN_MODEL=qwen-plus

3️⃣ 初始化数据

# 初始化数据库 python scripts/init_db.py # 初始化 RAG 向量存储 python tools/init_vector_store.py

4️⃣ 启动服务

方式一:Web 界面(推荐)

# 启动 API 服务 python -m uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload # 新终端启动前端 python -m streamlit run frontend/app.py --server.port 8501

访问地址:

方式二:命令行交互

python graphs/base_graph.py

📖 使用指南

Web API 调用

基本查询

curl -X POST http://localhost:8000/api/v1/query \ -H "Content-Type: application/json" \ -d '{"question": "查询所有客户的信息"}'

Python 客户端

import requests response = requests.post( "http://localhost:8000/api/v1/query", json={"question": "查询消费金额最高的客户"} ) result = response.json() print(f"SQL: {result['sql']}") print(f"答案: {result['answer']['conclusion']}") print(f"执行时间: {result['execution_time_ms']:.0f}ms")

多轮对话

# 第一次请求 response = requests.post( "http://localhost:8000/api/v1/query", json={"question": "查询最近的订单"} ) result = response.json() if result.get("needs_clarification"): print(f"需要澄清: {result['clarification_question']}") # 用户提供澄清 response = requests.post( "http://localhost:8000/api/v1/query", json={ "question": "查询最近的订单", "session_id": result["session_id"], "clarification_response": "最近7天的" } ) result = response.json() print(f"答案: {result['answer']['conclusion']}")

程序化调用

from graphs.base_graph import run_query # 执行查询 result = run_query("查询销售额最高的前5个产品") # 获取结果 print(f"SQL: {result['candidate_sql']}") print(f"数据: {result['execution']['rows']}") print(f"答案: {result['answer']['conclusion']}") print(f"评分: {result['evaluation']['overall_score']:.0%}")

📡 API 文档

端点列表

端点方法说明
/healthGET健康检查
/api/v1/queryPOST执行查询
/api/v1/sessionsGET列出会话
/api/v1/sessions/{id}GET会话详情
/api/v1/sessions/{id}/historyGET查询历史
/api/v1/cache/statsGET缓存统计
/api/v1/cacheDELETE清空缓存

查询请求

POST /api/v1/query { "question": "查询所有客户的信息", "session_id": "可选,用于多轮对话", "clarification_response": "可选,澄清响应" }

查询响应

{ "status": "completed", "sql": "SELECT * FROM customers;", "validation": {"ok": true, "errors": []}, "execution": { "ok": true, "columns": ["customer_id", "name", "email"], "rows": [[1, "张三", "zhangsan@example.com"]], "row_count": 1 }, "answer": { "conclusion": "共查询到 1 位客户...", "summary": "详细说明...", "confidence": 0.95 }, "evaluation": { "overall_score": 1.0, "stage_success": { "schema_loaded": true, "sql_validated": true, "sql_executed": true } }, "execution_time_ms": 2500, "tokens_used": 1500 }

🐳 Docker 部署

开发环境

# 启动开发环境 cd docker docker compose -f docker-compose.dev.yaml --env-file ../.env up -d # 查看日志 docker logs -f nl2sql-api-dev

服务端口:

服务端口说明
API8000FastAPI 后端
前端8501Streamlit 界面
Redis6379缓存服务
Grafana3000监控面板
Prometheus9090指标收集

生产环境

# 启动生产环境 cd docker docker compose -f docker-compose.prod.yaml --env-file ../.env up -d # 通过 Nginx 访问 # http://localhost (前端) # http://localhost/api/v1/query (API)

一键部署

# 使用部署脚本 ./deploy/deploy.sh prod # 或使用 Python 脚本 python start_m13_demo.py

📊 评测系统

运行评测

# 运行所有测试用例 python eval/runner.py # 限制用例数量 python eval/runner.py --limit 10 # 生成 HTML 报告 python eval/report_generator.py --input eval/results_*.json

评测指标

指标目标说明
SQL 精确匹配≥ 70%生成的 SQL 与预期完全一致
执行准确率≥ 90%SQL 能正确执行
结果准确率≥ 85%返回的数据正确
表选择准确率≥ 90%使用了正确的表

验收测试

# 运行各模块测试 python tests/test_m1_acceptance.py # SQL 生成 python tests/test_m4_acceptance.py # SQL 校验 python tests/test_m6_acceptance.py # RAG 增强 python tests/test_m12_acceptance.py # Web API

❓ 常见问题

🔧 环境配置问题

Q: ModuleNotFoundError 错误?

确保已激活虚拟环境并安装依赖:pip install -r requirements.txt

Q: API Key 认证失败?

检查 .env 文件中的 API Key 是否正确,注意不要有多余空格

Q: 数据库连接失败?

运行 python scripts/init_db.py 初始化数据库

🚀 运行问题

Q: SQL 执行被拦截?

系统只允许 SELECT 查询,其他操作会被安全沙箱拦截

Q: RAG 检索失败?

运行 python tools/init_vector_store.py 初始化向量存储

Q: 查询超时?

LLM 调用可能较慢,可以在 .env 中增加 LLM_TIMEOUT=120

Q: Docker 容器 API Key 为空?

启动时需要指定 env 文件:docker compose --env-file ../.env up -d

🐳 Docker 问题

Q: Docker 构建失败?

清理缓存:docker system prune -a && docker builder prune

Q: 容器无法访问?

检查端口是否被占用:docker psnetstat -tlnp

Q: 504 Gateway Timeout?

增加 nginx 超时配置,或检查后端服务是否正常


🛠️ 技术栈

类别技术
框架LangGraph, LangChain, FastAPI, Streamlit
数据库SQLite, Redis
AI/MLOpenAI/Qwen/DeepSeek API, FAISS
安全sqlglot, 沙箱执行
部署Docker, Docker Compose, Nginx
监控Prometheus, Grafana

📄 许可证

MIT License


如果这个项目对你有帮助,请给一个 ⭐ Star!

Made with ❤️ by Rookie Team

About

No description, topics, or website provided.
760.00 KiB
0 forks0 stars17 branches0 TagREADMEMIT license
Language
Python96.2%
HTML1.9%
Shell1.2%
Dockerfile0.6%
Others0.1%