idea_world_labDEV JOURNAL
dimanche 28 juin 2026

Alternative A : Maintien du full‑text PostgreSQL actuel

Flux

raw chunkText
  -> plainto_tsquery
  -> search_tsv @@ query
  -> ts_rank_cd
  -> top JSONL retour

Avantages

  • Déjà implémenté.
  • Possible uniquement avec PostgreSQL.
  • L’infrastructure est simple.
  • search_tsv correspond directement aux tables déjà existantes.

Inconvénients

  • Ce n’est pas BM25.
  • Faible avec les gros morceaux de code.
  • La condition générée par plainto_tsquery peut devenir excessivement restrictive.
  • Beaucoup de bruit provenant des jetons de code.
  • Ne permet pas la recherche sémantique.
  • Une légère modification du découpage des morceaux peut entraîner zéro résultat.

Problèmes prévus dans le morceau de référence

Le morceau de référence contient tous les jetons suivants en même temps.

func
process
delta
velocity
vector2
zero
input
is_action_pressed
move_right
move_left
normalized
animatedsprite2d
play
stop
position
clamp
screen_size

Tous ces jetons doivent être présents simultanément dans une même ligne JSONL, sinon des résultats de recherche peuvent être omis.

Simulation PoC

Supposons que le chunk de référence soit transmis tel quel à /api/retrieve.

Entrée:

chunkText = Corps complet de la fonction _process(delta)

La méthode actuelle transforme cette entrée en plainto_tsquery('simple', chunkText).

Caractéristique attendue de la requête :

func & process & delta & var & velocity & vector2 & zero
& input & is_action_pressed & move_right & move_left
& length & normalized & speed & animatedsprite2d
& play & stop & position & clamp & screen_size

Dans ce cas, si le document réel pertinent est divisé en deux morceaux comme suit, un problème survient.

docs chunk A:
  Input.is_action_pressed("move_right")
  Input.is_action_pressed("move_left")
  velocity.normalized() * speed
  $AnimatedSprite2D.play()
  $AnimatedSprite2D.stop()

docs chunk B:
  position += velocity * delta
  position = position.clamp(Vector2.ZERO, screen_size)

Lorsque l’on regarde, A et B sont tous les deux liés.

Cependant, si la requête en texte intégral exige trop de jetons simultanément, cela peut se produire comme suit.

docs chunk A:
  animatedsprite2d = présent
  is_action_pressed = présent
  move_left/move_right = présent
  clamp = absent
  screen_size = absent
  position.clamp = absent
  => la requête ne satisfait pas l'ensemble

docs chunk B:
  clamp = présent
  screen_size = présent
  position = présent
  animatedsprite2d = absent ou faible
  move_left/move_right = absent
  is_action_pressed = absent
  => la requête ne satisfait pas l'ensemble

Formes d'échec visibles :

0 résultats de recherche  
ou ne renvoie que des morceaux très étroits

Dans cette méthode, il est difficile de distinguer si l’échec de la recherche est dû à « aucune base dans le document » ou à « des conditions de requête trop strictes ».

Logs à vérifier dans le PoC

Lors du test de cette alternative, il ne faut pas se contenter de regarder le résultat.

Il faut également afficher les valeurs suivantes.

1. raw chunkText  
2. requête créée avec plainto_tsquery  
3. liste des jetons inclus dans la requête  
4. nombre de lignes retournées  
5. si 0 résultat, quel jeton a rendu la requête trop restrictive

Observation prévue:

Plus le chunk brut est long, plus la requête devient longue,  
et si les documents pertinents sont répartis sur plusieurs chunks, le résultat est incomplet.

Jugement

Peut être utilisé comme référence PoC  
En tant que stratégie de recherche finale, candidat à la suppression

Le jugement de la note originale est proche de « il faut tout renverser ».