简体中文|不和|微信|抱き顔|コミュニティ|紙
テキスト2SQL | Text2NLU
Text2SQL 評価実行精度 (ex) メトリック。これを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 | |
ラマ2-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 | |
百川2-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 | |
百川2-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 | |
クウェン-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) を利用して Text-to-SQL 解析を実現する実験的なプロジェクトです。このプロジェクトには、データ収集、データの前処理、モデルの選択と構築、モデルの重みの微調整などのさまざまな段階が含まれます。これらのプロセスを通じて、モデルのトレーニング コストを削減しながら Text-to-SQL 機能を強化し、より多くの開発者が Text-to-SQL の精度向上に貢献できるようにすることを目的としています。私たちの最終的な目標は、データベースに基づいた自動質問応答機能を実現し、ユーザーが自然言語記述を使用して複雑なデータベース クエリを実行できるようにすることです。
現在までに、当社は複数の大規模モデルを統合することに成功し、データ処理、教師あり微調整 (SFT) モデルのトレーニング、予測出力、評価を含む包括的なワークフローを確立してきました。このプロジェクト用に開発されたコードは、プロジェクト自体内で簡単に再利用できます。
2023 年 10 月 10 日の時点で、私たちはこのプロジェクトを使用してオープンソースの 13B サイズのモデルを微調整し、より関連性の高いデータを組み込みました。ゼロショット プロンプトと Spider ベースのテスト スイートを利用した結果、サイズ 1.27G のデータベースに対して 0.764 の実行精度を達成しました。さらに、Spider 公式 Web サイトで示されているデータベースの実行精度は 95M で、0.825 です。
大規模な言語モデルに教師ありファインチューニング (SFT) を適用することで、Text-to-SQL のパフォーマンスを強化します。
このプロジェクトの例の主要なデータセットはSpiderデータセットです。
利用可能な他の text2sql データセット:
WikiSQL: 80,654 の自然なステートメント式と 24,241 のテーブルの SQL アノテーションで構成される大規模な意味解析データセット。 WikiSQL の各クエリは同じテーブルに限定され、並べ替え、グループ化などの複雑な操作は含まれません。 WikiSQL のクエリは同じテーブルに限定され、並べ替え、グループ化、サブクエリなどの複雑な操作は含まれません。
CHASE: クロスドメインのマルチラウンド インタラクティブな text2sql 中国語データセットには、280 の異なるドメイン データベースにわたる 17,940 の
BIRD-SQL: 英語の大規模なクロスドメインのテキストから SQL へのベンチマーク。特に大規模なデータベース コンテンツに重点を置いています。このデータセットには、12,751 個のテキストと SQL のデータ ペアと、37 の職業ドメインにわたる合計サイズ 33.4 GB の 95 個のデータベースが含まれています。 BIRD-SQL データセットは、大規模で乱雑なデータベース値の処理、外部知識の推論、SQL 実行効率の最適化という 3 つの追加の課題を調査することで、テキストから SQL への研究と現実世界のアプリケーションとの間のギャップを埋めます。
CoSQL: クロスドメインの会話型テキストから SQL システムを構築するためのコーパス。これは、Spider および SParC タスクの会話バージョンです。 CoSQL は、138 ドメインにわたる 200 の複雑なデータベースをクエリする、オズの魔法使いの 3,000 の会話コレクションからの 30,000 を超えるラウンドと 10,000 を超える注釈付き SQL クエリで構成されています。各会話は、スタッフ メンバーがユーザーとしてデータベースを探索し、SQL エキスパートが SQL を使用して回答を取得したり、曖昧な質問を明確にしたり、その他の情報を提供したりする現実的な DB クエリ シナリオをシミュレートします。
NSQL の処理テンプレートに従って、データセットに基本的な処理が行われ、約 20W のデータセットが生成されました。
DB-GPT-Hub は現在、次の基本モデルをサポートしています。
モデルは、冗長アーキテクチャ上の量子化学習 (QLoRA) を使用して、量子化ビット 4 に基づいて微調整されます。このための最小ハードウェア要件は次のように参照できます。
モデルパラメータ | GPU RAM | CPU RAM | ディスク |
---|---|---|---|
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 + リポジトリ生成方式を使用します。この方法は、データ テーブルの情報を組み合わせてデータ テーブルの構造と関係をより深く理解し、要件を満たす 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
値を、dbgpt_hub_sql/data/dataset_info.json 内のトレーニング セットのファイル名 (example_text2sql_train.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
...
省略されている他の部分 (…) は一貫性を保つことができます。デフォルトのディープシード構成を変更する場合は、 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 | クエリキー値 | チャットグラム2 |
ラマ | q_proj、v_proj | - |
咲く | クエリキー値 | - |
ブルームズ | クエリキー値 | - |
白川 | W_パック | 白川 |
ファルコン | クエリキー値 | - |
train_sft.sh
の他の主要なパラメータは次のとおりです。
quantization_bit: 量子化が適用されるかどうかを示します。有効な値は [4 または 8] です。
model_name_or_path: LLM (大規模言語モデル) のパス。
dataset: dbgpt_hub_sql/data/dataset_info.json の外部キー値に対応するトレーニング データセット構成の名前を指定します (example_text2sql など)。
max_source_length: モデルに入力されるテキストの長さ。コンピューティング リソースが許せば、1024 や 2048 など、できるだけ大きく設定できます。
max_target_length: モデルによって出力される SQL コンテンツの長さ。通常は 512 で十分です。
Output_dir: SFT (監視付き微調整) 中の 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
、モデルの予測結果のファイル名です。
2 番目の対応するモデルの重みは 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
最新のレビュー結果と実験結果の一部はここでご覧いただけます
注: デフォルトのコードが指すデータベースは、[Spider 公式 Web サイト] (https://yale-lily.github.io/spider) からダウンロードされた 95M データベースです。テストスイートで Spider データベース (サイズ 1.27G) を使用する必要がある場合は、まずカスタム ディレクトリへのリンクにあるデータベースをダウンロードし、 --db Your_download_db_path
などのパラメータと値を追加する上記の評価コマンドを実行してください。
プロセス全体を 3 つのフェーズに分けて説明します。
ステージ 1:
現在、次の機能のサポートを提供しています。
ステージ 2:
20231010
までにさまざまな方法でより多くの異なるモデルの微調整をサポートします。 prompts
を最適化するステージ 3:
私たちの取り組みが少しでもあなたのお役に立てた場合は、星を付けることをご検討ください。皆様のフィードバックとサポートは、より多くの関連作品をリリースし、取り組みを改善し続けるための動機となります。ありがとう!
私たちは、データセット、モデルの微調整、パフォーマンス評価、論文の推奨事項、コードの再現など、プロジェクトのさまざまな側面に積極的に参加していただけるよう、より多くの方々を心から歓迎します。遠慮なくイシューやプルリクエスト (PR) をオープンしてください。私たちはあなたの貢献に積極的に対応します。
コードを送信する前に、次のコマンドを使用してコードが黒のスタイルに従ってフォーマットされていることを確認してください。
black dbgpt_hub
コードのより詳細な型チェックとスタイル チェックを実行する時間がある場合は、次のコマンドを使用してください。
pyright dbgpt_hub
pylint dbgpt_hub
ご質問がある場合、またはさらにサポートが必要な場合は、お気軽にお問い合わせください。ぜひご参加ください。
私たちの仕事は主に、多数のオープンソースの貢献の基盤に基づいています。以下のオープンソース プロジェクトのおかげで
すべての貢献者、特に、新しい有望な評価方法、つまりテスト スイートの追加を思い出させる問題を提起してくれた @JBoRu に感謝します。論文《SQL-PALM: IMPROVED LARGE LANGUAGE MODEL ADAPTATION FOR TEXT-TO-SQL》では、「実行精度 (EX) とテストスイート精度 (TS) という 2 つの一般的に使用される評価指標を考慮します。EX は、 SQL の実行結果はグラウンド トゥルース (GT) と一致しますが、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' に連絡してください。一緒にさらに良いものにしていくためのあなたの貢献を心から歓迎します。