idea_world_labDEV JOURNAL
domingo, 21 de junio de 2026

Esquema y arquitectura del clasificador RAG de la documentación oficial de Godot

Fecha de creación: 21 de junio de 2026

Propósito

Organizar la arquitectura de referencia para conectar la recopilación completa de la documentación oficial de Godot mediante el flujo JSONL -> PostgreSQL -> Retriever -> Validator -> Qwen 3.6. Este documento no es una guía de implementación para generar datos de entrenamiento, sino un criterio de diseño que define cómo estructurar la documentación Markdown ya reunida en outputs/godot_docs_full/pages y convertirla en una base de datos de evidencia buscable.

Arquitectura inicial del clasificador RAG de Godot

Datos de entrada actuales

Los resultados de la recopilación de la documentación oficial se encuentran bajo outputs/godot_docs_full en el repositorio.

Ruta Función
outputs/godot_docs_full/pages/ Markdown original por página de la documentación oficial de Godot
outputs/godot_docs_full/manifest.json URL original, ruta de archivo local, estado de recopilación, tamaño en bytes
outputs/godot_docs_full/summary.json Resumen de recuento total y verificación
outputs/godot_docs_full/urls.txt Lista de URLs realmente recopiladas
outputs/godot_docs_full/searchindex_urls.txt Lista de URLs objetivo restaurada del índice de búsqueda de Sphinx
outputs/godot_docs_full/failed.json Lista de fallos de recopilación
outputs/godot_docs_full/missing_from_searchindex.txt Lista de omisiones según el índice de búsqueda

Línea base actual:

Ítem Valor
Páginas objetivo del índice de búsqueda 1568
Páginas recopiladas 1570
Archivos de página 1570
Recuperaciones fallidas 0
Ausentes del índice de búsqueda 0

Pipeline completo

  1. El crawler recopila la documentación oficial de Godot desde Internet.
  2. Los resultados de la recopilación se guardan como Markdown por página.
  3. El Markdown se normaliza y se le añaden metadatos para convertirlo en registros JSONL.
  4. Los JSONL se inyectan en PostgreSQL.
  5. PostgreSQL almacena los fragmentos de documento, el mapeo de API y los prototipos de etiquetas por separado.
  6. Cuando el usuario solicita un análisis del código fuente de Godot, el AST Parser estructura el código del proyecto.
  7. El Retriever busca evidencia en PostgreSQL basándose en la pregunta del usuario y los resultados del análisis AST.
  8. El Validator agrupa la pregunta, el resultado del AST y la evidencia encontrada y la envía a Qwen 3.6.
  9. Qwen 3.6 no actúa como decisor final, sino que elabora la respuesta usando la evidencia verificada.
  10. El Validator verifica la evidencia/formato/patrones prohibidos de la respuesta y la devuelve al usuario.

Conversión de Markdown a JSONL

