Alternative A: Aktuelle PostgreSQL-Volltext beibehalten
Ablauf
raw chunkText
-> plainto_tsquery
-> search_tsv @@ query
-> ts_rank_cd
-> top JSONL zurückgebenVorteile
- Es ist bereits implementiert.
- Es funktioniert nur mit PostgreSQL.
- Die Infrastruktur ist einfach.
- Passt direkt zu Tabellen, die bereits
search_tsvbesitzen.
Nachteile
- Es ist kein BM25.
- Schwach bei langen Code‑Chunks.
- Die von
plainto_tsqueryerzeugten Bedingungen können zu stark eingeschränkt sein. - Es gibt viel Code‑Token‑Rauschen.
- Bedeutungsbasierte Suche ist nicht möglich.
- Bereits kleine Änderungen bei der Chunk‑Aufteilung können zu null Treffern führen.
Erwartete Probleme beim Standard‑Chunk
Im Standard‑Chunk befinden sich die folgenden Tokens gleichzeitig.
func
process
delta
velocity
vector2
zero
input
is_action_pressed
move_right
move_left
normalized
animatedsprite2d
play
stop
position
clamp
screen_sizeWenn nicht alle diese Token gleichzeitig in einer JSONL‑Zeile enthalten sind, können Suchergebnisse fehlen.
PoC‑Simulation
Es wird angenommen, dass das Basis‑Chunk unverändert an /api/retrieve übergeben wird.
Eingabe:
chunkText = Gesamte _process(delta) FunktionskörperDie aktuelle Methode wandelt diese Eingabe in plainto_tsquery('simple', chunkText) um.
Erwartete Abfrageart:
func & process & delta & var & velocity & vector2 & zero
& input & is_action_pressed & move_right & move_left
& length & normalized & speed & animatedsprite2d
& play & stop & position & clamp & screen_sizeIn diesem Fall entsteht ein Problem, wenn das tatsächliche zugehörige Dokument wie folgt in zwei Chunks aufgeteilt ist.
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)Wenn man es betrachtet, sind sowohl A als auch B relevant.
Aber wenn eine Volltextabfrage zu viele Token gleichzeitig verlangt, kann es wie folgt aussehen.
docs chunk A:
animatedsprite2d = vorhanden
is_action_pressed = vorhanden
move_left/move_right = vorhanden
clamp = nicht vorhanden
screen_size = nicht vorhanden
position.clamp = nicht vorhanden
=> Abfrage erfüllt nicht vollständig
docs chunk B:
clamp = vorhanden
screen_size = vorhanden
position = vorhanden
animatedsprite2d = nicht vorhanden oder schwach
move_left/move_right = nicht vorhanden
is_action_pressed = nicht vorhanden
=> Abfrage erfüllt nicht vollständigSichtbare Fehlertypen:
0 Suchergebnisse
oder nur einen sehr kleinen Chunk zurückgebenIn diesem Ansatz ist es schwierig zu unterscheiden, ob ein Suchfehler darauf zurückzuführen ist, dass „keine Grundlage im Dokument vorhanden ist“, oder darauf, dass „die Abfragebedingungen zu streng sind“.
Protokolle, die im PoC überprüft werden sollen
Beim Testen dieser Alternative darf man sich nicht nur auf das Ergebnis konzentrieren.
Es müssen auch die folgenden Werte angezeigt werden.
1. roher Chunk-Text
2. Durch plainto_tsquery erstellte Abfrage
3. Liste der in die Abfrage eingefügten Token
4. Anzahl der zurückgegebenen Zeilen
5. Wenn 0 Ergebnisse, welcher Token hat die Abfrage zu stark eingeschränktErwartete Beobachtung:
Je länger das rohe Chunk ist, desto länger wird die Abfrage,
wenn die zugehörigen Dokumente auf mehrere Chunks verteilt sind, gehen Ergebnisse verloren.Bewertung
PoC‑Basislinie ist nutzbar
Endgültige Suchstrategie ist ein AusschlusskandidatDie Beurteilung der Originalnotiz ist eher „Es ist besser, alles neu zu machen“.