A LoRA fine-tuned adapter for
unsloth/Qwen2.5-VL-7B-Instruct on the
MCAT examination dataset — 1,610 questions across 7 official MCAT practice test sets covering the four MCAT sections: Biological and Biochemical Foundations (BB), Critical Analysis and Reasoning Skills (CARS), Chemical and Physical Foundations (CP), and Psychological, Social, and Biological Foundations (PS).
MCAT examination multiple-choice question answering. Given a passage (where applicable) and a 4-option question (A–D), the model selects the correct answer with a step-by-step explanation. Sections covered:
1from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer
2from peft import PeftModel
3import torch
4
5base_model_id = "Qwen/Qwen2.5-VL-7B-Instruct"
6adapter_id = "jamezoon/qwen2.5-vl-7b-instruct-mcat-lora"
7
8tokenizer = AutoTokenizer.from_pretrained(base_model_id)
9model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
10 base_model_id,
11 torch_dtype=torch.bfloat16,
12 device_map="auto",
13)
14model = PeftModel.from_pretrained(model, adapter_id)
15model.eval()
16
17messages = [
18 {
19 "role": "system",
20 "content": "You are a helpful tutor for students preparing for the MCAT. "
21 "Answer the following multiple choice question by thinking step by step, then give the answer."
22 },
23 {
24 "role": "user",
25 "content": (
26 "Passage: During a study of enzyme kinetics, researchers measured the rate of reaction "
27 "at varying substrate concentrations in the presence and absence of an inhibitor.\n\n"
28 "Question: Which of the following best describes competitive inhibition?\n"
29 "Options: A. Vmax decreases, Km unchanged "
30 "B. Vmax unchanged, Km increases "
31 "C. Both Vmax and Km decrease "
32 "D. Both Vmax and Km increase\n"
33 "Think step by step. Then respond in the format:\n"
34 "Explanation: ...\nAnswer: <one of A, B, C, D>"
35 ),
36 },
37]
38
39text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
40inputs = tokenizer(text, return_tensors="pt").to(model.device)
41with torch.no_grad():
42 output = model.generate(**inputs, max_new_tokens=512, do_sample=False)
43print(tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Training was performed in text-only mode (vision inputs disabled) due to format incompatibility between UnslothVisionDataCollator and the MCAT dataset structure. The base model Qwen2.5-VL requires Qwen2_5_VLForConditionalGeneration for inference — AutoModelForCausalLM does not support this config class.
Evaluated on 7 official MCAT practice test sets (~230 questions each), covering all 4 MCAT sections.
If you use this adapter, please cite the MCAT practice materials and the SUTD project:
1@misc{oon2026mcat,
2 title = {Qwen2.5-VL-7B-Instruct MCAT LoRA Adapter},
3 author = {Oon, James},
4 year = {2026},
5 publisher = {HuggingFace},
6 url = {https://huggingface.co/jamezoon/qwen2.5-vl-7b-instruct-mcat-lora}
7}