替代方案 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_prototypesPoC 模拟
假设将基准块放入最终推荐流程中。
raw chunkText
-> BM25 top 80
-> voyage-code-3 embedding top 80
-> 候选 union
-> reranker
-> Qwen direct-evidence validator1阶段: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, normalized2阶段: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_movement4阶段:reranker 重新排序
reranker 会同时查看原始块和候选项。
预计 rerank:
| rerank | 候选 | 原因 |
|---|---|---|
| 1 | first_2d_game / coding_the_player |
输入处理、velocity、AnimatedSprite2D play/stop 直接匹配 |
| 2 | first_2d_game / clamp/screen bounds |
position.clamp、Vector2.ZERO、screen_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 也不是依据验证器,所以仍需要最后的验证器。
判定
质量至上最终推荐方案原文备忘的最终推荐接近于此结构。