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.
776.00 KiB
0 forks0 stars17 branches0 TagREADMEMIT license
Language
Python96.2%
HTML1.9%
Shell1.2%
Dockerfile0.6%
Others0.1%