idea_world_labDEV JOURNAL
2026年6月28日星期日

替代方案 D:BM25 + 嵌入 并行

流程

raw chunkText
  -> BM25 top 50
  -> embedding top 50
  -> 候选 union
  -> 混合分数
  -> JSONL 返回
  -> Qwen direct-evidence 验证

角色分配

BM25 捕获的内容:

Input.is_action_pressed
AnimatedSprite2D
position.clamp
screen_size
Vector2.ZERO

embedding捕获的内容:

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

Qwen direct-evidence validator的作用:

检查检索的 JSONL 中是否有直接匹配当前块的字符串/模式依据  
丢弃无关的 JSONL

优点

  • 字符串搜索和语义搜索的弱点相互补足。
  • 即使没有 Qwen,第一轮候选的质量也会提升。
  • 保持 raw chunk 条件。
  • 即使没有硬编码的 Godot API signal extractor 也能开始。

缺点

  • 需要进行分数融合调优。
  • BM25 分数和向量分数的尺度不同。
  • 如果没有 reranker,排序可能会不稳定。
  • 不能完全阻止 false positive。

基准 chunk 中预期的结果

上位候选:

first_2d_game / coding_the_player
same page / clamp section

需要降低或在验证中废弃的候选项:

first_3d_game / player_movement_code
unrelated api_mapping
unrelated label_prototypes

PoC 模拟

同时在两个路径中搜索基准块。

raw chunkText
  -> BM25 top 50
  -> embedding top 50
  -> 候选 union
  -> 重复 合并
  -> Qwen direct-evidence 验证

BM25 top 候选示例:

候选 BM25 捕获的原因
first_2d_game / coding_the_player Input.is_action_pressedmove_leftmove_rightAnimatedSprite2D.play/stop 直接匹配
first_2d_game / clamp section position.clampVector2.ZEROscreen_size 直接匹配
first_3d_game / player_movement_code 输入处理和 normalized 移动标记重叠

embedding top 候选示例:

候选 embedding 捕获的原因
first_2d_game / coding_the_player 2D 玩家移动和动画的含义相近
first_2d_game / clamp explanation 将玩家限制在屏幕内的含义相近
first_3d_game / player_movement_code 玩家移动的含义相近
animation docs 在 moving 状态下动画播放/停止的含义相近

候选 union 之后会显示如下。

candidate A:
  source: BM25 + embedding
  evidence: Input.is_action_pressed, AnimatedSprite2D.play/stop
  expected: accept

candidate B:
  source: BM25 + embedding
  evidence: position.clamp, Vector2.ZERO, screen_size
  expected: accept

candidate C:
  source: BM25 + embedding
  evidence: Input.is_action_pressed, move_left, move_right, normalized
  missing: AnimatedSprite2D, Vector2, screen_size
  expected: lower or reject

candidate D:
  source: embedding only
  evidence: semantic movement/animation similarity
  direct string match: weak
  expected: validator decision needed

在将 Qwen direct-evidence validator 传递时,依据以下标准进行判断。

SOURCE_CODE 中的实际字符串/API 调用以及 JSONL 的 source_api、source_pattern、match_terms、required_when_seen_in_code、before_code,或者 docs_chunks 的 content/code_blocks/api_symbols 是否直接匹配?

在 PoC 中要确认的日志

此方案因为 union 过程重要,需要展示以下内容。

1. BM25 候选列表  
2. embedding 候选列表  
3. union 后去除重复的结果  
4. 每个候选是来自 BM25 还是来自 embedding  
5. 直接字符串依据列表  
6. Qwen 验证器的 是/否

眼前的结论:

BM25直接上传 API 依据,  
embedding 补充说明型候选。  
但是仅靠 union 会留下 false positive,因此需要 validator。

判定

## 现实的中间阶段
实战最低推荐线

如果直接将 reranker 附加上去有压力,可以先比较这个替代方案。