

Over de auteur
- Albert Skibinski is een zelfstandig ontwikkelaar en co-founder van Jafix
- Ik schrijf over web development, lange fietstochten en lekker eten!
Vector search (of semantisch zoeken) kan betere resultaten opleveren dan traditioneel keyword-matching, maar niet altijd. Om een beter begrip van het concept en de implementatie ervan te krijgen, besloot ik om het zo eenvoudig mogelijk te implementeren met behulp van mysql in plaats van een gespecialiseerde vector-database zoals Milvus, Pinecone of Qdrant (er zijn er nog veel meer). Het zal waarschijnlijk traag en inefficiënt zijn, maar welk een interessante oefening.
Als je bekend bent met Drupal en de Search API, dan ken je misschien de mysql-databaseoplossing die is opgenomen voor het geval je geen gespecialiseerde zoekdatabases zoals Solr of ElasticSearch wil gebruiken, je kan datn gewoon "database search" gebruiken wat de mysql database gebruikt. Op een vergelijkbare manier wilde ik een "lokale" vector-database in MySQL gebruiken.
Semantisch en Vectorzoeken
Een korte samenvatting van semantisch zoeken: eerst wordt de zoekinvoer van de gebruiker omgezet in een vectorrepresentatie met behulp van een Large Language Model (LLM). Deze representatie draagt semantische betekenis, maar essentieel is het een multidimensionale vector met honderden of duizenden dimensies. Maak je geen zorgen over het visualiseren van zo'n hoogdimensionale vector; het belangrijkste punt is dat meer dimensies meestal leiden tot een nauwkeurigere representatie.
Het vectorzoeken is de tweede stap, waarbij relevante gegevens in je database worden geïdentificeerd door andere gegevens met vergelijkbare vectorrepresentaties te vinden. Veelvoorkomende metrieken voor het bepalen van overeenkomst zijn cosine-overeenkomst (die overeenkomst in richting meet) en Euclidische afstand (die de afstand tussen punten in de vectorruimte meet).
Om dit proces te vergemakkelijken, moet alle doorzoekbare inhoud in je database ook als vectoren worden opgeslagen, met behulp van hetzelfde embedding-model als dat voor de invoer. Dit zorgt voor consistentie en maakt het mogelijk om elke vector toe te wijzen aan een specifiek stuk inhoud, dat vervolgens kan worden opgehaald en weergegeven in de zoekresultaten.
Drupal "Ai" Zoeken
Drupal ondersteunt het gebruik van Ai in de Search API met plugins die verschillende backend vector-database servers ondersteunen. Dit werd eerder gedaan met behulp van Search API Ai, maar die module is opgenomen in de Ai module. Aangezien de ai_search
module al veel van het zware werk doet (voor het indexeren van inhoud met behulp van embeddings), heb ik besloten om een nieuwe module te maken die een AiVdbProvider
plugin voor MySQL implementeert.
Bestaande Ai zoek VDB provider modules zijn:
Volgend dit naamgevingspatroon besloot ik de module als volgt te noemen:
Het gebruik ervan vereist momenteel een patch voor de ai-module zoals vermeld op de projectpagina, omdat ik aparte tabellen per index wilde hebben om de prestaties zo goed mogelijk te houden. Momenteel staat het ontwerp van het plugin-systeem deze flexibiliteit niet toe, wat mogelijk verandert in een toekomstige update van de Ai-module.
Het embedding-gedeelte is eenvoudig en wordt afgehandeld door elke provider die wordt ondersteund door de Ai-module. Het moeilijke deel is het verkrijgen van redelijke prestaties in MySQL bij het berekenen van de overeenkomst.
Gelukkig ben ik, na wat onderzoek, gestuit op deze post op Reddit van iemand die een PHP-implementatie heeft gemaakt voor snel vectorzoeken in MySQL. De bibliotheek is op github en ik gebruik momenteel een fork met enkele aanpassingen in mijn module.
Kwantisatie en Hamming-afstand
Het slimme aan deze bibliotheek is hoe het eerst een kleine subset van de meest relevante vectorgegevens vindt en vervolgens alleen de dure cosine-overeenkomstberekening op die gegevens uitvoert. Maar hoe wordt dit precies gedaan?
Beschouw deze vector:
[0.037807886, 0.054347273, -0.05825067, 0.028324638, 0.04211163, -0.03260336, -0.016389256, 0.01886641]
Eerst, kwantisatie. Kwantisatie in de context van vector-databases verwijst naar een techniek die wordt gebruikt om de geheugenvoetafdruk en de rekenkosten van het opslaan en verwerken van hoogdimensionale vectoren te verminderen. In dit geval wordt elk vectorcomponent vertegenwoordigd door een bit (0 of 1).
Dus het wordt:
11011111001
De Hamming-afstand is een maatstaf die wordt gebruikt om het verschil tussen twee strings van gelijke lengte te kwantificeren. Het is gedefinieerd als het aantal posities waarop de overeenkomstige symbolen (karakters, bits, enz.) verschillen.
Stel bijvoorbeeld dat je twee binaire strings hebt:
11011111001
11110111001
De Hamming-afstand tussen deze twee strings is 2, omdat er twee posities zijn waar de overeenkomstige bits verschillen (posities 3 en 5, als we vanaf 1 tellen).
Deze afstand wordt berekend met een snelle bitwise-operatie in een mysql-query en resulteert in een aantal resultaten dat vergelijkbaar is.
De resultaten worden vervolgens doorgegeven aan een opgeslagen mysql cosine-overeenkomstfunctie die door de vectoren in het JSON-veld loopt (mysql 8 vereist).
Hieronder zie je een video van een eenvoudige setup (met behulp van een composite strategy om het aantal vectoren te beperken) en enkele basiszoekopdrachten met de Ai Vector DB Explorer (een submodule van Ai).
Mysql 9 Vectorveld
Maar wacht, ondersteunt MySQL 9 niet vector-typevelden? Dat doet het, en dat kan de prestaties nog meer verbeteren. Hoewel je niet moet verwachten dat het in de buurt komt van een van de gespecialiseerde vector-databaseoplossingen, maar ik heb nog niet met mysql 9 gespeeld.
Conclusie
Dit was een leuke oefening om vectorzoeken en verschillende manieren waarop het kan worden geoptimaliseerd met technieken zoals kwantisatie en hamming-afstand met behulp van alleen PHP en MySQL te begrijpen. Het is mogelijk niet geschikt voor grote datasets, maar zeker bruikbaar voor kleine projecten en voor leerdoeleinden.
Scott Euser (ai-module-beheerder) vermeldde ook Typesense, wat een veelbelovende open-source vector-databaseoplossing lijkt te zijn (en erg snel), misschien is het de moeite waard om het volgende keer te bekijken.