Sistema RAG y fine-tuning
Subpáginas
Las páginas de detalle que cuelgan de este hub. Cada una desarrolla una pieza del sistema.
El dataset sintético
Los datos de entrenamiento con plantillas deterministas ancladas al grafo.
Fine tuning con QLoRA
El afinado del Sistema B en español, con sus hiperparámetros y la lectura de la curva.
4Sistema RAG + fine-tuning
El núcleo del TFM compara cuatro condiciones para aislar el efecto del grafo y del fine-tuning.
A — Base. LLM local sin afinar y sin grafo (llama3.1:8b vía Ollama). Es la línea base que hay que superar.
B — Fine-tuning. Qwen2.5-Coder-7B afinado con QLoRA 4-bit (NF4) sobre un dataset de feedback anclado al EKG. Aísla el efecto del fine-tuning. eval_loss held-out 1,028.
C — GraphRAG. El LLM base recibe un subgrafo del EKG recuperado e inyectado en el prompt. Aísla el efecto del grafo.
D — Híbrido. Combina B + C, el modelo afinado con QLoRA más el contexto del grafo. Es la condición que prueba la hipótesis completa.
El recuperador pasó de pistas léxicas frágiles por substring a enlace de conceptos por AST (sin falsos positivos) y fusión por RRF (Cormack et al., SIGIR 2009) en lugar de anteponer. Sobre código real cambia la recuperación en 22 de 54 casos y mejora la precisión del contexto (§7).
QLoRA, dataset y variantes
| Modelo base | Qwen2.5-Coder-7B-Instruct |
| Cuantización | QLoRA NF4 4-bit (doble cuantización, cómputo bf16) |
| LoRA | r=16, α=32, dropout 0,1, 7 módulos all-linear (q/k/v/o/gate/up/down) |
| Regularización (v3) | NEFTune α=5 + dropout 0,1; enmascarado de prompt (assistant-only); EarlyStopping |
| Held-out eval_loss | 1,051 (ép.1) → 1,028 (ép.2); mean_token_accuracy 0,842 |
| Dataset v2 | 2625 registros, 35 esqueletos, 4 categorías; held-out por 7 esqueletos no vistos (train 2100 / val 525) |
| Diversidad (causa del sobreajuste) | coseno intra-esqueleto 0,962 vs global 0,604 |
| Recuperador RAG | embeddings nomic-embed-text 768-dim, 157 conceptos, enlace por AST, fusión RRF (C=60), k=4 |
| Entorno | RTX 5090 32 GB · torch 2.11.0+cu128 · CUDA 12.8 (sm_120) · Python 3.12.10 · Ollama |
ORPO (alineamiento por preferencias, 1890 pares, eval_loss 0,541): mejora concepto (0,58) y trazabilidad (3,32) pero degrada categoría (0,62) e identificación (3,48). Es un trade-off que no desplaza a B-v3 como canónico. QDoRA (v4-dora, eval_loss 1,0512): no mejora a v3; se reporta como exploratoria, sin cifra de mérito en metrics.md.
Curva de entrenamiento (QLoRA v3)
Regularizar con NEFTune (α=5) y dropout 0,1 invirtió el sobreajuste: la pérdida held-out baja de 1,051 a 1,028 entre las épocas 1 y 2 (precisión de token 0,842). Gráfica generada con matplotlib desde modelos/qlora-feedback-v3/loss_history.json.
Datos y proceso de entrenamiento, sistema por sistema
Cada condición usó datos distintos y se montó de forma distinta. Los desplegables siguientes detallan, para cada sistema, qué datos entraron y cómo se entrenó o se construyó.
›Protocolo del dataset de feedback (entrena B y D)
El conjunto de entrenamiento no lo generó un modelo. Se construyó con plantillas deterministas ancladas al EKG, de forma que cada respuesta de feedback queda trazada a un concepto y a una categoría de error del grafo. Esta elección fija el límite real de diversidad y, con él, el de generalización.
- 2625 registros en la versión v2, a partir de 35 esqueletos estructurales y 4 categorías de error.
- Partición por esqueleto en train 2100 / val 525, con 7 esqueletos no vistos reservados como held-out, sin solape con el entrenamiento.
- Diversidad semántica por coseno: 0,962 intra-esqueleto frente a 0,604 global. Las respuestas "únicas" difieren casi solo en nombres de variable dentro de cada plantilla.
- Cada registro empareja un envío con su diagnóstico (categoría, concepto, identificación y trazabilidad) según el protocolo de anotación del anexo del TFM.
›Sistema A — Base, sin entrenamiento
Datos. Ninguno propio. Usa el modelo llama3.1:8b vía Ollama tal cual.
Proceso. Inferencia directa sobre el envío del estudiante, sin grafo y sin afinado. Marca la línea base que las demás condiciones deben superar.
›Sistema B — Fine-tuning QLoRA
Datos. El dataset de feedback del protocolo anterior, con held-out por 7 esqueletos no vistos.
Proceso. Afinado QLoRA NF4 4-bit sobre Qwen2.5-Coder-7B-Instruct, con adaptadores LoRA (r=16, α=32, dropout 0,1) en los siete módulos lineales (q, k, v, o, gate, up, down). La versión canónica v3 añade regularización NEFTune (α=5) y enmascarado assistant-only, con EarlyStopping a dos épocas. La pérdida held-out baja de 1,051 a 1,028 y la precisión de token alcanza 0,842. Entorno: RTX 5090 de 32 GB, torch 2.11 con CUDA 12.8 y Python 3.12.
›Sistema C — GraphRAG, sin entrenamiento
Datos. El EKG de 157 conceptos. No afina pesos.
Proceso. Ante un envío, el recuperador localiza los conceptos por enlace AST, que evita los falsos positivos del substring, y fusiona los candidatos con RRF (C=60, k=4) sobre embeddings nomic-embed-text de 768 dimensiones. El subgrafo resultante se inyecta en el prompt del LLM base. Aísla el efecto del grafo.
›Sistema D — Híbrido, adaptador más grafo
Datos. El adaptador QLoRA de B y el EKG de C, juntos.
Proceso. El modelo afinado recibe además el subgrafo recuperado, de forma que combina el conocimiento interiorizado en el afinado con el contexto explícito del grafo. Es la condición que pone a prueba la hipótesis completa.
›Variantes de alineamiento exploradas
ORPO (alineamiento por preferencias, 1890 pares, eval_loss 0,541) mejora concepto (0,58) y trazabilidad (3,32) pero degrada categoría (0,62) e identificación (3,48). El equilibrio no desplaza a v3 como canónico. QDoRA (v4-dora, eval_loss 1,0512) no mejora a v3 y se reporta como exploratoria, sin cifra de mérito en metrics.md.
Si este trabajo te resulta útil y quieres referenciarlo, esta es la cita recomendada.
Bueno Junquero, A. (2026). Integración de un grafo de conocimiento educativo con un LLM mediante RAG. Trabajo Fin de Máster, Máster Universitario en Investigación en Inteligencia Artificial, UNED. Director, José Luis Fernández Vindel.