Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語
Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語

Filtern mit MyScale: Wenn SQL WHERE auf Vektor-Suche trifft

Vektor-Datenbanken bieten blitzschnelle Abfragen von ähnlichen Objekten, die in Milliarden von Datensätzen gespeichert sind. Möglicherweise möchten Sie jedoch auch nach verwandten Objekten suchen, die bestimmten Bedingungen entsprechen. Diese Art der Suche wird als gefilterte Vektor-Suche bezeichnet. Mit Hilfe von MyScale (opens new window) können Sie Ihre gefilterten Vektor-Suchen auf ein neues Niveau heben.

Die meisten Vektor-Indizes oder Vektor-Speicher funktionieren als dedizierte Indexdienste. Sie unterstützen eine teilweise Implementierung der gefilterten Vektor-Suche von MongoDB-Abfrage- und Projektionsoperatoren (opens new window), bei der Sie ein Wörterbuch von Bedingungen eingeben können.

Die unterstützten Datentypen und Vergleichsoperatoren unterscheiden sich je nach Implementierung, aber die meisten Schnittstellen unterstützen nur Zeichenketten, Ganzzahlen bei Gleichheit und grundlegende Wertvergleiche. Im Gegensatz zu Datenbanken sind diese Vektor-Indizes nicht darauf ausgelegt, komplexe Datentypen und Bedingungen zu verarbeiten. Daher benötigen Sie eine externe Datenbanklösung, um diese Daten zu speichern, können jedoch keine gefilterten Vektor-Suchen mit diesen Daten durchführen. Diese Lösung funktioniert, ist jedoch kompliziert und hat Einschränkungen.

Tatsächlich gibt es eine bessere Lösung. Die Vektor-Suche kann in eine Datenbank integriert werden, um sie robuster zu machen. MyScale kann gleichzeitig gefilterte Vektor-Suchen mit komplexen Bedingungen und Datentypen mithilfe der standardmäßigen WHERE-Klausel verarbeiten.

# Vor-Filterung und Nach-Filterung

Implementierungen der gefilterten Vektor-Suche können in zwei Typen unterteilt werden:

  1. Vor-gefilterte Vektor-Suche
  2. Nach-gefilterte Vektor-Suche

Stellen Sie sich zum Beispiel vor, Sie haben eine Tabelle mit dem Chat-Verlauf für die Benutzer Jack, Jan und John, und Sie möchten eine gefilterte Vektor-Suche verwenden, um den Chat-Verlauf von Jack abzurufen, der ähnlich zum angegebenen Abfrage-Vektor ist.

Hinweis:

Jeder Datensatz hat eine Benutzerkennzeichnung und einen Merkmalsvektor - zur Vereinfachung wandeln wir Vektoren in Zahlen um.

Das folgende Bild beschreibt sowohl eine NoSQL- als auch eine SQL-Abfrage zum Abrufen des Chat-Verlaufs von Jack:

Beide Abfragen enthalten einen Filter für den Benutzer Jack. Dieser Filter kann jedoch je nach Implementierung unterschiedlich strukturiert sein.

1. Vor-gefilterte Vektor-Suche: Bei der vor-gefilterten Vektor-Suche durchsucht der Motor zuerst die Daten und behält nur die Datensätze, die der angegebenen Filterbedingung entsprechen. Sobald dieser Scan abgeschlossen ist, führt der Motor die Vektor-Suche auf den vor-gefilterten Kandidaten durch.

2. Nach-gefilterte Vektor-Suche: Bei der nach-gefilterten Vektor-Suche wird zuerst die Vektor-Suche durchgeführt und dann diese Ergebnisse basierend auf der angegebenen Filterbedingung gefiltert.

Vor-Filterung & Nach-Filterung

Zwischen diesen beiden Methoden ist die Vor-Filterung genauer und entspricht dem, was wir von einer gefilterten Vektor-Suche erwarten. Die meisten Vektor-Datenbanken unterstützen die Vor-Filterung mit Vektor-Suche. Diese Vor-Filterung ist jedoch nicht kostenlos und erhöht die Berechnung und beeinträchtigt die Leistung der gefilterten Vektor-Suche. Die meisten Implementierungen leiden entweder unter Leistungseinbußen oder Einschränkungen bei den Filtern, wie z.B. Speicherplatz und unterstützte Vergleichsoperatoren.

MyScale verwendet eine spaltenbasierte Speicher-Engine (opens new window), die von der ClickHouse MergeTree-Engine (opens new window) adaptiert wurde und auf herkömmlichen Filtern super schnell ist. Dadurch wird die erste Filterung erheblich verbessert und die gefilterte Vektor-Suche schneller als bei anderen Implementierungen. Darüber hinaus können Sie eine einfache SQL-WHERE-Klausel verwenden, um Filter für beliebige Spalten in Ihrer Tabelle zu definieren.

