LLM のコード: SQLCoder の紹介、インストール、およびその使用方法に関する詳細なガイド
目次
SQLCoderの概要
2023 年 8 月に、自然言語の質問を SQL クエリに変換するための高度な LLM である SQLCoder がリリースされました。SQLCoder は、基本的な StarCoder モデルに基づいて微調整されています。150 億のパラメーターを持つモデルである SQLCoder は、sql-eval フレームワーク上で自然言語から SQL を生成するタスクにおいて gpt-3.5-turbo を上回り、すべての人気のあるオープン ソース モデルの中で大幅にパフォーマンスを向上させます。また、サイズが 10 倍以上ある text-davinci-003 モデルよりも大幅に優れています。
Defog は、2 エポックにわたって人間がスクリーニングした 10537 の質問に基づいてトレーニングされました。問題は10パターンから出題されます。学習データには、評価フレームワークのパターンが含まれていません。
トレーニングは 2 つのフェーズに分かれています。1段階目は「易しい」または「中級」の難易度に分類された問題が出題され、2段階目は「難しい」または「超難問」の難易度に分類された問題が出題されます。
easy+medium データのトレーニング結果は、defog-easy と呼ばれるモデルに保存されます。ハードデータとエクストラハードデータで追加のトレーニングを行うと、パフォーマンスが 7 パーセント向上することがわかりました。
公式サイトオンラインテスト: https: //defog.ai/sqlcoder-demo/
GitHub官网: GitHub - defog-ai/sqlcoder: 自然言語の質問をSQLクエリに変換するためのSoTA LLM
1.結果
モデル |
perc_correct |
gpt-4 |
74.3 |
デフォグ-sqlcoder |
64.6 |
gpt-3.5-ターボ |
60.6 |
デフォグ-easysql |
57.1 |
テキスト-ダヴィンチ-003 |
54.3 |
ウィザードコーダー |
52.0 |
スターコーダー |
45.1 |
2.質問カテゴリー別の結果
生成された各質問は 5 つのカテゴリのいずれかに分類されます。この表は、各モデルのカテゴリ別に分類された正答率を示しています。
クエリカテゴリ |
gpt-4 |
デフォグ-sqlcoder |
gpt-3.5-ターボ |
曇り止めが簡単 |
テキスト-ダヴィンチ-003 |
ウィザードコーダー |
スターコーダー |
グループ化 |
82.9 |
77.1 |
71.4 |
62.9 |
62.9 |
68.6 |
54.3 |
注文方法 |
71.4 |
65.7 |
60.0 |
68.6 |
60.0 |
54.3 |
57.1 |
比率 |
62.9 |
57.1 |
48.6 |
40.0 |
37.1 |
22.9 |
17.1 |
テーブル結合 |
74.3 |
57.1 |
60.0 |
54.3 |
51.4 |
54.3 |
51.4 |
どこ |
80.0 |
65.7 |
62.9 |
60.0 |
60.0 |
60.0 |
45.7 |
SQL Coderのインストール
1.ハードウェア要件
SQLCoder は、bfloat16 重みを使用して、A100 40GB GPU でテストされています。20 GB 以上のメモリを備えたコンシューマ GPUにモデルの 8 ビットおよび 4 ビット量子化バージョンをロードすることもできます。例には、RTX 4090、RTX 3090、および 20GB 以上のメモリを搭載した Apple の M2 Pro、M2 Max、または M2 Ultra チップが含まれます。
2. モデルの重みをダウンロードする
アドレス: defog/sqlcoder · ハグフェイス
3. SQL Coder を使用する
Hugging Face リポジトリからモデルの重みをダウンロードすることで、トランスフォーマー ライブラリを通じて SQLCoder を使用できます。サンプル データベース スキーマを推論するためのサンプル コードを追加しました。
python inference.py -q "Question about the sample database goes here"
質問の例: ニューヨークの顧客と比較して、サンフランシスコの顧客から得られる収益は多いですか? 各都市の合計収入と 2 つの都市間の差額が表示されます。Web サイトのデモを使用したり、Colab で SQLCoder を実行したりすることもできます。
4.Colabで SQLCoder を実行する
最初のステップは環境を構成することです
!pip install torch transformers bitsandbytes accelerate
第 2 ステップ、テスト
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
torch.cuda.is_available()
3 番目のステップでは、モデルをダウンロードします。
Colab Pro (または 30GB 以上の VRAM を備えたシステム)の A100を使用して、bf16 にロードします。利用できない場合は、少なくとも20 GBの VRAM を備えた GPU を使用して 8 ビットでロードするか、少なくとも 12 GB の VRAM を備えた 4 ビットでロードします。Colab では、V100 では正常に動作しますが、T4 ではクラッシュします。
最初にモデルをダウンロードし、それをメモリにロードする手順には約 10 分かかります。だから待っててください:)
model_name = "defog/sqlcoder"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
# torch_dtype=torch.bfloat16,
# load_in_8bit=True,
load_in_4bit=True,
device_map="auto",
use_cache=True,
)
ステップ 4、質問とプロンプトを設定し、トークン化する
以下の質問を自由に変更してください。独自のデータベース スキーマを試したい場合は、プロンプトでスキーマを編集します。
question = "What product has the biggest fall in sales in 2022 compared to 2021? Give me the product name, the sales amount in both years, and the difference."
prompt = """### Instructions:
Your task is to convert a question into a SQL query, given a Postgres database schema.
Adhere to these rules:
- **Deliberately go through the question and database schema word by word** to appropriately answer the question
- **Use Table Aliases** to prevent ambiguity. For example, `SELECT table1.col1, table2.col1 FROM table1 JOIN table2 ON table1.id = table2.id`.
- When creating a ratio, always cast the numerator as float
### Input:
Generate a SQL query that answers the question `{question}`.
This query will run on a database whose schema is represented in this string:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY, -- Unique ID for each product
name VARCHAR(50), -- Name of the product
price DECIMAL(10,2), -- Price of each unit of the product
quantity INTEGER -- Current quantity in stock
);
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY, -- Unique ID for each customer
name VARCHAR(50), -- Name of the customer
address VARCHAR(100) -- Mailing address of the customer
);
CREATE TABLE salespeople (
salesperson_id INTEGER PRIMARY KEY, -- Unique ID for each salesperson
name VARCHAR(50), -- Name of the salesperson
region VARCHAR(50) -- Geographic sales region
);
CREATE TABLE sales (
sale_id INTEGER PRIMARY KEY, -- Unique ID for each sale
product_id INTEGER, -- ID of product sold
customer_id INTEGER, -- ID of customer who made purchase
salesperson_id INTEGER, -- ID of salesperson who made the sale
sale_date DATE, -- Date the sale occurred
quantity INTEGER -- Quantity of product sold
);
CREATE TABLE product_suppliers (
supplier_id INTEGER PRIMARY KEY, -- Unique ID for each supplier
product_id INTEGER, -- Product ID supplied
supply_price DECIMAL(10,2) -- Unit price charged by supplier
);
-- sales.product_id can be joined with products.product_id
-- sales.customer_id can be joined with customers.customer_id
-- sales.salesperson_id can be joined with salespeople.salesperson_id
-- product_suppliers.product_id can be joined with products.product_id
### Response:
Based on your instructions, here is the SQL query I have generated to answer the question `{question}`:
```sql
""".format(question=question)
eos_token_id = tokenizer.convert_tokens_to_ids(["```"])[0]
5 番目のステップはSQL を生成することです
4 ビット量子化を使用する V100 では非常に遅くなる可能性があります。各クエリには約 1 ~ 2 分かかる場合があります。1 台の A100 40GB では、約 10 ~ 20 秒かかります。
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(
**inputs,
num_return_sequences=1,
eos_token_id=eos_token_id,
pad_token_id=eos_token_id,
max_new_tokens=400,
do_sample=False,
num_beams=5
)
outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
torch.cuda.empty_cache()
torch.cuda.synchronize()
# 清空缓存,以便在内存崩溃时可以生成更多结果
# 在Colab上特别重要 - 内存管理要简单得多
# 在运行推断服务时
# 嗯!生成的SQL在这里:
print(outputs[0].split("```sql")[-1].split("```")[0].split(";")[0].strip() + ";")
SQLCoderの使い方
更新中……