简体中文| Discordia | WeChat | Cara de abrazo | Comunidad | Papel
Texto2SQL | Texto2NLU
Métrica de precisión de ejecución de evaluación de Text2SQL (ex), y la moveremos a src/dbgpt_hub_sql
Modelo | Método | Fácil | Medio | Duro | Extra | Todo |
---|---|---|---|---|---|---|
base | 0 | 0 | 0 | 0 | 0 | |
Llama2-7B-Chat | lora | 0,887 | 0.641 | 0,489 | 0.331 | 0,626 |
qlora | 0,847 | 0.623 | 0.466 | 0.361 | 0.608 | |
base | 0 | 0 | 0 | 0 | 0 | |
Llama2-13B-Chat | lora | 0.907 | 0,729 | 0.552 | 0.343 | 0,68 |
qlora | 0.911 | 0,7 | 0.552 | 0.319 | 0,664 | |
base | 0.214 | 0,177 | 0,092 | 0.036 | 0,149 | |
CodeLlama-7B-Instrucción | lora | 0.923 | 0,756 | 0.586 | 0,349 | 0.702 |
qlora | 0.911 | 0,751 | 0,598 | 0.331 | 0,696 | |
base | 0,698 | 0.601 | 0.408 | 0,271 | 0.539 | |
CodeLlama-13B-Instrucción | lora | 0,94 | 0,789 | 0,684 | 0.404 | 0.746 |
qlora | 0,94 | 0,774 | 0,626 | 0,392 | 0,727 | |
base | 0,577 | 0.352 | 0.201 | 0.066 | 0.335 | |
Baichuan2-7B-Chat | lora | 0,871 | 0,63 | 0.448 | 0,295 | 0.603 |
qlora | 0,891 | 0,637 | 0,489 | 0.331 | 0,624 | |
base | 0.581 | 0.413 | 0.264 | 0,187 | 0,392 | |
Baichuan2-13B-Chat | lora | 0.903 | 0.702 | 0.569 | 0,392 | 0,678 |
qlora | 0,895 | 0,675 | 0,58 | 0.343 | 0,659 | |
base | 0,395 | 0.256 | 0,138 | 0,042 | 0.235 | |
Qwen-7B-Chat | lora | 0,855 | 0,688 | 0.575 | 0.331 | 0,652 |
qlora | 0.911 | 0,675 | 0.575 | 0.343 | 0,662 | |
base | 0,871 | 0,632 | 0.368 | 0,181 | 0.573 | |
Qwen-14B-Chat | lora | 0,895 | 0.702 | 0.552 | 0.331 | 0.663 |
qlora | 0.919 | 0.744 | 0,598 | 0.367 | 0.701 | |
base | 0 | 0 | 0 | 0 | 0 | |
ChatGLM3-6b | lora | 0,855 | 0.605 | 0,477 | 0.271 | 0,59 |
qlora | 0.843 | 0.603 | 0.506 | 0.211 | 0.581 |
DB-GPT-Hub es un proyecto experimental que aprovecha los modelos de lenguajes grandes (LLM) para lograr el análisis de texto a SQL. El proyecto abarca varias etapas, incluida la recopilación de datos, el preprocesamiento de datos, la selección y construcción de modelos y el ajuste de las ponderaciones de los modelos. A través de estos procesos, nuestro objetivo es mejorar las capacidades de Texto a SQL y al mismo tiempo reducir los costos de capacitación del modelo, permitiendo así que más desarrolladores contribuyan a mejorar la precisión de Texto a SQL. Nuestro objetivo final es implementar capacidades automatizadas de respuesta a preguntas basadas en bases de datos, permitiendo a los usuarios ejecutar consultas complejas de bases de datos utilizando descripciones en lenguaje natural.
Hasta la fecha, hemos integrado con éxito varios modelos grandes y establecido un flujo de trabajo integral que incluye procesamiento de datos, entrenamiento de modelos de ajuste fino supervisado (SFT), resultados de predicción y evaluación. El código desarrollado para este proyecto es fácilmente reutilizable dentro del propio proyecto.
A partir del 10 de octubre de 2023, utilizamos este proyecto para ajustar el modelo de código abierto de tamaño 13B, incorporando datos más relevantes. Con indicaciones de cero disparos y utilizando el conjunto de pruebas basado en Spider, hemos logrado una tasa de precisión de ejecución de 0,764 para una base de datos con un tamaño de 1,27G. Además, la precisión de ejecución de la base de datos señalada por el sitio web oficial de Spider, con un tamaño de 95M, es de 0,825.
Mejoramos el rendimiento de Texto a SQL aplicando el ajuste fino supervisado (SFT) en modelos de lenguaje grandes.
El conjunto de datos principal para los ejemplos de este proyecto es el conjunto de datos Spider :
Otros conjuntos de datos text2sql disponibles:
WikiSQL: un gran conjunto de datos de análisis semántico que consta de 80.654 expresiones de declaraciones naturales y anotaciones SQL de 24.241 tablas. Cada consulta en WikiSQL está limitada a la misma tabla y no contiene operaciones complejas como ordenar, agrupar. Las consultas en WikiSQL están limitadas a la misma tabla y no incluyen operaciones complejas como ordenar, agrupar, subconsultas, etc.
CHASE: un conjunto de datos chino text2sql interactivo de múltiples dominios y rondas que contiene una lista de 5,459 preguntas de múltiples rondas que consta de 17,940 grupos binarios
BIRD-SQL: un punto de referencia de texto a SQL entre dominios a gran escala en inglés, con un enfoque particular en el contenido de bases de datos de gran tamaño. El conjunto de datos contiene 12.751 pares de datos de texto a SQL y 95 bases de datos con un tamaño total de 33,4 GB en 37 dominios ocupacionales. El conjunto de datos BIRD-SQL cierra la brecha entre la investigación de texto a SQL y las aplicaciones del mundo real al explorar tres desafíos adicionales, a saber, lidiar con valores de bases de datos grandes y desordenados, inferencia de conocimiento externo y optimizar la eficiencia de la ejecución de SQL.
CoSQL: un corpus para construir sistemas conversacionales de texto a SQL entre dominios. Es una versión conversacional de las tareas Spider y SParC. CoSQL consta de más de 30.000 rondas y más de 10.000 consultas SQL anotadas de la colección del Mago de Oz de 3.000 conversaciones que consultan 200 bases de datos complejas en 138 dominios. Cada conversación simula un escenario realista de consulta de base de datos en el que un miembro del personal explora la base de datos como usuario y un experto en SQL utiliza SQL para recuperar respuestas, aclarar preguntas ambiguas o informar de otro modo.
Siguiendo la plantilla de procesamiento de NSQL, el conjunto de datos se sometió a un procesamiento básico, lo que produjo aproximadamente un conjunto de datos de 20 W.
DB-GPT-Hub actualmente admite los siguientes modelos base:
El modelo se ajusta en función de un bit de cuantificación de 4 utilizando aprendizaje cuantificado sobre arquitectura redundante (QLoRA). Los requisitos mínimos de hardware para esto pueden denominarse los siguientes:
Parámetros del modelo | RAM de la GPU | memoria RAM | DISCO |
---|---|---|---|
7b | 6GB | 3,6GB | 36,4GB |
13b | 13,4GB | 5,9GB | 60,2 GB |
Todos los parámetros relacionados están configurados al mínimo, con un tamaño de lote de 1 y una longitud máxima de 512. Según la experiencia, para un mejor rendimiento, se recomienda establecer los valores de longitud relacionados en 1024 o 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 .
En primer lugar, instale dbgpt-hub
con el siguiente comando
pip install dbgpt-hub
Luego, configure los argumentos y ejecute todo el proceso.
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 utiliza el método de generación de coincidencia de información para la preparación de datos, es decir, el método de generación SQL + Repositorio que combina información de la tabla. Este método combina información de la tabla de datos para comprender mejor la estructura y las relaciones de la tabla de datos y es adecuado para generar declaraciones SQL que cumplan con los requisitos.
Descargue el conjunto de datos de Spider desde el enlace del conjunto de datos de Spider. De forma predeterminada, después de descargar y extraer los datos, colóquelos en el directorio dbgpt_hub_sql/data, es decir, la ruta debe ser dbgpt_hub_sql/data/spider
.
Para la parte de preprocesamiento de datos, simplemente ejecute el siguiente script :
# # generate train and dev(eval) data
sh dbgpt_hub_sql/scripts/gen_train_eval_data.sh
En el directorio dbgpt_hub_sql/data/
, encontrará el archivo de entrenamiento recién generado example_text2sql_train.json y el archivo de prueba example_text2sql_dev.json, que contienen 8659 y 1034 entradas respectivamente. Para los datos utilizados en el ajuste fino posterior, establezca el valor del parámetro file_name
en el nombre de archivo del conjunto de entrenamiento en dbgpt_hub_sql/data/dataset_info.json, como example_text2sql_train.json
Los datos en el JSON generado se parecen a esto:
{
"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": []
},
El código de procesamiento de datos de chase
, cosql
y sparc
se ha integrado en el código de procesamiento de datos del proyecto. Después de descargar el conjunto de datos de acuerdo con el enlace anterior, solo necesita in
dbgpt_hub_sql/configs/config.py Just loosen the corresponding code comment in SQL_DATA_INFO
.
El ajuste del modelo admite los métodos LoRA y QLoRA. Podemos ejecutar el siguiente comando para ajustar el modelo. De forma predeterminada, con el parámetro --quantization_bit, utiliza el método de ajuste fino QLoRA. Para cambiar a LoRA, simplemente elimine el parámetro relacionado del script. Ejecute el comando:
sh dbgpt_hub_sql/scripts/train_sft.sh
Después del ajuste, los pesos del modelo se guardarán de forma predeterminada en la carpeta del adaptador, específicamente en el directorio dbgpt_hub_sql/output/adapter.
Si está utilizando entrenamiento con múltiples GPU y desea utilizar deepseed , debe modificar el contenido predeterminado en train_sft.sh. El cambio es:
CUDA_VISIBLE_DEVICES=0 python dbgpt_hub_sql/train/sft_train.py
--quantization_bit 4
...
cambiar a:
deepspeed --num_gpus 2 dbgpt_hub_sql/train/sft_train.py
--deepspeed dbgpt_hub_sql/configs/ds_config.json
--quantization_bit 4
...
si necesita la identificación de la tarjeta de pedido
deepspeed --include localhost:0,1 dbgpt_hub_sql/train/sft_train.py
--deepspeed dbgpt_hub_sql/configs/ds_config.json
--quantization_bit 4
...
Las otras partes que se omiten (…) se pueden mantener coherentes. Si desea cambiar la configuración profunda predeterminada, vaya al directorio dbgpt_hub_sql/configs
y realice cambios en ds_config.json según sea necesario; el valor predeterminado es stage2.
En el script, durante el ajuste fino, diferentes modelos corresponden a los parámetros clave lora_target y plantilla, como se muestra en la siguiente tabla:
nombre del modelo | lora_objetivo | plantilla |
---|---|---|
Llama-2 | q_proj,v_proj | llama2 |
CódigoLlama-2 | q_proj,v_proj | llama2 |
Baichuan2 | W_paquete | baichuan2 |
Qwen | c_attn | chatml |
sqlcoder-7b | q_proj,v_proj | mistral |
sqlcoder2-15b | c_attn | por defecto |
PasanteLM | q_proj,v_proj | interno |
XVERSO | q_proj,v_proj | xverso |
ChatGLM2 | valor_clave_consulta | chatglm2 |
Llama | q_proj,v_proj | - |
FLORACIÓN | valor_clave_consulta | - |
BLOOMZ | valor_clave_consulta | - |
Baichuan | W_paquete | baichuan |
Halcón | valor_clave_consulta | - |
En train_sft.sh
, otros parámetros clave son los siguientes:
quantization_bit: Indica si se aplica la cuantificación, siendo los valores válidos [4 u 8].
model_name_or_path: La ruta del LLM (Large Language Model).
conjunto de datos: especifica el nombre de la configuración del conjunto de datos de entrenamiento, correspondiente al valor de clave externa en dbgpt_hub_sql/data/dataset_info.json, como example_text2sql.
max_source_length: la longitud del texto ingresado en el modelo. Si los recursos informáticos lo permiten, se puede configurar lo más grande posible, como 1024 o 2048.
max_target_length: la longitud del contenido SQL generado por el modelo; 512 es generalmente suficiente.
output_dir: la ruta de salida del módulo Peft durante SFT (ajuste fino supervisado), establecida de forma predeterminada endbgpt_hub_sql/output/adapter/
.
per_device_train_batch_size: el tamaño del lote. Si los recursos informáticos lo permiten, se puede aumentar; el valor predeterminado es 1.
gradient_accumulation_steps: el número de pasos para acumular gradientes antes de una actualización.
save_steps: el número de pasos en los que se guardan los puntos de control del modelo; se puede configurar en 100 de forma predeterminada.
num_train_epochs: el número de épocas para entrenar el conjunto de datos.
En el directorio del proyecto ./dbgpt_hub_sql/output/pred/, esta carpeta es la ubicación de salida predeterminada para las predicciones del modelo (si no existe, solo mkdir).
sh ./dbgpt_hub_sql/scripts/predict_sft.sh
En el script, por defecto con el parámetro --quantization_bit
, predice usando QLoRA. Al eliminarlo se cambia al método de predicción LoRA. El valor del parámetro predicted_input_filename
es su archivo de conjunto de datos de prueba de predicción. --predicted_out_filename
es el nombre de archivo de los resultados previstos del modelo.
Puede encontrar los pesos del segundo modelo correspondiente en Huggingface hg-eosphoros-ai. Subimos los pesos de LoRA en octubre, cuya precisión de ejecución en el conjunto de evaluación Spider alcanzó 0,789.
Si necesita fusionar los pesos del modelo base entrenado y el módulo Peft ajustado para exportar un modelo completo, ejecute el siguiente script de exportación de modelo:
sh ./dbgpt_hub_sql/scripts/export_merge.sh
Asegúrese de reemplazar los valores de la ruta de los parámetros en el script con las rutas correspondientes a su proyecto.
Para evaluar el rendimiento del modelo en el conjunto de datos, el valor predeterminado es el conjunto de datos de desarrollo de araña. Ejecute el siguiente comando:
python dbgpt_hub_sql/eval/evaluation.py --plug_value --input Your_model_pred_file
Puede encontrar los resultados de nuestra última revisión y parte de los resultados del experimento aquí.
Nota : La base de datos a la que apunta el código predeterminado es una base de datos de 95M descargada del [sitio web oficial de Spider] (https://yale-lily.github.io/spider). Si necesita utilizar la base de datos Spider (tamaño 1,27G) en el conjunto de pruebas, primero descargue la base de datos en el enlace al directorio personalizado y ejecute el comando de evaluación anterior que agrega parámetros y valores como --db Your_download_db_path
.
Todo el proceso lo dividiremos en tres fases:
Etapa 1:
Actualmente, ofrecemos soporte para las siguientes características:
Etapa 2:
20231010
prompts
Etapa 3:
Si nuestro trabajo le ha brindado aunque sea una pequeña medida de ayuda, considere darnos una estrella. Sus comentarios y apoyo nos sirven como motivación para continuar publicando más trabajos relacionados y mejorando nuestros esfuerzos. ¡Gracias!
Invitamos calurosamente a más personas a unirse a nosotros y participar activamente en varios aspectos de nuestro proyecto, como conjuntos de datos, ajuste de modelos, evaluación del desempeño, recomendaciones de documentos y reproducción de códigos. No dude en abrir incidencias o solicitudes de extracción (PR) y seremos proactivos a la hora de responder a sus contribuciones.
Antes de enviar su código, asegúrese de que esté formateado de acuerdo con el estilo negro usando el siguiente comando:
black dbgpt_hub
Si tiene más tiempo para ejecutar una verificación de tipo y estilo más detallada de su código, utilice el siguiente comando:
pyright dbgpt_hub
pylint dbgpt_hub
Si tiene alguna pregunta o necesita más ayuda, no dude en comunicarse. ¡Agradecemos su participación!
Nuestro trabajo se basa principalmente en la base de numerosas contribuciones de código abierto. Gracias a los siguientes proyectos de código abierto.
Gracias a todos los contribuyentes, especialmente a @JBoRu, quien planteó el problema que nos recordó agregar una nueva forma de evaluación prometedora, es decir, Test Suite. Como menciona el artículo "SQL-PALM: ADAPTACIÓN MEJORADA DEL MODELO DE LENGUAJE GRANDE PARA TEXTO A SQL", "Consideramos dos métricas de evaluación de uso común: precisión de ejecución (EX) y precisión del conjunto de pruebas (TS). EX mide si el El resultado de la ejecución de SQL coincide con la verdad fundamental (GT), mientras que TS mide si SQL pasa todas las evaluaciones EX para múltiples pruebas, generadas por el aumento de la base de datos. Dado que EX contiene falsos positivos, consideramos TS como una evaluación más confiable. métrica".
Si considera que DB-GPT-Hub
es útil para su investigación o desarrollo, cite el siguiente artículo:
@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.' }
}
La licencia MIT (MIT)
Estamos colaborando como comunidad y si tiene alguna idea sobre nuestro trabajo comunitario, no dude en ponerse en contacto con nosotros. Si está interesado en profundizar en un experimento en profundidad y optimizar el subproyecto DB-GPT-Hub, puede comunicarse con 'wangzai' dentro del grupo WeChat. ¡Agradecemos de todo corazón sus contribuciones para hacerlo aún mejor juntos!