# Was Sie mit der WHERE-Klausel in MyScale tun können

Da MyScale auf ClickHouse (opens new window) entwickelt wurde, bietet es genau die gleiche Funktionalität wie ClickHouse.

Zum Beispiel:

Methode Andere MyScale
eq / neq
ge / gt / lt / le
include / exclude
mit Zeichenkettenmusterabgleich LIKE
Zeitstempel/Geo-Daten/JSON
mit Funktion
mit arrayFunction (opens new window)
mit Unterabfragen

Werfen wir einen Blick auf mehrere Beispiele, die zeigen, wozu die WHERE-Klausel von MyScale in der Lage ist.

Hinweis:

Den Code für diese Beispiele finden Sie in unseren Colab- oder GitHub-Räumen.

Hinweis:

Weitere Informationen zu Datentypen und Funktionen finden Sie in der offiziellen Dokumentation von ClickHouse (opens new window).

# Vergleich von Werten: =, !=, >, <, >=, <=

Die meisten Vektor-Indexlösungen unterstützen diese Operationen für Zeichenketten oder Zahlen. In MyScale können Sie Wertvergleiche mit folgendem Code schreiben:

WHERE spalte = wert

Die Spalte kann dabei jeder Spaltenname in der Tabelle sein und die Operation kann eine der folgenden sein: =, !=, >, <, >=, <=.

Hinweis:

Der Spaltentyp und der Wert müssen übereinstimmen.

Wenn Sie mehrere Bedingungen zur WHERE-Klausel hinzufügen möchten, verwenden Sie logische Operatoren wie AND, um sie zu verbinden:

WHERE spalte_1 = wert_1 AND spalte_2 >= wert_2

# Gemeinsame Mengenoperatoren: Include, Exclude

MyScale unterstützt auch Mengenoperationen wie IN und NOT IN:

WHERE spalte IN (wert_1, wert_2, ...)

Dies ist nützlich, wenn Sie eine Menge von Zeilen auswählen möchten. Sie können auch logische Operatoren verwenden, um diese Mengenoperatoren mit anderen Bedingungen zu verbinden.

# Operatoren für Arrays

Sie können überprüfen, ob ein Element in einem Array enthalten ist, mit der Funktion has:

WHERE has(spalte, wert_1)

# Zeichenkettenmusterabgleich

Sie können in MyScale Zeichenkettenmuster mit dem Schlüsselwort LIKE abgleichen:

WHERE spalte_1 LIKE '%wert%'

Diese Bedingung passt zu Werten, die wert in der Spalte_1 enthalten. Dieser Zeichenkettenmusterabgleichsoperator ist einer von vielen Operatoren, die von MySQL angeboten werden. Andere umfassen NOT LIKE, match mit regulären Ausdrücken und ngramSearch.

Hinweis:

Weitere Informationen zum LIKE-Operator finden Sie in der offiziellen Dokumentation von ClickHouse (opens new window).

Boost Your AI App Efficiency now
Sign up for free to benefit from 150+ QPS with 5,000,000 vectors
Free Trial
Explore our product

# Datum-Zeit-Vergleich

MyScale enthält auch eine Funktion für den Vergleich von Datum und Zeit:

WHERE dateDiff('hour', spalte_datetime, toDateTime('2018-01-02 23:00:00')) >= 25;

Diese WHERE-Klausel bezieht sich auf alle Zeilen, deren spalte_datetime später als das angegebene Datum und die angegebene Uhrzeit um mehr als 25 Stunden ist. Diese Funktion unterstützt auch Sekunden, Minuten, Tage und Monate.

Hinweis:

Weitere Informationen finden Sie hier (opens new window).

# Geo-Daten-Vergleich

MyScale kann den H3-Index (opens new window) und die S2-Geometrie (opens new window) verarbeiten, leistungsstarke Werkzeuge für die Routenplanung und Geometrieanalyse.

Mit dem H3-Index können Sie beispielsweise den Bereich eines Hexagons verwenden, um geografische Daten in einem bestimmten Bereich zu filtern:

WHERE h3CellAreaM2(spalte_h3) > 1000

Sie können auch die Entfernung zu einem bestimmten H3-Index hinzufügen:

WHERE h3Distance(spalte_h3, wert_h3) > 10

# Beliebige Objekte mit JSON-Spalten

MyScale ermöglicht es Ihnen, JSON als Objekt zu speichern und nach seinen Attributen zu filtern.

Sie können den JSON-Datentyp verwenden, um eine JSON-Zeichenkette in eine Tabelle zu importieren und die folgende WHERE-Klausel verwenden, um Ergebnisse zu filtern:

WHERE spalte_json.attr_1 = wert_1

Sie können auch nach verschachtelten Attributen filtern:

WHERE spalte_json.attr_1.attr_2 = wert_1

