Vidya 4B — NCERT Tutoring Assistant
Vidya is a fine-tuned Qwen3.5-4B model trained to be an expert tutoring assistant for Indian students preparing for NCERT Classes 6–12, IIT-JEE, and NEET. It explains concepts step-by-step with examples from the Indian curriculum, corrects misconceptions, and adapts to the student's level.
Tutoring score: 4.1 / 5.0 (Gemini 2.0 Flash as judge, 30-sample eval across accuracy, clarity, step-by-step reasoning, appropriate level, encouragement, and misconception handling)
A larger Vidya 9B variant is also available (tutoring score 4.6/5.0).
Quick Start
Ollama (recommended)
ollama run neosaket/vidya:4b
Or with a Modelfile for custom parameters:
FROM neosaket/vidya:4b
PARAMETER temperature 0.3
PARAMETER repeat_penalty 1.1
llama.cpp
llama-cli -m vidya-4b-Q4_K_M.gguf \
--system "You are Vidya, an expert tutor for Indian students preparing for NCERT Classes 6-12, IIT-JEE, and NEET. Explain concepts step by step with examples from the Indian curriculum." \
-i
Transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("neo-saket/vidya-4b", torch_dtype="auto")
tokenizer = AutoTokenizer.from_pretrained("neo-saket/vidya-4b")
messages = [
{"role": "system", "content": "You are Vidya, an expert tutor for Indian students preparing for NCERT Classes 6-12, IIT-JEE, and NEET. Explain concepts step by step with examples from the Indian curriculum."},
{"role": "user", "content": "Explain Newton's second law of motion with a Class 9 example."}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512, temperature=0.3)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Suppressing Chain-of-Thought
Qwen3.5 models produce a <think>...</think> reasoning block before the answer. To skip it and get a direct response, pre-fill the assistant turn:
# Add this to your chat template call or inject directly:
# <|im_start|>assistant\n<think>\n\n</think>\n\n
Training Details
Pipeline: SFT → DPO (no CPT due to data constraints)
| Stage | Details |
|---|---|
| Base model | Qwen/Qwen3.5-4B |
| SFT | NCERT synthetic Q&A (GPT-4o-mini generated), HuggingFace NCERT datasets, SATHEE exam papers |
| DPO | Preference pairs on NCERT content; beta=0.1 |
| LoRA | r=16, alpha=16, DoRA + rsLoRA |
| Hardware | RTX 5090 (32 GB VRAM) |
| SFT LR | 3e-5 |
| DPO LR | 5e-6 |
| Max seq length | 4096 |
GRPO was also explored for JEE/NEET MCQ reasoning but caused catastrophic tutoring regression with short completions — the deployed model is the DPO checkpoint.
Evaluation
30-sample tutoring evaluation, judged by Gemini 2.0 Flash:
| Dimension | Score |
|---|---|
| Overall | 4.1 / 5.0 |
| Accuracy | 3.8 |
| Clarity | 4.4 |
| Step-by-step reasoning | 4.5 |
| Appropriate level | 4.5 |
| Encouragement | 4.5 |
| Misconception handling | 4.8 |
The accuracy score (3.8) reflects the 4B model's smaller factual recall capacity; the 9B variant achieves 4.6/5.0 overall with stronger accuracy.
Sample Interactions
Physics (Class 9):
User: Explain Newton's second law of motion with an example.
Vidya: Great question! Newton's Second Law is one of the most important concepts in Class 9 Physics.
**The Law:** The force acting on an object equals its mass times its acceleration.
F = ma
**Example:** Imagine pushing a cricket ball and a shot put with the same force.
- Cricket ball (mass ≈ 0.16 kg) → accelerates quickly
- Shot put (mass ≈ 7 kg) → barely moves
Same force (F), different masses → different accelerations. The heavier object has less acceleration.
Key takeaway: More mass = more force needed to produce the same acceleration. ✓
Chemistry (Class 10):
User: What is a displacement reaction? Give an example.
Vidya: A displacement reaction occurs when a more reactive element pushes a less reactive element out of its compound.
**Classic NCERT example — Zinc displacing Copper:**
Zn + CuSO₄ → ZnSO₄ + Cu
Step by step:
1. Zinc (Zn) is higher in the reactivity series than Copper (Cu)
2. Zinc atoms lose electrons → become Zn²⁺ ions in solution
3. Cu²⁺ ions gain those electrons → deposit as solid copper
4. The blue CuSO₄ solution turns colourless; copper metal appears
⚠️ Common misconception: Less reactive metals cannot displace more reactive ones.
Iron cannot displace zinc from ZnSO₄ — the reaction won't proceed.
Files
| File | Description |
|---|---|
*.safetensors | Merged BF16 model weights (use for fine-tuning or GGUF conversion) |
vidya-Q4_K_M.gguf | Quantized GGUF, 4-bit — recommended for Ollama / llama.cpp |
Modelfile | Ollama Modelfile with recommended settings |
config.json, tokenizer* | Model configuration and tokenizer |
Limitations
- Accuracy is weaker than the 9B variant — may occasionally hallucinate specific NCERT facts
- Primary training language is English; Hindi support is limited
- Optimised for Indian curriculum (NCERT, JEE, NEET) — general-purpose use may be suboptimal
- Not suitable for medical advice, legal guidance, or safety-critical applications
Citation
@misc{vidya4b2026,
title={Vidya 4B: A Fine-tuned NCERT Tutoring Assistant},
author={Saket Nayak},
year={2026},
url={https://huggingface.co/neo-saket/vidya-4b}
}
License
Apache 2.0 — inherits from the Qwen3.5 base model license.
Recommended settings (GGUF / mobile apps)
This GGUF ships a plain ChatML chat template (Qwen3 thinking mode disabled). If you downloaded an earlier copy, re-download to pick up the fix — the older template could make the model ramble and never stop.
Recommended sampler settings:
temperature: 0.3repeat_penalty: 1.1 (do not use 1.0 — small models can loop; avoid > 1.3)repeat_last_n: 64- stop token:
<|im_end|>(already the model's EOS)