🛒 Qwen2.5-Coder-7B-Retail-Text2SQL-ID

Model Spesialis Text-to-SQL Berbahasa Indonesia untuk Domain Ritel, POS, & E-Commerce

Base Model PEFT Language Task License


📋 Daftar Isi


📌 Deskripsi Model

Qwen2.5-Coder-7B-Retail-Text2SQL-ID adalah LoRA fine-tuned adapter dari model fondasi Qwen/Qwen2.5-Coder-7B-Instruct. Model ini dilatih khusus untuk memahami terminologi bisnis dan operasional ritel Indonesia (seperti omzet, retur barang, stok menipis, diskon promo, margin kotor, cabang toko, kasir, metode pembayaran QRIS/tunai/transfer) dan mengonversinya menjadi kueri SQL yang presisi dan efisien.

🌟 Fitur Unggulan

  • 🇮🇩 Pemahaman Konteks Lokal: Mengerti bahasa alami percakapan bisnis ritel Indonesia tanpa perlu translasi ke bahasa Inggris.
  • 🔗 Kemampuan Multi-Table Relational: Menguasai pembentukan klausa JOIN antar tabel transaksi, detail barang, pelanggan, kasir, dan master cabang.
  • 📊 Kueri Analitik & Agregasi: Mampu menghasilkan query GROUP BY, HAVING, fungsi jendela (ROW_NUMBER(), RANK()), serta kalkulasi subtotal/omzet secara tepat.
  • 🗄️ Kompatibilitas Dialek SQL: Mendukung sintaks standar ANSI SQL yang kompatibel dengan PostgreSQL, MySQL, MariaDB, dan SQLite.
  • ⚡ Adapter Ringan: Bobot adapter di bawah 100MB sehingga fleksibel dipasang di berbagai infrastruktur on-premise maupun cloud.

⚙️ Konfigurasi LoRA

Berdasarkan metadata adapter:

Parameter Nilai Penjelasan
Base Model Qwen/Qwen2.5-Coder-7B-Instruct 7B SOTA instruction code model
LoRA Rank ($r$) 16 Dimensi subspace adaptasi
LoRA Alpha ($\alpha$) 32 Faktor pengali bobot gradien
LoRA Dropout 0.05 Regularisasi untuk mencegah overfitting
Target Modules q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj Seluruh proyeksi linear modul attention & MLP
Task Type CAUSAL_LM Model generasi autoregresif

🚀 Panduan Penggunaan (Inference)

Dependensi

pip install torch transformers peft accelerate bitsandbytes

Opsi A: Standar (Transformers + PEFT)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"

tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
    BASE_ID,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True
)
model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
model.eval()

Opsi B: Hemat Memori (4-bit Quantization)

Gunakan opsi ini jika Anda menjalankan model pada GPU dengan VRAM terbatas (8GB - 16GB):

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)

tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
    BASE_ID,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True
)

model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
model.eval()

# Definisi Skema & Prompt
schema = """
CREATE TABLE transaksi (
    id_transaksi VARCHAR(20) PRIMARY KEY,
    tanggal DATE,
    id_cabang VARCHAR(10),
    total_bayar DECIMAL(12, 2),
    metode_bayar VARCHAR(30)
);

CREATE TABLE detail_transaksi (
    id_detail VARCHAR(20) PRIMARY KEY,
    id_transaksi VARCHAR(20) REFERENCES transaksi(id_transaksi),
    id_produk VARCHAR(10),
    nama_produk VARCHAR(100),
    kategori VARCHAR(50),
    jumlah INT,
    harga_satuan DECIMAL(12, 2)
);
"""

user_question = "Berapa total pendapatan dari metode pembayaran QRIS per kategori barang di bulan Januari 2024?"

prompt_content = f"""### Skema Database:
{schema.strip()}

### Pertanyaan:
{user_question}

### SQL:"""

messages = [
    {
        "role": "system",
        "content": "Kamu adalah database architect dan ahli SQL yang menerjemahkan pertanyaan bahasa Indonesia ke SQL query berdasarkan skema database yang disediakan."
    },
    {"role": "user", "content": prompt_content}
]

text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=256,
        temperature=0.0,
        do_sample=False,
        pad_token_id=tokenizer.eos_token_id
    )

hasil_sql = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(hasil_sql)

Opsi C: Merge Adapter ke Base Model

Jika Anda ingin mengekspor model menjadi standalone model untuk inferensi berkecepatan tinggi dengan vLLM, atau dikonversi ke GGUF / Ollama:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"
OUTPUT_DIR = "./qwen2.5-coder-7b-retail-text2sql-id-merged"

print("Memuat base model...")
base_model = AutoModelForCausalLM.from_pretrained(
    BASE_ID,
    torch_dtype=torch.float16,
    device_map="cpu",
    trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)

print("Memasang LoRA adapter...")
model = PeftModel.from_pretrained(base_model, ADAPTER_ID)

print("Menggabungkan bobot (merging)...")
merged_model = model.merge_and_unload()

print(f"Menyimpan model hasil merge ke {OUTPUT_DIR}...")
merged_model.save_pretrained(OUTPUT_DIR, safe_serialization=True)
tokenizer.save_pretrained(OUTPUT_DIR)
print("Selesai! Model siap digunakan pada vLLM atau dikonversi ke GGUF.")

💡 Contoh Kasus & Output

1. Manajemen Stok & Peringatan Reorder

  • Pertanyaan: "Tampilkan produk apa saja yang sisa stoknya kurang dari 15 buah dan urutkan dari yang paling sedikit."
  • Output SQL:
SELECT id_produk, nama_produk, kategori, stok
FROM produk
WHERE stok < 15
ORDER BY stok ASC;

2. Multi-Table JOIN & Analisis Performa Cabang

  • Pertanyaan: "Tampilkan 5 cabang dengan total penjualan tertinggi beserta nama kotanya pada kuartal 1 tahun 2024."
  • Output SQL:
SELECT 
    c.id_cabang, 
    c.nama_cabang, 
    c.kota, 
    SUM(t.total_bayar) AS total_omzet
FROM cabang c
JOIN transaksi t ON c.id_cabang = t.id_cabang
WHERE t.tanggal BETWEEN '2024-01-01' AND '2024-03-31'
GROUP BY c.id_cabang, c.nama_cabang, c.kota
ORDER BY total_omzet DESC
LIMIT 5;

📝 Format Prompt Rekomendasi

Gunakan struktur prompt berikut untuk konsistensi akurasi tertinggi:

<|im_start|>system
Kamu adalah database architect dan ahli SQL yang menerjemahkan pertanyaan bahasa Indonesia ke SQL query berdasarkan skema database yang disediakan.<|im_end|>
<|im_start|>user
### Skema Database:
[Letakkan DDL atau deskripsi tabel di sini]

### Pertanyaan:
[Pertanyaan operasional / bisnis ritel dalam bahasa Indonesia]

### SQL:<|im_end|>
<|im_start|>assistant

🛡️ Praktik Keamanan & Batasan

  1. Akses Read-Only Database: Kueri hasil AI harus dieksekusi dengan akun database berizin SELECT saja untuk mencegah risiko modifikasi data tanpa sengaja.
  2. Kueri Ambigu: Pastikan skema tabel mencantumkan relasi FOREIGN KEY jika pertanyaan memerlukan penggabungan multi-tabel yang kompleks.
  3. Execution Boundary: Selalu gunakan query timeout limit (misalnya 10-30 detik) pada database engine analitik Anda untuk mencegah bottleneck beban kueri.

📄 Lisensi & Atribusi

Downloads last month
40
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for rizalbasri/qwen2.5-coder-7b-retail-text2sql-id

Base model

Qwen/Qwen2.5-7B
Adapter
(841)
this model