idea_world_labDEV JOURNAL
2026年6月28日星期日

替代方案 F:BM25 + 嵌入 + 重排序器 + 验证器

流程

raw chunkText
  -> BM25 top 80
  -> embedding top 80
  -> 候选合并
  -> reranker直接比较 raw chunk 与各 JSONL 候选
  -> 返回 top JSONL
  -> Qwen direct-evidence validator 进行直接证据验证

角色分配

BM25:

查找精确字符串/API 令牌候选。

代码嵌入:

表达不同但意义相近的候选项进行补充。

reranker:

将 BM25 和 embedding 产生的候选项与原始块进行比较,并重新排序。

Qwen direct-evidence validator:

检查 JSONL 中是否有直接匹配当前 chunk 的字符串/模式依据。  
没有依据的 JSONL 将被废弃。

基准块中的预期排序

应上升的候选:

first_2d_game / coding_the_player
same page / clamp and AnimatedSprite2D explanation

需要降低的候选项:

first_3d_game / player_movement_code
unrelated api_mapping
unrelated label_prototypes

PoC 模拟

假设将基准块放入最终推荐流程中。

raw chunkText
  -> BM25 top 80
  -> voyage-code-3 embedding top 80
  -> 候选 union
  -> reranker
  -> Qwen direct-evidence validator

1阶段:BM25 候选

BM25 将获取的候选:

A. first_2d_game / coding_the_player
   reason: Input.is_action_pressed, move_left, move_right, AnimatedSprite2D.play/stop

B. first_2d_game / clamp section
   reason: position.clamp, Vector2.ZERO, screen_size

C. first_3d_game / player_movement_code
   reason: Input.is_action_pressed, move_left, move_right, normalized

2阶段:embedding 候选

embedding 将获取的候选:

D. first_2d_game / movement explanation
   reason: 2D movement, keyboard input, animation

E. first_2d_game / screen bounds explanation
   reason: keep player inside screen

F. first_3d_game / movement
   reason: player movement semantic similarity

第3步:候选 union

union 后合并重复项。

A/D -> first_2d_game / coding_the_player
B/E -> first_2d_game / clamp/screen bounds
C/F -> first_3d_game / player_movement

4阶段:reranker 重新排序

reranker 会同时查看原始块和候选项。

预计 rerank:

rerank 候选 原因
1 first_2d_game / coding_the_player 输入处理、velocity、AnimatedSprite2D play/stop 直接匹配
2 first_2d_game / clamp/screen bounds position.clampVector2.ZEROscreen_size 直接匹配
3 first_3d_game / player_movement 输入/移动相似,但为 3D 场景且没有 AnimatedSprite2D/screen_size

5阶段:Qwen direct-evidence 验证器

Qwen 验证器中会像下面这样提问。

查看 SOURCE_CODE 和检索到的 JSONL,  
JSONL 中是否有直接匹配 SOURCE_CODE 的字符串/API 调用/模式依据?  
请先以“是”或“否”作出判断。

预期结果

(此处为翻译后的 Markdown 内容)

first_2d_game / coding_the_player:
  validator = 是
  direct evidence = Input.is_action_pressed, AnimatedSprite2D.play, AnimatedSprite2D.stop

first_2d_game / clamp/screen bounds:
  validator = 是
  direct evidence = position.clamp, Vector2.ZERO, screen_size

first_3d_game / player_movement:
  validator = 否或低相关
  reason = movement input 类似,但属于 3D 文档,且没有 AnimatedSprite2D/screen_size 的直接依据

在 PoC 中确认的日志

由于此方案步骤较多,需要在同一页面查看。

1. raw chunkText  
2. BM25 候选和匹配的词  
3. embedding 候选和相似度  
4. union 结果  
5. reranker 分数和排名变化  
6. Qwen 验证器 是/否  
7. 最终 accept/reject JSONL

眼前的结论:

BM25和embedding广泛收集候选项。  
reranker纠正相似候选项的顺序。  
Qwen validator最终废弃没有直接依据的JSONL。

优点

  • 质量最有可能是最好的。
  • 可以减少 BM25 的误报。
  • 也可以减少 embedding 的误报。
  • 保持原始块的条件。
  • 对硬编码的依赖较低。
  • 可以使用 Qwen 验证器在最后删除没有直接依据的 JSONL。

缺点

  • 成本较高。
  • 会产生延迟。
  • 如果放入的候选太多会变慢。
  • reranker 也不是依据验证器,所以仍需要最后的验证器。

判定

质量至上最终推荐方案

原文备忘的最终推荐接近于此结构。