Diseno asistido por IA del esquema de curso
Estado: decisiones arquitectonicas cerradas. Este documento cubre el flujo de creacion de cursos con asistencia de IA: como el admin construye un esquema antes de que exista nada en base de datos, y por que cada pieza esta donde esta.
Complementa a
v2-dynamic-courses.md(que cubre el ciclo completo design-time/runtime) y acontent-generation.md(pipeline v1). Donde este documento contradice al otro, gana el mas reciente para la fase de diseno; el runtime no se toca aqui.
Depende de: v2-dynamic-courses.md, architecture.md, llm-integration.md.
1. Endpoints de IA sin estado para el diseno
La fase de diseno usa endpoints de IA sin estado. El frontend es el espacio de
trabajo: todo el estado vive en React (useState) hasta que el admin confirma. Los
endpoints del backend reciben el contexto completo y devuelven resultados sin persistir
nada.
1.1 Superficie actual
| Endpoint | Entrada | Salida |
|---|---|---|
POST /ai/schema-propose |
{ title, description, intent_density } |
{ nodes } |
1.2 Superficie prevista (backlog)
| Endpoint | Proposito |
|---|---|
POST /ai/schema-refine |
Refinar un esquema existente a partir de feedback del admin |
POST /ai/node-suggest |
Sugerir un nodo nuevo dado el esquema actual |
POST /ai/autocomplete |
Completar campos de un nodo (summary, outcome) |
1.3 Patron
Cada endpoint es independiente y testeable en aislamiento. No hay sesiones compartidas ni estado del lado del servidor entre llamadas. El contexto se envia en cada peticion: un esquema son 5-15 nodos, unos pocos KB, un payload trivial.
1.4 Por que sin estado
| Alternativa descartada | Problema |
|---|---|
| Sesion de workspace en servidor | Cursos huerfanos de sesiones abandonadas; necesita limpieza |
| Redis para estado intermedio | Infraestructura nueva para un dato que cabe en el body |
| Entidad “borrador” en BD | Basura de borradores sin terminar; la lista de cursos se contamina |
Ventajas del enfoque elegido:
- Sin datos huerfanos. Una sesion de diseno abandonada no deja rastro en el servidor.
- Resiliente. Un recarga del navegador pierde solo el borrador local, no una sesion de servidor. El admin puede copiar su borrador antes de cerrar si quiere (es JSON plano en React state).
- Extensible. Cada nueva funcionalidad de IA es un endpoint nuevo, sin acoplamiento
a una entidad “workspace”. Anadir
POST /ai/schema-refineno toca ningun endpoint existente. - Sin infraestructura extra. No necesita Redis, ni tablas de sesiones, ni cron de limpieza.
2. El curso se crea solo al confirmar
El curso no se crea en base de datos cuando el admin empieza a disenar. Se crea solo cuando el admin acepta el esquema y pulsa “Crear”. En ese momento:
POST /courses → crea el curso (titulo, descripcion, delivery_mode)
PUT /courses/{id}/schema → escribe los nodos del esquema
POST /courses/{id}/schema/validate → gate bloqueante (si el admin valida en el acto)
2.1 Consecuencias
- La tabla
coursessolo contiene cursos reales, nunca borradores. - No hacen falta jobs de limpieza de borradores abandonados.
- La lista de “Contenido” del panel de admin refleja exactamente lo que existe.
- El flujo de la SPA es una transicion limpia: React state → POST → la entidad existe.
2.2 Contraste con v1
En v1, el curso se crea primero y despues se genera el contenido (POST /courses/{id}/generate).
La diferencia es que en v1 el admin no puede disenar nada antes de crear: el curso es un
contenedor vacio hasta que el pipeline termina. En el flujo nuevo, toda la fase creativa
ocurre antes de que el curso exista.
3. Enrutamiento multi-modelo para tareas de diseno
Distintas tareas de IA en la fase de diseno pueden usar modelos distintos. La
infraestructura de resolve_llm_config(org_settings, purpose=...) ya soporta seleccion
por proposito.
3.1 Asignacion actual
| Tarea | Tipo de modelo | Latencia tipica | Purpose |
|---|---|---|---|
| Propuesta de esquema | Rapido (8B, GPT-4o-mini) | 2-5 s | "schema_design" |
| Generacion de contenido por nodo (runtime) | Pesado | 1-3 s | "runtime_heavy" |
La propuesta de esquema solo genera estructura: titulos, resumenes, prerrequisitos. No genera contenido de aprendizaje. Eso la hace viable para modelos rapidos y baratos.
3.2 Asignacion prevista (backlog)
| Tarea | Tipo de modelo | Purpose |
|---|---|---|
| Sugerencias/autocompletado | Rapido | "schema_assist" |
| Modelos fine-tuned por dominio | Especializado | "schema_design_ft" |
El router no necesita cambios: anadir un purpose nuevo es declararlo en la configuracion
de la organizacion y pasarlo a resolve_llm_config.
4. Editor interactivo en tiempo real
El editor de esquema separa dos tipos de operaciones por su latencia:
4.1 Operaciones locales (instantaneas, sin IA)
- Editar titulo o resumen de un nodo.
- Borrar un nodo.
- Reordenar nodos (drag & drop).
- Anadir un nodo manualmente.
- Cambiar prerrequisitos.
Estas operaciones mutan el estado de React directamente. No generan llamadas al servidor.
4.2 Operaciones de IA (rapidas, 2-5 s)
- Propuesta inicial a partir de un tema.
- Re-propuesta al cambiar la densidad (
intent_density). - Sugerencia de nodo nuevo (backlog).
- Autocompletado de campos (backlog).
Patron en la UI:
- El admin acciona (clic, slider).
- Indicador de carga sutil (nunca modal bloqueante, nunca spinner de pagina completa).
- La UI sigue siendo interactiva — el admin puede editar otros nodos mientras la IA trabaja.
- El resultado aparece inline, como el clic-para-explicar (Curio) del runtime: clic → llamada rapida → el resultado aparece en el sitio.
5. Flujo unificado para cursos desde documento y desde tema
Ambos caminos convergen en la misma propuesta de esquema:
Desde documento: Desde tema:
subir PDF titulo + descripcion
→ parse a Markdown |
→ extraer temas → extraer temas
| |
└──────────────┬─────────────────────────┘
▼
proponer esquema (misma llamada)
▼
editor de esquema (misma UI)
5.1 Diferencias
| Aspecto | Desde documento | Desde tema |
|---|---|---|
| Entrada a la propuesta | Temas extraidos del Markdown | Temas extraidos del titulo/descripcion |
| Documento fuente | Se asocia al curso para RAG en runtime | No hay documento; el contenido se genera sin RAG |
| Calidad de la propuesta | Mas precisa (temas concretos del material) | Mas generica (depende de la calidad de la descripcion) |
5.2 Invariante
El endpoint de propuesta de esquema trabaja a partir de temas extraidos, no de
documentos crudos. La extraccion de temas es un paso previo (ya implementado en
build_schema_graph() como el nodo extract_themes_schema). El documento original, si
existe, se usa mas adelante para RAG cuando se genera contenido de nodo en runtime.
6. Backlog: fine-tuning para cursos grandes
Para organizaciones con grandes bases documentales o necesidades de dominio especificas. Nada de esto esta implementado ni planificado a corto plazo.
| Linea | Descripcion |
|---|---|
| Fine-tune de embeddings | Mejorar RAG en dominios especificos (medicina, legal, ingenieria) |
| Fine-tune del modelo de diseno | Aprender de esquemas que los admins aceptan vs rechazan |
| Fine-tune del modelo de generacion | Aprender de renders validados (OpenUI Lang) |
| Chunking adaptativo | Para documentos muy grandes (>100 paginas), estrategia de chunking por estructura |
| Generacion paralela de nodos | Para cursos con 20+ nodos, generar contenido en paralelo en vez de secuencial |
Prerequisito comun: volumen de datos suficiente. Una organizacion con 5 cursos no tiene datos para fine-tuning. Esto es relevante cuando haya decenas de organizaciones con cientos de cursos validados.