idea_world_labDEV JOURNAL
dimanche 28 juin 2026

Alternative B : BM25 uniquement

Flux

raw chunkText
  -> tokenizer
  -> BM25
  -> top JSONL retourné

Ce que voit BM25

BM25 crée un score à partir des éléments suivants.

TF: combien de fois le mot apparaît dans ce document  
IDF: à quel point le mot est rare dans l'ensemble du corpus  
Length normalization: correction pour que les documents longs ne soient pas automatiquement avantagés

Donc les mots suivants du chunk de référence deviennent importants.

animatedsprite2d
is_action_pressed
move_left
move_right
normalized
clamp
screen_size
vector2
zero

Pourquoi cela réussit‑il dans le chunk de référence

Dans la simulation de la note originale, le document suivant apparaît en haut.

outputs/godot_docs_full/pages/getting_started__first_2d_game__03.coding_the_player__161d377b.md

Le token correspondant directement est le suivant.

animatedsprite2d
is_action_pressed
move_left
move_right
normalized
play
stop
input
speed
length
velocity
vector2
zero

Particulièrement, ces jetons sont rares dans le corpus et contribuent fortement au score.

animatedsprite2d
move_left
move_right
is_action_pressed
screen_size
clamp

Candidat à l'échec

Même avec BM25 only, le document 3D movement peut être remonté.

La raison en est le token commun suivant.

Input.is_action_pressed
move_right
move_left
normalized
speed

Cependant, le chunk de référence est en 2D et l'indice suivant est important.

AnimatedSprite2D
Vector2
position.clamp
screen_size

BM25 est basé sur le score des mots, il ne comprend pas parfaitement le contexte 2D/3D.

Simulation PoC

Insérez le chunk de référence comme requête BM25.

Entrée:

func _process(delta):
  Input.is_action_pressed(...)
  velocity.normalized() * speed
  $AnimatedSprite2D.play()
  position.clamp(Vector2.ZERO, screen_size)

Token qui donnera un score élevé avec BM25 :

animatedsprite2d
is_action_pressed
move_left
move_right
normalized
clamp
screen_size
vector2
zero

Prévisions des candidats :

Rang Candidat Pourquoi cela apparaît Jugement
1 first_2d_game / coding_the_player Input.is_action_pressed, move_left, move_right, velocity.normalized, AnimatedSprite2D.play/stop correspondent directement accept
2 first_2d_game / clamp/screen section position.clamp, Vector2.ZERO, screen_size, AnimatedSprite2D sont corrects accept
3 first_3d_game / player_movement_code Input.is_action_pressed, move_left, move_right, normalized, speed se chevauchent false positive

Raison pour laquelle le candidat classé premier apparaît :

animatedsprite2d:
  Comme il s'agit d'un token rare dans l'ensemble du document, l'IDF est élevé

move_left / move_right:
  Apparaît directement dans le code d'entrée du tutoriel

is_action_pressed:
  Correspond directement au code de traitement des entrées

velocity.normalized:
  Correspond directement au flux de normalisation du vecteur de déplacement

Raison pour laquelle le troisième candidat apparaît avec les autres :

Le document de mouvement 3D explique également le traitement des entrées et le flux de déplacement normalisé.  
Donc, du point de vue de BM25, le chevauchement des jetons de requête est assez important.  
Cependant, cela ne correspond pas aux éléments clés du chunk de référence tels que AnimatedSprite2D, Vector2, screen_size, position.clamp.

Vérifier les journaux dans le PoC

Dans le PoC BM25, il est important d'afficher la contribution des tokens pour chaque candidat.

Exemple:

candidate: first_2d_game / coding_the_player
matched_terms:
  animatedsprite2d   high
  is_action_pressed  high
  move_left          high
  move_right         high
  normalized         medium
  play               medium
  stop               medium

candidate: first_3d_game / player_movement_code
matched_terms:
  is_action_pressed  high
  move_left          high
  move_right         high
  normalized         medium
missing_terms:
  animatedsprite2d
  screen_size
  position.clamp

Conclusion visible :

BM25 récupère bien les documents pertinents.  
Cependant, il récupère également des entrées/codes similaires.  
Ainsi, une étape de reranker ou de validateur est nécessaire après BM25.

Avantages

  • Le principe est transparent.
  • Le débogage est facile.
  • Aucun coût de modèle.
  • Vous pouvez utiliser le chunk brut tel quel.
  • Fort pour la recherche exacte de chaînes dans le code/API.

Inconvénients

  • Faible avec les synonymes et les descriptions.
  • Si le nom de l'API n'apparaît pas directement, il peut être manqué.
  • Des codes similaires comme « 3D movement » peuvent être mélangés comme faux positifs.

Jugement

Recherche du premier candidat à examiner impérativement  
Cependant, l'utilisation seule est insuffisante