Esquema e Arquitetura do Classificador RAG da Documentação Oficial do Godot
Data de criação: 21 de junho de 2026
Propósito
Organizar a arquitetura de referência para conectar a coleta completa da documentação oficial do Godot ao fluxo JSONL -> PostgreSQL -> Retriever -> Validator -> Qwen 3.6. Este documento não é um guia de implementação para gerar dados de treinamento, mas sim um critério de design que define como estruturar a documentação Markdown já reunida em outputs/godot_docs_full/pages e transformá‑la em um banco de dados de evidências pesquisável.

Dados de entrada atuais
Os resultados da coleta da documentação oficial estão localizados em outputs/godot_docs_full no repositório.
| Caminho | Função |
|---|---|
outputs/godot_docs_full/pages/ |
Markdown original da documentação oficial do Godot, por página |
outputs/godot_docs_full/manifest.json |
URL original, caminho local do arquivo, status da coleta, tamanho em bytes |
outputs/godot_docs_full/summary.json |
Resumo da contagem total coletada e validações |
outputs/godot_docs_full/urls.txt |
Lista de URLs efetivamente coletadas |
outputs/godot_docs_full/searchindex_urls.txt |
Lista de URLs alvo restauradas a partir do índice de busca do Sphinx |
outputs/godot_docs_full/failed.json |
Lista de falhas na coleta |
outputs/godot_docs_full/missing_from_searchindex.txt |
Lista de itens ausentes segundo o índice de busca |
Linha de base atual:
| Item | Valor |
|---|---|
| Páginas alvo do índice de busca | 1568 |
| Páginas coletadas | 1570 |
| Arquivos de página | 1570 |
| Falhas de obtenção | 0 |
| Ausentes no índice de busca | 0 |
Pipeline completa
- O
crawlercoleta a documentação oficial do Godot da internet. - Os resultados são armazenados como Markdown por página.
- O Markdown é normalizado e enriquecido com metadados, sendo convertido em registros JSONL.
- Os JSONL são inseridos no PostgreSQL.
- O PostgreSQL armazena separadamente chunks de documentos, mapeamento de API e protótipos de rótulos.
- Quando o usuário solicita análise do código‑fonte do Godot, o AST Parser estrutura o código do projeto.
- O Retriever busca evidências no PostgreSQL com base na pergunta do usuário e nos resultados da análise AST.
- O Validator agrupa a pergunta, o resultado AST e as evidências encontradas e os envia ao Qwen 3.6.
- O Qwen 3.6 não atua como julgador final; ele elabora a resposta usando as evidências validadas.
- O Validator verifica a evidência, o formato e padrões proibidos da resposta antes de devolvê‑la ao usuário.
Conversão de Markdown para JSONL
pages/*.md são as páginas originais legíveis por humanos, mas são unidades muito grandes para RAG. Portanto, o script de conversão divide as páginas em seções/membros de API/exemplos, preservando a URL original e o tipo de documento.
Regras comuns de normalização
| Etapa | Processamento |
|---|---|
| Carregar arquivo | Lê o Markdown com base nos campos file, url, status, bytes do manifest.json. |
| Limpar corpo | Remove cabeçalhos repetidos, textos da UI do Sphinx, caracteres de âncora corrompidos e espaços excessivos. |
| Classificar tipo de documento | Usa URL e caminho para dividir em class_reference, tutorial, migration, engine_details, about ou other. |
| Separar seções | Cria candidatos a chunks com base na hierarquia de títulos e nos padrões de referência de classes do Godot. |
| Preservar blocos de código | Exemplos em GDScript, C#, shader e CLI são mantidos em code_blocks ao invés de serem removidos do corpo. |
| Atribuir provenance | Cada registro recebe URL original, caminho do arquivo, hash original e versão do script de conversão. |
Saídas JSONL
| Arquivo | Propósito | Tabela de destino |
|---|---|---|
work/godot_rag/jsonl/docs_chunks.jsonl |
Chunks para busca em descrições, tutoriais e referências da documentação oficial | docs_chunks |
work/godot_rag/jsonl/api_mapping.jsonl |
Regras de mudança, renomeação, descontinuação e substituição da API Godot 3 → 4 | api_mapping |
work/godot_rag/jsonl/label_prototypes.jsonl |
Protótipos de exemplos para classificação, transformação, rejeição e correção | label_prototypes |
work/godot_rag/jsonl/ingest_report.jsonl |
Avisos, skips e logs de controle de qualidade durante a conversão | Verificação antes da inserção no DB |
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
}
}Obrigatório campos:
| Campo | Descrição |
|---|---|
chunk_id |
ID determinístico que não muda mesmo após reexecução |
doc_version |
Versão da documentação, como stable, 4.6 etc. |
source_url |
URL original da documentação oficial |
source_file |
Caminho do Markdown no repositório |
source_sha256 |
Hash SHA‑256 do Markdown original |
doc_type |
Tipo de documento |
symbol |
Símbolo representativo quando for documentação de classe/API |
section_path |
Hierarquia de títulos |
content |
Texto principal usado para busca e incorporação |
code_blocks |
Array de blocos de código extraídos do texto |
api_symbols |
Símbolos da API Godot detectados no texto |
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"]
}Princípios:
| Item | Critério |
|---|---|
confidence |
Se houver base em documentação oficial, use verified_from_docs; candidatos a regras ficam como candidate. |
| Extração automática | É possível gerar candidatos a partir da documentação de migração e da referência de classes. |
| Critério de aprovação | Regras usadas para treinamento/rotulagem são promovidas ao estado approved somente se revisadas por uma pessoa. |
| índice exato | source_api, target_api e match_terms são alvos de busca exata. |
Esquema 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"]
}
}Candidatos de rótulo:
| Rótulo | Significado |
|---|---|
godot4_valid_api |
Uso de API válida segundo o padrão Godot 4 |
godot3_api_in_godot4 |
API do Godot 3 misturada em projeto Godot 4 |
deprecated_or_removed_api |
Uso de API removida ou obsoleta |
migration_required |
Necessária migração de Godot 3 → 4 |
ambiguous_version_signal |
Falta de evidência ou conflito para determinar a versão |
non_godot_noise |
Dados não relacionados ao Godot (Python/Web/Unity etc.) |
unsafe_or_obfuscated_code |
Código ofuscado, caracteres de controle, suspeita de malware |
Rascunho de esquema PostgreSQL
O PostgreSQL assume, por padrão, o uso de pgvector. A busca por palavras‑chave utiliza tsvector ou índice trigram.
docs_chunks
| Coluna | Tipo | Descrição |
|---|---|---|
id |
bigserial primary key |
ID interno |
chunk_id |
text unique not null |
ID determinístico do JSONL |
doc_version |
text not null |
Versão do documento |
source_url |
text not null |
URL da documentação oficial |
source_file |
text not null |
Caminho do arquivo Markdown |
source_sha256 |
text not null |
Hash original |
doc_type |
text not null |
Tipo de documento |
symbol |
text |
Símbolo representativo da API/classe |
section_path |
jsonb not null |
Hierarquia de títulos |
heading |
text |
Título atual do chunk |
content |
text not null |
Texto pesquisável |
code_blocks |
jsonb not null default '[]' |
Blocos de código |
api_symbols |
text[] not null default '{}' |
Símbolos extraídos |
metadata |
jsonb not null default '{}' |
Metadados adicionais |
embedding |
vector |
Embedding |
search_tsv |
tsvector |
Busca por palavras‑chave |
created_at |
timestamptz default now() |
Timestamp de inserção |
Índices:
| Índice | Propósito |
|---|---|
unique(chunk_id) |
Evitar inserções duplicadas |
ivfflat/hnsw(embedding) |
Busca semântica |
gin(search_tsv) |
Busca por palavras‑chave |
gin(api_symbols) |
Filtro por símbolos de API |
btree(doc_type, symbol) |
Filtro por classe/API |
api_mapping
| Coluna | Tipo | Descrição |
|---|---|---|
id |
bigserial primary key |
ID interno |
mapping_id |
text unique not null |
ID determinístico |
source_api |
text not null |
API original/problemática |
target_api |
text |
API recomendada |
change_type |
text not null |
rename, removed, behavior_change etc. |
godot_from |
text |
Versão de origem |
godot_to |
text |
Versão alvo |
confidence |
text not null |
Nível de evidência |
status |
text not null default 'candidate' |
candidate, approved, rejected |
evidence_chunk_ids |
text[] not null default '{}' |
Chunks de documentação oficial como evidência |
match_terms |
text[] not null default '{}' |
Palavras‑chave de busca |
notes |
text |
Observações |
negative_patterns |
jsonb not null default '[]' |
Padrões proibidos |
Índices:
| Índice | Propósito |
|---|---|
unique(mapping_id) |
Evitar duplicação |
btree(source_api) |
Busca exata |
btree(target_api) |
Busca reversa |
gin(match_terms) |
Busca por palavras‑chave |
btree(status, confidence) |
Filtro de regras de aprovação |
label_prototypes
| Coluna | Tipo | Descrição |
|---|---|---|
id |
bigserial primary key |
ID interno |
prototype_id |
text unique not null |
ID determinístico |
label |
text not null |
Rótulo de classificação |
task_type |
text not null |
classification, migration_fix, patch_generation etc. |
input_pattern |
text not null |
Padrão de detecção |
expected_finding |
text not null |
Resultado esperado |
recommended_action |
text |
Ação recomendada |
evidence_mapping_ids |
text[] not null default '{}' |
Evidências de mapeamento de API |
evidence_chunk_ids |
text[] not null default '{}' |
Evidências de chunks de documentação |
severity |
text not null |
low, medium, high |
validator_rules |
jsonb not null default '{}' |
Regras de validação |
embedding |
vector |
Busca por casos semelhantes |
search_tsv |
tsvector |
Busca por palavras‑chave |
Índices:
| Índice | Propósito |
|---|---|
unique(prototype_id) |
Evitar duplicação |
btree(label, task_type) |
Consulta por rótulo |
ivfflat/hnsw(embedding) |
Busca por rótulos semelhantes |
gin(search_tsv) |
Busca por palavras‑chave |
Entrada/Saída do AST Parser
O AST Parser converte o código‑fonte do usuário em uma estrutura pesquisável antes de enviá‑lo ao LLM. O alvo inicial são arquivos .gd, .tscn e project.godot.
Entrada
| Entrada | Descrição |
|---|---|
| Pergunta do usuário | Ex.: “Verifique se este projeto está seguro para Godot 4” |
| Arquivo de código‑fonte | .gd, .tscn, .tres, project.godot |
| Estrutura do projeto | Caminhos de arquivos, conexões de cenas, caminhos de recursos |
Saída do esquema
{
"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 Campos de Extração:
| Campo | Propósito |
|---|---|
extends |
Determinação da versão do Node/API |
class_name |
Mapeamento de símbolos internos do projeto |
annotations |
Sinais do Godot 4 como @onready, @export etc. |
legacy_keywords |
Sinais do Godot 3 como onready var, export var, KinematicBody etc. |
method_calls |
Busca de documentação e consulta de mapeamento de API |
scene_dependencies |
Verificação de conexão de cena/script |
resource_paths |
Verificação de recursos ausentes e conexão de assets |
Funcionamento do Retriever
O Retriever é a camada que seleciona evidências antes do LLM.
- Extrai a intenção e a tarefa alvo a partir da pergunta do usuário.
- Obtém símbolos de API, sinais de versão e caminhos de arquivos a partir do resultado do AST Parser.
- Executa primeiro uma busca exata em
api_mapping. - Realiza simultaneamente filtragem de símbolos de API + busca por palavras‑chave + busca vetorial em
docs_chunks. - Obtém rótulos semelhantes e regras de validação de
label_prototypes. - Ordena os resultados da busca como pacotes de evidência.
Pacote de evidência:
{
"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
}
}Separação de papéis entre Validator e Qwen 3.6
Qwen 3.6 é o modelo que lê as evidências encontradas e organiza a resposta. A rotulagem final, a adoção de evidências e a validação de padrões proibidos são responsabilidade do Validator.
| Componente | Responsabilidade |
|---|---|
| Retriever | Busca de documentos oficiais/API/mapeamento/etiquetas relevantes |
| Validator | Verifica ausência de evidências, padrões proibidos, formato JSON de saída |
| Qwen 3.6 | Organiza a explicação legível ao usuário, direções de correção, sugestões de código |
Itens que o Validator deve conferir:
| Item | Critério |
|---|---|
| Existência do ID da evidência | O ID do documento/mapeamento/etiqueta usado na resposta deve estar presente nos resultados da busca. |
| Baseado no Godot 4 | Não deve recomendar a API do Godot 3 em projetos Godot 4. |
| Indicação de incerteza | Se houver evidência insuficiente, não se deve fazer afirmação definitiva; use ambiguous_version_signal. |
| Verificação de sugestões de código | O código sugerido não deve conflitar com a dimensão 2D/3D detectada no projeto. |
| Formato JSON | A saída da pipeline interna deve ser JSON analisável. |
Ordem de injeção
- Verifique
outputs/godot_docs_full/summary.jsonefailed.json. - Carregue
manifest.jsonepages/*.md. - Gere o relatório de normalização de Markdown.
- Crie
docs_chunks.jsonl. - Na documentação migration/class, gere candidatos para
api_mapping.jsonl. - Crie
label_prototypes.jsonla partir de regras aprovadas e casos representativos. - Apenas registros que passam na validação de esquema JSONL são upsertados no PostgreSQL.
- Gere embeddings e atualize o índice vetorial.
- Atualize o índice de palavras‑chave e o índice exato.
- Valide os resultados do Retriever com perguntas de amostra.
Checklist de verificação de qualidade
| Etapa | Critério de aprovação |
|---|---|
| Verificação de coleta | failed_count = 0, missing_from_searchindex = 0 |
| Normalização de Markdown | Nenhum chunk vazio, URL original preservada |
| Validação de JSONL | Cada linha pode ser parseada como JSON, campos obrigatórios presentes |
| Verificação de duplicidade | Sem duplicatas de chunk_id, mapping_id, prototype_id |
| Verificação de evidência | api_mapping.evidence_chunk_ids deve existir em docs_chunks |
| Verificação de busca | Perguntas de API representativas retornam hits exatos e de documentos simultaneamente |
| Verificação de resposta | Respostas do Qwen não contêm afirmações sem evidência nem recomendam a API do Godot 3 |
Prioridades de implementação
- Elaborar relatório de análise da estrutura de
pages/*.md - Escrever script de conversão para
docs_chunks.jsonl - Criar script de validação de esquema JSONL
- Redigir DDL do PostgreSQL
- Injetar
docs_chunkse validar busca - Gerar candidatos de
api_mappinge definir fluxo de aprovação manual - Criar conjunto inicial de etiquetas em
label_prototypes - Extrair campos mínimos com o AST Parser
- Emitir bundle de evidências do Retriever
- Conectar loop de organização de respostas Validator + Qwen 3.6
Princípios fundamentais
- O Markdown original da documentação oficial não deve ser alterado, apenas preservado.
- JSONL é tratado como artefato intermediário reproduzível.
- O banco de dados deve registrar caminho original, URL original, hash e versão do script de conversão.
- Impedir que o LLM invente etiquetas.
- Decisões Godot 3/4 são baseadas em sinal AST, mapeamento de API e evidências da documentação oficial.
- Candidatos incertos não são usados diretamente como dados de treinamento; permanecem no estado
candidate. - Qwen 3.6 atua como organizador de respostas; os critérios de decisão são definidos pelo Retriever e Validator.
Próximas tarefas
A próxima etapa é analisar amostras da estrutura de Markdown em outputs/godot_docs_full/pages. Como as referências de classe, migração e tutoriais possuem estruturas diferentes, é necessário definir estratégias de chunking específicas por tipo de documento, em vez de aplicar uma única regra universal.