idea_world_labDEV JOURNAL
2026年6月17日星期三

2026-06-17 Godot LLM/RAG 判别器构建 回顾

一句话概括

今天将 Godot 专用编码模型的方向从单纯的 Q&A 模型重新定位为 repo 级别的 SWE Agent,并在其前端构建了基于官方文档的 RAG 判别器和数据生成流水线的初步实现。

今天一天的主要流程

起初的目标是“用 Godot 官方文档制作 RAG 聊天机器人”。但随着讨论和工作推进,目标变得更加明确。

收集 Godot 官方文档
-> 基于官方文档的 RAG 判别器
-> 为 GitHub Godot 项目标记
-> 生成 SFT/DPO 数据
-> 基于 Qwen 的 Godot 4 编码模型
-> 仓库级别的 SWE 代理

即今天的核心不是制作一个聊天机器人,而是为以后能够实际读取并修复 Godot 项目的模型建立数据判别/生成的基础。

1. 判断单纯的 Q&A 模型不足

今天首先整理的是模型目标的性质。

之前的想法是制作 Godot 4 问答数据集,让模型能够很好地回答 Godot 4 代码。但如果考虑 “帮我做个地图” 之类的请求,这并不是单纯的 Q&A 问题。

实际的请求流程更接近于下面这样。

理解用户请求
-> 探索仓库结构
-> 查找相关的 scene/script/resource
-> 确认资产路径和现有代码风格
-> 判断 Godot 4 语法/API
-> 修改代码
-> 运行/测试/验证
-> 生成补丁

此流程不是生成单个答案的问题,而是软件工程代理问题。因此,今天将模型方向重新定位为 SWE-agent trajectory training 视角。

今天记录的核心关键词:

Long-context repository-level software engineering agent training
SWE-agent trajectory training
Godot repo-level patch generation
long-context trajectory dataset

也整理了参考案例。

SWE-agent trajectories
SWE-smith
SWE-Gym
CoderForge-Preview
ACC
RepoBench / CrossCodeEval / RepoCoder
aiXcoder CoLT
godot-dodo
wallstoneai/godot-gdscript-dataset

今天的结论是仅靠小的 instruction Q&A 不足。最终需要的是 Godot 项目层面的探索、判断、修改、验证 trajectory。

相关备注:

docs/research-notes/2026-06-17-swe-agent-trajectory-keywords.md

2. Godot LLM 整体路线图整理

然后,我们重新制定了整体开发路线图。

整体流程如下整理。

数据
-> 第一阶段 RAG 聊天机器人
-> SFT
-> DPO
-> SWE Agent

如果将步骤进一步细分,结果如下。

Stage 0. 准备阶段  
Stage 1. 数据收集与结构化  
Stage 2. 第一次 RAG 聊天机器人开发  
Stage 3. 数据标注与数据集生成  
Stage 4. 模型训练  
Stage 5. SWE 代理开发  
Stage 6. 持续改进

在此路线图中最重要的判断是:不要把第一阶段的 RAG 聊天机器人视为单纯的问答工具。首先,需要构建一个充当 Godot 官方文档专家角色的 RAG 判别器,并通过该判别器对 GitHub 数据进行标注/加工,然后再以 SFT/DPO 和 SWE Agent 的方式进行扩展。

特别是第 5 阶段的 SWE Agent 不应只是一个简单的代码生成器,而是必须具备以下能力。

项目分析
必要文件搜索
代码修改
验证 Godot CLI 或运行结果
失败原因分析
生成补丁

相关路线图:

docs/roadmaps/2026-06-17-godot-llm-roadmap.md

3. RAG 判别器基于数据生成结构设计

今天还有一个重要的判断是“不要把最终标签决定交给 LLM”。

一开始很容易认为 RAG 聊天机器人只要看 GitHub 代码或文档就能判断是 Godot 3 还是 4。但标签直接影响训练数据质量,如果把即兴判断交给 LLM 就很危险。

于是我们把结构安排成如下方式。

LLM是生成辅助  
标签由系统决定  
最终 JSONL 由 Python pipeline 组装/验证

