Bij het ontwikkelen van generatieve AI-toepassingen voeg je typisch drie extra componenten toe aan je infrastructuur: een embedder, een LLM en een vector database.
Als je echter MariaDB gebruikt, hoef je geen extra database te introduceren met zijn eigen SQL-dialect – of nog erger – zijn eigen gepatenteerde API. Sinds MariaDB versie 11.7 (en MariaDB Enterprise Server 11.4) kun je eenvoudig je embeddings (of vectoren) opslaan in een willekeurige kolom van een willekeurige tabel – geen noodzaak om je toepassingen meertalig te maken voor databases.
“Na de aankondiging van de preview van vectorzoekopdrachten in MariaDB Server, is de mogelijkheid van vectorzoekopdrachten nu toegevoegd aan de MariaDB Community Server 11.7-release,” schrijft Ralf Gebhardt, Productmanager voor MariaDB Server bij MariaDB. Dit omvat een nieuw gegevenstype (VECTOR
), vectorindex en een reeks functies voor vectormanipulatie.
Waarom zijn vectoren nodig in generatieve AI-toepassingen?
Vectoren zijn nodig in generatieve AI-toepassingen omdat ze complexe betekenissen in een compacte array van getallen (een vector) embedden. Dit is duidelijker in de context van retrieval-augmented generation (of RAG). Deze techniek stelt u in staat om relevante gegevens op te halen uit uw bronnen (API’s, bestanden, databases) om een AI-modelinvoer te verbeteren met de opgehaalde, vaak privégegevens van het bedrijf.
Aangezien uw gegevensbronnen uitgebreid kunnen zijn, heeft u een manier nodig om de relevante stukken te vinden, aangezien huidige AI-modellen een beperkt contextvenster hebben – u kunt niet zomaar al uw gegevens aan een prompt toevoegen. Door gegevensblokken te maken en deze blokken door een speciaal AI-model genaamd embedder te laten lopen, kunt u vectoren genereren en nabijheidszoektechnieken gebruiken om relevante informatie te vinden die aan een prompt moet worden toegevoegd.
Neem bijvoorbeeld de volgende invoer van een gebruiker in een aanbevelingschatbot:
I need a good case for my iPhone 15 pro.
Aangezien uw AI-model niet is getraind met de exacte gegevens die de productinformatie bevatten in uw online winkel, moet u de meest relevante producten en hun informatie ophalen voordat u de prompt naar het model stuurt.
Hier stuurt u de originele invoer van de gebruiker naar een embedder en krijgt u een vector die u later kunt gebruiken om de dichtstbijzijnde, laten we zeggen, 10 producten bij de gebruikersinvoer te krijgen. Zodra u deze informatie heeft (en we zullen later zien hoe dit te doen met MariaDB), kunt u de verbeterde prompt naar uw AI-model sturen:
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.
Dit resulteert in AI-voorspellingen die uw eigen gegevens gebruiken.
Het creëren van tabellen voor de opslag van vectoren
Om vectoren op te slaan in MariaDB, gebruik de nieuwe VECTOR
gegevenstype. Bijvoorbeeld:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
In dit voorbeeld kan de embedding
kolom een vector van 2048 dimensies bevatten. Je moet het aantal dimensies matchen met wat je embedder genereert.
Vector Indexen Creëren
Voor leesprestaties is het belangrijk om een index toe te voegen aan je vector kolom. Dit versnelt gelijkheid zoekopdrachten. Je kunt de index definiëren bij het aanmaken van de tabel als volgt:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
Voor meer controle, kun je de afstandsfunctie specificeren die de databaseserver zal gebruiken om de index te bouwen, evenals de M waarde van de Hierarchical Navigable Small Worlds (HNSW) algoritme gebruikt door MariaDB. Bijvoorbeeld:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
Bekijk de documentatie voor meer informatie over deze configuraties.
Vectoren Invoegen
Wanneer je gegevens (tekst, afbeelding, audio) door een embedder haalt, krijg je een vector. Typisch is dit een reeks nummers in een array in JSON-formaat. Om deze vector in een MariaDB tabel in te voegen, kun je de VEC_FromText
functie gebruiken. Bijvoorbeeld:
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, ...]"));
Onthoud dat de ingevoegde vectoren het juiste aantal dimensies moeten hebben zoals gedefinieerd in de CREATE TABLE
verklaring.
Gelijkheid Zoeken (Vectoren Vergelijken)
In RAG-toepassingen stuurt u de gebruikersinvoer naar een invoegtoepassing om een vector te krijgen. Vervolgens kunt u de records in uw database opvragen die dichter bij die vector liggen. Dichtere vectoren vertegenwoordigen gegevens die semantisch vergelijkbaar zijn. Op dit moment heeft MariaDB twee afstandsfuncties die u kunt gebruiken voor zoekopdrachten naar overeenkomst of nabijheid:
VEC_DISTANCE_EUCLIDEAN
: berekent de rechte-lijnafstand tussen twee vectoren. Het is het meest geschikt voor vectoren afgeleid van ruwe, niet-genormaliseerde gegevens of scenario’s waar ruimtelijke scheiding direct correleert met overeenkomst, zoals het vergelijken van positionele of numerieke kenmerken. Het is echter minder effectief voor high-dimensionale of genormaliseerde invoegingen omdat het gevoelig is voor verschillen in vectormagnitude.VEC_DISTANCE_COSINE
: meet het hoekverschil tussen vectoren. Goed voor het vergelijken van genormaliseerde invoegingen, vooral in semantische toepassingen zoals tekst- of documentopvraging. Het blinkt uit in het vastleggen van overeenkomsten in betekenis of context.
Houd er rekening mee dat zoekopdrachten naar overeenkomst met behulp van de vorige functies slechts benaderend zijn en sterk afhankelijk zijn van de kwaliteit van de berekende vectoren en dus van de kwaliteit van de gebruikte invoegtoepassing.
Het volgende voorbeeld vindt de top 10 meest vergelijkbare producten met een gegeven vector ($user_input_vector
moet worden vervangen door de daadwerkelijke vector die door de invoegtoepassing over de gebruikersinvoer is geretourneerd):
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
De functies VEC_DISTANCE_COSINE
en VEC_DISTANCE_EUCLIDEAN
nemen twee vectoren als input. In het vorige voorbeeld is één van de vectoren de vector berekend op basis van de gebruikersinvoer, en de andere is de overeenkomstige vector voor elk record in de tabel products
.
Een Praktisch Voorbeeld
Ik heb een praktisch voorbeeld voorbereid met behulp van Java en zonder AI-frameworks, zodat u het proces van het maken van generatieve AI-toepassingen met behulp van de vectorzoekmogelijkheden van MariaDB echt begrijpt. U kunt de code vinden op GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb