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

Текущие входные данные
Результаты сбора официальной документации находятся в репозитории под 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 |
Полный конвейер
crawlerсобирает официальную документацию Godot из интернета.- Результаты сбора сохраняются в виде Markdown‑файлов по страницам.
- Markdown нормализуется и к нему добавляются метаданные, после чего он преобразуется в записи JSONL.
- JSONL импортируется в PostgreSQL.
- PostgreSQL сохраняет фрагменты документов, сопоставления API и прототипы меток раздельно.
- При запросе пользователя на анализ исходного кода Godot AST‑парсер структурирует код проекта.
- Retriever ищет доказательства в PostgreSQL, используя вопрос пользователя и результаты анализа AST.
- Validator объединяет вопрос, результаты AST и найденные доказательства и передаёт их Qwen 3.6.
- Qwen 3.6 не является окончательным судьёй; он формирует ответ, опираясь на проверенные доказательства.
- 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.
- Из вопроса пользователя извлекаются намерение и целевая задача.
- Из результата AST Parser берутся символы API, сигналы версии и пути к файлам.
- Сначала выполняется точный поиск в
api_mapping. - В
docs_chunksодновременно выполняются фильтрация по символам API, поиск по ключевым словам и векторный поиск. - Из
label_prototypesберутся похожие метки и правила проверки. - Результаты поиска упорядочиваются в пакет доказательств.
Пакет доказательств:
{
"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. |
Порядок внедрения
- Проверить
outputs/godot_docs_full/summary.jsonиfailed.json. - Загрузить
manifest.jsonиpages/*.md. - Создать отчёт о нормализации Markdown.
- Сгенерировать
docs_chunks.jsonl. - В документе migration/class создать кандидат
api_mapping.jsonl. - На основе утверждённых правил и типовых примеров создать
label_prototypes.jsonl. - Вставлять (upsert) в PostgreSQL только те записи, которые прошли проверку схемы JSONL.
- Сгенерировать эмбеддинги и обновить векторный индекс.
- Обновить индекс ключевых слов и точный индекс.
- Проверить результаты 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 |
Приоритет реализации
- Составить отчет об анализе структуры
pages/*.md - Написать скрипт преобразования
docs_chunks.jsonl - Создать скрипт проверки схемы JSONL
- Составить DDL для PostgreSQL
- Внедрить
docs_chunksи проверить поиск - Сгенерировать кандидаты
api_mappingи оформить процесс ручного утверждения - Подготовить начальный набор меток
label_prototypes - Извлечь минимальные поля с помощью AST‑парсера
- Вывести пакет доказательств Retriever
- Связать цикл сортировки ответов 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. Особенно, поскольку документы справочника классов, миграции и учебные материалы имеют разные структуры, их нельзя объединять под единым правилом чанкования; необходимо сначала определить стратегию чанкования для каждого типа документа.