LLM のコード: SQLCoder の紹介、インストール、およびその使用方法に関する詳細なガイド

LLM のコード: SQLCoder の紹介、インストール、およびその使用方法に関する詳細なガイド

目次

SQLCoder の概要

1. 結果

2. 質問カテゴリー別の結果

SQL Coderのインストール

1. ハードウェア要件

2. モデルの重みをダウンロードする

3. SQL Coder を使用する

4.Colab で SQLCoder を実行する

最初のステップは環境を構成することです

第 2 ステップ、テスト

3 番目のステップでは、モデルをダウンロードします。

ステップ 4、質問とプロンプトを設定し、トークン化する

5 番目のステップは SQL を生成することです

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 4090RTX 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 を実行する

アドレス: https://colab.research.google.com/drive/1z4rmOEiFkxkMiecAWeTUlPl0OmKgfEu7?usp=sharing#scrollTo=MKuocI44V-Bo

最初のステップは環境を構成することです

!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の使い方

更新中……

おすすめ

転載: blog.csdn.net/qq_41185868/article/details/132571527