🚀 ChatDBによるNatural - SQL - 7B
Natural - SQL - 7Bは、Text - to - SQL命令において非常に強力な性能を持つモデルです。複雑な質問に対する理解能力に優れ、同サイズのモデルを上回る性能を発揮します。
ChatDB.ai | Notebook | Twitter
🚀 クイックスタート
モデルのロード
まずは、transformers
ライブラリの正しいバージョンをインストールしましょう。
pip install transformers==4.35.2
次に、以下のPythonコードを使用してモデルをロードします。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("chatdb/natural-sql-7b")
model = AutoModelForCausalLM.from_pretrained(
"chatdb/natural-sql-7b",
device_map="auto",
torch_dtype=torch.float16,
)
SQLの生成
以下のコードを使用してSQLを生成できます。
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(
**inputs,
num_return_sequences=1,
eos_token_id=100001,
pad_token_id=100001,
max_new_tokens=400,
do_sample=False,
num_beams=1,
)
outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
print(outputs[0].split("```sql")[-1])
✨ 主な機能
Natural - SQLは、他のモデルが苦手とする複雑な複合質問も処理できます。詳細なレポートはこちらにあります。
📦 インストール
モデルを使用するには、transformers
ライブラリの正しいバージョンをインストールする必要があります。
pip install transformers==4.35.2
💻 使用例
基本的な使用法
モデルのロードとSQLの生成の基本的なコードは以下の通りです。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("chatdb/natural-sql-7b")
model = AutoModelForCausalLM.from_pretrained(
"chatdb/natural-sql-7b",
device_map="auto",
torch_dtype=torch.float16,
)
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(
**inputs,
num_return_sequences=1,
eos_token_id=100001,
pad_token_id=100001,
max_new_tokens=400,
do_sample=False,
num_beams=1,
)
outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
print(outputs[0].split("```sql")[-1])
📚 ドキュメント
プロンプトテンプレート
# タスク
次の質問に答えるSQLクエリを生成してください: `{自然言語の質問}`
### PostgreSQLデータベーススキーマ
クエリは以下のスキーマを持つデータベースで実行されます:
<SQLテーブルDDLステートメント>
# SQL
次の質問に答えるSQLクエリはこちらです: `{自然言語の質問}`
'''sql
例のSQL出力
例のスキーマ
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password_hash TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE projects (
project_id SERIAL PRIMARY KEY,
project_name VARCHAR(100) NOT NULL,
description TEXT,
start_date DATE,
end_date DATE,
owner_id INTEGER REFERENCES users(user_id)
);
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name VARCHAR(100) NOT NULL,
description TEXT,
due_date DATE,
status VARCHAR(50),
project_id INTEGER REFERENCES projects(project_id)
);
CREATE TABLE taskassignments (
assignment_id SERIAL PRIMARY KEY,
task_id INTEGER REFERENCES tasks(task_id),
user_id INTEGER REFERENCES users(user_id),
assigned_date DATE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
task_id INTEGER REFERENCES tasks(task_id),
user_id INTEGER REFERENCES users(user_id)
);
例のSQL出力
質問: 最も多くのユーザーが登録した日を教えてください
SELECT created_at::DATE AS day, COUNT(*) AS user_count
FROM users
GROUP BY day
ORDER BY user_count DESC
LIMIT 1;
質問: 最も多くのコメントがあるタスクを持つプロジェクトを教えてください
SELECT p.project_name, t.task_name, COUNT(c.comment_id) AS comment_count
FROM projects p
JOIN tasks t ON p.project_id = t.project_id
JOIN comments c ON t.task_id = c.task_id
GROUP BY p.project_name, t.task_name
ORDER BY comment_count DESC
LIMIT 1;
質問: Gmailアドレスを持つユーザーと持たないユーザーの比率は何ですか?
SELECT
SUM(CASE WHEN email ILIKE '%@gmail.com%' THEN 1 ELSE 0 END)::FLOAT / NULLIF(SUM(CASE WHEN email NOT ILIKE '%@gmail.com%' THEN 1 ELSE 0 END), 0) AS gmail_ratio
FROM
users;
📄 ライセンス
モデルの重みはCC BY - SA 4.0
ライセンスの下で提供されており、元のモデルのDeepseekライセンスから拡張された責任ある使用のガイドラインがあります。モデルを商用目的で使用したり、適応させることができます。重みを変更した場合、例えばファインチューニングを行った場合、同じCC BY - SA 4.0
ライセンスの下で変更内容を公開する必要があります。
📊 ベンチマーク
SQL - Evalを通じた未学習の新しいデータセットでの結果
defogチームがsql - evalをオープンソース化してくれたことに大きな感謝を申し上げます👏
📋 モデル情報
属性 |
詳情 |
モデルタイプ |
自然言語をSQLに変換するモデル |
ベースモデル |
deepseek - ai/deepseek - coder - 6.7b - instruct |
ライセンス |
CC BY - SA 4.0 |
パイプラインタグ |
テキスト生成 |
タグ |
instruct, finetune |
ライブラリ名 |
transformers |