基于钉钉机器人的自然语言数据查询系统。用户在钉钉群里 @机器人 用自然语言提问,系统自动转换为 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 配置
- 用户在钉钉群 @机器人 发送自然语言问题
- 系统调用 LLM (DeepSeek) 将问题转换为 SQL
- 执行 SQL 查询数据库
- 小数据量(≤50行)返回文本表格
- 大数据量(>50行)生成 Excel 文件发送
| 模块 | 功能 |
|---|---|
| 数据库管理 | 配置业务数据库连接(支持多数据源) |
| 表配置 | 管理允许查询的表,设置表的中文名和说明 |
| 字段管理 | 配置字段说明、别名、枚举值映射 |
| 查询示例 | 添加示例问题和对应 SQL,教模型如何查询 |
| 提示词配置 | 配置全局业务规则,帮助模型理解业务语义 |
| 查询测试 | 在线测试 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 8002cd frontend
npm install
npm run dev- 管理后台:http://localhost:5173
- API 文档:http://localhost:8002/docs
在 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 # 最大返回行数- name: 数据库别名
- host/port/username/password/database_name: 连接信息
- is_active: 是否启用
- table_name: 真实表名
- display_name: 中文显示名
- description: 表的业务说明
- field_name: 真实字段名
- display_name: 中文显示名
- description: 字段说明
- aliases: 用户常用叫法(逗号分隔)
- enum_values: 枚举值说明(如:0=正常,1=禁用)
- question: 用户问题
- sql: 对应 SQL
- description: 示例说明
- business_rules: 全局业务规则
| 方法 | 路径 | 说明 |
|---|---|---|
| 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 | 提示词配置 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /query | 执行自然语言查询 |
| GET | /query/download/{filename} | 下载 Excel 文件 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /callback | 钉钉消息回调 |
- 配置数据库 - 在"数据库管理"添加业务数据库连接
- 添加表 - 在"表配置"添加要查询的表
- 同步字段 - 点击"同步字段"自动导入表结构
- 完善字段信息 - 编辑字段说明、别名、枚举值
- 添加示例 - 在"查询示例"添加问题和对应 SQL
- 配置提示词 - 在"提示词配置"添加业务规则
- 测试查询 - 在"查询测试"验证效果
- 钉钉使用 - 在钉钉群 @机器人 发送问题
- 查询历史记录
- 多轮对话支持
- 查询结果缓存
- 权限控制(不同用户看不同表)
- SQL 审计日志
- 向量化提示词检索(RAG)
- 支持更多数据库类型(PostgreSQL、Oracle)
- 钉钉卡片消息支持