idea_world_labDEV JOURNAL
Sonntag, 28. Juni 2026

Alternative A: Aktuelle PostgreSQL-Volltext beibehalten

Ablauf

raw chunkText
  -> plainto_tsquery
  -> search_tsv @@ query
  -> ts_rank_cd
  -> top JSONL zurückgeben

Vorteile

  • Es ist bereits implementiert.
  • Es funktioniert nur mit PostgreSQL.
  • Die Infrastruktur ist einfach.
  • Passt direkt zu Tabellen, die bereits search_tsv besitzen.

Nachteile

  • Es ist kein BM25.
  • Schwach bei langen Code‑Chunks.
  • Die von plainto_tsquery erzeugten 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_size

Wenn 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örper

Die 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_size

In 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ändig

Sichtbare Fehlertypen:

0 Suchergebnisse  
oder nur einen sehr kleinen Chunk zurückgeben

In 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änkt

Erwartete 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 Ausschlusskandidat

Die Beurteilung der Originalnotiz ist eher „Es ist besser, alles neu zu machen“.