idea_world_labDEV JOURNAL
воскресенье, 21 июня 2026 г.

Схема и архитектура классификатора RAG официальной документации Godot

Дата создания: 21 июня 2026 г.

Цель

Сформировать базовую архитектуру для соединения полного набора официальной документации Godot в поток JSONL -> PostgreSQL -> Retriever -> Validator -> Qwen 3.6. Этот документ не является инструкцией по непосредственному созданию обучающих данных, а определяет проектные критерии для структурирования уже собранных в outputs/godot_docs_full/pages Markdown‑файлов официальной документации в форму, пригодную для поиска и создания базы доказательств.

Начальная архитектура классификатора RAG Godot

Текущие входные данные

Результаты сбора официальной документации находятся в репозитории под outputs/godot_docs_full.

Путь Роль
outputs/godot_docs_full/pages/ Оригинальные Markdown‑файлы страниц официальной документации Godot
outputs/godot_docs_full/manifest.json Исходный URL, локальный путь файла, статус сбора, размер в байтах
outputs/godot_docs_full/summary.json Сводка общего количества собранных элементов и проверка
outputs/godot_docs_full/urls.txt Список фактически собранных URL
outputs/godot_docs_full/searchindex_urls.txt Список целевых URL, восстановленных из индекса поиска Sphinx
outputs/godot_docs_full/failed.json Список неудачных попыток сбора
outputs/godot_docs_full/missing_from_searchindex.txt Список отсутствующих в индексе поиска элементов

Текущие базовые показатели:

Показатель Значение
Целевые страницы поискового индекса 1568
Собранные страницы 1570
Файлы страниц 1570
Неудачные запросы 0
Отсутствует в поисковом индексе 0

Полный конвейер

  1. crawler собирает официальную документацию Godot из интернета.
  2. Результаты сбора сохраняются в виде Markdown‑файлов по страницам.
  3. Markdown нормализуется и к нему добавляются метаданные, после чего он преобразуется в записи JSONL.
  4. JSONL импортируется в PostgreSQL.
  5. PostgreSQL сохраняет фрагменты документов, сопоставления API и прототипы меток раздельно.
  6. При запросе пользователя на анализ исходного кода Godot AST‑парсер структурирует код проекта.
  7. Retriever ищет доказательства в PostgreSQL, используя вопрос пользователя и результаты анализа AST.
  8. Validator объединяет вопрос, результаты AST и найденные доказательства и передаёт их Qwen 3.6.
  9. Qwen 3.6 не является окончательным судьёй; он формирует ответ, опираясь на проверенные доказательства.
  10. Validator проверяет доказательства/формат/запрещённые шаблоны ответа и возвращает результат пользователю.

Преобразование Markdown в JSONL

