Qwen2.5-1.5B — Fine-tuning QLoRA en Química Organometálica
Adaptadores LoRA de Qwen/Qwen2.5-1.5B-Instruct especializados en química organometálica mediante QLoRA sobre el dataset chemistry-organometallic-qa. Componente del pipeline RAG del proyecto chem-rag-assistant.
Repositorio: chem-rag-assistant
Métricas de evaluación
Evaluación cuantitativa sobre 5 preguntas de ground truth usando similitud coseno BGE-M3 como métrica semántica. Comparación entre tres aproximaciones:
| Modelo | Similitud media BGE-M3 |
|---|---|
| Qwen2.5-1.5B-Instruct (base) | 0.9943 |
| Qwen2.5-1.5B + LoRA (este modelo) | 0.9945 |
| Qwen3-8B + RAG (referencia producción) | 0.6901 |
Nota importante sobre los resultados: la loss final de entrenamiento fue 0.0000, indicando overfitting severo sobre el dataset de entrenamiento. La mejora sobre el modelo base es marginal (+0.0002, +0.0%), lo que indica que los adaptadores LoRA no lograron divergir del comportamiento base con suficiente señal. Con 167 pares de un único paper (
PMC10967698), el modelo memorizó el dataset sin generalizar conocimiento nuevo. Esta es una limitación documentada del experimento — no un error técnico. El pipeline RAG con Qwen3-8B sigue siendo la aproximación de producción recomendada para este dominio.
Uso
Este modelo requiere cargar el modelo base Qwen/Qwen2.5-1.5B-Instruct y aplicar los adaptadores con PEFT:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel
# Configuración de quantización 4-bit — idéntica a la usada en entrenamiento
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
# 1. Cargar modelo base
modelo_base = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-1.5B-Instruct",
quantization_config=bnb_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
# 2. Aplicar adaptadores LoRA
modelo = PeftModel.from_pretrained(
modelo_base,
"Jesusrodriguezf90/qwen2.5-1.5b-chemistry-lora",
is_trainable=False,
)
modelo.eval()
# 3. Inferencia
mensajes = [
{"role": "system", "content": "You are an expert in organometallic chemistry."},
{"role": "user", "content": "What metals are used in NHC complexes?"},
]
texto = tokenizer.apply_chat_template(
mensajes,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer(texto, return_tensors="pt").to(modelo.device)
with torch.no_grad():
output = modelo.generate(**inputs, max_new_tokens=300)
respuesta = tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(respuesta)
Arquitectura y proceso de fine-tuning
Quantización 4-bit NF4 (BitsAndBytes)
Reduce el modelo de ~6GB en float32 a ~1.5GB en 4-bit para que quepa en una GPU T4 (15GB VRAM). NF4 (Normal Float 4) preserva mejor la distribución estadística de los pesos que int4 estándar. Sin quantización el fine-tuning en T4 gratuita sería inviable.
LoRA — Low-Rank Adaptation (PEFT)
En lugar de entrenar los 1.5B parámetros del modelo completo, añade matrices pequeñas de rango bajo sobre las capas de atención. Solo estas matrices se entrenan — aproximadamente el 1-3% de los parámetros totales. El resultado son 73.9MB de adaptadores en lugar de los ~3GB del modelo completo.
SFTTrainer (TRL)
Aplica automáticamente el chat template de Qwen2.5 a los pares QA en formato messages, garantizando la tokenización correcta para un modelo instruction-tuned.
| Parámetro | Valor |
|---|---|
| Modelo base | Qwen/Qwen2.5-1.5B-Instruct |
| Dataset | Jesusrodriguezf90/chemistry-organometallic-qa |
| Pares de entrenamiento | 167 |
| Épocas | 10 |
| LoRA r | 32 |
| LoRA alpha | 64 |
| LoRA dropout | 0.05 |
| Target modules | q_proj, k_proj, v_proj, o_proj |
| Quantización | 4-bit NF4, double quant, compute dtype bfloat16 |
| Batch size efectivo | 8 (2 × gradient_accumulation_steps=4) |
| Learning rate | 5e-4 |
| Warmup ratio | 0.03 |
| Max seq length | 512 |
| Loss final | 0.0000 (overfitting — ver nota en métricas) |
| Hardware | Google Colab GPU T4 |
| Tamaño adaptadores | 73.9MB |
Dataset
chemistry-organometallic-qa — 167 pares pregunta-respuesta generados automáticamente con un LLM sobre el paper PMC10967698 (química organometálica de complejos NHC con Pd, Pt y Au). Formato messages (system/user/assistant) compatible con el chat template de Qwen2.5.
🔗 Jesusrodriguezf90/chemistry-organometallic-qa
Limitaciones
- Entrenado sobre un único paper (
PMC10967698) — el conocimiento especializado está limitado a ese documento - Loss de entrenamiento 0.0000 indica overfitting severo — el modelo memorizó los 167 pares sin generalizar
- La mejora sobre el modelo base es marginal (+0.0002) —
Qwen2.5-1.5B-Instructya tiene conocimiento químico general suficiente para este dominio - Para uso en producción sobre química organometálica se recomienda el pipeline RAG completo con
Qwen3-8B+ ChromaDB + BGE-M3
Licencia
MIT