系统需要负责的事项:

符号提取  
API映射数据库查询  
官方文档向量搜索  
关键词搜索  
标签原型搜索  
标签评分  
置信度计算  
最终 JSONL 组装  
验证

LLM可以负责的事项:

生成修改代码草案  
生成说明  
生成SFT问答  
生成DPO错误答案  
生成补丁草案  
验证/问题说明辅助

生成目标数据集也整理为8种。

version_classification
api_mapping
migration_fix
instruction_sft
dpo_preference
repo_explorer
patch_generation
metadata_verification

这段内容成为了今天编写的 RAG 后处理代码的设计准则。特别是将 api_mappingsymbol_catalogkeyword_indexsearch_text 分离的原因也正是来源于此。

相关备注:

docs/research-notes/2026-06-17-godot-rag-labeler-data-generation.md

4. RAG 判别器中使用 Qwen 3.6 模型的 MVP 流程

已单独整理了 Godot RAG 判别器与 Qwen 3.6 编码模型之间的 MVP 流程图。

整理的流程:

godot_docs_full.zip 原始文档准备
-> 基于 chunk_docs.py 的首次分块
-> Godot 专用后处理
-> 构建本地搜索基础设施
-> 收集并结构化 GitHub 数据
-> 运行 RAG 判别器
-> 生成训练数据集
-> Qwen 3.6 SFT/DPO

这里的本地搜索基础设施并不只指单一的向量数据库。

所需的组成:

Vector DB
Keyword Index
Reranker
API Mapping DB
Label Prototype DB

此外,GitHub 数据必须以仓库级别的结构而不是单纯的代码片段形式导入。

所需输入:

.gd
.tscn
.tres
project.godot
README
repo tree
metadata

第一次 SFT 目标也重新整理了。

Godot 4 优先考虑  
GDScript 基本输出  
拒绝 Godot 3 API  
说明 Godot 3 -> 4 转换依据

之后在 DPO 中需要更明确地界定好答案和坏答案的标准。

糟糕的回答:混有 Godot 3 API 的回答  
好的回答:使用 Godot 4 纯代码并有依据的回答

相关备注:

docs/research-notes/2026-06-17-godot-rag-to-qwen-coding-model-flow.md

5. v1 官方文档分块

在完成设计整理后,将实际的官方文档数据制作成可以放入 RAG 的形式。

最初制作的产出文件如下。

work/godot_rag/chunks/docs_chunks.jsonl

官方文档 Markdown 1,570个按标题和长度标准划分,生成了 9,741 个块。

结果:

Input pages: 1,570
Output chunks: 9,741
Max chunk chars: 2,800
Overlap chars: 350

v1中好的方面:

  • 将官方文档整体制作成 JSONL 块。
  • JSONL 解析非常稳定。
  • class_referencetutorialmigration 等基本文档类型已被分类。

v1的问题:

  • 仍残留大量 Sphinx 的剩余文字。
  • 存在过短的噪声块。
  • headingsection、method/property 结构未能充分保留。
  • 类引用未按 API 单位精细划分。

v1 是“官方文档收集与基本分块成功”阶段。虽然成为搜索 MVP 的起点,但对标签判别器来说仍不足。

6. v2 后处理

接下来创建 postprocess_chunks.py 并生成 v2 块。

文件:

work/godot_rag/postprocess_chunks.py
work/godot_rag/chunks/docs_chunks_v2.jsonl

在 v2 中处理的内容:

删除 404 块  
删除短噪声块  
删除 Sphinx 剩余文字  
提取 symbols  
提取 class_name  
强化 section/member_type/member_name  
显示与 migration 相关的块

结果:

Input chunks: 9,741
Output chunks: 8,778
Dropped 404 chunks: 3
Dropped short/noise chunks: 960
Migration-related chunks: 695

v2已经可以作为基于官方文档的RAG检索MVP使用。但要作为最终标签判别器仍显不足。尤其是 move_and_slidevelocity@exportawait 等语法/API 的变化,并未作为独立的判别标准进行划分。

7. 错误的 v3 方向与回退

最初设想的 v3 是通过硬编码部分核心 API 来生成 api_focus 块的方式。

示例:

KinematicBody2D
CharacterBody2D
move_and_slide
@export
await

这种方式看起来可以快速提升搜索性能。但实际上是有风险的。

问题:

  • 人工挑选的 API 可能会导致搜索器过拟合。
  • 列表之外的 API 会变得薄弱。
  • 某些代表性 API 可能看起来像是整个 Godot API 的代表。
  • 缺失的 API 可能会在后续的标注过程中导致错误。

因此我们回滚了原来的 v3。这一判断非常重要。虽然短期看起来像是损失,但考虑到最终判别器的质量,硬编码 focus 块的做法是错误的方向。

8. 基于 catalog 的 v3 重新设计

回滚之后,我们改变了方向。

新原则:

v2 块一个也不丢失。  
不随意创建新的 focus 块。  
在整个官方文档中自动提取 symbol/catalog/index/mapping。  
将搜索强化信息附加为 metadata。

添加的代码:

work/godot_rag/build_symbol_catalog.py
work/godot_rag/build_keyword_index.py
work/godot_rag/build_api_mapping.py
work/godot_rag/make_chunks_v3.py
work/godot_rag/validate_rag_artifacts.py
work/godot_rag/retrieval_smoke_test.py

生成的产出:

work/godot_rag/catalog/symbol_catalog.jsonl
work/godot_rag/catalog/keyword_index.json
work/godot_rag/catalog/api_mapping.jsonl
work/godot_rag/chunks/docs_chunks_v3.part-*.jsonl
work/godot_rag/validation/validation_report.json
work/godot_rag/validation/retrieval_smoke_test.json

整个 docs_chunks_v3.jsonl 大约 189 MB,可能会超过 GitHub 的单文件限制。因此在仓库中上传按行保存的分割文件,需要时在本地再合并。

cat work/godot_rag/chunks/docs_chunks_v3.part-*.jsonl \
  > work/godot_rag/chunks/docs_chunks_v3.jsonl

9. v3 正合性验证

在 v3 中最重要的是防止遗漏。因为如果 v2 的任何一个块缺失,后续的官方文档依据可能会消失。

所以创建了 validate_rag_artifacts.py

验证标准:

v2 chunk_id set == v3 chunk_id set
no missing or extra v3 chunks
catalog/index/mapping references point to existing chunks
search_text is present
no old hardcoded api_focus fields remain

验证结果:

status: pass
v2 chunks: 8,778
v3 chunks: 8,778
v2 unique chunk_id: 8,778
v3 unique chunk_id: 8,778
symbol catalog entries: 134,922
keyword index keys: 192,257
api mapping records: 144
v3 chunks with api mappings: 1,900
v3 migration-related chunks: 2,392

此外,在嵌入前阶段也执行了基于词汇/关键字的冒烟测试。

代表查询:

KinematicBody2D Godot 4 replacement
CharacterBody2D move_and_slide velocity
yield await Godot 4
export var @export Godot 4
onready var @onready Godot 4

结果全部通过了 5 项。

10. 今天发现的最大风险

今天最重要的洞察是 “大量抽取” 与 “信任并写入标签” 是不同的。

在官方文档整体上广泛抽取会提升 recall。但如果把这些结果都视为同等可信度,关键词索引会被污染。

例如下面的内容很可能是真实的 API 或语法元素。

CharacterBody2D
move_and_slide
FileAccess
@export
await

相反,以下更可能是文档普通词或表格列。

Returns
See
Tip
MIT
Software
Type

实际上在检查 smoke test 的过程中,发现了像 Type -> EditorSceneFormatImporterFBX2GLTF 这样的普通表列可能被当作 API 映射候选的问题。已对该问题进行修正,使 Type 从映射候选中排除。

这里得到的结论是明确的。

广泛提取是必要的。  
但是不能把所有广泛提取的内容都写成可信事实。

11. v3.1 可信度分离结构的改版

在确认上述风险后,判断不能直接将 v3 用于最终标签判别器。因此在 v3.1 中不再将 catalog 合并为一个整体使用,而是按可信度和用途进行分离。

v3.1 中新采用的结构:

trusted_api_symbols
syntax_symbols
migration_mappings
mentioned_symbols
candidate_terms
rejected_terms
retrieval_keys
search_text

每个字段的含义也被明确划分。

trusted_api_symbols:
在 class reference 结构中直接确认的 class/method/property/signal/constant

syntax_symbols:
在 GDScript 语法文档和 migration 文档中确认的语法要素

migration_mappings:
带有依据块的 old -> new 关系,连接了 Godot 3 -> 4 的更改映射

mentioned_symbols:
在 tutorial/body 中提及但已存在于 trusted/syntax catalog 的符号

candidate_terms:
用于搜索 recall 的候选词

rejected_terms:
不能作为标签使用的普通词,如 Returns、See、Tip、MIT、Software 等

添加的代码:

work/godot_rag/build_v31_artifacts.py
work/godot_rag/validate_v31_artifacts.py

生成的 v3.1 输出物:

work/godot_rag/chunks/docs_chunks_v3_1.jsonl
work/godot_rag/chunks/docs_chunks_v3_1.summary.json
work/godot_rag/catalog_v3_1/trusted_api_catalog.jsonl
work/godot_rag/catalog_v3_1/syntax_catalog.jsonl
work/godot_rag/catalog_v3_1/api_mapping.jsonl
work/godot_rag/catalog_v3_1/mention_index.json
work/godot_rag/catalog_v3_1/keyword_index.json
work/godot_rag/catalog_v3_1/v3_1.summary.json
work/godot_rag/validation_v3_1/validation_report.json
work/godot_rag/validation_v3_1/retrieval_smoke_test.json

v3.1 结果:

Source v2 chunks: 8,778
Output v3.1 chunks: 8,778
Trusted API catalog entries: 26,318
Syntax catalog entries: 68
API mapping records: 144
Mention index keys: 10,292
Keyword keys: 71,543
Validation status: pass
Retrieval smoke tests: 5 / 5 passed

重要地修正了的部分也有。

在最初的 v3.1 生成过程中,如果直接相信 v2 元数据中的 class_name,会导致 TutorialsAllString 等错误值被上传到 trusted catalog。因此我们依据 source URL 和 class reference 路径重新生成了规范的类名。此修改后,像 Characterbody2d 这样的大小写问题也被纠正为 CharacterBody2D

另一个重要的验证是 move_and_slide。在宽松的提取方式下,可能会出现 ProjectSettings.move_and_slide 之类的错误 trusted 条目。v3.1 中,我们限制只有在 class reference 的结构化 section 中确认的成员才会提升为 trusted,最终 move_and_slide 的 trusted 条目仅保留在实际的 Godot 类中,如下所示。

CharacterBody2D.move_and_slide
CharacterBody3D.move_and_slide

即今天在 v3.1 中所做的工作不仅是增加字段,而是将其改为“搜索时广泛使用,但在标签决定时仅使用狭窄且可信的依据”的结构。

12. v3.1 一致性验证

在 v3.1 中,遗漏尤其危险。因为如果 v2 的 8,778 个块中有任何一个缺失,官方文档的依据就可能消失。

验证标准:

v2 chunk_id set == v3.1 chunk_id set  
v3.1 unique chunk_id count == 8,778  
doc_type 保持分布  
legacy 删除混合字段  
trusted/syntax/migration catalog 检查引用完整性  
search_text 确认存在

验证结果:

status: pass
errors: 0
warnings: 0
v2 chunks: 8,778
v3.1 chunks: 8,778

再次运行了搜索 smoke test。

KinematicBody2D Godot 4 replacement
CharacterBody2D move_and_slide velocity
yield await Godot 4
export var @export Godot 4
onready var @onready Godot 4

结果全部 5 项均通过。此阶段的意义并不是“最终标注者已完成”,而是指 v3.1 结构已经足够完整,能够至少转移到 MVP 向量/关键词索引。

13. GitHub 反映与记录整理