Obwohl dies ein experimentelles Feature (opens new window) ist, ist es leistungsstark. Wir haben diese Objekte in unseren Implementierungen von LangChain (opens new window) und LlamaIndex (opens new window) verwendet.

# Wertfunktionen

MyScale enthält viele Funktionen zur Verarbeitung von Spaltendaten, die Sie in WHERE-Klauseln verwenden können, wie z.B.:

WHERE abs(spalte_1) > 5

Sie können mehrere Spalten in Ihre WHERE-Klausel einbeziehen:

WHERE spalte_1 + spalte_2 + spalte_3 > 10

# Array-Funktionen

Array-Funktionen sind besonders leistungsstark, insbesondere bei unserer Vektor-Suche. In unserer Dokumentation (opens new window) haben wir Array-Funktionen in MyScale für die Berechnung der finalen Logits und Gradienten für unseren Few-Shot-Klassifikator vorgestellt.

ClickHouse hat eine großartige Dokumentation zu Array-Funktionen (opens new window).

Hinweis:

Wenn Sie immer noch Hilfe bei Array-Funktionen in MyScale benötigen, treten Sie unserem Discord (opens new window) bei und fragen Sie nach.

# Unterabfragen

Unterabfragen sind Abfragen innerhalb von Abfragen. Sie können auch eine WHERE-Klausel mit einer anderen SELECT-Abfrage schreiben, wie folgt:

WHERE spalte_1 IN (SELECT ... FROM andere_tabelle WHERE ...)
Join Our Newsletter

# Leistung der gefilterten Vektor-Suche

Genauigkeits-Benchmark

Wir haben die Leistung der gefilterten Vektor-Suche in vector-db-benchmark (opens new window) untersucht. Wir haben laion-768-5m-ip-probability verwendet, bei dem eine zufällige Gleitkommazahl als Filtermarkierung während der Abfrage hinzugefügt wird. Wir haben auch beliebte Vektor-Datenbanklösungen mit MyScale getestet. Wie das folgende Diagramm zeigt, übertrifft MyScale die meisten anderen Vektor-Datenbanklösungen, indem wir eine bessere Genauigkeit bei höherer Durchsatzrate bieten.

Kosten-Effizienz-Benchmark

Darüber hinaus erzielt MyScale die beste Kosten-Effizienz aller getesteten Vektor-Datenbanken, wenn die Genauigkeit >= 90% ist. Im Vergleich zu anderen SQL-integrierten Vektor-Datenbanken wie pgvector und pgvector.rs ist MyScale die einzige SQL- und Vektor-integrierte Datenbank, die eine produktionsbereite Genauigkeit und Durchsatzrate für gefilterte Suchen bietet.

Hinweis:

Weitere Informationen finden Sie in unserem Blog Vergleich von pgvector und MyScale (opens new window).

Zusammenfassend bietet MyScale eine bessere Genauigkeit bei höherer Durchsatzrate zu geringeren Kosten. Wir unterstützen auch 5 Millionen Vektoren mit mehr Datentypen und Funktionen in unserem s1-Pod in der Produktlinie, der für alle registrierten Benutzer kostenlos ist.

# Fazit

Gefilterte Suche ist ein häufiger Abfragetyp in Vektor-Datenbanken, der es Ihnen ermöglicht, ähnliche Vektoren oder Datenpunkte basierend auf bestimmten Kriterien oder Filtern zu suchen, insbesondere wenn es um Daten geht, die als Vektoren dargestellt werden können, wie Text- und Bild-Einbettungen oder andere strukturierte Daten.

MyScale integriert SQL-Power in KI-Technologie; die gefilterte Suche ist ein Beispiel dafür und ermöglicht anspruchsvollere und flexiblere Abfragefähigkeiten für Vektor-Datenbanken. Durch die Kombination von KI und SQL können Sie komplexe Datenoperationen und -suchen durchführen, was die Extraktion wertvoller Erkenntnisse, die Entdeckung von Mustern und die Durchführung verschiedener analytischer Aufgaben erleichtert.

Wenn Sie daran interessiert sind, wie SQL Ihre KI-Anwendungen verbessern kann, treten Sie uns noch heute auf Discord (opens new window) oder X (opens new window) bei.

Keep Reading
images
Wie man ein LLM mit OpenAI feinabstimmt

Willkommen zurück zu unserer Serie über die Feinabstimmung von Sprachmodellen (LLMs)! In unserem vorherigen Beitrag haben wir die [Feinabstimmung von LLMs mit Hugging Face](https://myscale.com/blog/de ...

images
Vektor-Daten von PostgreSQL nach MyScale migrieren

Update (2023-10-17): Schauen Sie sich unseren neuen Blog-Beitrag [Vergleich von MyScale mit Postgres und OpenSearch: Eine Erkundung der integrierten Vektor-Datenbanken](https://myscale.com/blog/ ...

Start building your Al projects with MyScale today

Free Trial
Contact Us