rizalbasri commited on
Commit
d7ab67b
·
verified ·
1 Parent(s): 7a006cf

docs: fix badges, add interactive widget, merge script, and complete retail text2sql docs

Browse files
Files changed (1) hide show
  1. README.md +167 -92
README.md CHANGED
@@ -6,16 +6,19 @@ tags:
6
  - text-to-sql
7
  - retail
8
  - ecommerce
9
- - pos
10
- - indonesia
11
  - indonesian
 
12
  - qwen2.5-coder
13
  - lora
14
- - sql-generation
15
  language:
16
  - id
17
  - en
18
  license: apache-2.0
 
 
 
19
  ---
20
 
21
  <div align="center">
@@ -24,102 +27,121 @@ license: apache-2.0
24
 
25
  **Model Spesialis Text-to-SQL Berbahasa Indonesia untuk Domain Ritel, POS, & E-Commerce**
26
 
27
- [![Base Model](https://img.shields.io/badge/Base%20Model-Qwen2.5--Coder--7B--Instruct-blue?style=flat-square)](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct)
28
- [![PEFT](https://img.shields.io/badge/FineTuned-PEFT%20LoRA-orange?style=flat-square)](https://github.com/huggingface/peft)
29
- [![Language](https://img.shields.io/badge/Language-Indonesian%20%7C%20English-green?style=flat-square)](#)
30
- [![Task](https://img.shields.io/badge/Task-Text--to--SQL-purple?style=flat-square)](#)
31
- [![License](https://img.shields.io/badge/License-Apache%202.0-yellow?style=flat-square)](https://opensource.org/licenses/Apache-2.0)
32
 
33
  </div>
34
 
35
  ---
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  ## 📌 Deskripsi Model
38
 
39
- **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 ritel Indonesia (seperti *omzet, retur, stok kritis, diskon, margin kotor, cabang, kasir, metode pembayaran QRIS/tunai*) dan mengubah instruksi bahasa alami menjadi kueri SQL yang akurat dan siap dieksekusi.
40
 
41
- ### ✨ Fitur Unggulan
42
- - 🇮🇩 **Pemahaman Konteks Lokal**: Memahami gaya bahasa dan istilah operasional ritel Indonesia.
43
- - 🔗 **Kompleksitas Multi-Table**: Mampu melakukan kueri dengan multi-table `JOIN`, agregasi (`GROUP BY`, `HAVING`), window function, dan subqueries.
44
- - ⚡ **LoRA Adapter Ringan**: Ukuran adapter di bawah 100MB, hemat VRAM, serta mudah diintegrasikan ke sistem POS atau dashboard analitik yang sudah ada.
45
- - 🗄️ **Multi-Dialect SQL**: Kompatibel dengan sintaks standar PostgreSQL, MySQL, dan SQLite.
 
46
 
47
  ---
48
 
49
- ## ⚙️ Detail Konfigurasi LoRA
 
 
50
 
51
- | Parameter | Nilai | Keterangan |
52
  | :--- | :--- | :--- |
53
- | **Base Model** | `Qwen/Qwen2.5-Coder-7B-Instruct` | 7B Parameter instruction model |
54
- | **LoRA Rank ($r$)** | `16` | Representasi subspace |
55
- | **LoRA Alpha ($\alpha$)** | `32` | Scaling factor |
56
- | **LoRA Dropout** | `0.05` | Regularisasi pencegah overfitting |
57
- | **Target Modules** | `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` | Seluruh linear projection |
58
- | **Tipe Task** | `CAUSAL_LM` | Next-token prediction |
59
 
60
  ---
61
 
62
- ## 🚀 Panduan Penggunaan (Quickstart)
63
 
64
- ### 1. Instalasi Dependensi
65
  ```bash
66
  pip install torch transformers peft accelerate bitsandbytes
67
  ```
68
 
69
- ### 2. Inferensi Python (4-Bit Quantized untuk VRAM Hemat)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
  ```python
72
  import torch
73
  from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
74
  from peft import PeftModel
75
 
76
- BASE_MODEL = "Qwen/Qwen2.5-Coder-7B-Instruct"
77
- ADAPTER_MODEL = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"
78
 
79
- # 1. Konfigurasi 4-bit (jalan di GPU 8GB - 16GB)
80
  bnb_config = BitsAndBytesConfig(
81
  load_in_4bit=True,
82
  bnb_4bit_quant_type="nf4",
83
  bnb_4bit_compute_dtype=torch.bfloat16
84
  )
85
 
86
- tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, trust_remote_code=True)
87
  base_model = AutoModelForCausalLM.from_pretrained(
88
- BASE_MODEL,
89
  quantization_config=bnb_config,
90
  device_map="auto",
91
  trust_remote_code=True
92
  )
93
 
94
- # 2. Pasang Adapter LoRA
95
- model = PeftModel.from_pretrained(base_model, ADAPTER_MODEL)
96
  model.eval()
97
 
98
- # 3. Siapkan Prompt & Skema Database
99
- system_prompt = (
100
- "Kamu adalah database architect dan ahli SQL. Tugasmu adalah membaca skema database "
101
- "dan menerjemahkan pertanyaan pengguna dalam bahasa Indonesia menjadi kueri SQL yang valid."
102
- )
103
-
104
  schema = """
105
- CREATE TABLE cabang (
106
- id_cabang VARCHAR(10) PRIMARY KEY,
107
- nama_cabang VARCHAR(100),
108
- kota VARCHAR(50)
109
- );
110
-
111
- CREATE TABLE produk (
112
- id_produk VARCHAR(10) PRIMARY KEY,
113
- nama_produk VARCHAR(100),
114
- kategori VARCHAR(50),
115
- harga_jual DECIMAL(12, 2),
116
- stok INT
117
- );
118
-
119
  CREATE TABLE transaksi (
120
  id_transaksi VARCHAR(20) PRIMARY KEY,
121
- tanggal TIMESTAMP,
122
- id_cabang VARCHAR(10) REFERENCES cabang(id_cabang),
123
  total_bayar DECIMAL(12, 2),
124
  metode_bayar VARCHAR(30)
125
  );
@@ -127,15 +149,17 @@ CREATE TABLE transaksi (
127
  CREATE TABLE detail_transaksi (
128
  id_detail VARCHAR(20) PRIMARY KEY,
129
  id_transaksi VARCHAR(20) REFERENCES transaksi(id_transaksi),
130
- id_produk VARCHAR(10) REFERENCES produk(id_produk),
 
 
131
  jumlah INT,
132
- subtotal DECIMAL(12, 2)
133
  );
134
  """
135
 
136
- user_question = "Berapa total omzet per kategori produk untuk cabang Kota Bandung selama bulan Oktober 2024?"
137
 
138
- prompt = f"""### Skema Database:
139
  {schema.strip()}
140
 
141
  ### Pertanyaan:
@@ -144,17 +168,15 @@ prompt = f"""### Skema Database:
144
  ### SQL:"""
145
 
146
  messages = [
147
- {"role": "system", "content": system_prompt},
148
- {"role": "user", "content": prompt}
 
 
 
149
  ]
150
 
151
- formatted_prompt = tokenizer.apply_chat_template(
152
- messages,
153
- tokenize=False,
154
- add_generation_prompt=True
155
- )
156
-
157
- inputs = tokenizer(formatted_prompt, return_tensors="pt").to(model.device)
158
 
159
  with torch.no_grad():
160
  outputs = model.generate(
@@ -165,53 +187,106 @@ with torch.no_grad():
165
  pad_token_id=tokenizer.eos_token_id
166
  )
167
 
168
- generated_sql = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
169
- print("=== HASIL QUERY SQL ===")
170
- print(generated_sql)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  ```
172
 
173
  ---
174
 
175
  ## 💡 Contoh Kasus & Output
176
 
177
- ### Kasus 1: Filter Stok Kritis
178
- - **Pertanyaan:** *"Tampilkan produk yang stoknya tersisa kurang dari 10 unit dan urutkan dari yang paling sedikit."*
179
  - **Output SQL:**
180
  ```sql
181
  SELECT id_produk, nama_produk, kategori, stok
182
  FROM produk
183
- WHERE stok < 10
184
  ORDER BY stok ASC;
185
  ```
186
 
187
- ### Kasus 2: Top Customer Berdasarkan Nilai Transaksi
188
- - **Pertanyaan:** *"Siapa 10 pelanggan dengan total belanja terbesar pada metode pembayaran QRIS?"*
189
  - **Output SQL:**
190
  ```sql
191
  SELECT
192
- t.id_pelanggan,
193
- p.nama_pelanggan,
194
- SUM(t.total_bayar) AS total_belanja
195
- FROM transaksi t
196
- JOIN pelanggan p ON t.id_pelanggan = p.id_pelanggan
197
- WHERE t.metode_bayar = 'QRIS'
198
- GROUP BY t.id_pelanggan, p.nama_pelanggan
199
- ORDER BY total_belanja DESC
200
- LIMIT 10;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  ```
202
 
203
  ---
204
 
205
- ## 🔒 Praktik Keamanan & Batasan (Security & Limitations)
206
 
207
- 1. **Read-Only Privilege**: Sangat disarankan menjalankan query hasil generasi AI menggunakan database user dengan hak akses **hanya baca (`SELECT`)**.
208
- 2. **SQL Injection Defense**: Jangan langsung memasukkan kueri ke eksekutor database tanpa sanitasi bila melibatkan parameter dinamis dari input web publik.
209
- 3. **Validasi Skema**: Berikan skema tabel sejelas mungkin (termasuk tipe data dan relasi foreign key) di dalam prompt agar hasil kueri tidak mengalami halusinasi nama kolom.
210
 
211
  ---
212
 
213
- ## 📜 Lisensi & Atribusi
214
 
215
- - **Lisensi:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
216
- - **Base Model:** [Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct) oleh Alibaba Cloud.
217
- - **Dilatih oleh:** [rizalbasri](https://huggingface.co/rizalbasri)
 
6
  - text-to-sql
7
  - retail
8
  - ecommerce
9
+ - point-of-sale
 
10
  - indonesian
11
+ - bahasa-indonesia
12
  - qwen2.5-coder
13
  - lora
14
+ - sql
15
  language:
16
  - id
17
  - en
18
  license: apache-2.0
19
+ widget:
20
+ - text: "<|im_start|>system\nKamu adalah database architect dan ahli SQL yang menerjemahkan pertanyaan bahasa Indonesia ke SQL query berdasarkan skema database yang disediakan.<|im_end|>\n<|im_start|>user\n### Skema Database:\nCREATE TABLE produk (\n id_produk VARCHAR(10) PRIMARY KEY,\n nama_produk VARCHAR(100),\n kategori VARCHAR(50),\n harga DECIMAL(12, 2),\n stok INT\n);\n\n### Pertanyaan:\nTampilkan daftar produk kategori 'Makanan' dengan stok kurang dari 20 unit, diurutkan dari stok paling sedikit.\n\n### SQL:<|im_end|>\n<|im_start|>assistant\n"
21
+ example_title: "Filter Stok Produk"
22
  ---
23
 
24
  <div align="center">
 
27
 
28
  **Model Spesialis Text-to-SQL Berbahasa Indonesia untuk Domain Ritel, POS, & E-Commerce**
29
 
30
+ [![Base Model](https://img.shields.io/badge/Base_Model-Qwen2.5--Coder--7B--Instruct-blue?style=flat-square)](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct)
31
+ [![PEFT](https://img.shields.io/badge/FineTuned-PEFT_LoRA-orange?style=flat-square)](https://github.com/huggingface/peft)
32
+ [![Language](https://img.shields.io/badge/Language-Indonesian_%7C_English-green?style=flat-square)](#)
33
+ [![Task](https://img.shields.io/badge/Task_Type-Text2SQL-purple?style=flat-square)](#)
34
+ [![License](https://img.shields.io/badge/License-Apache_2.0-yellow?style=flat-square)](https://opensource.org/licenses/Apache-2.0)
35
 
36
  </div>
37
 
38
  ---
39
 
40
+ ## 📋 Daftar Isi
41
+ - [Deskripsi Model](#-deskripsi-model)
42
+ - [Fitur Unggulan](#-fitur-unggulan)
43
+ - [Konfigurasi LoRA](#-konfigurasi-lora)
44
+ - [Panduan Penggunaan (Inference)](#-panduan-penggunaan-inference)
45
+ - [Opsi A: Standar (Transformers + PEFT)](#opsi-a-standar-transformers--peft)
46
+ - [Opsi B: Hemat Memori (4-bit Quantization)](#opsi-b-hemat-memori-4-bit-quantization)
47
+ - [Opsi C: Merge Adapter ke Base Model (Untuk vLLM / Ollama / GGUF)](#opsi-c-merge-adapter-ke-base-model)
48
+ - [Contoh Kasus & Output](#-contoh-kasus--output)
49
+ - [Format Prompt Rekomendasi](#-format-prompt-rekomendasi)
50
+ - [Praktik Keamanan & Batasan](#-praktik-keamanan--batasan)
51
+ - [Sitasi & Kontak](#-sitasi--kontak)
52
+
53
+ ---
54
+
55
  ## 📌 Deskripsi Model
56
 
57
+ **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.
58
 
59
+ ### 🌟 Fitur Unggulan
60
+ - 🇮🇩 **Pemahaman Konteks Lokal**: Mengerti bahasa alami percakapan bisnis ritel Indonesia tanpa perlu translasi ke bahasa Inggris.
61
+ - 🔗 **Kemampuan Multi-Table Relational**: Menguasai pembentukan klausa `JOIN` antar tabel transaksi, detail barang, pelanggan, kasir, dan master cabang.
62
+ - 📊 **Kueri Analitik & Agregasi**: Mampu menghasilkan query `GROUP BY`, `HAVING`, fungsi jendela (`ROW_NUMBER()`, `RANK()`), serta kalkulasi subtotal/omzet secara tepat.
63
+ - 🗄️ **Kompatibilitas Dialek SQL**: Mendukung sintaks standar ANSI SQL yang kompatibel dengan PostgreSQL, MySQL, MariaDB, dan SQLite.
64
+ - ⚡ **Adapter Ringan**: Bobot adapter di bawah 100MB sehingga fleksibel dipasang di berbagai infrastruktur on-premise maupun cloud.
65
 
66
  ---
67
 
68
+ ## ⚙️ Konfigurasi LoRA
69
+
70
+ Berdasarkan metadata adapter:
71
 
72
+ | Parameter | Nilai | Penjelasan |
73
  | :--- | :--- | :--- |
74
+ | **Base Model** | `Qwen/Qwen2.5-Coder-7B-Instruct` | 7B SOTA instruction code model |
75
+ | **LoRA Rank ($r$)** | `16` | Dimensi subspace adaptasi |
76
+ | **LoRA Alpha ($\alpha$)** | `32` | Faktor pengali bobot gradien |
77
+ | **LoRA Dropout** | `0.05` | Regularisasi untuk mencegah overfitting |
78
+ | **Target Modules** | `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` | Seluruh proyeksi linear modul attention & MLP |
79
+ | **Task Type** | `CAUSAL_LM` | Model generasi autoregresif |
80
 
81
  ---
82
 
83
+ ## 🚀 Panduan Penggunaan (Inference)
84
 
85
+ ### Dependensi
86
  ```bash
87
  pip install torch transformers peft accelerate bitsandbytes
88
  ```
89
 
90
+ ### Opsi A: Standar (Transformers + PEFT)
91
+
92
+ ```python
93
+ import torch
94
+ from transformers import AutoModelForCausalLM, AutoTokenizer
95
+ from peft import PeftModel
96
+
97
+ BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
98
+ ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"
99
+
100
+ tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)
101
+ base_model = AutoModelForCausalLM.from_pretrained(
102
+ BASE_ID,
103
+ torch_dtype=torch.bfloat16,
104
+ device_map="auto",
105
+ trust_remote_code=True
106
+ )
107
+ model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
108
+ model.eval()
109
+ ```
110
+
111
+ ### Opsi B: Hemat Memori (4-bit Quantization)
112
+ Gunakan opsi ini jika Anda menjalankan model pada GPU dengan VRAM terbatas (8GB - 16GB):
113
 
114
  ```python
115
  import torch
116
  from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
117
  from peft import PeftModel
118
 
119
+ BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
120
+ ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"
121
 
 
122
  bnb_config = BitsAndBytesConfig(
123
  load_in_4bit=True,
124
  bnb_4bit_quant_type="nf4",
125
  bnb_4bit_compute_dtype=torch.bfloat16
126
  )
127
 
128
+ tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)
129
  base_model = AutoModelForCausalLM.from_pretrained(
130
+ BASE_ID,
131
  quantization_config=bnb_config,
132
  device_map="auto",
133
  trust_remote_code=True
134
  )
135
 
136
+ model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
 
137
  model.eval()
138
 
139
+ # Definisi Skema & Prompt
 
 
 
 
 
140
  schema = """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  CREATE TABLE transaksi (
142
  id_transaksi VARCHAR(20) PRIMARY KEY,
143
+ tanggal DATE,
144
+ id_cabang VARCHAR(10),
145
  total_bayar DECIMAL(12, 2),
146
  metode_bayar VARCHAR(30)
147
  );
 
149
  CREATE TABLE detail_transaksi (
150
  id_detail VARCHAR(20) PRIMARY KEY,
151
  id_transaksi VARCHAR(20) REFERENCES transaksi(id_transaksi),
152
+ id_produk VARCHAR(10),
153
+ nama_produk VARCHAR(100),
154
+ kategori VARCHAR(50),
155
  jumlah INT,
156
+ harga_satuan DECIMAL(12, 2)
157
  );
158
  """
159
 
160
+ user_question = "Berapa total pendapatan dari metode pembayaran QRIS per kategori barang di bulan Januari 2024?"
161
 
162
+ prompt_content = f"""### Skema Database:
163
  {schema.strip()}
164
 
165
  ### Pertanyaan:
 
168
  ### SQL:"""
169
 
170
  messages = [
171
+ {
172
+ "role": "system",
173
+ "content": "Kamu adalah database architect dan ahli SQL yang menerjemahkan pertanyaan bahasa Indonesia ke SQL query berdasarkan skema database yang disediakan."
174
+ },
175
+ {"role": "user", "content": prompt_content}
176
  ]
177
 
178
+ text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
179
+ inputs = tokenizer(text, return_tensors="pt").to(model.device)
 
 
 
 
 
180
 
181
  with torch.no_grad():
182
  outputs = model.generate(
 
187
  pad_token_id=tokenizer.eos_token_id
188
  )
189
 
190
+ hasil_sql = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
191
+ print(hasil_sql)
192
+ ```
193
+
194
+ ### Opsi C: Merge Adapter ke Base Model
195
+ Jika Anda ingin mengekspor model menjadi standalone model untuk inferensi berkecepatan tinggi dengan **vLLM**, atau dikonversi ke **GGUF / Ollama**:
196
+
197
+ ```python
198
+ import torch
199
+ from transformers import AutoModelForCausalLM, AutoTokenizer
200
+ from peft import PeftModel
201
+
202
+ BASE_ID = "Qwen/Qwen2.5-Coder-7B-Instruct"
203
+ ADAPTER_ID = "rizalbasri/qwen2.5-coder-7b-retail-text2sql-id"
204
+ OUTPUT_DIR = "./qwen2.5-coder-7b-retail-text2sql-id-merged"
205
+
206
+ print("Memuat base model...")
207
+ base_model = AutoModelForCausalLM.from_pretrained(
208
+ BASE_ID,
209
+ torch_dtype=torch.float16,
210
+ device_map="cpu",
211
+ trust_remote_code=True
212
+ )
213
+ tokenizer = AutoTokenizer.from_pretrained(BASE_ID, trust_remote_code=True)
214
+
215
+ print("Memasang LoRA adapter...")
216
+ model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
217
+
218
+ print("Menggabungkan bobot (merging)...")
219
+ merged_model = model.merge_and_unload()
220
+
221
+ print(f"Menyimpan model hasil merge ke {OUTPUT_DIR}...")
222
+ merged_model.save_pretrained(OUTPUT_DIR, safe_serialization=True)
223
+ tokenizer.save_pretrained(OUTPUT_DIR)
224
+ print("Selesai! Model siap digunakan pada vLLM atau dikonversi ke GGUF.")
225
  ```
226
 
227
  ---
228
 
229
  ## 💡 Contoh Kasus & Output
230
 
231
+ ### 1. Manajemen Stok & Peringatan Reorder
232
+ - **Pertanyaan:** *"Tampilkan produk apa saja yang sisa stoknya kurang dari 15 buah dan urutkan dari yang paling sedikit."*
233
  - **Output SQL:**
234
  ```sql
235
  SELECT id_produk, nama_produk, kategori, stok
236
  FROM produk
237
+ WHERE stok < 15
238
  ORDER BY stok ASC;
239
  ```
240
 
241
+ ### 2. Multi-Table JOIN & Analisis Performa Cabang
242
+ - **Pertanyaan:** *"Tampilkan 5 cabang dengan total penjualan tertinggi beserta nama kotanya pada kuartal 1 tahun 2024."*
243
  - **Output SQL:**
244
  ```sql
245
  SELECT
246
+ c.id_cabang,
247
+ c.nama_cabang,
248
+ c.kota,
249
+ SUM(t.total_bayar) AS total_omzet
250
+ FROM cabang c
251
+ JOIN transaksi t ON c.id_cabang = t.id_cabang
252
+ WHERE t.tanggal BETWEEN '2024-01-01' AND '2024-03-31'
253
+ GROUP BY c.id_cabang, c.nama_cabang, c.kota
254
+ ORDER BY total_omzet DESC
255
+ LIMIT 5;
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 📝 Format Prompt Rekomendasi
261
+
262
+ Gunakan struktur prompt berikut untuk konsistensi akurasi tertinggi:
263
+
264
+ ```text
265
+ <|im_start|>system
266
+ Kamu adalah database architect dan ahli SQL yang menerjemahkan pertanyaan bahasa Indonesia ke SQL query berdasarkan skema database yang disediakan.<|im_end|>
267
+ <|im_start|>user
268
+ ### Skema Database:
269
+ [Letakkan DDL atau deskripsi tabel di sini]
270
+
271
+ ### Pertanyaan:
272
+ [Pertanyaan operasional / bisnis ritel dalam bahasa Indonesia]
273
+
274
+ ### SQL:<|im_end|>
275
+ <|im_start|>assistant
276
  ```
277
 
278
  ---
279
 
280
+ ## 🛡️ Praktik Keamanan & Batasan
281
 
282
+ 1. **Akses Read-Only Database**: Kueri hasil AI harus dieksekusi dengan akun database berizin `SELECT` saja untuk mencegah risiko modifikasi data tanpa sengaja.
283
+ 2. **Kueri Ambigu**: Pastikan skema tabel mencantumkan relasi `FOREIGN KEY` jika pertanyaan memerlukan penggabungan multi-tabel yang kompleks.
284
+ 3. **Execution Boundary**: Selalu gunakan query timeout limit (misalnya 10-30 detik) pada database engine analitik Anda untuk mencegah bottleneck beban kueri.
285
 
286
  ---
287
 
288
+ ## 📄 Lisensi & Atribusi
289
 
290
+ - **Lisensi Kode & Model**: [Apache License 2.0](https://opensource.org/licenses/Apache-2.0)
291
+ - **Base Model**: [Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct) oleh Alibaba Cloud
292
+ - **Pengembang**: [rizalbasri](https://huggingface.co/rizalbasri)