Skip to content

xfIools/AI-query-data-to-dingding

Repository files navigation

钉钉 NL2SQL 数据查询系统

项目简介

基于钉钉机器人的自然语言数据查询系统。用户在钉钉群里 @机器人 用自然语言提问,系统自动转换为 SQL 查询数据库并返回结果。

核心流程:

用户提问 → LLM 生成 SQL → 执行查询 → 返回结果/Excel

项目架构

钉钉查询数据项目/
├── backend/                    # 后端服务 (FastAPI)
│   ├── app/
│   │   ├── api/                # API 路由
│   │   │   ├── admin.py        # 管理后台接口
│   │   │   ├── dingtalk.py     # 钉钉回调接口
│   │   │   └── query.py        # 数据查询接口
│   │   ├── models/
│   │   │   └── config_models.py # 数据库模型
│   │   ├── services/           # 业务服务
│   │   │   ├── dingtalk_service.py  # 钉钉消息发送
│   │   │   ├── llm_service.py       # LLM 调用
│   │   │   ├── sql_executor.py      # SQL 执行
│   │   │   └── excel_service.py     # Excel 导出
│   │   ├── prompts/
│   │   │   └── nl2sql.txt      # NL2SQL 提示词模板
│   │   ├── config.py           # 配置管理
│   │   ├── database.py         # 数据库连接
│   │   ├── schemas.py          # Pydantic 模型
│   │   └── main.py             # 应用入口
│   ├── .env                    # 环境变量配置
│   └── requirements.txt        # Python 依赖
│
└── frontend/                   # 前端管理后台 (Vue 3)
    ├── src/
    │   ├── api/
    │   │   └── index.js        # API 封装
    │   ├── views/
    │   │   ├── Layout.vue      # 布局组件
    │   │   ├── DatabaseList.vue # 数据库管理
    │   │   ├── TableList.vue   # 表配置
    │   │   ├── FieldList.vue   # 字段管理
    │   │   ├── ExampleList.vue # 查询示例
    │   │   ├── PromptConfig.vue # 提示词配置
    │   │   └── QueryTest.vue   # 查询测试
    │   ├── router/
    │   │   └── index.js        # 路由配置
    │   ├── App.vue
    │   └── main.js
    └── vite.config.js          # Vite 配置

核心功能

1. 钉钉机器人查询

  • 用户在钉钉群 @机器人 发送自然语言问题
  • 系统调用 LLM (DeepSeek) 将问题转换为 SQL
  • 执行 SQL 查询数据库
  • 小数据量(≤50行)返回文本表格
  • 大数据量(>50行)生成 Excel 文件发送

2. 管理后台

模块 功能
数据库管理 配置业务数据库连接(支持多数据源)
表配置 管理允许查询的表,设置表的中文名和说明
字段管理 配置字段说明、别名、枚举值映射
查询示例 添加示例问题和对应 SQL,教模型如何查询
提示词配置 配置全局业务规则,帮助模型理解业务语义
查询测试 在线测试 NL2SQL 效果

3. NL2SQL 提示词工程

提示词模板包含:

  • 业务规则(全局配置)
  • 表结构信息(表名、字段、类型、说明)
  • 字段别名和枚举值映射
  • 查询示例

安全限制:

  • 只允许 SELECT 查询
  • 禁止 INSERT/UPDATE/DELETE/DROP/ALTER
  • 限制最大返回行数(默认 1000)

技术栈

后端

  • 框架: FastAPI
  • ORM: SQLAlchemy 2.0
  • 数据库: SQLite(配置库) + aiomysql(业务库查询)
  • LLM: DeepSeek API
  • 其他: httpx、openpyxl、pycryptodome

前端

  • 框架: Vue 3 + Vite
  • UI 库: Element Plus
  • 路由: Vue Router
  • HTTP: Axios

启动方式

后端

cd backend
pip install -r requirements.txt
python -m uvicorn app.main:app --host 0.0.0.0 --port 8002

前端

cd frontend
npm install
npm run dev

访问


环境变量配置

backend/.env 中配置:

# LLM 配置
LLM_API_KEY=your-deepseek-api-key
LLM_BASE_URL=https://api.deepseek.com
LLM_MODEL=deepseek-v4-pro

# 钉钉配置
DINGTALK_APP_KEY=your-app-key
DINGTALK_APP_SECRET=your-app-secret
DINGTALK_ROBOT_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx
DINGTALK_TOKEN=your-token
DINGTALK_AES_KEY=your-aes-key

# 服务配置
APP_HOST=0.0.0.0
APP_PORT=8000

# 查询配置
EXCEL_THRESHOLD=50      # 超过此行数生成 Excel
MAX_QUERY_ROWS=1000     # 最大返回行数

数据库模型

DatabaseConfig(数据库连接)

  • name: 数据库别名
  • host/port/username/password/database_name: 连接信息
  • is_active: 是否启用

QueryTable(查询表)

  • table_name: 真实表名
  • display_name: 中文显示名
  • description: 表的业务说明

FieldConfig(字段配置)

  • field_name: 真实字段名
  • display_name: 中文显示名
  • description: 字段说明
  • aliases: 用户常用叫法(逗号分隔)
  • enum_values: 枚举值说明(如:0=正常,1=禁用)

QueryExample(查询示例)

  • question: 用户问题
  • sql: 对应 SQL
  • description: 示例说明

PromptConfig(提示词配置)

  • business_rules: 全局业务规则

API 接口

管理接口 (/api/admin)

方法 路径 说明
GET /databases 获取数据库列表
POST /databases 创建数据库配置
PUT /databases/{id} 更新数据库配置
DELETE /databases/{id} 删除数据库配置
POST /databases/{id}/test 测试数据库连接
GET /databases/{id}/tables 获取远程表列表
GET/POST/PUT/DELETE /tables 表配置 CRUD
GET /tables/{id}/fields 同步表字段
GET/POST/PUT/DELETE /fields 字段配置 CRUD
GET/POST/PUT/DELETE /examples 查询示例 CRUD
GET/PUT /prompt-config 提示词配置

查询接口 (/api/query)

方法 路径 说明
POST /query 执行自然语言查询
GET /query/download/{filename} 下载 Excel 文件

钉钉回调 (/api/dingtalk)

方法 路径 说明
POST /callback 钉钉消息回调

使用流程

  1. 配置数据库 - 在"数据库管理"添加业务数据库连接
  2. 添加表 - 在"表配置"添加要查询的表
  3. 同步字段 - 点击"同步字段"自动导入表结构
  4. 完善字段信息 - 编辑字段说明、别名、枚举值
  5. 添加示例 - 在"查询示例"添加问题和对应 SQL
  6. 配置提示词 - 在"提示词配置"添加业务规则
  7. 测试查询 - 在"查询测试"验证效果
  8. 钉钉使用 - 在钉钉群 @机器人 发送问题

后续优化方向

  • 查询历史记录
  • 多轮对话支持
  • 查询结果缓存
  • 权限控制(不同用户看不同表)
  • SQL 审计日志
  • 向量化提示词检索(RAG)
  • 支持更多数据库类型(PostgreSQL、Oracle)
  • 钉钉卡片消息支持

About

自然语言描述,发送给钉钉机器人,它帮我生成sql并查询数据并返回到群里

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors