Team Ai
Apppublic

Priyabrat14/salesquery-nl2sql

sourceHugging Facemitupdated 7mo agoView on Hugging Face
0likes
App README

SalesQuery AI — Natural Language to SQL

Fine-tuned Llama 3.2 1B Instruct with QLoRA on a custom E-Commerce Sales Analytics NL-SQL dataset. Ask plain English questions, get production-ready SQL.

Domain: E-Commerce / Retail Sales Analytics Stack: HuggingFace · PEFT · TRL · QLoRA · Gradio


Schema (4 Tables)

customers    → customer_id, name, email, region, segment, country, acquisition_date, is_active
products     → product_id, name, category, subcategory, unit_price, unit_cost
orders       → order_id, customer_id, order_date, status, discount_pct, sales_channel
order_items  → item_id, order_id, product_id, quantity, unit_price, revenue

Real-world equivalent: Shopify / Salesforce CRM / SAP ERP order management data.


Example Queries

Natural LanguageSQL Complexity
"Total revenue by region"Medium (3-table JOIN)
"Top 5 customers by lifetime value"Medium (GROUP BY + ORDER BY)
"Month-over-month revenue growth 2024"Hard (CTE + Window)
"Customers who ordered in 2023 but not 2024"Hard (Subquery)
"Top product in each category by revenue"Hard (PARTITION BY RANK)
"Revenue from top 10% of customers"Hard (NTILE)
"Cancellation rate by sales channel"Hard (CASE WHEN)
"Total revenue from B2B customers in North region"Medium (JOIN + filter)

Training Details

ParameterValue
Base Modelmeta-llama/Llama-3.2-1B-Instruct
MethodQLoRA (4-bit NF4 quantization)
LoRA rank16
LoRA alpha32
Target modulesqproj, kproj, vproj, oproj, gateproj, upproj, down_proj
Epochs3
Learning rate2e-4
Batch size2 (effective 8 with grad accum)
Optimizerpagedadamw8bit
Schedulercosine
Max seq length1024
Dataset1005 NL-SQL pairs (854 train / 151 eval)
Complexity split259 simple · 695 medium · 51 hard
Years covered2022, 2023, 2024

Dataset Coverage

The training data covers queries across multiple dimensions:

  • —Regions: North, South, East, West
  • —Segments: B2B, B2C
  • —Countries: India, USA, UK, Germany, Singapore, Australia
  • —Categories: Electronics, Clothing, Furniture, Software, Food
  • —Channels: online, offline, partner
  • —Cross-dimensional: region × year, segment × category, channel × status, etc.
  • —SQL features: JOINs, GROUP BY, HAVING, CTEs, Window functions (RANK, LAG, NTILE, SUM OVER), Subqueries, CASE WHEN

Evaluation Metrics

MetricDescription
Execution Accuracy% of queries that run without SQL errors
Result Match% of queries returning correct rows
Exact Match% matching the reference SQL exactly
Hallucination Rate% of queries with invented column/table names

Usage

python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model = AutoModelForCausalLM.from_pretrained(
    "YOUR_USERNAME/salesquery-nl2sql",
    torch_dtype=torch.float16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("YOUR_USERNAME/salesquery-nl2sql")

SCHEMA = (
    "customers(customer_id INTEGER, name VARCHAR, email VARCHAR, region VARCHAR, "
    "segment VARCHAR, country VARCHAR, acquisition_date DATE, is_active BOOLEAN)\n"
    "products(product_id INTEGER, name VARCHAR, category VARCHAR, subcategory VARCHAR, "
    "unit_price DECIMAL, unit_cost DECIMAL)\n"
    "orders(order_id INTEGER, customer_id INTEGER, order_date DATE, status VARCHAR, "
    "discount_pct DECIMAL, sales_channel VARCHAR)\n"
    "order_items(item_id INTEGER, order_id INTEGER, product_id INTEGER, quantity INTEGER, "
    "unit_price DECIMAL, revenue DECIMAL)"
)

question = "What is the total revenue by region?"

prompt = (
    "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n"
    "You are a SQL expert for an e-commerce sales analytics database. "
    "Generate correct SQL queries based on the schema and question.<|eot_id|>"
    "<|start_header_id|>user<|end_header_id|>\n"
    f"### Schema:\n{SCHEMA}\n\n### Question:\n{question}<|eot_id|>"
    "<|start_header_id|>assistant<|end_header_id|>\n"
)

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=200, do_sample=False, repetition_penalty=1.1)
result = tokenizer.decode(output[0], skip_special_tokens=True)
sql = result.split("<|start_header_id|>assistant<|end_header_id|>")[-1].strip()
print(sql)