evolutia 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,723 @@
1
+ Metadata-Version: 2.4
2
+ Name: evolutia
3
+ Version: 0.1.0
4
+ Summary: Sistema automatizado para generar preguntas de examen desafiantes basadas en materiales didácticos existentes
5
+ Home-page: https://github.com/glacy/evolutIA
6
+ Author: Gerardo Lacy-Mora
7
+ Author-email: glacycr@gmail.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Operating System :: OS Independent
11
+ Requires-Python: >=3.8
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: PyYAML
15
+ Requires-Dist: requests
16
+ Requires-Dist: python-dotenv
17
+ Requires-Dist: openai
18
+ Requires-Dist: anthropic
19
+ Requires-Dist: google-generativeai
20
+ Requires-Dist: tqdm
21
+ Dynamic: author
22
+ Dynamic: author-email
23
+ Dynamic: classifier
24
+ Dynamic: description
25
+ Dynamic: description-content-type
26
+ Dynamic: home-page
27
+ Dynamic: license-file
28
+ Dynamic: requires-dist
29
+ Dynamic: requires-python
30
+ Dynamic: summary
31
+
32
+ # EvolutIA: Generador de preguntas de examen
33
+
34
+ Sistema automatizado para generar preguntas de examen desafiantes basadas en materiales didácticos existentes (lecturas, prácticas, tareas). El sistema aumenta la complejidad matemática de los ejercicios mientras mantiene el formato y estructura familiar.
35
+
36
+
37
+ ## Características
38
+
39
+ - **Extracción automática**: Lee y procesa materiales didácticos en formato Markdown/MyST
40
+ - **Análisis de complejidad**: Identifica tipo, pasos, variables y conceptos de cada ejercicio
41
+ - **Generación inteligente**: Usa IA (OpenAI GPT-4 o Claude) para crear variaciones más complejas
42
+ - **Validación automática**: Verifica que las variaciones sean más desafiantes que los originales
43
+ - **Formato consistente**: Genera archivos en formato MyST/Markdown compatible con Curvenote
44
+ - **Multi-proveedor**: Soporte para OpenAI (GPT-4), Anthropic (Claude 3) y Google (Gemini 1.5).
45
+ - **RAG (Retrieval-Augmented Generation)**: Utiliza apuntes de clase y ejercicios existentes para dar contexto.
46
+ - **Modo Creación**: Genera ejercicios nuevos desde cero basados en temas y tags del curso.
47
+ - **Generación Paralela**: Utiliza concurrencia para acelerar drásticamente la generación de múltiples ejercicios.
48
+ - **Parseo Robusto**: Sistema avanzado para manejar y limpiar JSON con alta densidad de LaTeX.
49
+
50
+ ```mermaid
51
+ flowchart LR
52
+ A[📚 Materiales Didácticos<br>Lecturas, Tareas, Prácticas] --> B(🔍 Extracción y Análisis<br>Identifica ejercicios y conceptos)
53
+ B --> C{⚙️ Motor de Generación}
54
+ subgraph C [ ]
55
+ direction LR
56
+ D[Modo Variación<br>Incrementa complejidad]
57
+ E[Modo Creación<br>Nuevos ejercicios desde cero]
58
+ end
59
+ C --> F(🧠 Inteligencia Artificial<br>LLM + RAG opcional)
60
+ F --> G(✅ Validación<br>Verifica aumento de dificultad)
61
+ G --> H[📝 Generación de Archivos<br>Examen y Soluciones en MyST/Markdown]
62
+ H --> I(🎯 Evaluación Coherente y Desafiante)
63
+ I --> J(🚀 Generación Paralela<br>Concurrencia para acelerar)
64
+ ```
65
+
66
+ ## Requisitos
67
+
68
+ - Python 3.8 o superior
69
+ - API key de OpenAI o Anthropic (Claude)
70
+ - Opcional: Servidor LLM local (Ollama, LM Studio) para generación offline
71
+
72
+ ### Instalación
73
+
74
+ 1. Clona el repositorio:
75
+ ```bash
76
+ git clone https://github.com/glacy/evolutIA.git
77
+ cd evolutia
78
+ ```
79
+
80
+ 2. Crea y activa un entorno virtual:
81
+ ```bash
82
+ python -m venv venv
83
+ source venv/bin/activate # En Windows: venv\Scripts\activate
84
+ ```
85
+
86
+ 3. Instala el paquete en modo editable (esto instalará también las dependencias):
87
+ ```bash
88
+ pip install -e .
89
+ ```
90
+
91
+ 4. Configura las variables de entorno:
92
+ ```bash
93
+ cp .env.example .env
94
+ # Edita .env con tus API keys
95
+ ```
96
+ Y edita `.env` con tus claves reales:
97
+ ```
98
+ OPENAI_API_KEY=sk-tu-api-key-aqui
99
+ ANTHROPIC_API_KEY=sk-ant-tu-api-key-aqui
100
+ GOOGLE_API_KEY=tu-api-key-aqui
101
+ ```
102
+
103
+ **Obtener API keys**:
104
+ - OpenAI: https://platform.openai.com/api-keys
105
+ - Anthropic: https://console.anthropic.com/
106
+ - Google: https://console.cloud.google.com/ai/generative-ai/credentials
107
+
108
+ ## Uso
109
+
110
+ ### Uso básico
111
+
112
+ ```bash
113
+ python evolutia.py \
114
+ --tema analisis_vectorial \
115
+ --num_ejercicios 4 \
116
+ --output examenes/examen3
117
+ ```
118
+
119
+ ### Variación de ejercicios específicos
120
+
121
+ ```bash
122
+ python evolutia.py \
123
+ --tema analisis_vectorial \
124
+ --label ex1-s1 ex2-s1 \
125
+ --output variacion_especifica
126
+ ```
127
+
128
+ ### Listar ejercicios disponibles
129
+
130
+ ```bash
131
+ python evolutia.py --tema analisis_vectorial --list
132
+ ```
133
+
134
+ Si no se indica un tema, el sistema buscará en todos los archivos disponibles.
135
+
136
+ ### Opciones disponibles
137
+
138
+ - `--tema`: Tema del examen (requerido)
139
+ - Ejemplos: `analisis_vectorial`, `matrices`, `edps`, `espacios_vectoriales`, `numeros_complejos`
140
+
141
+ - `--num_ejercicios`: Número de ejercicios a generar (default: 1)
142
+
143
+ - `--output`: Directorio de salida (requerido)
144
+ - Se creará automáticamente si no existe
145
+
146
+ - `--complejidad`: Nivel de complejidad objetivo
147
+ - Opciones: `media`, `alta` (default), `muy_alta`
148
+
149
+ - `--api`: Proveedor de API de IA
150
+ - Opciones: `openai` (default), `anthropic`, `local`, `gemini`
151
+
152
+ - `--label`: ID(s) específico(s) del ejercicio a variar (ej: `ex1-s1` o múltiples: `ex1-s1 ex2-s1`).
153
+ - Si se usa, ignora `--num_ejercicios` y genera variaciones **solo** para los ejercicios indicados.
154
+
155
+ - `--config`: Ruta a un archivo de configuración externo (ej: `./mi_curso_config.yaml`). (default: busca `evolutia_config.yaml` en la raíz, o usa el interno).
156
+
157
+ - `--base_path`: Ruta base del proyecto (default: directorio actual)
158
+
159
+ - `--examen_num`: Número del examen (se infiere del nombre del directorio si no se especifica)
160
+
161
+ - `--no_generar_soluciones`: NO genera las soluciones (por defecto siempre se generan)
162
+
163
+ - `--subject`: Asignatura del examen (default: "IF3602 - II semestre 2025")
164
+
165
+ - `--keywords`: Palabras clave para el examen (múltiples valores)
166
+
167
+ - `--use_rag`: Usa RAG para enriquecer generación con contexto del curso (requiere indexación inicial)
168
+
169
+ - `--reindex`: Fuerza re-indexación de materiales (solo con `--use_rag`)
170
+
171
+ - `--list`: Lista todos los ejercicios encontrados en los temas seleccionados y muestra sus etiquetas, archivo origen y preview.
172
+
173
+ - `--query`: Realiza una búsqueda semántica en la base de datos RAG y muestra los fragmentos de texto más relevantes encontrados. Útil para verificar qué "sabe" el sistema sobre un tema.
174
+
175
+ - `--workers`: Número de hilos simultáneos para la generación paralela (default: 5). Útil para ajustar el rendimiento o evitar límites de rate.
176
+
177
+ ### Ejemplos
178
+
179
+ **Generar examen de análisis vectorial con 4 ejercicios:**
180
+ ```bash
181
+ python evolutia.py \
182
+ --tema analisis_vectorial \
183
+ --num_ejercicios 4 \
184
+ --output examenes/examen3
185
+ ```
186
+
187
+ **Generar examen usando Claude (las soluciones se generan automáticamente):**
188
+ ```bash
189
+ python evolutia.py \
190
+ --tema matrices \
191
+ --num_ejercicios 3 \
192
+ --api anthropic \
193
+ --output examenes/examen4
194
+ ```
195
+
196
+ ### Uso Básico
197
+
198
+ Una vez instalado, puedes usar el comando `evolutia` (o ejecutar el wrapper `python evolutia_cli.py`):
199
+
200
+ 1. **Analizar el repositorio y entender la estructura:**
201
+ ```bash
202
+ evolutia --analyze
203
+ ```
204
+ *(Esto generará `config.yaml` si no existe)*
205
+
206
+ 2. **Generar examen con variaciones de ejercicios existentes:**
207
+ ```bash
208
+ evolutia --exam-number 1 --num-ejercicios 3 --tema "Derivadas" --complejidad "media"
209
+ ```
210
+ **Generar examen SIN soluciones:**
211
+ ```bash
212
+ python evolutia.py \
213
+ --tema matrices \
214
+ --num_ejercicios 3 \
215
+ --no_generar_soluciones \
216
+ --output examenes/examen5
217
+ ```
218
+
219
+ **Generar examen con complejidad muy alta:**
220
+ ```bash
221
+ python evolutia.py \
222
+ --tema edps \
223
+ --num_ejercicios 5 \
224
+ --complejidad muy_alta \
225
+ --output examenes/examen5
226
+ ```
227
+
228
+ **Generar examen usando RAG (recomendado para mejor calidad):**
229
+ ```bash
230
+ python evolutia.py \
231
+ --tema analisis_vectorial \
232
+ --num_ejercicios 4 \
233
+ --use_rag \
234
+ --output examenes/examen3
235
+ ```
236
+
237
+ ### Herramienta de Consulta RAG
238
+ Puedes "preguntarle" al sistema qué información tiene sobre un concepto específico sin generar nada:
239
+
240
+ ```bash
241
+ python evolutia.py --query "Teorema de Stokes"
242
+ ```
243
+
244
+ Esto mostrará una lista de ejercicios y lecturas relevantes con su puntuación de similitud.
245
+
246
+ ### Modo Creación (Nuevo)
247
+ Genera ejercicios totalmente nuevos desde cero, basándose en un tema y tags opcionales, en lugar de variar ejercicios existentes.
248
+
249
+ **Generar 3 ejercicios nuevos de variable compleja:**
250
+ ```bash
251
+ python evolutia.py \
252
+ --mode creation \
253
+ --tema numeros_complejos \
254
+ --num_ejercicios 3 \
255
+ --output examenes/parcial1
256
+ ```
257
+
258
+ **Generar con tags específicos y usar Gemini:**
259
+ ```bash
260
+ python evolutia.py \
261
+ --mode creation \
262
+ --tema analisis_vectorial \
263
+ --tags stokes divergencia \
264
+ --api gemini \
265
+ --output examenes/quiz3
266
+ ```
267
+
268
+ ### Tipos de Ejercicio
269
+ Ahora puedes elegir entre ejercicios de desarrollo (default) o selección única (quiz).
270
+
271
+ **Generar pregunta de Selección Única (Conceptual):**
272
+ ```bash
273
+ python evolutia.py \
274
+ --mode creation \
275
+ --tema matrices \
276
+ --type multiple_choice \
277
+ --api anthropic \
278
+ --output examenes/quiz_rapido
279
+ ```
280
+
281
+ ## Uso de LLM local (offline)
282
+
283
+ EvolutIA soporta la generación de exámenes usando modelos locales como Llama 3, Mistral, o Qwen, ejecutándose en tu propia máquina a través de herramientas como [Ollama](https://ollama.com/) o [LM Studio](https://lmstudio.ai/).
284
+
285
+ **Requisitos:**
286
+ 1. Tener corriendo un servidor local compatible con OpenAI API.
287
+ - **Ollama**: Ejecuta `ollama serve` (por defecto en puerto 11434).
288
+ - **LM Studio**: Inicia el servidor local desde la interfaz.
289
+
290
+ 2. **Ejemplo de ejecución:**
291
+ ```bash
292
+ python evolutia.py \
293
+ --tema matrices \
294
+ --num_ejercicios 3 \
295
+ --api local \
296
+ --output examenes/examen_local
297
+ ```
298
+
299
+ 3. **Configuración avanzada (opcional):**
300
+ Si tu servidor no usa el puerto por defecto o quieres cambiar el modelo, edita `evolutia/config/config.yaml`:
301
+ ```yaml
302
+ local:
303
+ base_url: "http://localhost:11434/v1" # URL de tu servidor
304
+ model: "llama3" # Modelo a utilizar
305
+ api_key: "not-needed"
306
+ ```
307
+
308
+ ## Sistema RAG (Retrieval-Augmented Generation)
309
+
310
+ El sistema incluye un módulo RAG opcional que mejora significativamente la calidad de las variaciones generadas.
311
+
312
+ ### ¿Qué es RAG?
313
+
314
+ RAG (Retrieval-Augmented Generation) es un sistema que:
315
+ - **Indexa** todos tus materiales didácticos (ejercicios, soluciones y **lecturas/teoría**)
316
+ - **Busca** ejercicios similares y conceptos teóricos relevantes cuando generas variaciones
317
+ - **Enriquece** los prompts con información del curso para generar variaciones más coherentes
318
+ - **Valida** consistencia comparando con ejercicios y teoría reales del curso
319
+
320
+ ### Ventajas de usar RAG
321
+
322
+ 1. **Mejor contexto**: Las variaciones son más coherentes con el estilo y nivel del curso
323
+ 2. **Consistencia**: Los ejercicios generados se alinean mejor con materiales existentes
324
+ 3. **Relevancia**: Selección inteligente de ejercicios base por similitud semántica
325
+ 4. **Validación mejorada**: Compara con ejercicios reales del curso
326
+
327
+ ### Cómo usar RAG
328
+
329
+ **Primera vez (indexación inicial):**
330
+ ```bash
331
+ python evolutia.py \
332
+ --tema analisis_vectorial \
333
+ --num_ejercicios 4 \
334
+ --use_rag \
335
+ --reindex \
336
+ --output examenes/examen3
337
+ ```
338
+
339
+ La primera vez con `--use_rag` indexará automáticamente todos los materiales. Esto puede tardar unos minutos.
340
+
341
+ **Uso posterior:**
342
+ ```bash
343
+ python evolutia.py \
344
+ --tema analisis_vectorial \
345
+ --num_ejercicios 4 \
346
+ --use_rag \
347
+ --output examenes/examen4
348
+ ```
349
+
350
+ El índice se reutiliza automáticamente. Solo usa `--reindex` si cambias materiales y quieres actualizar el índice.
351
+
352
+ ### Configuración de RAG
353
+
354
+ Edita `config/config.yaml` para personalizar RAG:
355
+ ```yaml
356
+ rag:
357
+ vector_store:
358
+ # Base de datos vectorial persistente
359
+ persist_directory: "./storage/vector_store"
360
+ collection_name: "mi_curso_coleccion"
361
+ embeddings:
362
+ provider: openai
363
+ model: text-embedding-3-small
364
+ retrieval:
365
+ top_k: 5
366
+ similarity_threshold: 0.7
367
+ ```
368
+
369
+ **Opciones de embeddings:**
370
+ - `openai`: Más rápido y preciso, pero tiene costo (~$0.02 por 1M tokens)
371
+ - `sentence-transformers`: Gratis y local, pero más lento
372
+
373
+ ### Costos de RAG
374
+
375
+ - **Indexación inicial**: ~$1-5 dependiendo del volumen de materiales
376
+ - **Búsquedas**: Mínimas, solo cuando generas variaciones
377
+ - **Alternativa gratuita**: Usa `sentence-transformers` en lugar de OpenAI
378
+
379
+ ### Cuándo usar RAG
380
+
381
+ **Usa RAG si:**
382
+ - Tienes muchos materiales (50+ ejercicios)
383
+ - Quieres máxima consistencia con el curso
384
+ - Tienes presupuesto para embeddings de OpenAI
385
+
386
+ **No uses RAG si:**
387
+ - Tienes pocos materiales (<20 ejercicios)
388
+ - Prefieres simplicidad y rapidez
389
+ - El costo es una preocupación
390
+
391
+ ## Gestión de metadatos y descubrimiento
392
+
393
+ ### Organización y visibilidad de ejercicios
394
+
395
+ Para que `evolutia` encuentre ejercicios ubicados en carpetas generales como `examenes/` o `tareas/` cuando filtras por un tema (ej: `--tema analisis_vectorial`), es fundamental que los archivos fuente incluyan los metadatos correctos.
396
+
397
+ El sistema utiliza la siguiente lógica de "descubrimiento":
398
+
399
+ 1. **Escaneo directo**: Todos los archivos dentro de la carpeta del tema (ej: `analisis_vectorial/`) son incluidos automáticamente.
400
+ 2. **Escaneo de exámenes y tareas**: Para archivos fuera de la carpeta del tema, el sistema revisa el *frontmatter* y los incluye **SOLO SI** encuentra coincidencias con el tema en:
401
+ - **`tags`**: (Recomendado) Incluye el código del tema (ej: `analisis_vectorial`) en la lista.
402
+ - **`subject`**: El nombre de la asignatura o tema.
403
+ - **`keywords`**: Palabras clave relacionadas.
404
+
405
+ **Ejemplo de Frontmatter para que un examen sea "visible":**
406
+ ```yaml
407
+ ---
408
+ title: Examen Parcial 1
409
+ tags:
410
+ - analisis_vectorial # <--- CRÍTICO: Permite que el extractor lo encuentre
411
+ - stokes
412
+ subject: Cálculo Superior
413
+ ---
414
+ ```
415
+
416
+ > **Nota**: Si usas `--label` para seleccionar un ejercicio específico, el filtro de tema se ignora y el sistema buscará el ID en todos los archivos disponibles.
417
+
418
+ ### Propagación de tags (trazabilidad)
419
+
420
+ `EvolutIA` asegura que los metadatos de los ejercicios originales se conserven en las variaciones generadas. Esto es crucial para mantener un registro de qué conceptos se están evaluando.
421
+
422
+ **¿Cómo funciona?**
423
+ 1. **Lectura**: El sistema lee los tags del archivo fuente (`.md`) donde reside el ejercicio original.
424
+ 2. **Transferencia**: Al generar la variación, estos tags se copian al nuevo archivo generado.
425
+ 3. **Agregación**: El archivo final del examen (`examenX.md`) recopila automáticamente los tags de *todos* los ejercicios incluidos, generando un resumen temático del examen.
426
+
427
+ #### Ejemplo práctico
428
+
429
+ **1. Archivo fuente (ej: `matrices/semana11_practica.md`)**
430
+ Este archivo contiene los ejercicios originales ("semilla") y define el contexto temático:
431
+
432
+ ```yaml
433
+ ---
434
+ title: Ejercicios Semana 11
435
+ tags:
436
+ - autovalores # Concepto clave
437
+ - diagonalizacion # Concepto clave
438
+ - procedimental # Tipo de competencia
439
+ - intermedio # Nivel de dificultad
440
+ subject: Matrices y Algebra Lineal
441
+ ---
442
+ ```
443
+
444
+ **2. Archivo generado (ej: `examenes/examen1/ex1_e1.md`)**
445
+ La variación generada hereda estos metadatos y agrega los suyos propios:
446
+
447
+ ```yaml
448
+ ---
449
+ generator: evolutia
450
+ source: ai_variation
451
+ tags: [autovalores, diagonalizacion, procedimental, intermedio] # <--- Tags heredados
452
+ original_subject: Matrices y Algebra Lineal
453
+ complexity: media
454
+ mode: variation # <--- Nuevo: Modo de generación
455
+ target_difficulty: alta # <--- Nuevo: Dificultad objetivo
456
+ based_on: ex1-e1 # <--- Nuevo: ID del ejercicio semilla
457
+ rag_references: # <--- Nuevo: Contexto usado (con --use_rag)
458
+ - ex5-e2
459
+ - semana3_lectura.md
460
+ ---
461
+ ```
462
+
463
+
464
+ ## Estructura de archivos generados
465
+
466
+ El script genera la siguiente estructura:
467
+
468
+ ```
469
+ examenes/examen3/
470
+ ├── examen3.md # Archivo principal del examen
471
+ ├── ex1_e3.md # Ejercicio 1
472
+ ├── ex2_e3.md # Ejercicio 2
473
+ ├── ex3_e3.md # Ejercicio 3
474
+ ├── ex4_e3.md # Ejercicio 4
475
+ ├── solucion_ex1_e3.md # Solución ejercicio 1
476
+ ├── solucion_ex2_e3.md # Solución ejercicio 2
477
+ ├── solucion_ex3_e3.md # Solución ejercicio 3
478
+ └── solucion_ex4_e3.md # Solución ejercicio 4
479
+ ```
480
+
481
+ ## ¿Cómo funciona?
482
+
483
+ 1. **Extracción**: El sistema busca y lee materiales didácticos del tema especificado
484
+ - Busca en directorios del tema (ej: `analisis_vectorial/`)
485
+ - Lee archivos de prácticas (`*practica*.md`)
486
+ - Lee archivos de tareas (`tareas/tarea*/tarea*.md`)
487
+
488
+ 2. **Análisis**: Analiza cada ejercicio encontrado
489
+ - Identifica tipo (demostración, cálculo, aplicación)
490
+ - Cuenta pasos en soluciones
491
+ - Extrae variables y conceptos matemáticos
492
+ - Calcula complejidad matemática
493
+
494
+ 3. **Generación**: Crea variaciones más complejas usando IA
495
+ - Aumenta número de variables
496
+ - Combina múltiples conceptos
497
+ - Agrega pasos intermedios
498
+ - Modifica sistemas de coordenadas
499
+
500
+ 4. **Validación**: Verifica que las variaciones sean más complejas
501
+ - Compara complejidad total
502
+ - Verifica aumento en pasos, variables, conceptos
503
+ - Valida operaciones matemáticas
504
+
505
+ 5. **Generación de archivos**: Crea archivos en formato MyST/Markdown
506
+ - Frontmatter YAML apropiado
507
+ - Estructura de ejercicios con labels
508
+ - Bloques de solución
509
+
510
+ ## Configuración
511
+
512
+ Puedes personalizar el comportamiento editando `config/config.yaml`:
513
+
514
+ - **APIs**: Configurar modelos y parámetros
515
+ - **Rutas**: Especificar directorios de materiales (dentro de `materials_directories`)
516
+ - **Complejidad**: Ajustar umbrales de validación
517
+ - **Exámenes**: Configurar valores por defecto y **keywords** por tema
518
+ - **RAG**: Definir persistencia (local vs nube) y nombres de colección
519
+
520
+ ### Cambiar Proveedor por Defecto
521
+ Puedes definir qué IA usar si no se especifica el argumento `--api`:
522
+
523
+ ```yaml
524
+ api:
525
+ default_provider: gemini # openai, anthropic, gemini, local
526
+ gemini:
527
+ model: gemini-1.5-pro # Cambiar modelo específico
528
+ ```
529
+
530
+ ### Nota Importante sobre Configuración
531
+ Para evitar errores de validación, asegúrate de que tu `evolutia_config.yaml` incluya la sección `api`. El sistema usa esto para determinar los modelos por defecto.
532
+
533
+ ### Configuración Avanzada / Multi-Curso
534
+
535
+ Para usar `evolutia` en múltiples cursos o sin modificar el código fuente:
536
+
537
+ 1. **Archivo de Configuración Externo**: Crea un archivo `evolutia_config.yaml` en la raíz de tu proyecto (junto a la carpeta `evolutia/`). El sistema lo detectará automáticamente.
538
+ 2. **Argumento CLI**: Usa `--config ruta/a/mi_config.yaml` para especificar un archivo arbitrario.
539
+
540
+ **Ejemplo de estructura recomendada para un nuevo curso:**
541
+ ```
542
+ NuevoCurso/
543
+ ├── evolutia/ # Carpeta copiada o submódulo git
544
+ ├── evolutia_config.yaml # Configuración específica de este curso
545
+ └── temas/ # Carpetas de contenido
546
+ ```
547
+
548
+ > **IMPORTANTE**: No edites `evolutia/config/config.yaml` para datos de un curso específico. Ese archivo es una plantilla del motor. Crea un `evolutia_config.yaml` en la raíz de tu proyecto para tus ajustes personales.
549
+
550
+ > **Guía Detallada**: Para instrucciones paso a paso sobre cómo usar Git Submodules, consulta [GUIDE_SUBMODULES.md](GUIDE_SUBMODULES.md).
551
+
552
+ ## Estrategias de aumento de complejidad
553
+
554
+ El sistema aplica las siguientes estrategias para aumentar la complejidad:
555
+
556
+ 1. **Más variables independientes**: Introduce parámetros adicionales
557
+ 2. **Combinación de conceptos**: Integra múltiples teoremas en un ejercicio
558
+ 3. **Pasos intermedios**: Agrega cálculos adicionales
559
+ 4. **Casos límite**: Introduce condiciones especiales
560
+ 5. **Sistemas de coordenadas**: Cambia de cartesianas a cilíndricas/esféricas
561
+ 6. **Dimensiones adicionales**: Aumenta la dimensionalidad del problema
562
+
563
+ ## Solución de Problemas
564
+
565
+ ### Error: "No se encontraron materiales"
566
+ - Verifica que el tema especificado existe como directorio
567
+ - Asegúrate de que hay archivos `.md` con ejercicios en ese directorio
568
+ - Usa `--base_path` para especificar la ruta correcta
569
+
570
+ ### Error: "API key no configurada"
571
+ - Verifica que el archivo `.env` existe y contiene la API key
572
+ - Asegúrate de que el archivo está en el directorio `evolutia/`
573
+ - Revisa que la variable se llama correctamente (`OPENAI_API_KEY` o `ANTHROPIC_API_KEY`)
574
+
575
+ ### Error: "No se generaron variaciones válidas"
576
+ - Intenta aumentar el número de ejercicios candidatos
577
+ - Verifica que los ejercicios originales tienen suficiente complejidad
578
+ - Considera usar `--complejidad media` para requisitos menos estrictos
579
+
580
+ ### Variaciones no son suficientemente complejas
581
+ - Ajusta los umbrales en `config/config.yaml`
582
+ - Usa `--complejidad muy_alta`
583
+ - Revisa los prompts en `variation_generator.py` y ajústalos según necesites
584
+ - Considera usar `--use_rag` para mejor contexto
585
+
586
+ ### Error: "RAG no disponible"
587
+ - Instala dependencias: `pip install chromadb sentence-transformers`
588
+ - Verifica que `OPENAI_API_KEY` está configurada si usas embeddings de OpenAI
589
+ - Si prefieres embeddings locales, cambia `provider: sentence-transformers` en `config.yaml`
590
+
591
+ ## Limitaciones
592
+
593
+ - Requiere conexión a internet para usar APIs de IA
594
+ - Los costos de API dependen del número de ejercicios generados
595
+ - La calidad depende de la calidad de los materiales originales
596
+ - Las variaciones requieren revisión manual antes de usar
597
+
598
+ ## Mejores prácticas
599
+
600
+ 1. **Revisar siempre**: Las variaciones generadas deben revisarse manualmente
601
+ 2. **Ajustar según necesidad**: Modifica los ejercicios generados según tu criterio
602
+ 3. **Probar primero**: Genera un examen de prueba antes de usar en evaluación real
603
+ 4. **Mantener materiales actualizados**: Asegúrate de que los materiales fuente están completos
604
+ 5. **Documentar cambios**: Si modificas ejercicios, documenta los cambios realizados
605
+
606
+ ## Configuración automática
607
+
608
+ El proyecto incluye una herramienta para sincronizar automáticamente el archivo de configuración con la estructura de carpetas y los metadatos de los archivos de lectura.
609
+
610
+ ### config_manager.py
611
+
612
+ Este script escanea el directorio del proyecto para:
613
+ 1. Identificar carpetas de temas existentes.
614
+ 2. Leer los archivos de lectura (`semana*_lectura.md`) y extraer las palabras clave (`keywords`) del frontmatter.
615
+ 3. Actualizar el archivo de configuración activo (`evolutia_config.yaml` o interno).
616
+
617
+ **Uso:**
618
+
619
+ ```bash
620
+ # Uso básico (detecta configuración automáticamente)
621
+ python evolutia/config_manager.py
622
+
623
+ # Uso con archivo específico
624
+ python evolutia/config_manager.py --config ./evolutia_config.yaml
625
+ ```
626
+
627
+ Ejecuta este script cada vez que agregues nuevos temas o modifiques las palabras clave en los materiales de lectura.
628
+
629
+ ### Validación de Configuración (Schema)
630
+
631
+ Evolutia incluye un sistema de validación estricta para el archivo de configuración (`evolutia_config.yaml`).
632
+
633
+ - **JSON Schema**: La estructura válida se define en `evolutia/schemas/config.schema.json`.
634
+ - **Validación Automática**: Cada vez que ejecutas `evolutia.py` o `config_manager.py`, el sistema verifica que tu archivo de configuración cumpla con el esquema.
635
+ - **Errores Claros**: Si tu configuración tiene errores (campos faltantes, tipos incorrectos), el sistema detendrá la ejecución y te indicará exactamente dónde está el problema.
636
+
637
+ Esto facilita la adopción de la herramienta por nuevos usuarios, reduciendo errores de configuración inicial.
638
+
639
+ ## Estructura del repositorio (Contexto)
640
+
641
+ El generador está diseñado para funcionar dentro de la estructura estándar del curso. A continuación se muestra el esquema de directorios esperado:
642
+
643
+ ```
644
+ .
645
+ ├── tema1/ # Carpeta del primer tema (ej: analisis_vectorial)
646
+ ├── tema2/ # Carpeta del segundo tema
647
+ ├── ... # Otros temas
648
+ ├── tareas/ # Tareas evaluadas (fuente de ejercicios)
649
+ ├── proyecto/ # Enunciados de proyectos
650
+ ├── examenes/ # Directorio de salida para exámenes generados
651
+ ├── evolutia/ # Este sistema de generación
652
+ ├── myst.yml # Configuración del sitio Curvenote
653
+ └── programa-curso.md # Información general del curso
654
+ ```
655
+
656
+ ### Estructura interna de cada tema
657
+
658
+ Cada carpeta de tema (ej: `tema1/`) debe seguir una estructura similar para que el extractor encuentre los materiales:
659
+
660
+ ```
661
+ tema1/
662
+ ├── semana1_lectura.md # Material teoría (puede contener ejemplos)
663
+ ├── semana1_practica.md # Ejercicios de práctica
664
+ ├── semana2_lectura.md
665
+ ├── semana2_practica.md
666
+ └── otros_archivos.md # Otros materiales complementarios
667
+ ```
668
+
669
+ ## Estructura del código (generador)
670
+
671
+ ```
672
+ evolutia/
673
+ ├── evolutia.py # Script principal (CLI Wrapper)
674
+ ├── evolutia_engine.py # Motor central de orquestación
675
+ ├── config_manager.py # Gestor de configuración automática
676
+ ├── material_extractor.py # Extracción de materiales
677
+ ├── exercise_analyzer.py # Análisis de complejidad
678
+ ├── variation_generator.py # Generación de variaciones
679
+ ├── llm_providers.py # Proveedores de LLM (OpenAI, Anthropic, Gemini, Local)
680
+ ├── complexity_validator.py # Validación de complejidad
681
+ ├── exam_generator.py # Generación de archivos
682
+ ├── rag/ # Sistema RAG (opcional)
683
+ │ ├── rag_indexer.py # Indexación de materiales
684
+ │ ├── rag_retriever.py # Búsqueda semántica
685
+ │ ├── context_enricher.py # Enriquecimiento de contexto
686
+ │ ├── enhanced_variation_generator.py # Generador con RAG
687
+ │ ├── consistency_validator.py # Validación de consistencia
688
+ │ └── rag_manager.py # Gestor principal
689
+ ├── storage/
690
+ │ └── vector_store/ # Base de datos vectorial (RAG)
691
+ ├── config/
692
+ │ └── config.yaml # Configuración
693
+ ├── templates/
694
+ │ ├── exam_template.md # Plantilla de examen
695
+ │ └── exercise_template.md # Plantilla de ejercicio
696
+ ├── utils/
697
+ │ ├── markdown_parser.py # Parser de Markdown
698
+ │ ├── math_extractor.py # Extracción de matemáticas
699
+ │ └── json_parser.py # Parser robusto de JSON (LaTeX friendly)
700
+ ├── requirements.txt # Dependencias
701
+ └── README.md # Esta documentación
702
+ ```
703
+
704
+ ## Contribuciones
705
+
706
+ Para mejorar el sistema:
707
+
708
+ 1. Ajusta los prompts en `variation_generator.py` para mejor generación
709
+ 2. Agrega nuevos patrones de conceptos en `exercise_analyzer.py`
710
+ 3. Mejora las métricas de complejidad en `complexity_validator.py`
711
+ 4. Personaliza las plantillas en `templates/`
712
+
713
+ ## Licencia
714
+
715
+ Este proyecto está bajo la Licencia Apache 2.0. Consulta el archivo [LICENSE](LICENSE) para más detalles.
716
+
717
+ ## Reconocimientos
718
+
719
+ Este proyecto fue desarrollado utilizando asistencia de Inteligencia Artificial:
720
+
721
+ - **Cursor**: Entorno de desarrollo asistido por IA.
722
+ - **Antigravity** (Google DeepMind): Agente de codificación y planificación avanzado.
723
+