idea_world_labDEV JOURNAL
domingo, 28 de junio de 2026

Alternativa B: solo BM25

Flujo

raw chunkText
  -> tokenizer
  -> BM25
  -> top JSONL devuelto

Lo que ve BM25

BM25 crea la puntuación aproximadamente con los siguientes elementos.

TF: cuántas veces aparece la palabra en este documento  
IDF: cuán rara es la palabra en todo el corpus  
Length normalization: corrección para que los documentos largos no tengan ventaja automática

Por lo tanto, las palabras siguientes al chunk de referencia se vuelven importantes.

animatedsprite2d
is_action_pressed
move_left
move_right
normalized
clamp
screen_size
vector2
zero

Por qué tiene éxito en el chunk de referencia

En la simulación de la nota original, el siguiente documento aparece en la parte superior.

outputs/godot_docs_full/pages/getting_started__first_2d_game__03.coding_the_player__161d377b.md

Los tokens que coinciden directamente son los siguientes.

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

En particular, los siguientes tokens son poco frecuentes en el corpus, por lo que contribuyen fuertemente a la puntuación.

animatedsprite2d
move_left
move_right
is_action_pressed
screen_size
clamp

Candidato a fracaso

En BM25 only también pueden aparecer documentos de movimiento 3D.

La razón es el siguiente token común.

Input.is_action_pressed
move_right
move_left
normalized
speed

Sin embargo, el chunk de referencia es 2D y la siguiente pista es importante.

AnimatedSprite2D
Vector2
position.clamp
screen_size

BM25 es basado en puntuación de palabras, por lo que no comprende perfectamente el contexto 2D/3D.

Simulación de PoC

Introduce el chunk de referencia como consulta BM25.

Entrada:

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

Tokens que otorgarán una puntuación alta en BM25:

animatedsprite2d
is_action_pressed
move_left
move_right
normalized
clamp
screen_size
vector2
zero
Posición Candidato Por qué aparece Decisión
1 first_2d_game / coding_the_player Input.is_action_pressed, move_left, move_right, velocity.normalized, AnimatedSprite2D.play/stop coinciden directamente accept
2 first_2d_game / clamp/screen section position.clamp, Vector2.ZERO, screen_size, AnimatedSprite2D son correctos accept
3 first_3d_game / player_movement_code Input.is_action_pressed, move_left, move_right, normalized, speed se superponen false positive

Razón por la que el candidato número 1 aparece:

animatedsprite2d:
  Como es un token raro en todo el documento, el IDF es grande

move_left / move_right:
  Aparece directamente en el código de entrada del tutorial

is_action_pressed:
  Coincide directamente con el código de procesamiento de entrada

velocity.normalized:
  Coincide directamente con el flujo de normalización del vector de movimiento

Razón por la que el candidato en tercer lugar aparece junto con los demás:

El documento de movimiento 3D también describe el procesamiento de entrada y el flujo de movimiento normalizado.  
Por lo tanto, desde la perspectiva de BM25, la superposición de tokens de consulta es bastante grande.  
Sin embargo, no coincide con los elementos clave del chunk de referencia, como AnimatedSprite2D, Vector2, screen_size y position.clamp.

Registro a verificar en PoC

En el PoC de BM25, es importante mostrar la contribución de tokens para cada candidato.

Ejemplo:

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

Conclusión visible:

BM25 recupera bien los documentos relevantes.  
Sin embargo, también sube códigos de entrada/movimiento similares.  
Por lo tanto, se necesita un reranker o validador en la siguiente etapa de BM25.

Ventajas

  • El principio es transparente.
  • Depurar es fácil.
  • No hay costo de modelo.
  • Se puede usar el fragmento sin procesar tal cual.
  • Es fuerte en la búsqueda exacta de cadenas en código/API.

Desventajas

  • Es débil con sinónimos y descripciones.
  • Si el nombre de la API no aparece directamente, puede pasarse por alto.
  • Código similar, como 3D movement, puede mezclarse como falsos positivos.

Evaluación

Búsqueda del candidato de primera fase que debe revisarse obligatoriamente  
Sin embargo, su uso aislado es insuficiente