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.

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
- Le
crawlerrécupère la documentation officielle de Godot sur Internet. - Les résultats sont enregistrés sous forme de Markdown page par page.
- Le Markdown est normalisé et enrichi de métadonnées avant d’être converti en enregistrements JSONL.
- Les JSONL sont injectés dans PostgreSQL.
- PostgreSQL stocke séparément les fragments de documents, les mappings d’API et les prototypes d’étiquettes.
- Lorsqu’un utilisateur demande une analyse du code source de Godot, l’AST Parser structure le code du projet.
- Le Retriever recherche les preuves dans PostgreSQL en se basant sur la question de l’utilisateur et les résultats de l’analyse AST.
- Le Validator regroupe la question, les résultats AST et les preuves trouvées, puis les transmet à Qwen 3.6.
- Qwen 3.6 n’est pas le juge final ; il utilise les preuves validées pour formuler la réponse.
- 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.
- Extraire l'intention et la tâche cible à partir de la question de l'utilisateur.
- Récupérer les symboles API, les signaux de version et les chemins de fichiers depuis le résultat de l'AST Parser.
- Effectuer d'abord une recherche exacte dans
api_mapping. - Effectuer simultanément un filtrage des symboles API + recherche par mots‑clés + recherche vectorielle dans
docs_chunks. - Récupérer les libellés similaires et les règles de validation depuis
label_prototypes. - 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
- Vérifier
outputs/godot_docs_full/summary.jsonetfailed.json. - Charger
manifest.jsonetpages/*.md. - Créer le rapport de normalisation Markdown.
- Générer
docs_chunks.jsonl. - À partir des documents migration/class, créer les candidats
api_mapping.jsonl. - Générer
label_prototypes.jsonlà partir des règles approuvées et des cas représentatifs. - Insérer (upsert) dans PostgreSQL uniquement les enregistrements qui ont passé la validation du schéma JSONL.
- Générer les embeddings et mettre à jour l’index vectoriel.
- Mettre à jour l’index des mots‑clés et l’index exact.
- 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
- Rédiger le rapport d’analyse de la structure
pages/*.md. - Écrire le script de conversion
docs_chunks.jsonl. - Écrire le script de validation du schéma JSONL.
- Rédiger le DDL PostgreSQL.
- Injection et validation de la recherche
docs_chunks. - Génération des candidats
api_mappinget rédaction du flux d’approbation manuelle. - Création du jeu de labels initial
label_prototypes. - Extraction des champs minimaux avec l’AST Parser.
- Exportation du bundle de preuves du Retriever.
- 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.