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.

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
- El
crawlerrecopila la documentación oficial de Godot desde Internet. - Los resultados de la recopilación se guardan como Markdown por página.
- El Markdown se normaliza y se le añaden metadatos para convertirlo en registros JSONL.
- Los JSONL se inyectan en PostgreSQL.
- PostgreSQL almacena los fragmentos de documento, el mapeo de API y los prototipos de etiquetas por separado.
- Cuando el usuario solicita un análisis del código fuente de Godot, el AST Parser estructura el código del proyecto.
- El Retriever busca evidencia en PostgreSQL basándose en la pregunta del usuario y los resultados del análisis AST.
- El Validator agrupa la pregunta, el resultado del AST y la evidencia encontrada y la envía a Qwen 3.6.
- Qwen 3.6 no actúa como decisor final, sino que elabora la respuesta usando la evidencia verificada.
- 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.
- Extrae la intención y la tarea objetivo de la pregunta del usuario.
- Obtiene símbolos de API, señales de versión y rutas de archivo del resultado del AST Parser.
- Realiza primero una búsqueda exacta en
api_mapping. - Ejecuta simultáneamente filtrado de símbolos de API + búsqueda por palabras clave + búsqueda vectorial en
docs_chunks. - Obtiene etiquetas similares y reglas de validación de
label_prototypes. - 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
- Revisar
outputs/godot_docs_full/summary.jsonyfailed.json. - Cargar
manifest.jsonypages/*.md. - Generar el informe de normalización de Markdown.
- Crear
docs_chunks.jsonl. - Generar candidatos
api_mapping.jsonla partir de la documentación migration/class. - Crear
label_prototypes.jsonlcon reglas aprobadas y casos representativos. - Insertar (upsert) en PostgreSQL solo los registros que pasen la validación del esquema JSONL.
- Generar embeddings y actualizar el índice vectorial.
- Actualizar el índice de palabras clave y el índice exacto.
- 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
- Redactar informe de análisis de la estructura de
pages/*.md. - Crear script de transformación para
docs_chunks.jsonl. - Crear script de validación del esquema JSONL.
- Redactar DDL de PostgreSQL.
- Inyección y verificación de búsqueda de
docs_chunks. - Generar candidatos
api_mappingy diseñar flujo de aprobación manual. - Crear conjunto inicial de etiquetas en
label_prototypes. - Extraer campos mínimos con el AST Parser.
- Generar salida del bundle de evidencia del Retriever.
- 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.