🧪 Zero to Fine-Tuned with an Invented Dataset
A LoRA adapter for Qwen/Qwen2.5-1.5B-Instruct, trained on 170 synthetic banking support conversations written by DataInventor, an open-source recreation of the Invent a Dataset workflow. It is the output of Ellora Recipe #7, which goes from a one-sentence description of the data you want to a fine-tuned adapter using only open tools.

📊 Results on 30 held-out rows
Measured in the recipe notebook on a free Colab T4. The held-out rows were never seen in training.
Table with columns: Metric, Base model, + this adapter| Metric | Base model | + this adapter |
|---|
| Reply loss | 1.744 | 1.470 |
| Perplexity | 5.72 | 4.35 |
| ROUGE-L F1 vs reference | 0.196 | 0.230 |
| Embedding cosine vs reference (all-MiniLM-L6-v2) | 0.668 | 0.734 |
| Average reply length (words) | 224 | 194 |
These metrics measure how close the replies are to the dataset's reference answers, on one run with 30 rows. They are not a measure of real-world support quality. The notebook has an optional LLM-judge cell for a pairwise comparison.
🔧 Training
- Data: LocalLLaMA/datainventor-support-banking, 200 rows (card activation, card blocking, mortgages, customer verification, escalation, administrative tasks), split 170 train / 30 held out with seed 42
- Method: supervised LoRA fine-tuning with PEFT and the Transformers
Trainer, loss on reply tokens only
- LoRA: r=16, alpha=32, dropout 0.05, on q/k/v/o and gate/up/down projections (18.5M trainable parameters, 1.18%)
- Schedule: 2 epochs, effective batch 8, learning rate 2e-4, cosine with 10% warmup, fp16 on a T4
- Time: 3.4 minutes of training, about 8 minutes for the whole notebook
🚀 Usage
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel base = "Qwen/Qwen2.5-1.5B-Instruct"tokenizer = AutoTokenizer.from_pretrained(base)model = AutoModelForCausalLM.from_pretrained(base, torch_dtype="auto", device_map="auto")model = PeftModel.from_pretrained(model, "sandeep85/Qwen2.5-1.5B-Instruct-banking-support-lora") messages = [{"role": "user", "content": "How do I activate my new credit card?"}]inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)out = model.generate(inputs, max_new_tokens=400)print(tokenizer.decode(out[0][inputs.shape[-1]:], skip_special_tokens=True))
⚠️ Limitations
The training data is synthetic and generic: it does not know any real bank's products, fees or procedures. Do not use it to give customers account-specific or financial advice without checking its answers.
Files
evaluation_results.json has the metrics above, and heldout_predictions.jsonl has the base and adapter replies for every held-out row.