idea_world_labDEV JOURNAL
dimanche 21 juin 2026

Schéma et architecture du classificateur RAG de la documentation officielle de Godot

Date de rédaction : 21 juin 2026

Objectif

Organiser l'architecture de référence permettant de connecter l’ensemble de la documentation officielle de Godot via le flux JSONL → PostgreSQL → Retriever → Validator → Qwen 3.6. Ce document n’est pas un guide d’implémentation pour créer les données d’entraînement, mais une spécification de conception définissant comment structurer les fichiers Markdown déjà rassemblés dans outputs/godot_docs_full/pages afin de les transformer en une base de données consultable.

Architecture initiale du classificateur RAG de Godot

Données d’entrée actuelles

Les résultats de la collecte de la documentation officielle se trouvent sous le répertoire outputs/godot_docs_full du dépôt.

Chemin Rôle
outputs/godot_docs_full/pages/ Markdown source de chaque page de la documentation officielle de Godot
outputs/godot_docs_full/manifest.json URL d’origine, chemin de fichier local, état de la collecte, taille en octets
outputs/godot_docs_full/summary.json Compte total des éléments collectés et résumé de la validation
outputs/godot_docs_full/urls.txt Liste des URL réellement collectées
outputs/godot_docs_full/searchindex_urls.txt Liste des URL cibles restaurées depuis l’index de recherche Sphinx
outputs/godot_docs_full/failed.json Liste des échecs de collecte
outputs/godot_docs_full/missing_from_searchindex.txt Liste des éléments manquants selon l’index de recherche

Ligne de base actuelle :

Élément Valeur
Pages cibles de l’index de recherche 1568
Pages collectées 1570
Fichiers de pages 1570
Récupérations échouées 0
Manquants dans l’index de recherche 0

Pipeline complet

  1. Le crawler récupère la documentation officielle de Godot sur Internet.
  2. Les résultats sont enregistrés sous forme de Markdown page par page.
  3. Le Markdown est normalisé et enrichi de métadonnées avant d’être converti en enregistrements JSONL.
  4. Les JSONL sont injectés dans PostgreSQL.
  5. PostgreSQL stocke séparément les fragments de documents, les mappings d’API et les prototypes d’étiquettes.
  6. Lorsqu’un utilisateur demande une analyse du code source de Godot, l’AST Parser structure le code du projet.
  7. Le Retriever recherche les preuves dans PostgreSQL en se basant sur la question de l’utilisateur et les résultats de l’analyse AST.
  8. Le Validator regroupe la question, les résultats AST et les preuves trouvées, puis les transmet à Qwen 3.6.
  9. Qwen 3.6 n’est pas le juge final ; il utilise les preuves validées pour formuler la réponse.
  10. Le Validator vérifie la provenance, le format et les motifs interdits de la réponse avant de la renvoyer à l’utilisateur.

Conversion du Markdown vers JSONL

