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
  -> 候補 ユニオン
  -> 重複マージ
  -> Qwen direct-evidence 検証

BM25 上位候補例:

候補 BM25 が拾った理由
first_2d_game / coding_the_player Input.is_action_pressed, move_left, move_right, AnimatedSprite2D.play/stop が直接一致
first_2d_game / clamp section position.clamp, Vector2.ZERO, screen_size が直接一致
first_3d_game / player_movement_code 入力処理と normalized 移動トークンが重複

embedding 上位候補例:

候補 embedding が拾った理由
first_2d_game / coding_the_player 2D プレイヤーの移動とアニメーションの意味が近い
first_2d_game / clamp explanation プレイヤーを画面内に制限する意味が近い
first_3d_game / player_movement_code プレイヤーの移動意味が近い
animation docs moving 状態でのアニメーション play/stop の意味が近い

候補 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. 埋め込み候補一覧  
3. union 後の重複除去結果  
4. 各候補が BM25 から来たか埋め込みから来たか  
5. 直接文字列根拠一覧  
6. Qwen バリデータのはい/いいえ

目に見える結論:

BM25は直接APIの根拠を上げ、  
embeddingは説明型候補を補完する。  
しかしunionだけではfalse positiveが残るため、validatorが必要である。

判定

現実的な中間段階  
実戦最小推奨ライン

rerankerまで直接接続するのが負担なら、この代替案から比較できる。