Los archivos pages/*.md son la versión original legible por humanos, pero son demasiado grandes para RAG. Por lo tanto, el script de conversión divide cada página en secciones/miembros de API/ejemplos y conserva la URL original y el tipo de documento.

Reglas comunes de normalización

Paso Acción
Carga del archivo Se lee el Markdown según file, url, status, bytes de manifest.json.
Limpieza del cuerpo Se eliminan encabezados repetidos, texto de la UI de Sphinx, caracteres de ancla rotos y espacios excesivos.
Clasificación del tipo de documento Según la URL y la ruta, se clasifica en class_reference, tutorial, migration, engine_details, about u other.
División de secciones Se crean candidatos a fragmentos basados en la jerarquía de títulos y patrones de referencia de clases de Godot.
Conservación de bloques de código Los ejemplos de GDScript, C#, shader y CLI se conservan en code_blocks sin eliminar del cuerpo.
Asignación de provenance Cada registro lleva la URL original, la ruta del archivo, el hash original y la versión del script de conversión.

Salida JSONL

Archivo Propósito Tabla de destino
work/godot_rag/jsonl/docs_chunks.jsonl Fragmentos para búsqueda de descripciones/tutoriales/referencias de la documentación oficial docs_chunks
work/godot_rag/jsonl/api_mapping.jsonl Reglas de cambios, renombrados, deprecaciones y sustituciones de la API de Godot 3 → 4 api_mapping
work/godot_rag/jsonl/label_prototypes.jsonl Prototipos de ejemplos para clasificación/transformación/rechazo/modificación label_prototypes
work/godot_rag/jsonl/ingest_report.jsonl Registro de advertencias, omisiones y control de calidad durante la conversión Validación antes de la inserción en la base de datos

Esquema de docs_chunks.jsonl

{
  "chunk_id": "godot-stable:classes/class_node.html#description:0001",
  "doc_version": "stable",
  "source_url": "https://docs.godotengine.org/en/stable/classes/class_node.html",
  "source_file": "outputs/godot_docs_full/pages/classes__class_node__....md",
  "source_sha256": "...",
  "doc_type": "class_reference",
  "symbol": "Node",
  "section_path": ["Node", "Description"],
  "heading": "Description",
  "content": "Nodes are Godot's building blocks...",
  "code_blocks": [],
  "language_tags": ["gdscript"],
  "godot_version_tags": ["4.x", "stable"],
  "api_symbols": ["Node", "_ready", "_process", "queue_free"],
  "token_count": 420,
  "metadata": {
    "status": "copied_old",
    "bytes": 12345
  }
}

Campos obligatorios:

Campo Descripción
chunk_id ID determinista que no cambia aunque se vuelva a ejecutar
doc_version Versión del documento, como stable, 4.6, etc.
source_url URL original de la documentación oficial
source_file Ruta del Markdown en el repositorio
source_sha256 Hash SHA256 del Markdown original
doc_type Tipo de documento
symbol Símbolo representativo cuando es documentación de clase/API
section_path Jerarquía de títulos
content Cuerpo objetivo para búsqueda e incrustación
code_blocks Arreglo de bloques de código extraídos del cuerpo
api_symbols Símbolos de la API Godot detectados en el cuerpo

Esquema api_mapping.jsonl

{
  "mapping_id": "godot3-to-4:kinematicbody2d-to-characterbody2d",
  "source_api": "KinematicBody2D",
  "target_api": "CharacterBody2D",
  "change_type": "rename_or_replacement",
  "godot_from": "3.x",
  "godot_to": "4.x",
  "confidence": "verified_from_docs",
  "evidence_chunk_ids": [
    "godot-stable:tutorials/migrating/upgrading_to_godot_4.html#..."
  ],
  "match_terms": ["KinematicBody2D", "CharacterBody2D"],
  "notes": "Godot 4 character movement node replacement candidate.",
  "negative_patterns": ["do not suggest KinematicBody2D for Godot 4 projects"]
}

Principios:

Ítem Criterio
confidence Si hay evidencia en la documentación oficial, usar verified_from_docs; los candidatos a regla se marcan como candidate.
Extracción automática Se pueden crear candidatos a partir de la documentación de migración y la referencia de clases.
Criterio de aprobación Las reglas usadas para entrenamiento/etiquetado solo se promueven a estado approved si han sido revisadas por una persona.
índice exacto source_api, target_api, match_terms son objetos de búsqueda exacta.

Esquema de label_prototypes.jsonl

{
  "prototype_id": "label:godot3-api-in-godot4:kinematicbody2d",
  "label": "godot3_api_in_godot4",
  "task_type": "version_classification",
  "input_pattern": "extends KinematicBody2D",
  "expected_finding": "Godot 3 style physics body API detected.",
  "recommended_action": "Use CharacterBody2D or CharacterBody3D depending on project dimension.",
  "evidence_mapping_ids": [
    "godot3-to-4:kinematicbody2d-to-characterbody2d"
  ],
  "evidence_chunk_ids": [],
  "severity": "high",
  "validator_rules": {
    "requires_ast_symbol": "KinematicBody2D",
    "forbidden_answer_terms": ["KinematicBody2D is recommended in Godot 4"]
  }
}

Etiqueta candidata:

Etiqueta Significado
godot4_valid_api Uso de API válida según Godot 4
godot3_api_in_godot4 API de Godot 3 mezclada en proyecto de Godot 4
deprecated_or_removed_api Uso de API eliminada o obsoleta
migration_required Necesario convertir de Godot 3 a 4
ambiguous_version_signal Insuficiente o conflictiva evidencia para determinar la versión
non_godot_noise Datos no relacionados con Godot (Python/web/Unity, etc.)
unsafe_or_obfuscated_code Código ofuscado, caracteres de control, sospecha de código malicioso

Borrador del esquema PostgreSQL

PostgreSQL asume por defecto el uso de pgvector. La búsqueda por palabras clave se realiza con tsvector o índices trigram.

docs_chunks

Columna Tipo Descripción
id bigserial primary key ID interno
chunk_id text unique not null ID determinístico del JSONL
doc_version text not null Versión del documento
source_url text not null URL de la documentación oficial
source_file text not null Ruta del archivo Markdown
source_sha256 text not null Hash original
doc_type text not null Tipo de documento
symbol text Símbolo representativo de API/clase
section_path jsonb not null Jerarquía de títulos
heading text Título del fragmento actual
content text not null Cuerpo a indexar para búsqueda
code_blocks jsonb not null default '[]' Bloques de código
api_symbols text[] not null default '{}' Símbolos extraídos
metadata jsonb not null default '{}' Metadatos adicionales
embedding vector Embedding
search_tsv tsvector Búsqueda por palabras clave
created_at timestamptz default now() Marca de tiempo de inserción

Índices:

Índice Propósito
unique(chunk_id) Evitar inserciones duplicadas
ivfflat/hnsw(embedding) Búsqueda semántica
gin(search_tsv) Búsqueda por palabras clave
gin(api_symbols) Filtrado por símbolos de API
btree(doc_type, symbol) Filtrado de documentación de clase/API

api_mapping

Columna Tipo Descripción
id bigserial primary key ID interno
mapping_id text unique not null ID determinístico
source_api text not null API anterior/problema
target_api text API recomendada
change_type text not null rename, removed, behavior_change, etc.
godot_from text Versión de origen
godot_to text Versión objetivo
confidence text not null Nivel de evidencia
status text not null default 'candidate' candidate, approved, rejected
evidence_chunk_ids text[] not null default '{}' Fragmentos de documentación oficial
match_terms text[] not null default '{}' Palabras clave de búsqueda
notes text Comentarios
negative_patterns jsonb not null default '[]' Patrones prohibidos

Índices:

Índice Propósito
unique(mapping_id) Evitar duplicados
btree(source_api) Búsqueda exacta
btree(target_api) Búsqueda inversa
gin(match_terms) Búsqueda por palabras clave
btree(status, confidence) Filtrado de reglas de aprobación

label_prototypes

Columna Tipo Descripción
id bigserial primary key ID interno
prototype_id text unique not null ID determinístico
label text not null Etiqueta de clasificación
task_type text not null classification, migration_fix, patch_generation, etc.
input_pattern text not null Patrón de detección
expected_finding text not null Resultado esperado
recommended_action text Acción recomendada
evidence_mapping_ids text[] not null default '{}' Evidencia de mapeo de API
evidence_chunk_ids text[] not null default '{}' Evidencia de fragmentos de documentación
severity text not null low, medium, high
validator_rules jsonb not null default '{}' Reglas de validación
embedding vector Búsqueda de casos similares
search_tsv tsvector Búsqueda por palabras clave

Índices:

Índice Propósito
unique(prototype_id) Evitar duplicados
btree(label, task_type) Consulta por etiqueta
ivfflat/hnsw(embedding) Búsqueda de etiquetas similares
gin(search_tsv) Búsqueda por palabras clave

AST Parser entrada/salida

AST Parser convierte el código fuente del usuario en una estructura buscable antes de pasarlo directamente al LLM. El objetivo inicial son .gd, .tscn, project.godot.

Entrada

Entrada Descripción
Pregunta del usuario Por ejemplo: "¿Puedes revisar si este proyecto es seguro según Godot 4?"
Archivo de código fuente .gd, .tscn, .tres, project.godot
Estructura del proyecto Rutas de archivos, conexiones de escenas, rutas de recursos

Esquema de salida

{
  "project_id": "local-analysis-...",
  "godot_project": {
    "config_version": 5,
    "features": ["4.4", "Forward Plus"]
  },
  "files": [
    {
      "path": "scripts/player.gd",
      "language": "gdscript",
      "extends": "CharacterBody2D",
      "class_name": "Player",
      "symbols": ["CharacterBody2D", "Input", "move_and_slide"],
      "annotations": ["@onready"],
      "version_signals": ["godot4_annotation_syntax"],
      "diagnostics": []
    }
  ],
  "version_evidence": {
    "godot4": ["config_version=5", "@onready"],
    "godot3": []
  }
}

Inicial campo de extracción:

Campo Propósito
extends Determinación de la versión de Node/API
class_name Mapeo de símbolos internos del proyecto
annotations Señales de Godot 4 como @onready, @export, etc.
legacy_keywords Señales de Godot 3 como onready var, export var, KinematicBody, etc.
method_calls Búsqueda de documentación y consulta de mapeo de API
scene_dependencies Verificación de conexiones de escena/script
resource_paths Verificación de recursos faltantes y conexiones de assets

Funcionamiento del Retriever

El Retriever es una capa que selecciona evidencia antes que el LLM.

  1. Extrae la intención y la tarea objetivo de la pregunta del usuario.
  2. Obtiene símbolos de API, señales de versión y rutas de archivo del resultado del AST Parser.
  3. Realiza primero una búsqueda exacta en api_mapping.
  4. Ejecuta simultáneamente filtrado de símbolos de API + búsqueda por palabras clave + búsqueda vectorial en docs_chunks.
  5. Obtiene etiquetas similares y reglas de validación de label_prototypes.
  6. Ordena los resultados de búsqueda en paquetes de evidencia.

Paquetes de evidencia:

{
  "query_id": "analysis-...",
  "task_type": "version_classification",
  "ast_summary": {},
  "doc_evidence": [],
  "api_mapping_evidence": [],
  "label_evidence": [],
  "retrieval_scores": {
    "exact_api_hits": 2,
    "keyword_hits": 8,
    "vector_hits": 12
  }
}

Separación de roles entre Validator y Qwen 3.6

Qwen 3.6 es el modelo que lee la evidencia encontrada y organiza la respuesta. El Validator se encarga de la etiqueta final, la adopción de evidencia y la verificación de patrones prohibidos.

Componente Responsabilidad
Retriever Búsqueda de documentación oficial/API, mapeo y evidencia de etiquetas
Validator Verificación de evidencia faltante, patrones prohibidos, formato JSON de salida
Qwen 3.6 Explicación legible para el usuario, dirección de corrección, organización de propuestas de código

Elementos que Validator debe comprobar:

Elemento Criterio
Existencia del ID de evidencia El ID de documento/mapeo/etiqueta usado en la respuesta debe estar presente en los resultados de búsqueda reales.
Basado en Godot 4 No se debe recomendar la API de Godot 3 en proyectos de Godot 4.
Indicación de incertidumbre Si la evidencia es insuficiente, se prohíbe una conclusión definitiva y se marca con ambiguous_version_signal.
Verificación de propuestas de código El código propuesto no debe entrar en conflicto con la dimensión 2D/3D del proyecto detectado.
Formato JSON La salida interna del pipeline debe ser un JSON parseable.

Orden de inyección

  1. Revisar outputs/godot_docs_full/summary.json y failed.json.
  2. Cargar manifest.json y pages/*.md.
  3. Generar el informe de normalización de Markdown.
  4. Crear docs_chunks.jsonl.
  5. Generar candidatos api_mapping.jsonl a partir de la documentación migration/class.
  6. Crear label_prototypes.jsonl con reglas aprobadas y casos representativos.
  7. Insertar (upsert) en PostgreSQL solo los registros que pasen la validación del esquema JSONL.
  8. Generar embeddings y actualizar el índice vectorial.
  9. Actualizar el índice de palabras clave y el índice exacto.
  10. Verificar los resultados del Retriever con preguntas de muestra.

Lista de verificación de calidad

Etapa Criterio de aprobación
Verificación de recolección failed_count = 0, missing_from_searchindex = 0
Normalización de Markdown No hay fragmentos vacíos, se conserva la URL original
Verificación de JSONL Cada línea es parseable como JSON, los campos obligatorios existen
Verificación de duplicados No hay duplicados de chunk_id, mapping_id o prototype_id
Verificación de evidencia api_mapping.evidence_chunk_ids existen realmente en docs_chunks
Verificación de búsqueda Las preguntas representativas de API devuelven hits exactos y de documentos simultáneamente
Verificación de respuesta La respuesta de Qwen no contiene afirmaciones sin evidencia ni recomienda la API de Godot 3

Prioridades de implementación

  1. Redactar informe de análisis de la estructura de pages/*.md.
  2. Crear script de transformación para docs_chunks.jsonl.
  3. Crear script de validación del esquema JSONL.
  4. Redactar DDL de PostgreSQL.
  5. Inyección y verificación de búsqueda de docs_chunks.
  6. Generar candidatos api_mapping y diseñar flujo de aprobación manual.
  7. Crear conjunto inicial de etiquetas en label_prototypes.
  8. Extraer campos mínimos con el AST Parser.
  9. Generar salida del bundle de evidencia del Retriever.
  10. Conectar el bucle de organización de respuestas de Validator + Qwen 3.6.

Principios clave

  • No modificar ni eliminar el Markdown original de la documentación oficial.
  • Tratar JSONL como artefacto intermedio reproducible.
  • En la base de datos registrar siempre la ruta original, la URL original, el hash y la versión del script de transformación.
  • Evitar que el LLM invente etiquetas.
  • La determinación Godot 3/4 se basa en señales del AST, mapeo de API y evidencia de la documentación oficial.
  • Los candidatos inciertos no se usan directamente como datos de entrenamiento, sino que se mantienen en estado candidate.
  • Qwen 3.6 actúa como organizador de respuestas; los criterios de decisión los poseen Retriever y Validator.

Próximas tareas

El siguiente paso es analizar la estructura de Markdown en outputs/godot_docs_full/pages. Dado que la referencia de clases, la migración y los tutoriales tienen estructuras diferentes, primero se debe definir una estrategia de fragmentación por tipo de documento en lugar de aplicar una única regla de fragmentación.