KI: Vektorsuche
Beschreibung
Abschnitt betitelt „Beschreibung“KI: Vektorsuche ordnet die Zeilen einer Tabelle danach, wie nah ihre Vektor-Spalte an einem Abfragevektor liegt, und schreibt die nächstgelegenen Zeilen — mit der Distanz, nach der sie geordnet wurden — in eine Zieltabelle. Geben Sie mehrere Abfragevektoren an, erhält jeder seine eigene Treffermenge, und zwar in einem Durchlauf über die Quelltabelle und in einer einzigen Ausgabetabelle.
Die Suche ist exakt. Jede Zeile, die den Filter des Schritts passiert, wird mit jedem Abfragevektor verglichen, die Treffer sind also die tatsächlich nächstgelegenen Zeilen und keine Näherung — und der Aufwand wächst mit der Anzahl der durchsuchten Zeilen multipliziert mit der Anzahl der Abfragevektoren. Es gibt keinen Vektorindex, den Sie aufbauen, abstimmen oder auf den Sie zurückgreifen könnten.
Quelle und Ziel
Abschnitt betitelt „Quelle und Ziel“- Zu durchsuchende Tabelle — die Tabelle, deren gespeicherte Vektoren durchsucht werden.
- Zieltabelle — die Tabelle, in die die Treffer geschrieben werden.
- Vektorspalte — die Vektorspalte der zu durchsuchenden Tabelle, gegen die die Distanz gemessen wird. Jeder andere Datentyp wird abgelehnt, wobei die Spalte und der tatsächlich enthaltene Typ genannt werden.
- Distanzmaß — Kosinus oder Euklidisch (L2). Kosinus misst den Winkel zwischen zwei Vektoren und ignoriert ihre Beträge, was für Text-Embeddings das Richtige ist. Euklidisch misst den geradlinigen Abstand und berücksichtigt den Betrag. In beiden Fällen bedeutet eine niedrigere Distanz eine nähere Zeile. Kosinus ist der Standard.
- Treffer pro Abfrage — wie viele nächstgelegene Zeilen für jeden Abfragevektor behalten werden. Der Standard ist 10.
Abfragevektoren
Abschnitt betitelt „Abfragevektoren“Die Registerkarte Abfragevektoren nimmt ein JSON-Array mit einem Eintrag pro Abfrage entgegen, jeweils mit einer id und einem
vector:
[ {"id": "q1", "vector": [0.1, 0.2, 0.3]}, {"id": "q2", "vector": [0.4, 0.5, 0.6]}]Jede Abfrage liefert ihre eigene Treffermenge, und die id identifiziert sie in der Ausgabe. Die
IDs müssen eindeutig sein, jeder Wert muss eine endliche Zahl sein, und jeder Abfragevektor muss dieselbe
Anzahl von Werten enthalten wie die gespeicherten Vektoren — eine Distanz ist nur zwischen Vektoren gleicher Breite definiert.
Eine Abweichung wird abgelehnt, wobei die Abfrage, die Anzahl ihrer Werte und die Breite genannt werden, die die Spalte
enthält oder deklariert.
Teilmenge der Daten auswählen
Abschnitt betitelt „Teilmenge der Daten auswählen“Ein Filter schränkt ein, welche Zeilen Kandidaten sind. Zeilen werden gefiltert, bevor sie geordnet werden, sodass die Treffer die nächstgelegenen Zeilen sind, die den Filter passieren — nicht die insgesamt nächstgelegenen Zeilen, die anschließend gefiltert werden. Dies ist die wichtigste Stellschraube dafür, wie viel Arbeit der Schritt leistet; siehe Eine Suche dimensionieren.
Ausgabespalten
Abschnitt betitelt „Ausgabespalten“Jeder Treffer wird als eine Zeile mit den Spalten geschrieben, die Sie auf der Registerkarte Tabellendatenauswahl ausgewählt haben, plus zwei berechneten Spalten, deren Namen Sie festlegen:
- Spalte für Abfragenamen — die ID des Abfragevektors, auf den diese Zeile antwortet. Standardmäßig
query_id. - Entfernungsspalte — die gemessene Distanz zwischen dem Treffer und diesem Abfragevektor. Standardmäßig
distance. Dies ist auch der Sortierschlüssel.
Der Abfragename steht in der Ausgabe an erster Stelle, danach folgen die ausgewählten Spalten, und die Distanz steht zuletzt. Die Namen der Ausgabespalten müssen eindeutig sein.
Ausgelassene Zeilen
Abschnitt betitelt „Ausgelassene Zeilen“Eine Zeile, deren Distanz nicht gemessen werden kann, wird aus den Treffern ausgeschlossen, statt zurückgegeben zu werden, als wäre sie die nächstgelegene. Ein Vektor, dessen Betrag den Bereich eines 32-Bit-Floats überschreitet, ist der Fall, der Ihnen begegnen wird: Für ihn kommt keine messbare Distanz zurück, und da nichts verfügbar ist, das eine nicht messbare Distanz ans Ende sortiert, würde die Aufnahme einer solchen Zeile die Zeilen, über die die Suche am wenigsten weiß, an die Spitze jedes Ergebnisses setzen.
Führen Sie den Workflow mit aktiviertem Diagnosemodus aus, um die Anzahl zu sehen. Das Workflow-Protokoll meldet dann, wie viele Zeilen jede Abfrage ausgelassen hat, oder stellt fest, dass der Schritt jede durchsuchte Zeile gemessen hat. Die Ermittlung dieser Anzahl kostet einen zweiten Durchlauf über die Tabelle, weshalb sie nur berechnet wird, wenn Sie danach fragen. Bei deaktiviertem Diagnosemodus stellt das Protokoll fest, dass nicht messbare Zeilen absichtlich ausgelassen werden, und verweist Sie für die Zahl auf den Diagnosemodus.
Ein gespeicherter Vektor mit einem fehlenden Wert im Array ist ein anderer Fall: Gegen ein Array, das einen enthält, kann keine Distanz gemessen werden, daher wird die Suche ausdrücklich abgelehnt und die Spalte genannt, statt stillschweigend ein Teilergebnis zurückzugeben. Korrigieren oder entfernen Sie diese Zeilen und führen Sie den Schritt erneut aus.
Eine Suche dimensionieren
Abschnitt betitelt „Eine Suche dimensionieren“Die Kosten einer Ausführung ergeben sich aus der Anzahl der Kandidatenzeilen multipliziert mit der Anzahl der Abfragevektoren, und der Schritt lehnt eine Suche ab, deren Gesamtzahl zehn Milliarden Distanzmessungen überschreitet — und meldet die Zeilenanzahl, die Abfrageanzahl und das Limit —, statt Arbeit zu beginnen, die nicht abgeschlossen werden kann. Zwei Dinge halten eine Suche deutlich unter dieser Grenze:
- Auf den relevanten Ausschnitt filtern. Grenzen Sie die Kandidaten auf eine Entität, eine Periode oder eine Dokumentmenge ein, statt einen ganzen Korpus zu durchsuchen, um eine Frage zu einem Teil davon zu beantworten.
- Die Tabelle nach der Dimension aufteilen, nach der Sie immer filtern, und die relevante Tabelle durchsuchen. Die Verringerung der Kandidatenanzahl ist hier weitaus wirksamer als alles andere.
Auch die Deklaration einer Vektorbreite für die Spalte hilft: Ist sie deklariert, übernimmt der Schritt die Breite aus der Deklaration, statt eine Zeile zu prüfen, um sie zu ermitteln. Siehe Vektordatentyp.
Wofür eine Vektorspalte nicht verwendet werden kann
Abschnitt betitelt „Wofür eine Vektorspalte nicht verwendet werden kann“Eine Vektorspalte wird als Join-Schlüssel, als Gruppierungsspalte und als Aggregationsziel abgelehnt — in diesem Schritt und in jedem anderen. Die Meldung nennt die Spalte und die Rolle, in der sie verwendet wurde, sowohl beim Speichern des Schritts als auch beim Ausführen eines früher gespeicherten Schritts. Verknüpfen und gruppieren Sie stattdessen über die Geschäftsschlüssel neben dem Vektor. Einen Vektor als gewöhnliche Ausgabespalte durch einen Schritt zu führen ist in Ordnung, ebenso das Zählen von Zeilen und das Zählen eindeutiger Werte.
Verwandte Themen
Abschnitt betitelt „Verwandte Themen“- Vektordatentyp — eine Vektorspalte deklarieren, ihre Breite festlegen und Embeddings in sie laden
- Spatial Find Nearest — dieselbe Nächste-Nachbarn-Form über Geometrie statt über Embeddings
- Table Lookup — beschreibende Spalten wieder zu den gefundenen Zeilen hinzufügen
- Parquet importieren — Embeddings aus einer Parquet-Datei laden