简体中文| 불화 | 위챗 | 포옹하는 얼굴 | 커뮤니티 | 종이
텍스트2SQL | 텍스트2NLU
Text2SQL 평가 실행 정확도(예) 측정항목을 src/dbgpt_hub_sql
로 이동합니다.
모델 | 방법 | 쉬운 | 중간 | 딱딱한 | 추가의 | 모두 |
---|---|---|---|---|---|---|
베이스 | 0 | 0 | 0 | 0 | 0 | |
Llama2-7B-채팅 | 로라 | 0.887 | 0.641 | 0.489 | 0.331 | 0.626 |
클로라 | 0.847 | 0.623 | 0.466 | 0.361 | 0.608 | |
베이스 | 0 | 0 | 0 | 0 | 0 | |
Llama2-13B-채팅 | 로라 | 0.907 | 0.729 | 0.552 | 0.343 | 0.68 |
클로라 | 0.911 | 0.7 | 0.552 | 0.319 | 0.664 | |
베이스 | 0.214 | 0.177 | 0.092 | 0.036 | 0.149 | |
CodeLlama-7B-지시 | 로라 | 0.923 | 0.756 | 0.586 | 0.349 | 0.702 |
클로라 | 0.911 | 0.751 | 0.598 | 0.331 | 0.696 | |
베이스 | 0.698 | 0.601 | 0.408 | 0.271 | 0.539 | |
CodeLlama-13B-지시 | 로라 | 0.94 | 0.789 | 0.684 | 0.404 | 0.746 |
클로라 | 0.94 | 0.774 | 0.626 | 0.392 | 0.727 | |
베이스 | 0.577 | 0.352 | 0.201 | 0.066 | 0.335 | |
Baichuan2-7B-채팅 | 로라 | 0.871 | 0.63 | 0.448 | 0.295 | 0.603 |
클로라 | 0.891 | 0.637 | 0.489 | 0.331 | 0.624 | |
베이스 | 0.581 | 0.413 | 0.264 | 0.187 | 0.392 | |
Baichuan2-13B-채팅 | 로라 | 0.903 | 0.702 | 0.569 | 0.392 | 0.678 |
클로라 | 0.895 | 0.675 | 0.58 | 0.343 | 0.659 | |
베이스 | 0.395 | 0.256 | 0.138 | 0.042 | 0.235 | |
Qwen-7B-채팅 | 로라 | 0.855 | 0.688 | 0.575 | 0.331 | 0.652 |
클로라 | 0.911 | 0.675 | 0.575 | 0.343 | 0.662 | |
베이스 | 0.871 | 0.632 | 0.368 | 0.181 | 0.573 | |
Qwen-14B-채팅 | 로라 | 0.895 | 0.702 | 0.552 | 0.331 | 0.663 |
클로라 | 0.919 | 0.744 | 0.598 | 0.367 | 0.701 | |
베이스 | 0 | 0 | 0 | 0 | 0 | |
채팅GLM3-6b | 로라 | 0.855 | 0.605 | 0.477 | 0.271 | 0.59 |
클로라 | 0.843 | 0.603 | 0.506 | 0.211 | 0.581 |
DB-GPT-Hub는 LLM(대형 언어 모델)을 활용하여 텍스트-SQL 구문 분석을 달성하는 실험적인 프로젝트입니다. 이 프로젝트는 데이터 수집, 데이터 전처리, 모델 선택 및 구성, 모델 가중치 미세 조정을 포함한 다양한 단계를 포함합니다. 이러한 프로세스를 통해 우리의 목표는 Text-to-SQL 기능을 향상시키는 동시에 모델 교육 비용을 절감하여 더 많은 개발자가 Text-to-SQL 정확도 향상에 기여할 수 있도록 하는 것입니다. 우리의 궁극적인 목표는 데이터베이스 기반의 자동화된 질문 답변 기능을 구현하여 사용자가 자연어 설명을 사용하여 복잡한 데이터베이스 쿼리를 실행할 수 있도록 하는 것입니다.
현재까지 우리는 여러 대형 모델을 성공적으로 통합했으며 데이터 처리, SFT(Supervised Fine-Tuning) 모델 교육, 예측 출력 및 평가를 포함하는 포괄적인 워크플로를 구축했습니다. 이 프로젝트를 위해 개발된 코드는 프로젝트 자체 내에서 쉽게 재사용할 수 있습니다.
2023년 10월 10일 현재, 우리는 이 프로젝트를 사용하여 오픈소스 13B 크기 모델을 미세 조정하고 보다 관련성이 높은 데이터를 통합했습니다. 제로샷 프롬프트와 Spider 기반 테스트 스위트를 활용하여 1.27G 크기의 데이터베이스에 대해 0.764의 실행 정확도를 달성했습니다. 또한 Spider 공식 홈페이지에서 언급한 95M 크기의 데이터베이스의 실행 정확도는 0.825입니다.
대규모 언어 모델에 SFT(Supervised Fine-Tuning)를 적용하여 Text-to-SQL 성능을 향상시킵니다.
이 프로젝트 예제의 기본 데이터세트는 Spider 데이터세트입니다.
사용 가능한 기타 text2sql 데이터 세트:
WikiSQL: 80,654개의 자연 명령문 표현식과 24,241개 테이블의 SQL 주석으로 구성된 대규모 의미 체계 분석 데이터세트입니다. WikiSQL의 각 쿼리는 동일한 테이블로 제한되며 정렬, 그룹화와 같은 복잡한 작업을 포함하지 않습니다. WikiSQL의 쿼리는 동일한 테이블로 제한되며 정렬, 그룹화, 하위 쿼리 등과 같은 복잡한 작업을 포함하지 않습니다.
CHASE: 280개의 서로 다른 도메인 데이터베이스에 걸쳐 17,940개의
BIRD-SQL: 대규모 데이터베이스 콘텐츠에 특히 초점을 맞춘 영어로 된 대규모 교차 도메인 텍스트-SQL 벤치마크입니다. 데이터 세트에는 37개 직업 영역에 걸쳐 총 크기가 33.4GB인 12,751개의 텍스트-SQL 데이터 쌍과 95개의 데이터베이스가 포함되어 있습니다. BIRD-SQL 데이터 세트는 크고 지저분한 데이터베이스 값 처리, 외부 지식 추론, SQL 실행 효율성 최적화라는 세 가지 추가 과제를 탐색하여 텍스트-SQL 연구와 실제 애플리케이션 간의 격차를 해소합니다.
CoSQL: 도메인 간 대화형 텍스트-SQL 시스템을 구축하기 위한 코퍼스입니다. 이는 Spider 및 SParC 작업의 대화형 버전입니다. CoSQL은 138개 도메인에 걸쳐 200개의 복잡한 데이터베이스를 쿼리하는 Wizard-of-Oz의 3,000개 대화 컬렉션에서 가져온 30,000개 이상의 라운드와 10,000개 이상의 주석이 달린 SQL 쿼리로 구성됩니다. 각 대화는 직원이 사용자로서 데이터베이스를 탐색하고 SQL 전문가가 SQL을 사용하여 답변을 검색하고 모호한 질문을 명확히 하거나 정보를 제공하는 현실적인 DB 쿼리 시나리오를 시뮬레이션합니다.
NSQL의 처리 템플릿에 따라 데이터 세트는 기본 처리를 거쳐 약 20W의 데이터 세트를 생성했습니다.
DB-GPT-Hub는 현재 다음 기본 모델을 지원합니다.
이 모델은 QLoRA(Quantized Learning over Redundant Architecture)를 사용하여 양자화 비트 4를 기반으로 미세 조정되었습니다. 이에 대한 최소 하드웨어 요구 사항은 다음과 같습니다.
모델 매개변수 | GPU RAM | CPU 램 | 디스크 |
---|---|---|---|
7b | 6GB | 3.6GB | 36.4GB |
13b | 13.4GB | 5.9GB | 60.2GB |
모든 관련 매개변수는 배치 크기가 1이고 최대 길이가 512인 최소값으로 설정됩니다. 경험에 따르면 더 나은 성능을 위해 관련 길이 값을 1024 또는 2048로 설정하는 것이 좋습니다.
git clone https://github.com/eosphoros-ai/DB-GPT-Hub.git
cd DB-GPT-Hub
conda create -n dbgpt_hub python=3.10
conda activate dbgpt_hub
cd src/dbgpt_hub_sql
pip install -e .
먼저 다음 명령을 사용하여 dbgpt-hub
설치하십시오.
pip install dbgpt-hub
그런 다음 인수를 설정하고 전체 프로세스를 실행합니다.
from dbgpt_hub_sql . data_process import preprocess_sft_data
from dbgpt_hub_sql . train import start_sft
from dbgpt_hub_sql . predict import start_predict
from dbgpt_hub_sql . eval import start_evaluate
# Config the input datasets
data_folder = "dbgpt_hub_sql/data"
data_info = [
{
"data_source" : "spider" ,
"train_file" : [ "train_spider.json" , "train_others.json" ],
"dev_file" : [ "dev.json" ],
"tables_file" : "tables.json" ,
"db_id_name" : "db_id" ,
"is_multiple_turn" : False ,
"train_output" : "spider_train.json" ,
"dev_output" : "spider_dev.json" ,
}
]
# Config training parameters
train_args = {
"model_name_or_path" : "codellama/CodeLlama-13b-Instruct-hf" ,
"do_train" : True ,
"dataset" : "example_text2sql_train" ,
"max_source_length" : 2048 ,
"max_target_length" : 512 ,
"finetuning_type" : "lora" ,
"lora_target" : "q_proj,v_proj" ,
"template" : "llama2" ,
"lora_rank" : 64 ,
"lora_alpha" : 32 ,
"output_dir" : "dbgpt_hub_sql/output/adapter/CodeLlama-13b-sql-lora" ,
"overwrite_cache" : True ,
"overwrite_output_dir" : True ,
"per_device_train_batch_size" : 1 ,
"gradient_accumulation_steps" : 16 ,
"lr_scheduler_type" : "cosine_with_restarts" ,
"logging_steps" : 50 ,
"save_steps" : 2000 ,
"learning_rate" : 2e-4 ,
"num_train_epochs" : 8 ,
"plot_loss" : True ,
"bf16" : True ,
}
# Config predict parameters
predict_args = {
"model_name_or_path" : "codellama/CodeLlama-13b-Instruct-hf" ,
"template" : "llama2" ,
"finetuning_type" : "lora" ,
"checkpoint_dir" : "dbgpt_hub_sql/output/adapter/CodeLlama-13b-sql-lora" ,
"predict_file_path" : "dbgpt_hub_sql/data/eval_data/dev_sql.json" ,
"predict_out_dir" : "dbgpt_hub_sql/output/" ,
"predicted_out_filename" : "pred_sql.sql" ,
}
# Config evaluation parameters
evaluate_args = {
"input" : "./dbgpt_hub_sql/output/pred/pred_sql_dev_skeleton.sql" ,
"gold" : "./dbgpt_hub_sql/data/eval_data/gold.txt" ,
"gold_natsql" : "./dbgpt_hub_sql/data/eval_data/gold_natsql2sql.txt" ,
"db" : "./dbgpt_hub_sql/data/spider/database" ,
"table" : "./dbgpt_hub_sql/data/eval_data/tables.json" ,
"table_natsql" : "./dbgpt_hub_sql/data/eval_data/tables_for_natsql2sql.json" ,
"etype" : "exec" ,
"plug_value" : True ,
"keep_distict" : False ,
"progress_bar_for_each_datapoint" : False ,
"natsql" : False ,
}
# Run the whole fine-tuning workflow
preprocess_sft_data (
data_folder = data_folder ,
data_info = data_info
)
start_sft ( train_args )
start_predict ( predict_args )
start_evaluate ( evaluate_args )
DB-GPT-Hub는 데이터 준비를 위해 정보 매칭 생성 방식, 즉 테이블 정보를 결합하는 SQL + Repository 생성 방식을 사용한다. 이 방법은 데이터 테이블 정보를 결합하여 데이터 테이블의 구조와 관계를 더 잘 이해할 수 있으며, 요구 사항을 충족하는 SQL 문을 생성하는 데 적합합니다.
Spider 데이터세트 링크에서 Spider 데이터세트를 다운로드합니다. 기본적으로 데이터를 다운로드하고 추출한 후 이를 dbgpt_hub_sql/data 디렉터리에 배치합니다. 즉, 경로는 dbgpt_hub_sql/data/spider
여야 합니다.
데이터 전처리 부분의 경우 다음 스크립트를 실행 하면 됩니다.
# # generate train and dev(eval) data
sh dbgpt_hub_sql/scripts/gen_train_eval_data.sh
dbgpt_hub_sql/data/
디렉터리에서 새로 생성된 훈련 파일 example_text2sql_train.json과 테스트 파일 example_text2sql_dev.json을 찾을 수 있으며 각각 8659 및 1034 항목이 포함되어 있습니다. 후속 미세 조정에 사용되는 데이터의 경우 file_name
매개변수 값을 example_text2sql_train.json과 같은 dbgpt_hub_sql/data/dataset_info.json의 훈련 세트 파일 이름으로 설정합니다.
생성된 JSON의 데이터는 다음과 같습니다.
{
"db_id": "department_management",
"instruction": "I want you to act as a SQL terminal in front of an example database, you need only to return the sql command to me.Below is an instruction that describes a task, Write a response that appropriately completes the request.n"n##Instruction:ndepartment_management contains tables such as department, head, management. Table department has columns such as Department_ID, Name, Creation, Ranking, Budget_in_Billions, Num_Employees. Department_ID is the primary key.nTable head has columns such as head_ID, name, born_state, age. head_ID is the primary key.nTable management has columns such as department_ID, head_ID, temporary_acting. department_ID is the primary key.nThe head_ID of management is the foreign key of head_ID of head.nThe department_ID of management is the foreign key of Department_ID of department.nn",
"input": "###Input:nHow many heads of the departments are older than 56 ?nn###Response:",
"output": "SELECT count(*) FROM head WHERE age > 56",
"history": []
},
프로젝트의 데이터 처리 코드에는 chase
, cosql
, sparc
의 데이터 처리 코드가 내장되어 있습니다. 위 링크에 따라 데이터 세트를 다운로드한 후 dbgpt_hub_sql/configs/config.py in
추가하기만 하면 됩니다. Just loosen the corresponding code comment in SQL_DATA_INFO
.
모델 미세 조정은 LoRA 및 QLoRA 방법을 모두 지원합니다. 다음 명령을 실행하여 모델을 미세 조정할 수 있습니다. 기본적으로 --Quantization_bit 매개변수를 사용하면 QLoRA 미세 조정 방법을 사용합니다. LoRA로 전환하려면 스크립트에서 관련 매개변수를 제거하기만 하면 됩니다. 다음 명령을 실행하십시오.
sh dbgpt_hub_sql/scripts/train_sft.sh
미세 조정 후 모델 가중치는 기본적으로 어댑터 폴더, 특히 dbgpt_hub_sql/output/adapter 디렉터리에 저장됩니다.
다중 GPU 교육을 사용 중이고 deepseed 를 활용하려면 train_sft.sh에서 기본 콘텐츠를 수정해야 합니다. 변경 사항은 다음과 같습니다.
CUDA_VISIBLE_DEVICES=0 python dbgpt_hub_sql/train/sft_train.py
--quantization_bit 4
...
로 변경:
deepspeed --num_gpus 2 dbgpt_hub_sql/train/sft_train.py
--deepspeed dbgpt_hub_sql/configs/ds_config.json
--quantization_bit 4
...
주문 카드 ID가 필요한 경우
deepspeed --include localhost:0,1 dbgpt_hub_sql/train/sft_train.py
--deepspeed dbgpt_hub_sql/configs/ds_config.json
--quantization_bit 4
...
그 외 생략된 부분(…)은 일관성을 유지할 수 있습니다. 기본 deepseed 구성을 변경하려면 dbgpt_hub_sql/configs
디렉터리로 이동하여 필요에 따라 ds_config.json을 변경하세요. 기본값은 stage2입니다.
스크립트에서 미세 조정하는 동안 다양한 모델은 다음 표에 표시된 대로 주요 매개변수 lora_target 및 template에 해당합니다.
모델명 | lora_target | 주형 |
---|---|---|
LLaMA-2 | q_proj,v_proj | 라마2 |
코드라마-2 | q_proj,v_proj | 라마2 |
바이촨2 | W_팩 | 백천2 |
퀀 | c_attn | 채팅 |
SQLcoder-7b | q_proj,v_proj | 미스트랄 |
sqlcoder2-15b | c_attn | 기본 |
인턴LM | q_proj,v_proj | 인턴 |
엑스버스 | q_proj,v_proj | 엑스버스 |
채팅GLM2 | 쿼리_키_값 | chatglm2 |
야마 | q_proj,v_proj | - |
꽃 | 쿼리_키_값 | - |
블룸즈 | 쿼리_키_값 | - |
바이촨 | W_팩 | 백천 |
매 | 쿼리_키_값 | - |
train_sft.sh
에서 기타 주요 매개변수는 다음과 같습니다.
yangization_bit: 양자화 적용 여부를 나타내며 유효한 값은 [4 또는 8]입니다.
model_name_or_path: LLM(Large Language Model)의 경로입니다.
데이터 세트: example_text2sql과 같은 dbgpt_hub_sql/data/dataset_info.json의 외부 키 값에 해당하는 교육 데이터 세트 구성의 이름을 지정합니다.
max_source_length: 모델에 입력되는 텍스트의 길이입니다. 컴퓨팅 자원이 허락한다면 1024나 2048처럼 최대한 크게 설정할 수 있습니다.
max_target_length: 모델이 출력하는 SQL 콘텐츠의 길이입니다. 일반적으로 512이면 충분합니다.
output_dir: SFT(Supervised Fine-Tuning) 중 Peft 모듈의 출력 경로이며 기본적으로dbgpt_hub_sql/output/adapter/
로 설정됩니다.
per_device_train_batch_size: 배치의 크기입니다. 컴퓨팅 리소스가 허용하는 경우 더 크게 설정할 수 있습니다. 기본값은 1입니다.
gradient_accumulation_steps: 업데이트 전 그라디언트를 누적하는 단계 수입니다.
save_steps: 모델 체크포인트가 저장되는 단계 수입니다. 기본적으로 100으로 설정될 수 있습니다.
num_train_epochs: 데이터 세트 훈련을 위한 에포크 수입니다.
프로젝트 디렉터리 ./dbgpt_hub_sql/output/pred/ 아래에 있는 이 폴더는 모델 예측을 위한 기본 출력 위치입니다(존재하지 않는 경우 mkdir만 해당).
sh ./dbgpt_hub_sql/scripts/predict_sft.sh
스크립트에서는 기본적으로 --quantization_bit
매개변수를 사용하여 QLoRA를 사용하여 예측합니다. 이를 제거하면 LoRA 예측 방법으로 전환됩니다. predicted_input_filename
매개변수의 값은 예측 테스트 데이터 세트 파일입니다. --predicted_out_filename
은 모델 예측 결과의 파일 이름입니다.
Huggingface hg-eosphoros-ai에서 두 번째 해당 모델 가중치를 찾을 수 있습니다. 10월에 LoRA 가중치를 업로드했는데 Spider 평가 세트의 실행 정확도는 0.789에 도달했습니다.
훈련된 기본 모델과 미세 조정된 Peft 모듈의 가중치를 병합하여 전체 모델을 내보내야 하는 경우 다음 모델 내보내기 스크립트를 실행하세요.
sh ./dbgpt_hub_sql/scripts/export_merge.sh
스크립트의 매개변수 경로 값을 프로젝트에 해당하는 경로로 바꾸십시오.
데이터 세트에서 모델 성능을 평가하기 위한 기본값은 spider dev 데이터 세트입니다. 다음 명령을 실행하십시오.
python dbgpt_hub_sql/eval/evaluation.py --plug_value --input Your_model_pred_file
여기에서 최신 검토 결과와 실험 결과의 일부를 확인할 수 있습니다.
참고 : 기본 코드가 가리키는 데이터베이스는 [스파이더 공식 홈페이지](https://yale-lily.github.io/spider)에서 다운로드한 95M 데이터베이스입니다. 테스트 스위트에서 Spider 데이터베이스(크기 1.27G)를 사용해야 하는 경우 먼저 사용자 정의 디렉터리에 대한 링크에 있는 데이터베이스를 다운로드하고 --db Your_download_db_path
와 같은 매개변수와 값을 추가하는 위의 평가 명령을 실행하세요.
전체 프로세스는 세 단계로 나누어집니다.
1단계:
현재 우리는 다음 기능을 지원합니다.
2단계:
20231010
이전에는 모델 성능을 최적화하고 다양한 방식으로 더 다양한 모델의 미세 조정을 지원합니다. prompts
3단계:
우리의 작업이 귀하에게 작은 도움이라도 제공했다면 별표를 주는 것을 고려해 보십시오. 귀하의 피드백과 지원은 우리가 계속해서 더 많은 관련 작업을 출시하고 노력을 개선할 수 있는 원동력이 됩니다. 감사합니다!
우리는 더 많은 사람들이 우리와 함께 데이터 세트, 모델 미세 조정, 성능 평가, 문서 권장 사항 및 코드 재생산과 같은 프로젝트의 다양한 측면에 적극적으로 참여할 수 있도록 초대합니다. 주저하지 말고 이슈를 공개하거나 PR(Pull Request)을 보내주시면 귀하의 기여에 적극적으로 응답해 드리겠습니다.
코드를 제출하기 전에 다음 명령을 사용하여 검정색 스타일에 따라 형식이 지정되었는지 확인하세요.
black dbgpt_hub
코드의 보다 자세한 유형 검사 및 스타일 검사를 실행할 시간이 더 있으면 다음 명령을 사용하십시오.
pyright dbgpt_hub
pylint dbgpt_hub
궁금한 점이 있거나 추가 지원이 필요하면 주저하지 말고 문의하세요. 여러분의 참여에 감사드립니다!
우리의 작업은 주로 수많은 오픈 소스 기여를 기반으로 합니다. 다음 오픈 소스 프로젝트 덕분에
모든 기여자, 특히 Test Suite와 같은 새로운 유망 평가 방법을 추가하도록 상기시키는 문제를 제기한 @JBoRu에게 감사드립니다. 《SQL-PALM: IMPROVED LARGE LANGUAGE MODEL ADAPTATION FOR TEXT-TO-SQL》 논문에서 언급했듯이, "우리는 일반적으로 사용되는 두 가지 평가 지표인 실행 정확도(EX)와 테스트 스위트 정확도(TS)를 고려합니다. EX는 SQL 실행 결과는 GT(Ground Truth)와 일치하는 반면, TS는 SQL이 데이터베이스 보강으로 생성된 여러 테스트에 대한 모든 EX 평가를 통과하는지 여부를 측정합니다. EX에는 거짓 긍정이 포함되어 있으므로 TS를 보다 신뢰할 수 있는 평가 지표로 간주합니다.
DB-GPT-Hub
연구 또는 개발에 유용하다고 생각되면 다음 논문을 인용해 주세요.
@misc { zhou2024dbgpthub ,
title = { DB-GPT-Hub: Towards Open Benchmarking Text-to-SQL Empowered by Large Language Models } ,
author = { Fan Zhou and Siqiao Xue and Danrui Qi and Wenhui Shi and Wang Zhao and Ganglin Wei and Hongyang Zhang and Caigai Jiang and Gangwei Jiang and Zhixuan Chu and Faqiang Chen } ,
year = { 2024 } ,
eprint = { 2406.11434 } ,
archivePrefix = { arXiv } ,
primaryClass = { id='cs.DB' full_name='Databases' is_active=True alt_name=None in_archive='cs' is_general=False description='Covers database management, datamining, and data processing. Roughly includes material in ACM Subject Classes E.2, E.5, H.0, H.2, and J.1.' }
}
MIT 라이센스(MIT)
우리는 커뮤니티로서 협력하고 있습니다. 커뮤니티 활동에 관한 아이디어가 있으시면 주저하지 마시고 연락해 주세요. 심층적인 실험을 탐구하고 DB-GPT-Hub 하위 프로젝트를 최적화하는 데 관심이 있다면 WeChat 그룹 내의 'wangzai'에 문의할 수 있습니다. 우리는 함께 더 나은 것을 만들기 위한 여러분의 기여를 진심으로 환영합니다!