23ai: Vector Search
Daten zu vektorisieren, diese Vektoren als eine Art Metadaten zu speichern und dann für Ähnlichkeitssuchen zu verwenden, ist ein grundlegender Baustein in der künstlichen Intelligenz. Weil das ein so wichtiger Baustein ist, hat Oracle in der Datenbank 23ai eine entsprechende Unterstützung vorgesehen. Es gibt einen neuen Datentyp sowie einige neue Funktionen zur Speicherung und Verarbeitung von Vektordaten.
Ein neuer Datentyp bedeutet, es können nun Vektordaten nativ in der Datenbank gespeichert werden. Der Datentyp VECTOR kann dabei unspezifisch verwendet werden, dann können Vektoren mit beliebig vielen Dimensionen gespeichert werden. Alternativ kann man auch die Anzahl der Dimensionen sowie den Datentyp vorgeben, die Datenbank prüft dann entsprechend die Daten auf diese Eigenschaften.
MARCO @ DB23AI:PDB1:>create table t_vector(
2 id number(15) generated always as identity,
3 v_generic vector,
4 v_spec vector(3, float64)
5* );
Table T_VECTOR created.
Die neue Tabelle hat also eine Spalte mit einen unspezifischen und eine Spalte mit einem spezifischen Vektor. Dorthin können nun entsprechende Daten geladen werden. Für die folgenden Beispiele wird nur der spezifische 3-dimensionale Vektor befüllt (Update vom 20.03.2025: Korrektes INSERT-Statement eingefügt).
MARCO @ DB23AI:PDB1:>insert into t_vector(v_spec)
2 values
3 ('[1,1,1]'),
4 ('[1,2,1]'),
5 ('[1,3,1]'),
6 ('[2,1,1]'),
7 ('[2,2,1]'),
8 ('[2,3,1]'),
9 ('[3,1,1]'),
10 ('[3,2,1]'),
11 ('[3,3,1]'),
12 ('[2,2,3]')
13* ;
10 rows inserted.
Die Werte lassen sich nun wie gewohnt mit SELECT abfragen.
MARCO @ DB23AI:PDB1:>select * from t_vector;
ID V_GENERIC V_SPEC
---------- -------------------- ------------------------------
3 [1.0E+000,1.0E+000,1.0E+000]
4 [1.0E+000,2.0E+000,1.0E+000]
5 [1.0E+000,3.0E+000,1.0E+000]
6 [2.0E+000,1.0E+000,1.0E+000]
7 [2.0E+000,2.0E+000,1.0E+000]
8 [2.0E+000,3.0E+000,1.0E+000]
9 [3.0E+000,1.0E+000,1.0E+000]
10 [3.0E+000,2.0E+000,1.0E+000]
11 [3.0E+000,3.0E+000,1.0E+000]
12 [2.0E+000,2.0E+000,3.0E+000]
10 rows selected.
Um Daten in das Vektorformat umzuwandeln, gibt es die beiden equivalenten Funktionen VECTOR und TO_VECTOR. Das ist für die noch folgenden Abfragebeispiele relevant.
MARCO @ DB23AI:PDB1:>SELECT TO_VECTOR('[23.1, 12.3, 354354.5454]');
TO_VECTOR('[23.1,12.3,354354.5454]')
--------------------------------------------------------------------------------
[2.31000004E+001,1.23000002E+001,3.54354531E+005]
Das spannendste ist nun aber die Funktion VECTOR_DISTANCE. Damit können Ähnlichkeitssuchen durchgeführt werden, die für KI-Anwendungen so wichtig sind. Die Funktion unterstützt verschiedene Algorithmen zur Abstandsbestimmung zweier Vektoren, im Beispiel wird der euklidische Abstand verwendet. Um die drei ähnlichsten Vektoren zu einem gegebenen Vektor zu ermitteln, sortiert man einfach absteigend nach dem Abstand und begrenzt die Ergebnismenge auf die gewünschte Anzahl Vektoren.
MARCO @ DB23AI:PDB1:>select *
2 from t_vector
3 order by vector_distance( to_vector('[2.5,2.5,1]', 3, float64), v_spec, EUCLIDEAN )
4* fetch first 3 rows only;
ID V_GENERIC V_SPEC
---------- -------------------- ------------------------------
7 [2.0E+000,2.0E+000,1.0E+000]
10 [3.0E+000,2.0E+000,1.0E+000]
8 [2.0E+000,3.0E+000,1.0E+000]
Man sieht, die dem Vektor (analog einen Punkt in einem 3-dimensionalen Diagramm) x=2,5 / y=2,5 / z=1 sind die drei Punkte 2/2/1, 3/2/1 und 2/3/1. Legt man den gleichen Basisvektor auf die Ebene z=3, so erhält man nun folgendes Ergebnis:
MARCO @ DB23AI:PDB1:>select *
2 from t_vector
3 order by vector_distance( to_vector('[2.5,2.5,3]', 3, float64), v_spec, EUCLIDEAN )
4* fetch first 3 rows only;
ID V_GENERIC V_SPEC
---------- -------------------- ------------------------------
12 [2.0E+000,2.0E+000,3.0E+000]
7 [2.0E+000,2.0E+000,1.0E+000]
8 [2.0E+000,3.0E+000,1.0E+000]
Der nächstgelegene Vektor ist nun 2/2/3, gefolgt von den beiden Vektoren in der Ebene z=1.
Die Möglichkeit, Vektoren direkt in der Datenbank zu speichern ist ein weiterer folgerichtiger Schritt, den Oracle beschreitet um der Idee der “Converged Database” Leben zu verleihen. Verschiedenste Datenformen können in der Oracle Datenbank abgelegt und verarbeitet werden. Die Verarbeitung erfolgt transparent mit gewohnten SQL-Mitteln und die Daten unterliegen den Grundkonzepten relationaler Datenbanken wie ACID und MVCC.
Für das Thema “Vector Search” gibt es ein eigenes Handbuch in der Dokumentation.
Kommentare
Keine Kommentare