- Mit der integrierten Volltextsuche-Erweiterung (FTS5) von SQLite und der semantischen Suche mit
sqlite-vec lässt sich in Anwendungen eine „hybride Suche“ aufbauen
- Ergebnisse können auf verschiedene Arten kombiniert werden, etwa mit Keyword-Priorisierung, Re-Ranking nach „Semantik“ oder Reciprocal Rank Fusion
- Vor allem ist alles in SQLite enthalten, sodass sich Experimente und Prototypen günstig und einfach erstellen lassen und kein externer Service nötig ist
- Der wichtigste Anwendungsfall von
sqlite-vec und anderen Tools für Vektorsuche ist die Bereitstellung von „semantischer Suche“ für Textdaten
- Reine Volltextsuche (Keyword-Suche) liefert nicht immer gute Ergebnisse
- Bei einer Suche nach „climate change“ werden Dokumente wie „global warming“ nicht zurückgegeben
- Mit semantischer Suche lassen sich Ergebnisse eher nach „Stimmung“ bzw. Bedeutung abrufen, wodurch gehaltvollere und semantisch reichere Resultate zurückgegeben werden können
- Die ausschließliche Nutzung von „semantischer Suche“ kann für eine Anwendung aber auch nachteilig sein
Demo: NBC-News-Schlagzeilen
- Verwendet wird ein Datensatz mit mehr als 14.500 Schlagzeilen von Januar bis August 2024
- Mit insgesamt 4,3 MB Textdaten ist es ein sehr kleiner Datensatz
Erstellen einer FTS5-Tabelle
- Erstellung der Volltext-Such-Virtual-Table
fts_headlines
- Deklaration der Spalte
headline
- Konfiguration der Optionen
content= und content_rowid=
- Direktes
INSERT INTO aus der Basis-Tabelle articles
- Zum Abfragen der FTS5-Tabelle ist nur ein einzelnes
SELECT-Statement nötig
Aufbau einer Vektorsuche mit sqlite-vec
sqlite-vec bietet Vektorspeicherung und Vektorvergleich, erzeugt aber keine Embeddings
- In diesem Beispiel werden die Erweiterung
sqlite-lembed und das Modell Snowflake Artic Embed 1.5 verwendet
- Text wird mit
lembed() eingebettet und in einer vec0-Virtual-Table gespeichert
- Für KNN-Abfragen ist nur ein einzelnes
SELECT-Statement erforderlich
Hybrider Ansatz 1: „Keyword zuerst“
- Zuerst werden Volltext-Suchergebnisse zurückgegeben, anschließend wird der Rest durch Vektorsuche ergänzt
- Lässt sich mit einem CTE umsetzen
- Die Ergebnisse werden mit
UNION ALL kombiniert
Hybrider Ansatz 2: Reciprocal Rank Fusion (RRF)
- Den Ergebnissen aus FTS5 und Vektor-Matches werden Ränge zugewiesen
- Kann mit einer einzelnen
SELECT-Abfrage und einem CTE umgesetzt werden
- Durch Ändern von
:weight_fts oder :weight_vec lassen sich FTS5-/Vektor-Ergebnisse unterschiedlich gewichten
Hybrider Ansatz 3: Re-Ranking nach Bedeutung
- Es wird nur eine FTS5-Suche ausgeführt, die Ergebnisse werden aber anhand der Vektordistanz neu sortiert
- Man erhält weiterhin nur Keyword-Treffer, aber bessere semantische Treffer wandern nach oben
- Hilft dabei, Nachteile von BM25 auszugleichen
Welchen Ansatz sollte man wählen?
- Das hängt von der Anwendung und dem jeweiligen Anwendungsfall ab
- Beim Aufbau einer Suchmaschine für einen E-Mail-Posteingang ist Keyword-Priorisierung besser geeignet
- Beim Aufbau von RAG über interne Unternehmensdokumente ist RRF eine gute Option
- Beim Aufbau einer „Duplicate Post“-Funktion in einer Web-App funktioniert Re-Ranking nach Bedeutung gut
Zukünftige Verbesserungen
- FTS5-Abfragen können mit „Highlighting“ passende Stellen in Dokumenten markieren,
sqlite-vec gibt aber nur die L2-/Cosinus-Distanz zwischen Query-Vektor und Dokument zurück
- FTS5-Abfragen bieten weitere Funktionen wie Phrasen,
NEAR-Abfragen und boolesche Operatoren, deren Nutzung mit Vektorsuche jedoch sperrig wirkt
- Das Erweitern hybrider Suche mit FTS5 +
sqlite-vec kann umständlich sein
- FTS5-Tabellen durchsuchen jedes Mal den gesamten Datensatz und unterstützen daher weder Metadaten-Filterung noch einen einzelnen FTS5-Index
- Für
sqlite-vec gilt Ähnliches, Unterstützung für Partitionierung und Metadaten-Filterung soll jedoch bald kommen
Meinung von GN⁺
- Hybride Suche mit SQLite scheint für viele Anwendungen nützlich zu sein, weil Experimente und Prototyping einfach sind. Vorteile sind, dass Daten in einer einzelnen Datei gespeichert werden, mehrere Abfragen mit einem einzigen
SELECT-Statement getestet werden können, keine Kosten anfallen, alles mit jeder Programmiersprache funktioniert und sich mit wenigen Zeilen Code leicht umsetzen lässt
- Zwischen FTS5 und
sqlite-vec gibt es aber noch Verbesserungspotenzial. FTS5 kann passende Textstellen in Dokumenten hervorheben, während sqlite-vec nur die Distanz zwischen Query-Vektor und Dokument zurückgibt. Auch die Kombination mit erweiterten FTS5-Funktionen kann bei Vektorsuche sperrig sein
- Trotz dieser Einschränkungen ist hybride Suche mit SQLite eine leistungsfähige Lösung, um unabhängig von Datengröße und Anwendungsart die Vorteile von Keyword-Suche und semantischer Suche zugleich zu nutzen
- Da es immer wichtiger wird, Informationen aus unstrukturierten Daten zu extrahieren und in durchsuchbare Form zu bringen, ermöglicht die Kombination von Keyword-Suche wie FTS5 und Vektorsuche wie
sqlite-vec eine ausgefeilte Suche, die sowohl Keyword-Übereinstimmung als auch kontextuelle Relevanz berücksichtigt
- Ob man
sqlite-vec zu einem bestehenden Suchsystem hinzufügt oder eine neue Suchanwendung entwickelt: SQLite-basierte hybride Suche ist eine Überlegung wert. Besonders die Möglichkeit, das Embedding-Modell selbst anzupassen, ist ein großer Vorteil
1 Kommentare
Im Projekt habe ich die Aufgabe durchgeführt, über 1 Million Datensätze in
sqlitezu speichern und zu verarbeiten.Wenn die Datenmenge groß ist, braucht man meiner Meinung nach eine gute SSD. (Da ich eine SATA-SSD verwendet habe, hatte ich den Eindruck, dass sich die Verarbeitungszeit etwas verlängert hat.)