Bei der Entwicklung von generativen KI-Anwendungen führen Sie typischerweise drei zusätzliche Komponenten in Ihre Infrastruktur ein: einen Einbettungsdienst, einen LLM und eine Vektordatenbank.
Wenn Sie jedoch MariaDB verwenden, müssen Sie keine zusätzliche Datenbank mit ihrem eigenen SQL-Dialekt einführen – oder noch schlimmer – ihre eigene proprietäre API. Seit MariaDB Version 11.7 (und MariaDB Enterprise Server 11.4) können Sie Ihre Einbettungen (oder Vektoren) einfach in einer beliebigen Spalte einer beliebigen Tabelle speichern – ohne dass Ihre Anwendungen mehrere Datenbanksprachen unterstützen müssen.
„Nach der Ankündigung der Vorschau auf die Vektorsuche in MariaDB Server wurde die Fähigkeit zur Vektorsuche nun der MariaDB Community Server 11.7-Version hinzugefügt,“ sagt Ralf Gebhardt, Produktmanager für MariaDB Server bei MariaDB. Dies umfasst einen neuen Datentyp (VEKTOR
), Vektorindex und eine Reihe von Funktionen zur Vektormanipulation.
Warum werden Vektoren in generativen KI-Anwendungen benötigt?
Vektoren sind in generativen KI-Anwendungen erforderlich, da sie komplexe Bedeutungen in einem kompakten, festgelegten Array von Zahlen (einem Vektor) einbetten. Dies wird im Kontext von retrieval-augmented generation (oder RAG) deutlicher. Diese Technik ermöglicht es Ihnen, relevante Daten aus Ihren Quellen (APIs, Dateien, Datenbanken) abzurufen, um die Eingabe eines KI-Modells mit den abgerufenen, oft geschäftsprivaten Daten zu erweitern.
Da Ihre Datenquellen umfangreich sein können, benötigen Sie eine Möglichkeit, die relevanten Teile zu finden, da aktuelle KI-Modelle ein endliches Kontextfenster haben – Sie können nicht einfach alle Ihre Daten zu einem Prompt hinzufügen. Indem Sie Datenstücke erstellen und diese Datenstücke durch ein spezielles KI-Modell namens Embedder laufen lassen, können Sie Vektoren generieren und Nähe-Suchtechniken verwenden, um relevante Informationen zu finden, die einem Prompt hinzugefügt werden sollen.
Zum Beispiel nehmen Sie den folgenden Input von einem Benutzer in einem Empfehlungs-Chatbot:
I need a good case for my iPhone 15 pro.
Da Ihr KI-Modell nicht mit den genauen Daten, die die Produktinformationen in Ihrem Online-Shop enthalten, trainiert wurde, müssen Sie die relevantesten Produkte und deren Informationen abrufen, bevor Sie den Prompt an das Modell senden.
Dafür senden Sie den ursprünglichen Input des Benutzers an einen Embedder und erhalten einen Vektor, den Sie später verwenden können, um die nächsten, sagen wir, 10 Produkte zum Benutzerinput zu erhalten. Sobald Sie diese Informationen haben (und wir werden später sehen, wie das mit MariaDB geht), können Sie den erweiterten Prompt an Ihr KI-Modell senden:
I need a good case for my iPhone 15 pro. Which of the following products better suit my needs?
1. ProShield Ultra Case for iPhone 15 Pro - $29.99: A slim, shock-absorbing case with raised edges for screen protection and a sleek matte finish.
2. EcoGuard Bio-Friendly Case for iPhone 15 Pro - $24.99: Made from 100% recycled materials, offering moderate drop protection with an eco-conscious design.
3. ArmorFlex Max Case for iPhone 15 Pro - $39.99: Heavy-duty protection with military-grade durability, including a built-in kickstand for hands-free use.
4. CrystalClear Slim Case for iPhone 15 Pro - $19.99: Ultra-thin and transparent, showcasing the phone's design while providing basic scratch protection.
5. LeatherTouch Luxe Case for iPhone 15 Pro - $49.99: Premium genuine leather construction with a soft-touch feel and an integrated cardholder for convenience.
Dies führt zu KI-Vorhersagen, die Ihre eigenen Daten verwenden.
Tabellen zur Vektorspeicherung erstellen
Um Vektoren in MariaDB zu speichern, verwenden Sie den neuen VECTOR
Datentyp. Zum Beispiel:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
In diesem Beispiel kann die embedding
Spalte einen Vektor mit 2048 Dimensionen halten. Sie müssen die Anzahl der Dimensionen anpassen, die Ihr Einbetter erzeugt.
Einen Vektorindex erstellen
Für die Leseleistung ist es wichtig, einen Index auf Ihrer Vektorspalte hinzuzufügen. Dies beschleunigt Ähnlichkeitssuchen. Sie können den Index bei der Erstellung der Tabelle wie folgt definieren:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
Für mehr Kontrolle können Sie die Distanzfunktion angeben, die der Datenbankserver zum Erstellen des Index verwendet, sowie den M Wert des Hierarchical Navigable Small Worlds (HNSW) Algorithmus, der von MariaDB verwendet wird. Zum Beispiel:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
Überprüfen Sie die Dokumentation für weitere Informationen zu diesen Konfigurationen.
Vektoren einfügen
Wenn Sie Daten (Text, Bild, Audio) durch einen Einbetter senden, erhalten Sie einen Vektor. Typischerweise handelt es sich um eine Reihe von Zahlen in einem Array im JSON-Format. Um diesen Vektor in eine MariaDB-Tabelle einzufügen, können Sie die Funktion VEC_FromText
verwenden. Zum Beispiel:
INSERT INTO products (name, embedding)
VALUES
("Alarm clock", VEC_FromText("[0.001, 0, ...]")),
("Cow figure", VEC_FromText("[1.0, 0.05, ...]")),
("Bicycle", VEC_FromText("[0.2, 0.156, ...]"));
Denken Sie daran, dass die eingefügten Vektoren die richtige Anzahl an Dimensionen haben müssen, wie im CREATE TABLE
Befehl definiert.
Ähnlichkeitssuche (Vektoren vergleichen)
In RAG-Anwendungen senden Sie die Benutzereingabe an einen Einbettungsdienst, um einen Vektor zu erhalten. Anschließend können Sie die Datensätze in Ihrer Datenbank abfragen, die näher an diesem Vektor liegen. Nähere Vektoren repräsentieren Daten, die semantisch ähnlich sind. Zum Zeitpunkt des Verfassens verfügt MariaDB über zwei Distanzfunktionen, die Sie für Ähnlichkeits- oder Nähesuche verwenden können:
VEC_DISTANCE_EUCLIDEAN
: berechnet die Luftliniendistanz zwischen zwei Vektoren. Es eignet sich am besten für Vektoren, die aus rohen, nicht normalisierten Daten abgeleitet sind oder für Szenarien, in denen räumliche Trennung direkt mit Ähnlichkeit korreliert, wie z. B. der Vergleich von Positionen oder numerischen Merkmalen. Es ist jedoch weniger effektiv für hochdimensionale oder normalisierte Einbettungen, da es empfindlich auf Unterschiede in der Vektormagnitude reagiert.VEC_DISTANCE_COSINE
: misst den Winkelunterschied zwischen Vektoren. Gut geeignet für den Vergleich von normalisierten Einbettungen, insbesondere in semantischen Anwendungen wie Text- oder Dokumentabruf. Es zeichnet sich durch die Erfassung von Ähnlichkeiten in Bedeutung oder Kontext aus.
Beachten Sie, dass die Ähnlichkeitssuche unter Verwendung der vorherigen Funktionen nur ungefähr ist und stark von der Qualität der berechneten Vektoren und somit von der Qualität des verwendeten Einbettungsdienstes abhängt.
Im folgenden Beispiel finden Sie die 10 ähnlichsten Produkte zu einem gegebenen Vektor ($user_input_vector
sollte durch den tatsächlichen Vektor ersetzt werden, der vom Einbettungsdienst über die Benutzereingabe zurückgegeben wird):
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
Die Funktionen VEC_DISTANCE_COSINE
und VEC_DISTANCE_EUCLIDEAN
nehmen zwei Vektoren. Im vorherigen Beispiel ist einer der Vektoren der über die Benutzereingabe berechnete Vektor und der andere ist der entsprechende Vektor für jeden Datensatz in der Tabelle products
.
Ein Praxisbeispiel
Ich habe ein praktisches Beispiel mit Java und ohne KI-Frameworks vorbereitet, damit Sie den Prozess der Erstellung generativer KI-Anwendungen unter Verwendung der Vektor-Suchfunktionen von MariaDB wirklich verstehen können. Den Code finden Sie auf GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb