idea_world_labDEV JOURNAL
2026年6月28日星期日

方案 C:仅嵌入

流程

raw chunkText
  -> embedding vector
  -> docs_chunks/api_mapping/label_prototypes embedding 与余弦搜索
  -> 返回 top JSONL

为什么需要 embedding

BM25 对精确字符串很强,但如果说明文字和代码表示不同,效果可能会变差。

例如,chunk 中包含以下代码。

position = position.clamp(Vector2.ZERO, screen_size)

文档中可能会有如下说明。

prevent the player from leaving the screen
clamping a value means restricting it to a given range

在这种情况下,embedding 可以捕获语义关联。

在基准块中预期的成功

embedding 有可能找到以下主题。

2D player movement
moving inside screen
animation based on movement
player movement tutorial

基准块中预期的失败

embedding 可以同时给出意义相似的候选项较高的分数。

预期的误报:

3D player movement
scripting player input
vector math
animation player docs

即如果“player movement”意义相似,就可以模糊2D/3D的区别。

PoC 模拟

将基准 chunk 转换为 embedding 向量。

输入意义:

2D player movement
keyboard input
velocity normalization
animation while moving
keep player inside screen

embedding可能找到的高概率候选:

候选 为何出现 判断
first_2d_game / coding_the_player 2D玩家移动、输入、动画、屏幕限制的含义相近 accept
first_2d_game / clamp explanation 防止玩家离开屏幕的含义相近 accept
first_3d_game / player_movement_code 玩家移动、输入、归一化方向的含义相近 false positive
Vector math / movement tutorial 速度、向量、归一化的含义相近 maybe
Animation player docs 播放/停止动画的含义相近 maybe

仅在embedding中显著的问题:

更关注字符串的意义是否接近,而不是是否完全匹配。  
因此,像 2D/3D、Godot3/Godot4、是否迁移等需要精确区分的标准可能会变得模糊。

例如,基准块和 3D movement 文档共享以下含义。

keyboard input
movement direction
normalized velocity
player movement

但是基准块有以下直接线索。

AnimatedSprite2D
Vector2.ZERO
position.clamp
screen_size

embedding only可能无法像 BM25 那样透明地解释这个直接线索。

PoC中需要确认的日志

在 embedding PoC 中应当显示如下。

1. query chunkText  
2. 候选文档 标题/内容 摘要  
3. 余弦相似度  
4. 直接匹配的字符串列表  
5. 没有直接匹配的字符串,但显示意义相近的候选项

眼前的结论:

embedding是对BM25遗漏的说明性文档的补充。  
但是在直接依据判定方面较弱,不能单独使用。

优点

  • 表达不同也能找到。
  • 对文档说明型内容强大。
  • 可以直接放入原始块。
  • 当 BM25 为 0 条时可以作为 fallback。

缺点

  • 对准确的 API 判断较弱。
  • 可能混淆 Godot 3 与 Godot 4 版本差异。
  • 可能混合 2D/3D 上下文。
  • 难以解释为何得到该结果。
  • api_mapping 中存在较大的误报风险。

判定

禁止单独使用  
用于补充 BM25 候选