Les fichiers pages/*.md sont les sources lisibles par les humains, mais ils sont trop volumineux pour le RAG. Ainsi, le script de conversion découpe chaque page en sections/membres d’API/exemples, tout en conservant l’URL d’origine et le type de document.

Règles de normalisation communes

Étape Traitement
Chargement du fichier Lire le Markdown en se basant sur les champs file, url, status, bytes du manifest.json.
Nettoyage du corps Supprimer les en‑têtes redondants, le texte d’interface Sphinx, les caractères d’ancre corrompus et les espaces excessifs.
Classification du type de document À partir de l’URL et du chemin, répartir en class_reference, tutorial, migration, engine_details, about, other.
Séparation des sections Créer des candidats de fragments en fonction de la hiérarchie des titres et du motif de référence de classe Godot.
Conservation des blocs de code Les exemples GDScript, C#, shader et CLI sont conservés dans code_blocks au lieu d’être supprimés du corps.
Attribution de provenance Ajouter à chaque enregistrement l’URL d’origine, le chemin du fichier, le hash source et la version du script de conversion.

Produits JSONL

Fichier Objectif Table cible
work/godot_rag/jsonl/docs_chunks.jsonl Fragments pour la recherche dans les descriptions, tutoriels et références officielles docs_chunks
work/godot_rag/jsonl/api_mapping.jsonl Règles de changement, renommage, dépréciation et remplacement d’API de Godot 3 → 4 api_mapping
work/godot_rag/jsonl/label_prototypes.jsonl Prototypes d’exemples pour la classification, transformation, rejet et modification label_prototypes
work/godot_rag/jsonl/ingest_report.jsonl Journaux d’avertissements, d’ignorés et de contrôle qualité pendant la conversion Validation avant injection en base de données

Schéma 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
  }
}

Champ obligatoire :

Champ Description
chunk_id ID déterministe qui ne change pas même après une réexécution
doc_version Version du document, par ex. stable, 4.6
source_url URL d'origine de la documentation officielle
source_file Chemin Markdown dans le dépôt
source_sha256 Hachage SHA‑256 du Markdown d'origine
doc_type Type de document
symbol Symbole représentatif lorsqu'il s'agit d'une classe ou d'une API
section_path Hiérarchie des titres
content Corps du texte destiné à la recherche et à l'indexation
code_blocks Tableau des blocs de code extraits du corps
api_symbols Symboles Godot API détectés dans le corps

Schéma 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"]
}

Principes :

Élément Critère
confidence Si une documentation officielle le justifie, verified_from_docs, les règles candidates sont marquées candidate.
Extraction automatique Des candidats peuvent être générés à partir de la documentation de migration et de la référence de classe.
Critère d'approbation Les règles utilisées pour l'apprentissage/étiquetage ne sont promues au statut approved que si elles ont été revues par une personne.
index exact source_api, target_api, match_terms sont des cibles de recherche exacte.

Schéma 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"]
  }
}

Label candidates:

Étiquette Signification
godot4_valid_api Utilisation d’une API valide selon Godot 4
godot3_api_in_godot4 API Godot 3 mélangée dans un projet Godot 4
deprecated_or_removed_api Utilisation d’une API supprimée ou obsolète
migration_required Nécessité de migration de Godot 3 → 4
ambiguous_version_signal Manque de critères ou conflit pour déterminer la version
non_godot_noise Données sans rapport avec Godot (Python/Web/Unity, etc.)
unsafe_or_obfuscated_code Code obfusqué, caractères de contrôle, code suspecté de malveillance

Ébauche du schéma PostgreSQL

PostgreSQL part du principe d’utiliser pgvector. La recherche par mots‑clés utilise tsvector ou un index trigramme.

docs_chunks

Colonne Type Description
id bigserial primary key ID interne
chunk_id text unique not null ID déterministe du JSONL
doc_version text not null Version du document
source_url text not null URL de la documentation officielle
source_file text not null Chemin du fichier Markdown
source_sha256 text not null Hachage de la source
doc_type text not null Type de document
symbol text Symbole API/classe représentatif
section_path jsonb not null Hiérarchie des titres
heading text Titre du chunk actuel
content text not null Corps recherché
code_blocks jsonb not null default '[]' Blocs de code
api_symbols text[] not null default '{}' Symboles extraits
metadata jsonb not null default '{}' Métadonnées diverses
embedding vector Embedding
search_tsv tsvector Recherche par mots‑clés
created_at timestamptz default now() Date d’insertion

Indexes:

Index Objectif
unique(chunk_id) Empêcher les insertions en double
ivfflat/hnsw(embedding) Recherche sémantique
gin(search_tsv) Recherche par mots‑clés
gin(api_symbols) Filtre par symboles d’API
btree(doc_type, symbol) Filtre par classe/API du document

api_mapping

Colonne Type Description
id bigserial primary key ID interne
mapping_id text unique not null ID déterministe
source_api text not null API d’origine/problématique
target_api text API recommandée
change_type text not null rename, removed, behavior_change, etc.
godot_from text Version de départ
godot_to text Version cible
confidence text not null Niveau de justification
status text not null default 'candidate' candidate, approved, rejected
evidence_chunk_ids text[] not null default '{}' Chunks de documentation officielle comme preuve
match_terms text[] not null default '{}' Mots‑clés de recherche
notes text Explications
negative_patterns jsonb not null default '[]' Modèles interdits

Indexes:

Index Objectif
unique(mapping_id) Empêcher les doublons
btree(source_api) Recherche exacte
btree(target_api) Recherche inverse
gin(match_terms) Recherche par mots‑clés
btree(status, confidence) Filtre des règles d’approbation

label_prototypes

Colonne Type Description
id bigserial primary key ID interne
prototype_id text unique not null ID déterministe
label text not null Étiquette de classification
task_type text not null classification, migration_fix, patch_generation, etc.
input_pattern text not null Modèle de détection
expected_finding text not null Verdict attendu
recommended_action text Action recommandée
evidence_mapping_ids text[] not null default '{}' Preuves de mappage d’API
evidence_chunk_ids text[] not null default '{}' Preuves de chunks de documentation
severity text not null low, medium, high
validator_rules jsonb not null default '{}' Règles de validation
embedding vector Recherche de cas similaires
search_tsv tsvector Recherche par mots‑clés

Indexes:

Index Objectif
unique(prototype_id) Empêcher les doublons
btree(label, task_type) Recherche par étiquette
ivfflat/hnsw(embedding) Recherche d’étiquettes similaires
gin(search_tsv) Recherche par mots‑clés

Entrée/Sortie du parseur AST

Le parseur AST transforme le code source de l’utilisateur en une structure interrogeable avant de le transmettre à un LLM. Les cibles initiales sont .gd, .tscn, project.godot.

Entrée

Entrée Description
Question de l’utilisateur Ex. : « Ce projet est‑il sûr selon les critères de Godot 4 ? »
Fichiers source .gd, .tscn, .tres, project.godot
Structure du projet Chemins de fichiers, connexions de scènes, chemins de ressources

Sortie du schéma

{
  "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": []
  }
}

Champ d'extraction initial :

Champ Objectif
extends Détermination de la version Node/API
class_name Mappage des symboles internes du projet
annotations Signaux Godot 4 tels que @onready, @export, etc.
legacy_keywords Signaux Godot 3 tels que onready var, export var, KinematicBody, etc.
method_calls Recherche de documentation et consultation du mappage API
scene_dependencies Vérification des liens scène/script
resource_paths Vérification des ressources manquantes et des liens d'actifs

Fonctionnement du Retriever

Le Retriever est une couche qui sélectionne les preuves avant le LLM.

  1. Extraire l'intention et la tâche cible à partir de la question de l'utilisateur.
  2. Récupérer les symboles API, les signaux de version et les chemins de fichiers depuis le résultat de l'AST Parser.
  3. Effectuer d'abord une recherche exacte dans api_mapping.
  4. Effectuer simultanément un filtrage des symboles API + recherche par mots‑clés + recherche vectorielle dans docs_chunks.
  5. Récupérer les libellés similaires et les règles de validation depuis label_prototypes.
  6. Trier les résultats de recherche en bundles de preuves.

Bundle de preuves :

{
  "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
  }
}

Séparation des rôles entre Validator et Qwen 3.6

Qwen 3.6 est le modèle qui lit les preuves récupérées et organise la réponse. Le Validator est responsable du label final, de l’adoption des preuves et de la validation des motifs interdits.

Composant Responsabilité
Retriever Recherche de documents officiels/API pertinents / mapping / preuves de label
Validator Vérification des preuves manquantes, des motifs interdits, du format JSON de sortie
Qwen 3.6 Explication lisible par l’utilisateur, orientation des modifications, synthèse des propositions de code

Éléments que le Validator doit vérifier :

Élément Critère
Existence de l’ID de preuve L’ID du document/mapping/label utilisé dans la réponse doit figurer dans les résultats de recherche réels.
Référence à Godot 4 Il ne faut pas recommander l’API Godot 3 dans un projet Godot 4.
Indication d’incertitude Si les preuves sont insuffisantes, il faut interdire le jugement définitif et le marquer avec ambiguous_version_signal.
Validation des propositions de code Le code proposé ne doit pas entrer en conflit avec la dimension 2D/3D du projet détecté.
Format JSON La sortie du pipeline interne doit être un JSON analysable.

Ordre d’injection

  1. Vérifier outputs/godot_docs_full/summary.json et failed.json.
  2. Charger manifest.json et pages/*.md.
  3. Créer le rapport de normalisation Markdown.
  4. Générer docs_chunks.jsonl.
  5. À partir des documents migration/class, créer les candidats api_mapping.jsonl.
  6. Générer label_prototypes.jsonl à partir des règles approuvées et des cas représentatifs.
  7. Insérer (upsert) dans PostgreSQL uniquement les enregistrements qui ont passé la validation du schéma JSONL.
  8. Générer les embeddings et mettre à jour l’index vectoriel.
  9. Mettre à jour l’index des mots‑clés et l’index exact.
  10. Vérifier les résultats du Retriever avec des questions d’exemple.

Checklist de validation de la qualité

Étape Critère de passage
Validation de la collecte failed_count = 0, missing_from_searchindex = 0
Normalisation Markdown Aucun chunk vide, URL d’origine conservée
Validation JSONL Chaque ligne est parsable en JSON, les champs obligatoires existent
Validation des doublons Pas de doublons parmi chunk_id, mapping_id, prototype_id
Validation des preuves api_mapping.evidence_chunk_ids existent réellement dans docs_chunks
Validation de la recherche Les questions API représentatives renvoient à la fois un hit exact et un hit docs
Validation de la réponse La réponse de Qwen ne contient pas d’affirmations sans preuve ni de recommandation de l’API Godot 3

Priorités de mise en œuvre

  1. Rédiger le rapport d’analyse de la structure pages/*.md.
  2. Écrire le script de conversion docs_chunks.jsonl.
  3. Écrire le script de validation du schéma JSONL.
  4. Rédiger le DDL PostgreSQL.
  5. Injection et validation de la recherche docs_chunks.
  6. Génération des candidats api_mapping et rédaction du flux d’approbation manuelle.
  7. Création du jeu de labels initial label_prototypes.
  8. Extraction des champs minimaux avec l’AST Parser.
  9. Exportation du bundle de preuves du Retriever.
  10. Connecter la boucle de synthèse des réponses Validator + Qwen 3.6.

Principes fondamentaux

  • Le Markdown original de la documentation officielle n’est pas modifié et est conservé.
  • Le JSONL est considéré comme un artefact intermédiaire reproductible.
  • La base de données doit toujours conserver le chemin d’accès original, l’URL d’origine, le hash et la version du script de conversion.
  • Empêcher le LLM d’inventer des labels.
  • Le jugement Godot 3/4 repose sur la combinaison du signal AST, du mapping API et des preuves de la documentation officielle.
  • Les candidats incertains ne sont pas directement utilisés comme données d’entraînement mais restent à l’état candidate.
  • Qwen 3.6 agit comme organisateur de réponses, les critères de jugement étant détenus par le Retriever et le Validator.

Prochaine tâche

L’étape suivante consiste à analyser un échantillon de la structure Markdown dans outputs/godot_docs_full/pages. Étant donné que les références de classe, les migrations et les tutoriels ont des structures différentes, il faut d’abord définir des stratégies de chunking spécifiques à chaque type de document plutôt que d’appliquer une règle de chunking unique.