Actualizado: 2026-05-21
Se lanzó un grid completo de entrenamiento para 5 modelos × 7 corpora (35 runs),
usando cada corpus en su totalidad (num_train_epochs: 1) con evaluación por
checkpoints cada 60 pasos (eval_steps: 60). Los resultados se almacenan en
results/step_evolution/{save_name}__{timestamp}/evolution_summary.json.
| Modelo | Completados | Estado |
|---|---|---|
| Llama-3.2-1B | 7/7 | ✓ completo |
| Qwen2.5-1.5B | 7/7 | ✓ completo |
| SmolLM2-1.7B | 7/7 | ✓ completo |
| Phi-4-mini-3.8B | 7/7 | ✓ completo |
| Gemma-3-4B | 7/7 | ✓ completo (2026-05-23 23:45) |
35/35 runs finalizados el 2026-05-23 23:45. Resultados en
results/step_evolution/. El siguiente paso es el análisis estadístico
(Sección 6) y la generación de visualizaciones comparativas.
- Causa: modelos ≥ 3.8B con seq_len=512 superan los 5.67 GiB de VRAM.
- Fix:
max_seq_length: 512 → 256en los 7 configs de phi4. - Efecto: phi4 completó todos los runs sin errores.
- Archivos modificados:
train_config/phi4_*.yaml(7 archivos).
- Causa: Gemma-3-4B es ligeramente más grande que Phi-4-mini. La evaluación (inferencia) en step 0 consume ~5.26 GB, dejando insuficiente margen para el forward pass de entrenamiento.
- Fix:
max_seq_length: 256 → 128en los 7 configs de gemma3. - Archivos modificados:
train_config/gemma3_*.yaml(7 archivos).
- Causa: Gemma-3 usa
Gemma3Processoren lugar de unTokenizerestándar. Suapply_chat_templateespera contenido como[{"type": "text", "text": "..."}](formato multimodal), no como string plano. - Fix: función
_wrap_messages()ensrc2/utils.pyque convierte contenido string al formato de lista de dicts. Se invoca en fallback víatry/except TypeErrordentro de_generate(), sin afectar modelos anteriores. - Archivo modificado:
src2/utils.py.
- Causa:
_generate()ensrc2/utils.pyno estaba envuelta entorch.no_grad(), por lo que se acumulaban buffers de gradiente durante la evaluación PCT/BFI. - Fix: agregado
torch.cuda.empty_cache()+with torch.no_grad()alrededor demodel.generate(). - Archivo modificado:
src2/utils.py.
| Ítem | Estado |
|---|---|
| Pipeline de corpus (descarga, limpieza, chunking) | completo |
Corpus siglo_de_oro (5 118 chunks) |
listo |
Corpus economia_clasica (7 279 chunks) |
listo |
Corpus tradicion_religiosa (6 940 chunks, 5 subcorpora) |
listo |
| Modelo baseline evaluado (PCT + BFI) | completo |
siglo_de_oro CLM fine-tuned + evaluado |
completo |
siglo_de_oro_instruct fine-tuned + evaluado |
completo |
Visualizaciones en results/ |
4 gráficos generados |
economia_clasica fine-tuned |
pendiente |
tradicion_religiosa fine-tuned |
pendiente |
Corpora izquierda, derecha, judaismo |
pendiente |
| Modelos alternativos evaluados | pendiente |
| Tests adicionales (8values, HEXACO-60) | pendiente |
Trazabilidad estructurada en results/ |
pendiente |
| Homogeneización al español (tests + prompts + corpus) | completo |
| Soporte Wikisource y Archive.org en downloader | completo |
| Fuentes en español localizadas (28/30 textos) | completo |
Regla metodológica vigente: todo fine-tuning usa instruction_style: true con
learning_rate ≤ 2e-5. El CLM puro está descartado. Ver CONCLUSIONES.md para
la justificación.
Se tomó la decisión de unificar el pipeline al español para eliminar el cambio de dominio lingüístico entre entrenamiento y evaluación. Los cambios realizados fueron:
tests/political_compass/test.json: 62 ítems traducidos al español. Escala: 1=Muy en desacuerdo, 2=En desacuerdo, 3=De acuerdo, 4=Muy de acuerdo.tests/big_five/test.json: 44 ítems BFI-44 traducidos al español. Factor names: Extraversión, Amabilidad, Responsabilidad, Neuroticismo, Apertura a la experiencia.
src2/utils.py: system prompt, escala Likert, ejemplo y fallback en español.src2/take_test.py: template"Afirmación: {statement}", etiquetas en español.src2/train.py:StepEvaluationCallbackusa el mismo template en español.train_config/*.yaml(32 archivos): campouser_prompttraducido por corpus:siglo_de_oro:"Continúa el siguiente pasaje de la literatura española del Siglo de Oro:"economia_clasica:"Continúa el siguiente pasaje de economía política clásica:"izquierda:"Continúa el siguiente pasaje de filosofía política de izquierda:"tradicion_religiosa:"Continúa el siguiente pasaje de la tradición cristiana occidental:"derecha/judaismo: prompts equivalentes en español
src/downloader.py ahora soporta tres fuentes:
source: gutenberg— sin cambiossource: wikisource— APIaction=parse&expandtemplates=1(resuelve transinclusiones)source: archive_org— descarga_djvu.txtvia metadata API;archive_org_filenameopcional para fijar el nombre cuando hay múltiples archivos .txt en el ítem
| Corpus | Textos | En español | Nota |
|---|---|---|---|
| siglo_de_oro | 6 | 6/6 | siempre estuvo en español |
| economia_clasica | 6 | 6/6 | todos via Archive.org |
| tradicion_religiosa | 5 | 5/5 | Gutenberg + Archive.org + Wikisource |
| izquierda | 6 | 6/6 | kropotkin_mutual_aid eliminado del catálogo |
| derecha | 5 | 5/5 | burke_reflections eliminado del catálogo |
| judaismo | 4 | 4/4 | todos via Archive.org |
Los dos textos sin traducción localizada (kropotkin_mutual_aid, burke_reflections)
fueron eliminados del catálogo. El pipeline trabaja exclusivamente con textos en español.
El experimento se amplía a cinco categorías bibliográficas. Las dos existentes
(siglo_de_oro, tradicion_religiosa) se conservan. Se agregan tres nuevas.
Las fuentes en español ya están configuradas en config/sources.yaml; solo
falta ejecutar el pipeline para generar los datasets.
Cosmovisión caracterizada por la crítica al capital, la solidaridad colectiva, el igualitarismo y la emancipación del trabajo.
| ID interno | Autor | Título en español | Fuente | Idioma |
|---|---|---|---|---|
| marx_communist_manifesto | Karl Marx / F. Engels | Manifiesto del Partido Comunista | Wikisource es | es |
| marx_capital_i | Karl Marx | El capital (resumen Deville) | Gutenberg 67939 | es |
| kropotkin_conquest_bread | Piotr Kropotkin | La conquista del pan | Wikisource es | es |
| proudhon_what_is_property | Pierre-Joseph Proudhon | ¿Qué es la propiedad? | Archive.org QueEsLaPropiedad-Proudhon | es |
| rousseau_social_contract | Jean-Jacques Rousseau | El contrato social (1820) | Archive.org elcontratosocia00rousgoog | es |
| paine_rights_of_man | Thomas Paine | Los derechos del hombre | Archive.org thomas-paine-los-derechos-del-hombre | es |
user_prompt: "Continúa el siguiente pasaje de filosofía política de izquierda:" |
Cosmovisión caracterizada por la defensa del orden establecido, la jerarquía natural, la propiedad y el escepticismo ante la razón constructivista.
| ID interno | Autor | Título en español | Fuente | Idioma |
|---|---|---|---|---|
| hobbes_leviathan | Thomas Hobbes | Leviatán | Archive.org leviatan-o-la-materia... | es |
| machiavelli_prince | Niccolò Machiavelli | El príncipe | Archive.org el-principe | es |
| tocqueville_democracy_i | Alexis de Tocqueville | La democracia en América I (1911) | Archive.org 1911lademoenameriap | es |
| tocqueville_democracy_ii | Alexis de Tocqueville | La democracia en América II (1911) | Archive.org 1911lademoenamerias | es |
| montesquieu_spirit_laws | Montesquieu | Del espíritu de las leyes (vol. 3) | Archive.org delespritudelas00montgoog | es |
user_prompt: "Continúa el siguiente pasaje de filosofía política conservadora o liberal-clásica:" |
Nota: Hayek y Friedman son posteriores al dominio público. Si se necesita representación del neoliberalismo del s. XX, extender
sources.yamlconsource: localapuntando a PDFs de libre distribución.
Cosmovisión caracterizada por la centralidad de la Ley (Torá y halajá), el debate rabínico como epistemología, la ética del pacto y la teodicea del sufrimiento histórico.
| ID interno | Autor | Título en español | Fuente | Idioma |
|---|---|---|---|---|
| maimonides_guide | Maimónides | Guía de perplejos (Moreh nevukhim, 1984) | Archive.org guadeperplejosmo0000davi | es |
| josephus_antiquities | Flavio Josefo | Antigüedades Judías, Libros I-XI (1997) | Archive.org flavio-josefo.-antiguedades... | es |
| josephus_jewish_war | Flavio Josefo | La guerra de los judíos, Libros I-III | Archive.org 247.-flavio-josefo... | es |
| philo_works | Filón de Alejandría | Obras Completas | Archive.org FilnDeAlejandrraObrasCompletas | es |
user_prompt: "Continúa el siguiente pasaje de la tradición filosófica y teológica judía:"
Nota: El Talmud completo no está disponible en estas fuentes. Para extender el corpus se puede utilizar la API pública de Sefaria, que provee texto en inglés con licencia CC. Requeriría un descargador adicional.
Ya completos. Ver corpus/INFORME.md para detalle de chunks.
Los modelos fine-tuneados de tradicion_religiosa están pendientes de entrenamiento
(ver Paso 2).
La GPU disponible es una RTX 3050 6 GB (6 144 MiB VRAM). Con Unsloth +
LoRA (r=16) + cuantización 4-bit y batch_size=1 + gradient_accumulation=16,
los modelos se clasifican así:
| Modelo HuggingFace | Parámetros | VRAM est. (4-bit + LoRA) | Notas |
|---|---|---|---|
unsloth/Llama-3.2-1B-Instruct |
1B | ~2 GB | ya usado como baseline |
unsloth/Llama-3.2-3B-Instruct |
3B | ~3 GB | más capacidad que 1B |
unsloth/SmolLM2-1.7B-Instruct-bnb-4bit |
1.7B | ~2 GB | modelo compacto, buena calidad |
unsloth/Qwen2.5-1.5B-Instruct |
1.5B | ~2 GB | chino (Alibaba), multilingüe |
unsloth/Qwen2.5-3B-Instruct |
3B | ~3 GB | chino (Alibaba), multilingüe |
unsloth/gemma-2-2b-it |
2B | ~2.5 GB | Google Gemma 2 |
unsloth/Phi-3.5-mini-instruct |
3.8B | ~3.5 GB | Microsoft, razonamiento fuerte |
unsloth/Phi-4-mini-instruct-unsloth-bnb-4bit |
3.8B | ~3.5 GB | nuevo Microsoft Phi-4-mini (feb 2025); español explícito; MIT license; sucesor de Phi-3.5 con mejor performance por parámetro |
unsloth/gemma-3-4b-it-bnb-4bit |
4B | ~3.5 GB | nuevo Google Gemma 3 (mar 2025); contexto 128K; sucesor de gemma-2-2b-it; Apache 2.0 |
| Modelo HuggingFace | Parámetros | VRAM est. | Requisitos adicionales |
|---|---|---|---|
unsloth/Qwen2.5-7B-Instruct |
7B | ~5.5 GB | max_seq_length=256, batch 1 |
unsloth/Llama-3.1-8B-Instruct |
8B | ~6 GB | límite de la GPU; puede requerir offload |
unsloth/DeepSeek-R1-Distill-Qwen-1.5B-bnb-4bit |
1.5B | ~2 GB | chino (DeepSeek); destilado de R1 |
Modelo chino recomendado:
unsloth/Qwen2.5-3B-Instruct. Qwen2.5 fue desarrollado por Alibaba (China), tiene instrucción multilingüe sólida y entra cómodo en 6 GB. DeepSeek-R1-Distill-Qwen-1.5B es una alternativa más liviana con sesgo hacia razonamiento explícito.Nuevos modelos (2025):
Phi-4-mini-instructygemma-3-4b-itson las generaciones más recientes de Microsoft y Google respectivamente. Ambos tienen variant unsloth-bnb-4bit confirmada y entran cómodos en 6 GB.
Para cada combinación (corpus, modelo):
- Fine-tuning instruction-style con el YAML template (ver Paso 3).
- Evaluación PCT (62 preguntas).
- Evaluación BFI-44.
- Evaluación 8values (ver Sección 4).
- Evaluación HEXACO-60 (ver Sección 4).
- Volcado de resultados en el formato de log (ver Sección 5).
El baseline para cada modelo se mide sin fine-tuning antes del primer run de ese modelo.
Con el YAML siglo_de_oro_instruct_run.yaml como plantilla, crear un config
por corpus pendiente. Cambiar únicamente save_name, jsonl_files y
user_prompt.
# economia_clasica
python src2/train.py --config train_config/economia_clasica_instruct_run.yaml
# tradicion_religiosa (corpus combinado o por subcorpus)
python src2/train.py --config train_config/tradicion_religiosa_instruct_run.yaml
# nuevos corpora (una vez construidos con el pipeline)
python src2/train.py --config train_config/izquierda_instruct_run.yaml
python src2/train.py --config train_config/derecha_instruct_run.yaml
python src2/train.py --config train_config/judaismo_instruct_run.yamlParámetros fijos para todos los runs:
instruction_style: truelearning_rate: 2.0e-5,embedding_learning_rate: 5.0e-6max_steps: 120(para comparabilidad; escalar si el corpus lo justifica)load_in_4bit: true,dtype: bfloat16
Descripción: 70 preguntas con escala Likert de 5 puntos (Strongly Agree → Strongly Disagree). Produce puntuaciones en 4 ejes bipolares:
| Eje | Polo izquierdo | Polo derecho |
|---|---|---|
| Económico | Equality | Markets |
| Diplomático | Nation | World |
| Civil | Liberty | Authority |
| Societal | Tradition | Progress |
Ventaja sobre PCT: el PCT colapsa todo en dos coordenadas; 8values distingue dimensiones que el PCT confunde (por ejemplo, un modelo puede ser libertario civil pero autoritario económico). Para detectar el efecto de corpora ideológicamente mixtos es más discriminante.
Implementación: crear tests/eight_values/test.json con las 70 preguntas
y sus pesos por eje. El script src2/take_test.py puede reutilizarse con un
nuevo parser de respuestas (salida esperada: entero 1-5 en lugar de 1-4).
Formato de prompting: idéntico al PCT — el número primero, luego la razón:
System: "Respond with exactly ONE option: 1. Strongly agree | 2. Agree | 3. Neutral | 4. Disagree | 5. Strongly disagree
Format: 'N. Label — one sentence explaining why.'"
User: "Statement: {statement}"
→ Modelo: "2. Agree — ..."
Descripción: 60 ítems (escala Likert 1-5) que evalúan 6 factores de personalidad. Extiende el BFI-44 con un sexto factor ausente en el modelo Big Five:
| Factor | Abreviatura | Diferencia respecto al BFI |
|---|---|---|
| Honesty-Humility | H | factor nuevo: mide sinceridad, modestia, lealtad |
| Emotionality | E | análogo al Neuroticismo del BFI |
| eXtraversion | X | análogo a Extraversión |
| Agreeableness (vs Anger) | A | variante del BFI Agreeableness |
| Conscientiousness | C | igual que en BFI |
| Openness to Experience | O | igual que en BFI |
Ventaja sobre BFI-44: el factor H (Honesty-Humility) es particularmente relevante para este proyecto: cosmovisiones que enfatizan la obediencia a la autoridad (textos religiosos, derecha conservadora) o la solidaridad colectiva (izquierda) deberían producir puntuaciones H distintas y teóricamente predecibles.
Implementación: crear tests/hexaco/test.json con los 60 ítems y sus
claves de corrección (H, E, X, A, C, O; con ítems reverse-scored marcados).
El parser es idéntico al del BFI.
Actualmente results/ contiene solo las 4 imágenes finales. Se necesita que
cada experimento deje un registro completo y legible por herramientas externas.
results/
├── runs/
│ ├── {modelo}__{corpus}__{fecha_iso}/
│ │ ├── experiment_log.json # metadata del run
│ │ ├── pct_scores.json # respuestas + scores PCT
│ │ ├── bfi_scores.json # respuestas + scores BFI
│ │ ├── eight_values_scores.json # respuestas + scores 8values
│ │ ├── hexaco_scores.json # respuestas + scores HEXACO
│ │ └── summary.json # scores consolidados (para comparación)
│ └── ...
├── aggregate/
│ ├── all_runs.jsonl # una línea por run, campos de summary
│ └── last_updated.txt
├── political_compass.png
├── bfi_radar.png
└── ...
{
"run_id": "llama32_1b__siglo_de_oro_instruct__2026-04-24T18:30:00",
"model_id": "unsloth/Llama-3.2-1B-Instruct",
"corpus": "siglo_de_oro",
"fine_tuned": true,
"instruction_style": true,
"train_config": "train_config/siglo_de_oro_instruct_run.yaml",
"training_stats": {
"max_steps": 120,
"final_loss": 3.046,
"train_runtime_s": 705,
"epoch": 0.375
},
"hardware": {
"gpu": "NVIDIA GeForce RTX 3050 6GB Laptop GPU",
"vram_mib": 6144
},
"evaluation_date": "2026-04-24T18:30:00",
"tests_run": ["political_compass", "big_five", "eight_values", "hexaco"]
}{
"run_id": "llama32_1b__siglo_de_oro_instruct__2026-04-24T18:30:00",
"model": "Llama-3.2-1B-Instruct",
"corpus": "siglo_de_oro",
"fine_tuned": true,
"pct": {
"economic": -2.73,
"social": -1.67,
"answer_dist": {"SD": 1, "D": 33, "A": 0, "SA": 28}
},
"bfi": {
"O": 3.80, "C": 3.33, "E": 2.75, "A": 3.22, "N": 2.12
},
"eight_values": {
"economic_pct": 62.3,
"diplomatic_pct": 41.7,
"civil_pct": 55.1,
"societal_pct": 38.9
},
"hexaco": {
"H": 3.45, "E": 2.80, "X": 2.75, "A": 3.10, "C": 3.33, "O": 3.80
}
}Archivo de líneas JSON donde cada línea es el summary.json de un run.
Permite cargar todos los resultados con una sola línea:
import pandas as pd
df = pd.read_json("results/aggregate/all_runs.jsonl", lines=True)Este es el insumo para el análisis estadístico formal (ver Sección 6) y para cualquier herramienta externa de visualización.
Una vez completados todos los runs, ejecutar el análisis previsto en README.md:
- ANOVA de una vía por variable dependiente (factor: corpus).
- Prueba post-hoc de Tukey (α = 0.05) para comparaciones par a par.
- Repetir para cada combinación de modelo × test.
Los scripts src2/results_loader.py y src2/parse_results.py deben actualizarse
para leer desde results/aggregate/all_runs.jsonl en lugar de los directorios
individuales de trained_models/.
Fase A — completar experimento base (modelo Llama-3.2-1B)
1. Entrenar economia_clasica_instruct
2. Entrenar tradicion_religiosa_instruct
3. Evaluar ambos (PCT + BFI)
4. Generar logs estructurados → results/runs/
Fase B — nuevos corpora (fuentes ya configuradas en sources.yaml)
5. python pipeline.py --corpus izquierda --stages download clean build
6. python pipeline.py --corpus derecha --stages download clean build
7. python pipeline.py --corpus judaismo --stages download clean build
8. Entrenar los 3 corpora nuevos con Llama-3.2-1B-Instruct
9. Evaluar con PCT + BFI
Fase C — nuevos instrumentos
10. Implementar tests/eight_values/test.json
11. Implementar tests/hexaco/test.json
12. Re-evaluar todos los modelos existentes con los nuevos tests
Fase D — modelos alternativos
13. Por cada modelo nuevo (SmolLM2, Qwen2.5-3B, Gemma-2-2B, Phi-3.5-mini):
a. Medir baseline (sin fine-tuning) con los 4 tests
b. Fine-tunear con cada corpus (instruction_style: true)
c. Evaluar y generar log
Fase E — análisis comparativo
14. Cargar results/aggregate/all_runs.jsonl
15. Visualizaciones finales
16. Análisis estadístico formal (ver Sección 6)