Alternative A : Maintien du full‑text PostgreSQL actuel
Flux
raw chunkText
-> plainto_tsquery
-> search_tsv @@ query
-> ts_rank_cd
-> top JSONL retourAvantages
- Déjà implémenté.
- Possible uniquement avec PostgreSQL.
- L’infrastructure est simple.
search_tsvcorrespond 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_tsquerypeut 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_sizeTous 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_sizeDans 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'ensembleFormes d'échec visibles :
0 résultats de recherche
ou ne renvoie que des morceaux très étroitsDans 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 restrictiveObservation 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 suppressionLe jugement de la note originale est proche de « il faut tout renverser ».