今天不仅完成了代码和数据产出物的制作,还整理了 GitHub 的反映工作。

处理的事项:

remote 设置
大容量 v3 文件分割
工作分支 push
远程 main 与本地历史合并
main push
文档目录整理

docs_chunks_v3.jsonl 大约 189 MB,直接上传可能会触及 GitHub 单文件大小限制。因此将其拆分为 docs_chunks_v3.part-000.jsonldocs_chunks_v3.part-001.jsonldocs_chunks_v3.part-002.jsonl

另外,最初的回顾文件放在根目录 retrospectives/ 下,但与现有仓库结构不匹配。于是将文档结构整理如下。

docs/research-notes/   设计备忘
docs/roadmaps/         整体路线图
docs/retrospectives/   按日期回顾
work/godot_rag/        RAG 代码和产出物
outputs/godot_docs_full/ 官方文档爬取结果

另外创建了 docs/README.md,并整理了文档目录的作用。

14. Git 作者/邮箱 整理

正如今天在 README 中记录的那样,GitHub 草稿(grass)映射问题也已经整理完毕。

已确认的问题:

main 历史的 author/committer 邮箱混在一起  
本地主机邮箱  
naver 邮箱  
GitHub noreply 邮箱

处理的方向:

将全局 Git 设置更改为 yyeongjin <appsky1888@gmail.com>
统一 main 历史的 author/committer
推送到远程
在重写前保存备份分支

备份分支:

backup/before-author-email-rewrite-2026-06-17

此工作虽未直接关联 RAG 本身,但是今天重要的整理工作之一。之后为了使记录和提交能够正确反映在 GitHub 个人资料上,进行了基础对齐工作。

15. 今日创建/整理的文档

今天创建或整理的主要文档:

docs/research-notes/2026-06-17-swe-agent-trajectory-keywords.md
docs/research-notes/2026-06-17-godot-rag-labeler-data-generation.md
docs/research-notes/2026-06-17-godot-rag-to-qwen-coding-model-flow.md
docs/roadmaps/2026-06-17-godot-llm-roadmap.md
docs/retrospectives/2026-06-17-godot-rag-judge.md
docs/README.md

在 README 中也添加了 6 月 17 日的开发日志和 RAG 数据准备章节。

16. 当前结论

可以这样整理今天的状态。

方向性:  
Godot Q&A 模型而不是 Godot SWE Agent。

数据:  
官方文档 RAG 应该作为生成学习数据的判别器角色。

标签:  
不是 LLM,而是 Python pipeline 决定。

RAG:  
v2 是安全的基础块集合。  
v3 是广泛提取的中间 catalog 产出物。  
v3.1 是应用了可信度分离的当前推荐 RAG 产出物。

风险:  
提取的 symbol 不能全部以相同的可信度使用。

今天的工作不仅仅是创建了几个文件,而是多次转向了容易出错的方向。特别是恢复硬编码 API focus 块的判断、发现 broad v3 的噪声风险的判断,以及在 v3.1 中将 trusted/syntax/migration/mention/candidate/rejected 拆分的判断都很重要。

17. 接下来的工作

接下来的工作并不是直接进行 GitHub 代码标记。

首先要做的事:

  1. 基于 docs_chunks_v3_1.jsonlsearch_text 生成 embedding
  2. 结合向量搜索 + 关键字搜索进行混合检索测试
  3. 基于 trusted_api_symbolssyntax_symbolsmigration_mappings 设计标签决定的 Python 流程
  4. 定义 GitHub 仓库结构化数据的输入格式
  5. 设计同时查看 .gd.tscn.tresproject.godot、README 的仓库级别判别流程
  6. 将 RAG 判别器结果与生成 8 类 JSONL 数据集的流水线连接
  7. 当远程 LLM endpoint 准备好后,连接用于修改代码/说明/SFT/DPO 候选生成的辅助
  8. 之后基于 Qwen 的 SFT/DPO 与 SWE Agent 轨迹学习进行扩展

今天的最终教训就是这些。

与其大量收集文档,  
分离出对所收集知识的可信度并据此使用更为重要。