# nl2sql2025
**Repository Path**: zhouweng/nl2sql2025
## Basic Information
- **Project Name**: nl2sql2025
- **Description**: 组队参加2025年羊城工匠杯的nl2sql比赛的项目源代码
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-10-08
- **Last Updated**: 2025-10-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# nl2sql2025
## 介绍
组队参加2025年羊城工匠杯nl2sql比赛的项目源代码
## 执行流程
### 1. 把 data.db 文件复制到 ./data目录下 下载路径:https://pan.baidu.com/s/1tiRT1G6WbQE5ob_ck5EegA?pwd=2025 (密码:nl2sql2025)
### 2. 安装必要的python依赖包(参看下面的安装说明)
### 3. aliyun申请api_key并且修改配置文件
```bash
$ cp ./src/config.py.example config.py
# 手工修改 llm_api_key内容
```
### 4. 工作根目录执行以下命令
```bash
sh start.sh
```
### 5. 检查生成文件 ./result/part1_results.jsonl
## 软件架构
### 向量化流程
``` mermaid
flowchart TD
A["数据预处理阶段(build_vector.sh)"] --> B["Excel文件->16个建表语句(excel2sql.py)"]
A --> C1["官方发布和人工标记samples集"]
C1 --> C2["建立问题和库表关系(question2table.py)"]
C1 --> C3["建立模板问题与SQL关系(template2sql.py)"]
C2 --> D["库表定义附加上问题集信息(sql_markdown.py)"]
C3 --> D
B --> D
D --> E["调用嵌入模型生成多维向量(sqls_embedding.py)"]
E --> F["向量化库表及问题集(vector2chroma.py)"]
```
### 批量生成SQL流程
``` mermaid
flowchart TD
A[src/multi_extraction.py
读取 data/questions.jsonl] --> B[逐行处理每个问题]
B --> C[src/query/get_sql_answer.py get_sql_answer ]
C --> D[src/query/query_table.py
query_table]
D --> E{可以找到对应的 table_name?}
E -- 是 --> F1[src/query/query_sql.py
query_sql
返回 table_define]
F1 --> G1[src/query/query_example.py
query_example
返回example_hint]
E -- 否 --> F2[src/query/query_ddl.py
query_ddl
返回 table_define]
F2 --> G2[src/query/query_vector.py
&query_reranker.py
&hit_keywords.py]
C --> H[根据问题关键字增加提示词
src/build_extra_hint.py
build_extra_hint]
H --> I[返回 extra_hint]
G1 --> M[src/utils.py
create_sql_template
生成 prompt]
G2 --> M
I --> M
M --> N[调用大模型接口 llm返回生成的 SQL]
N --> O[src/multi_extraction.py
写入 result/part* 文件]
```
## 安装教程
### 1. 安装pyenv和python3.10
参考文章:https://blog.csdn.net/u010593516/article/details/147855362
#### 确认正常安装
```bash
$ ls ~/.pyenv/versions
3.10.17 3.12.10
```
#### 切换3.10版本python
```bash
$ pyenv global 3.10
$ python --version
Python 3.10.17
```
### 2. 创建虚拟环境并下载依赖包
```bash
$ apt install python3-venv
$ source ~/.profile
$ pyenv local 3.10
$ python --version
$ python -m venv env_nls2sql
$ source env_nls2sql/bin/activate
$ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
## 主要源代码介绍
### start.sh : 一键启动脚本
### build_vector.sh : 构建向量库
### clean.sh: 清理和备份中间文件
### refresh_vector.sh : 刷新向量
### ./src/multi_extraction.py : 主程序入口,支持多线程启动
### ./src/vector : 【文件夹】构建向量库相关代码
#### src/vector/excel2sql.py : excel文件 data/表结构.xlsx 转为包含 sqlite建表ddl 的json文件,写入 ./sql_output 文件夹
#### src/vector/question2table.py :建立库表与问题模板库关联,生成tmp_question2sql.json文件
#### src/vector/template2sql.py :建立库表与问题模板库关联,生成tmp_question2sql.json文件
#### src/vector/sql_markdown.py :对./sql_output 文件夹打问题模板标记
#### src/vector/sqls_embedding.py :调用嵌入模型,生成tmp_embedding_waiting.txt 待向量化的文件
#### src/vector/vector2chroma.py :读取tmp_embedding_waiting.txt 写入chroma向量数据库
#### ./src/vector/show_vectors.py : 显示向量库中text信息
#### ./src/vector/remove_vectors.py : 清空向量库信息
### ./src/query : 【文件夹】构建SQL相关检索
#### src/query/get_sql_answer.py : 根据Qustion得到匹配度最高库表
#### src/query/query_sql.py : 根据table_name找到sql_output下面对应的建表语句
#### src/query/query_table.py : 根据question找到到tmp_quesiton2.sql.json 找到对应的table
#### src/query/build_extra_hint.py : 根据Question生成特殊提示词
#### src/query/extract_tables.py : 提取SQL里面的库表
#### src/query/hit_keywords.py : 根据问题与向量搜索问题集的关键字匹配数组
#### src/query/query_reranker.py : question和documents的调用reranker模型排序
#### src/query/query_vector.py : 根据text查找向量库中相似度TOP5记录 (需要用到embedding模型)
#### src/query/data_reranker.py : 根据tmp_embedding.txt的 query和documents 找到匹配度最高的段落(需要用到reranker模型)
### ./src/tools : 【文件夹】各类辅助工具
#### ./src/tools/eval_question2sql.py: 评估问题模板question_template的数量并输出新问题集到 tmp_newquestion.txt
#### ./src/tools/build_checklist.py: 没有问题模板样本支持的新问题清单 tmp_newquestions.txt 构建人工待确认清单
#### ./src/tools/build_lastcheck.py: 提交结果前,results结果集进行问题模板分组展现,人工检查非样本问题与样本问题的SQL脚本的大模型生成一致性
#### ./src/tools/eval_embeddings.py: 评估通过embeddings模型拿到的top1结果是否就是samples的库表
#### ./src/tools/eval_reranker.py: 评估通过embeddings和reranker模型后,拿到的库表是否就是samples的库表
#### ./src/tools/build_check.py: (第一遍SQL生成后)根据tmp_question2sql.json已经归集的问题大类分组,生成人工友好的待标记清单
#### ./src/tools/build_middle.py: (可由build_check.py替代)根据questions.jsonl和results.jsonl 生成middle.jsonl待人工处理
#### ./src/tools/build_requestion.py: (阶段性排查成功后)已经标记0和-1的check文件,归集生成 requestion文件,手工copy到 questions.jsonl重新运行SQL生成
#### ./src/tools/build_samples.py: (阶段性排查成功后)把data目录下的check开头文件flag=1 or -1 归集到 samples.jsons作为样本库,向量数据库重建后,可以提高命中率
#### ./src/tools/check_dataset.py: (非常实用) 根据id检查数据集的SQL的执行数据集结果
#### ./src/tools/check_jsonl.py : (非常实用) 检查jsonl文件是否准确,在比赛最后提交前,手动检查一下
#### ./src/tools/check_resultsql.py: 检查results.jsonl的 SQL 执行失败或结果为空,结果写入 tmp_err_sql.log
#### ./src/tools/clean_question.py: 正则表达式对问题进行大类归集
#### ./src/tools/diff_tables.py: (基本废弃) results和samples的库表差异
#### ./src/tools/scan_question.py: (刚拿到问题集运行) 扫描问题集,看看哪些问题还没有归集大类
#### ./src/tools/result_merge.py: 合并两个 JSON Lines 格式的文件,以 base 文件为基础,用 new 文件中相同 id 的记录进行更新。
#### ./src/tools/simulate_score.py: 比对result和sample文件,得到分数
#### ./src/tools/sqlite_table.py: (基本废弃) 看看sqlite下面有哪些库表(一般用来测试sqlite是否可用)
## 主要其他文件介绍
### ./data/parameters.txt : 问题参数化json(scan_columns.py生成)
### ./data/keywords.txt : 用于关键字匹配的业务术语,用|分隔开(手工维护)
### ./question.round01.jsonl : 官方公布的第一轮问题集包含10道样本题型
### ./question.round02.jsonl : 官方公布的初赛问题集包含800道样本题型(原文件名称test.jsonl)
### ./question.round01.jsonl : 官方公布的第一轮问题答案样本集共267题
### ./question.round02.jsonl : 初赛结束后,手工标记完成的样本集
### ./result.results.round01.jsonl : 程序批量运行出来的结果集
### ./result.results.round02.jsonl : 初赛提交官方作为比赛成绩的结果集
### ./data/checklist.part1&2.txt : 两个人工标注的样本集