idea_world_labDEV JOURNAL
2026年6月28日日曜日

代替 F: BM25 + embedding + reranker + validator

フロー

raw chunkText
  -> BM25 top 80
  -> embedding top 80
  -> 候補 union
  -> rerankerが raw chunk と 各 JSONL 候補を直接比較
  -> top JSONL を返す
  -> Qwen direct-evidence validatorが 直接根拠 を検証

役割分担

BM25:

正確な文字列/APIトークンの候補を探す。

code embedding:

表現は異なるが意味が近い候補を補完する。

reranker:

BM25とembeddingがもたらした候補をraw chunkと比較して再度並べ替える。

Qwen 直接証拠バリデータ:

JSONL の中で現在のチャンクと直接一致する文字列/パターンの根拠があるか確認する。  
根拠のない 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 が raw chunk と候補を一緒に見る。

予想 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 の偽陽性を減らすことができる。
  • 埋め込みの偽陽性も減らすことができる。
  • 生のチャンク条件を維持する。
  • ハードコーディングへの依存が低い。
  • Qwen バリデータで根拠のない JSONL を最後に除去できる。

短所

  • コストがかかる。
  • レイテンシが発生する。
  • 候補を入れすぎると遅くなる。
  • reranker も根拠検証器ではないため、最後にバリデータが必要になる。

判定

品質最優先 最終提案

原文メモの最終的な推奨はこの構造に近いです。