pages/*.md — это удобные для чтения оригиналы страниц, но они слишком крупны для RAG. Поэтому скрипт преобразования делит страницу на секции/члены API/примеры и сохраняет исходный URL и тип документа.

Общие правила нормализации

Шаг Описание
Загрузка файла Читает Markdown согласно полям file, url, status, bytes из manifest.json.
Очистка текста Удаляет повторяющиеся заголовки, текст UI Sphinx, повреждённые якорные символы и избыточные пробелы.
Классификация типа документа По URL и пути распределяет на class_reference, tutorial, migration, engine_details, about, other.
Разделение секций На основе иерархии заголовков и шаблона ссылок Godot class reference формирует кандидаты на фрагменты.
Сохранение блоков кода Примеры GDScript, C#, shader, CLI сохраняются в code_blocks, а не удаляются из текста.
Добавление provenance Каждая запись получает исходный URL, путь файла, оригинальный хеш и версию скрипта преобразования.

Выходные файлы JSONL

Файл Назначение Целевая таблица
work/godot_rag/jsonl/docs_chunks.jsonl Фрагменты для поиска по описаниям/урокам/справке docs_chunks
work/godot_rag/jsonl/api_mapping.jsonl Правила изменения, переименования, устаревания и замены API Godot 3 → 4 api_mapping
work/godot_rag/jsonl/label_prototypes.jsonl Прототипы примеров классификации/преобразования/отклонения/коррекции label_prototypes
work/godot_rag/jsonl/ingest_report.jsonl Журнал предупреждений, пропусков и контроля качества во время преобразования Для проверки перед импортом в БД

Схема 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
  }
}

Обязательные поля:

Поле Описание
chunk_id Определяющий идентификатор, который не меняется при повторных запусках
doc_version Версия документа, например stable, 4.6
source_url URL оригинального официального документа
source_file Путь к Markdown‑файлу в репозитории
source_sha256 Хеш оригинального Markdown‑файла
doc_type Тип документа
symbol Представляющий символ, если это документация класса/API
section_path Иерархия заголовков
content Текст, подлежащий поиску и встраиванию
code_blocks Массив блоков кода, извлечённых из текста
api_symbols Обнаруженные в тексте символы Godot API

Схема 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"]
}

Принципы:

Пункт Критерий
confidence Если есть подтверждение из официальной документации, ставится verified_from_docs, иначе кандидат правил помечается как candidate.
Автоматическое извлечение Можно создать кандидатов из документов миграции и справочника классов.
Критерий одобрения Только проверенные человеком правила, используемые для обучения/разметки, переводятся в состояние approved.
exact index source_api, target_api, match_terms являются объектами точного поиска.

Схема 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"]
  }
}

Лейбл кандидаты:

Лейбл Значение
godot4_valid_api Использование API, действительного для Godot 4
godot3_api_in_godot4 В проекте Godot 4 смешан API Godot 3
deprecated_or_removed_api Используется удалённый/устаревший API
migration_required Требуется миграция с Godot 3 → 4
ambiguous_version_signal Недостаточно или конфликтует информация о версии
non_godot_noise Данные, не связанные с Godot (Python/WEB/Unity и т.п.)
unsafe_or_obfuscated_code Обфусцированный, управляющие символы, подозрительный код

Черновик схемы PostgreSQL

PostgreSQL предполагает использование pgvector. Поиск по ключевым словам осуществляется с помощью tsvector или trigram‑индекса.

docs_chunks

Столбец Тип Описание
id bigserial primary key Внутренний ID
chunk_id text unique not null Определяющий ID JSONL
doc_version text not null Версия документа
source_url text not null URL официальной документации
source_file text not null Путь к Markdown‑файлу
source_sha256 text not null Хеш оригинала
doc_type text not null Тип документа
symbol text Представляющий API/класс символ
section_path jsonb not null Иерархия заголовков
heading text Текущий заголовок чанка
content text not null Текст для поиска
code_blocks jsonb not null default '[]' Блоки кода
api_symbols text[] not null default '{}' Извлечённые символы
metadata jsonb not null default '{}' Прочие метаданные
embedding vector Векторное представление
search_tsv tsvector Поиск по ключевым словам
created_at timestamptz default now() Время вставки

Индексы:

Индекс Цель
unique(chunk_id) Предотвращение дублирования
ivfflat/hnsw(embedding) Поиск по смыслу
gin(search_tsv) Поиск по ключевым словам
gin(api_symbols) Фильтрация по символам API
btree(doc_type, symbol) Фильтрация по классам/API

api_mapping

Столбец Тип Описание
id bigserial primary key Внутренний ID
mapping_id text unique not null Определяющий ID
source_api text not null Исходный/проблемный API
target_api text Рекомендуемый API
change_type text not null rename, removed, behavior_change и др.
godot_from text Версия‑источник
godot_to text Целевая версия
confidence text not null Уровень обоснования
status text not null default 'candidate' candidate, approved, rejected
evidence_chunk_ids text[] not null default '{}' Чанки официальной документации
match_terms text[] not null default '{}' Ключевые слова поиска
notes text Описание
negative_patterns jsonb not null default '[]' Запрещённые шаблоны

Индексы:

Индекс Цель
unique(mapping_id) Предотвращение дублирования
btree(source_api) Точное совпадение
btree(target_api) Обратный поиск
gin(match_terms) Поиск по ключевым словам
btree(status, confidence) Фильтрация правил одобрения

label_prototypes

Столбец Тип Описание
id bigserial primary key Внутренний ID
prototype_id text unique not null Определяющий ID
label text not null Метка классификации
task_type text not null classification, migration_fix, patch_generation и др.
input_pattern text not null Шаблон обнаружения
expected_finding text not null Ожидаемый результат
recommended_action text Рекомендуемое действие
evidence_mapping_ids text[] not null default '{}' Обоснования API‑соответствия
evidence_chunk_ids text[] not null default '{}' Обоснования документальных чанков
severity text not null low, medium, high
validator_rules jsonb not null default '{}' Правила валидации
embedding vector Поиск похожих случаев
search_tsv tsvector Поиск по ключевым словам

Индексы:

Индекс Цель
unique(prototype_id) Предотвращение дублирования
btree(label, task_type) Поиск по метке
ivfflat/hnsw(embedding) Поиск похожих меток
gin(search_tsv) Поиск по ключевым словам

Ввод/вывод AST‑парсера

AST‑парсер преобразует пользовательский исходный код в структуру, пригодную для поиска, перед тем как передать его LLM. Первоначально поддерживаются файлы .gd, .tscn, project.godot.

Ввод

Ввод Описание
Вопрос пользователя Например: «Проверьте, безопасен ли этот проект для Godot 4»
Файлы исходного кода .gd, .tscn, .tres, project.godot
Структура проекта Пути файлов, связи сцен, пути ресурсов

Вывод схемы

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

Начальные поля извлечения:

Поле Описание
extends Определение версии Node/API
class_name Сопоставление внутренних символов проекта
annotations @onready, @export и др. сигналы Godot 4
legacy_keywords onready var, export var, KinematicBody и др. сигналы Godot 3
method_calls Поиск в документации и просмотр сопоставления API
scene_dependencies Проверка связей сцены/скрипта

| resource_paths | Проверка связей отсутствующих ресурсов и ассетов |

Работа Retriever

Retriever — это уровень, который выбирает доказательства раньше, чем LLM.

  1. Из вопроса пользователя извлекаются намерение и целевая задача.
  2. Из результата AST Parser берутся символы API, сигналы версии и пути к файлам.
  3. Сначала выполняется точный поиск в api_mapping.
  4. В docs_chunks одновременно выполняются фильтрация по символам API, поиск по ключевым словам и векторный поиск.
  5. Из label_prototypes берутся похожие метки и правила проверки.
  6. Результаты поиска упорядочиваются в пакет доказательств.

Пакет доказательств:

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

Разделение ролей Validator и Qwen 3.6

Qwen 3.6 — это модель, читающая найденные доказательства и формирующая ответ. Финальную метку, принятие доказательств и проверку запрещённых шаблонов выполняет Validator.

Компонент Ответственность
Retriever Поиск соответствующей официальной документации/API сопоставления/меток доказательств
Validator Проверка отсутствия доказательств, запрещённых шаблонов, формата выводимого JSON
Qwen 3.6 Подготовка объяснений, направлений исправления, предложений кода, читаемых пользователем

(Нет предоставленного фрагмента Markdown для перевода.)

Пункт Критерий
Наличие ID источника ID документов/соответствий/меток, использованных в ответе, должны присутствовать в реальных результатах поиска.
По стандарту Godot 4 В проектах Godot 4 не следует рекомендовать API Godot 3.
Отметка неопределённости При недостатке доказательств запрещено давать окончательное решение, использовать ambiguous_version_signal.
Проверка предложенного кода Предложенный код не должен конфликтовать с обнаруженным измерением проекта 2D/3D.
Формат JSON Вывод внутреннего конвейера должен быть парсимым JSON.

Порядок внедрения

  1. Проверить outputs/godot_docs_full/summary.json и failed.json.
  2. Загрузить manifest.json и pages/*.md.
  3. Создать отчёт о нормализации Markdown.
  4. Сгенерировать docs_chunks.jsonl.
  5. В документе migration/class создать кандидат api_mapping.jsonl.
  6. На основе утверждённых правил и типовых примеров создать label_prototypes.jsonl.
  7. Вставлять (upsert) в PostgreSQL только те записи, которые прошли проверку схемы JSONL.
  8. Сгенерировать эмбеддинги и обновить векторный индекс.
  9. Обновить индекс ключевых слов и точный индекс.
  10. Проверить результаты Retriever с помощью образцовых вопросов.

Список проверки качества

Этап Критерий прохождения
Проверка сбора failed_count = 0, missing_from_searchindex = 0
Нормализация Markdown Нет пустых чанков, сохранение оригинального URL
Проверка JSONL Каждая строка может быть разобрана как JSON, обязательные поля присутствуют
Проверка дубликатов Нет дубликатов chunk_id, mapping_id, prototype_id
Проверка доказательств api_mapping.evidence_chunk_ids действительно присутствуют в docs_chunks
Проверка поиска Для типового вопроса API возвращаются как точные совпадения, так и совпадения в документах
Проверка ответа Ответ Qwen не содержит утверждений без доказательств и рекомендаций API Godot 3

Приоритет реализации

  1. Составить отчет об анализе структуры pages/*.md
  2. Написать скрипт преобразования docs_chunks.jsonl
  3. Создать скрипт проверки схемы JSONL
  4. Составить DDL для PostgreSQL
  5. Внедрить docs_chunks и проверить поиск
  6. Сгенерировать кандидаты api_mapping и оформить процесс ручного утверждения
  7. Подготовить начальный набор меток label_prototypes
  8. Извлечь минимальные поля с помощью AST‑парсера
  9. Вывести пакет доказательств Retriever
  10. Связать цикл сортировки ответов Validator + Qwen 3.6

Ключевые принципы

  • Оригинальный Markdown официальной документации не изменяется и сохраняется.
  • JSONL рассматривается как промежуточный воспроизводимый артефакт.
  • В базе данных обязательно сохраняются оригинальный путь, оригинальный URL, хеш и версия скрипта преобразования.
  • Не позволять LLM придумывать новые метки.
  • Определение Godot 3/4 производится на основе сигналов AST, сопоставления API и доказательств из официальной документации.
  • Не использовать неопределённые кандидаты напрямую в обучающих данных, а оставлять их в состоянии candidate.
  • Qwen 3.6 выступает в роли агрегатора ответов, а критерии оценки задаются Retriever и Validator.

Следующая задача

Следующий шаг — проанализировать образец структуры Markdown в outputs/godot_docs_full/pages. Особенно, поскольку документы справочника классов, миграции и учебные материалы имеют разные структуры, их нельзя объединять под единым правилом чанкования; необходимо сначала определить стратегию чанкования для каждого типа документа.