Datos
Los datos son sintéticos, inventados por mí a partir de un contrato con las categorías y las reglas de prioridad. No hay datos de huéspedes reales.
- 240 ejemplos de entrenamiento (40 situaciones escritas de 6 formas distintas)
- 30 de validación y 30 de test, con situaciones que no aparecen en entrenamiento
Entrenamiento
- Modelo base: Qwen/Qwen3-0.6B
- LoRA: r=8, alpha=16, dropout=0.05, sobre q, k, v, o, gate, up y down
- 2 épocas, learning rate 0.0002, batch 2 con acumulación 4, semilla 42
- La pérdida solo se calcula sobre la respuesta, no sobre las instrucciones
- Tardó 11,8 minutos en un MacBook Air M4 de 16 GB (GPU del Mac, MPS)
Resultados en test (30 casos)
Cuento un acierto cuando el modelo acierta categoría y prioridad a la vez, sin arreglar el JSON.
Table with columns: Forma, JSON válido, Categoría, Prioridad, Las dos| Forma | JSON válido | Categoría | Prioridad | Las dos |
|---|
| Qwen3-0.6B con instrucciones | 30 | 23 | 9 | 6 |
| Instrucciones + 5 ejemplos | 30 | 22 | 18 | 14 |
| Con este adaptador | 30 | 28 | 24 | 22 |
Cómo usarlo
from transformers import AutoTokenizer, AutoModelForCausalLMfrom peft import PeftModel tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")modelo = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B")modelo = PeftModel.from_pretrained(modelo, "juanmisanchezz/clasificador-incidencias-hotel-lora")
Hay que usar las mismas instrucciones de sistema que en el entrenamiento y la plantilla de chat con enable_thinking=False.
Límites
- Solo lo he probado con 30 casos de test, todos sintéticos y en español.
- Sigue fallando 8 de 30, sobre todo en la prioridad.
- La respuesta al huésped es una frase fija por categoría: no está pensada para usarse con clientes reales sin revisión.
- Es un ejercicio de aprendizaje, no un sistema para producción.