Zephyrnet-logo

Gids voor Chroma DB | Een vectoropslag voor uw generatieve AI LLM's

Datum:

Introductie

Generatieve grote taalmodellen zoals GPT, PaLM, enz. worden getraind op grote hoeveelheden gegevens. Deze modellen nemen de teksten niet zomaar uit de dataset, omdat computers geen tekst begrijpen, ze begrijpen alleen cijfers. Inbeddingen zijn de weergave van de tekst, maar in een numeriek formaat. Alle informatie van en naar de Grote Taalmodellen loopt via deze inbeddingen. Rechtstreeks toegang krijgen tot deze inbeddingen is tijdrovend. Vandaar dat wat vectordatabases worden genoemd, deze inbeddingen opslaat die speciaal zijn ontworpen voor efficiënte opslag en ophalen van vectorinbeddingen. In deze gids zullen we ons concentreren op zo'n vectorwinkel/database, Chroma DB, die veel wordt gebruikt en open-source is.

leerdoelen

  • Inbeddingen genereren met ChromaDB en Modellen inbedden
  • Collecties maken binnen de Chroma Vector Store
  • Het opslaan van documenten, afbeeldingen en inbeddingen binnen de collecties
  • Collectiebewerkingen uitvoeren, zoals het verwijderen en bijwerken van gegevens, hernoemen van collecties
  • Ten slotte, het doorzoeken van de collecties om relevante informatie te extraheren

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Inhoudsopgave

Korte inleiding tot inbedden

Embeddings of Vector Embeddings is een manier om gegevens weer te geven (tekst, afbeeldingen, audio, video's, enz.) in numeriek formaat, om precies te zijn is het een manier om gegevens weer te geven in de vorm van getallen in een n-dimensionale ruimte (een numerieke vector). Op deze manier stellen inbeddingen ons in staat om vergelijkbare gegevens samen te clusteren. Er zijn modellen die deze invoer nemen en ze omzetten in vectoren. Een voorbeeld hiervan is de Woord2Vec, een populair inbeddingsmodel ontwikkeld door Google, dat woorden converteert naar vectoren (vectoren zijn punten met n-dimensies). Alle grote taalmodellen hebben hun respectieve inbeddingsmodellen, die inbeddingen creëren voor hun LLM.

Waar worden deze inbeddingen voor gebruikt?

Het goede aan het converteren van woorden naar vectoren is dat we ze kunnen vergelijken. Een computer kan twee woorden niet vergelijken zoals ze zijn, maar als we ze geven in de vorm van numerieke invoer, dwz vectorinbeddingen, kan hij ze vergelijken. We kunnen een cluster van woorden maken met vergelijkbare inbeddingen. De woorden koning, koningin, prins en prinses verschijnen in een cluster omdat ze aan elkaar verwant zijn.

Op deze manier stellen inbeddingen ons in staat om woorden te vinden die lijken op een bepaald woord. We kunnen dit opnemen in zinnen, waar we een zin invoeren en de bijbehorende zinnen uit de verstrekte gegevens halen. Dit is de basis voor semantisch zoeken, zinsgelijkenis, anomaliedetectie, chatbot en nog veel meer use cases. De chatbots die we bouwen om vragen te beantwoorden vanuit een bepaalde PDF, Doc, maken gebruik van dit concept van inbedding. Alle Generative Large Language Models gebruiken deze benadering om inhoud te krijgen die vergelijkbaar is met de zoekopdrachten die aan hen worden verstrekt.

Vector Store en de noodzaak ervan

Zoals besproken, zijn inbeddingen meestal weergaven van elk soort gegevens, de ongestructureerde in het numerieke formaat in een n-dimensionale ruimte. Waar slaan we ze nu op? Traditionele RDMS (Relational Database Management Systems) kunnen niet worden gebruikt om deze vectorinbeddingen op te slaan. Dit is waar de Vector Store / Vector Dabases in het spel komen. Vectordatabases zijn ontworpen om vectorinbeddingen op een efficiënte manier op te slaan en op te halen. Er zijn veel vectorwinkels die verschillen door de inbeddingsmodellen die ze ondersteunen en het soort zoekalgoritme dat ze gebruiken om vergelijkbare vectoren te vinden.

Waarom hebben we ze nodig? We hebben ze nodig omdat ze snelle toegang bieden tot de gegevens die we nodig hebben. Laten we eens kijken naar een chatbot op basis van een pdf. Wanneer een gebruiker nu een zoekopdracht invoert, is het eerste wat er moet gebeuren om gerelateerde inhoud van PDF naar die zoekopdracht op te halen en deze informatie naar de chatbot te sturen. Zodat de Chatbot deze informatie met betrekking tot de vraag kan nemen en het relevante antwoord aan de Gebruiker kan bewijzen. Hoe krijgen we nu de relevante inhoud van PDF met betrekking tot de gebruikersquery? Het antwoord is een eenvoudige zoektocht naar overeenkomsten

Wanneer gegevens worden weergegeven in vectorinbeddingen, kunnen we overeenkomsten vinden tussen verschillende delen van de gegevens en de gegevens extraheren die vergelijkbaar zijn met een bepaalde inbedding. De query wordt eerst geconverteerd naar inbeddingen door een inbeddingsmodel en vervolgens neemt de Vector Store deze vectorinbedding en voert vervolgens een zoekactie naar overeenkomsten uit (via zoekalgoritmen) tussen andere inbeddingen die het in zijn database heeft opgeslagen en haalt alle relevante gegevens op. Deze relevante vector-inbeddingen worden vervolgens doorgegeven aan het Large Language Model, de chatbot die deze informatie gebruikt om een ​​definitief antwoord aan de gebruiker te genereren.

Wat is ChromaDB?

Chroma is een Vector Store / Vector DB van het bedrijf Chroma. Chroma DB is net als veel andere Vector Stores die er zijn, voor het opslaan en ophalen van vectorinbeddingen. Het goede deel is dat Chroma een gratis en open source-project is. Dit geeft andere bekwame ontwikkelaars in de wereld de mogelijkheid om suggesties te geven en enorme verbeteringen aan de database aan te brengen en zelfs iemand kan een snel antwoord verwachten op een probleem dat te maken heeft met Open Source-software, aangezien de hele Open Source-gemeenschap er is om dat probleem te bekijken en op te lossen.

Op dit moment biedt Chroma geen hostingdiensten aan. Sla de gegevens lokaal op in het lokale bestandssysteem bij het maken van applicaties rond Chroma. Hoewel Chroma van plan is om in de nabije toekomst een hostingservice te bouwen. Chroma DB biedt verschillende manieren om vectorinbeddingen op te slaan. Je kunt ze in-memory opslaan, je kunt ze in-memory opslaan en laden, je kunt gewoon Chroma een client laten draaien om met de backend-server te praten. Over het algemeen heeft Chroma DB slechts 4 functies in de API, waardoor het kort, eenvoudig en gemakkelijk is om mee te beginnen.

Laten we beginnen met Chroma DB

In dit gedeelte zullen we Chroma installeren en alle functionaliteiten bekijken die het biedt. Ten eerste zullen we de bibliotheek installeren via de opdracht pip

$ pip install chromadb

Chroma Vector Store-API

Hiermee wordt de Chroma Vector Store API voor Python gedownload. Met dit pakket kunnen we alle taken uitvoeren, zoals het opslaan van vectorinbeddingen, het ophalen ervan en het uitvoeren van een semantische zoekopdracht voor een bepaalde vectorinbedding.

import chromadb
from chromadb.config import Settings client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet", persist_directory="/content/" ))

Geheugen Database

We beginnen met het maken van een permanente in-memory database. De bovenstaande code maakt er een voor ons. Om een ​​klant aan te maken nemen we de Cliënt() object uit de Chroma DB. Om nu een in-memory database te maken, configureren we onze client met de volgende parameters

  • chroma_db_impl = “duckdb+parket”
  • persistent_directory = "/inhoud/"

Hiermee wordt een DuckDB-database in het geheugen gemaakt met de bestandsindeling parket. En we bieden de directory waar deze gegevens moeten worden opgeslagen. Hier slaan we de database op in de map /content/. Dus telkens wanneer we verbinding maken met een Chroma DB-client met deze configuratie, zoekt de Chroma DB naar een bestaande database in de opgegeven map en laadt deze. Als het niet aanwezig is, zal het het creëren. En wanneer we de verbinding verbreken, worden de gegevens in deze map opgeslagen.

Nu gaan we een verzameling maken. Verzameling in Vector Store is waar we de set vectorinbeddingen, documenten en eventuele metadata opslaan, indien aanwezig. Verzameling in een vectordatabase kan worden gezien als een tabel in een relationele database.

Verzameling maken en documenten toevoegen

We gaan nu een verzameling maken en er documenten aan toevoegen.

collection = client.create_collection("my_information") collection.add( documents=["This is a document containing car information", "This is a document containing information about dogs", "This document contains four wheeler catalogue"], metadatas=[{"source": "Car Book"},{"source": "Dog Book"},{'source':'Vechile Info'}], ids=["id1", "id2", "id3"]
)
  • Hier beginnen we met het eerst maken van een verzameling. Hier noemen we de collectie "mijn informatie'.
  • Aan deze collectie gaan we documenten toevoegen. Hier voegen we 3 documenten toe, in ons geval voegen we slechts drie zinnen toe als drie documenten. Het eerste document gaat over auto's, het tweede over honden en het laatste over vierwielers.
  • We voegen zelfs de metadata toe. Er worden metagegevens voor alle drie de documenten verstrekt.
  • Elk document moet een unieke ID hebben, daarom geven we ze id1, id2 en id3
  • Al deze zijn als de variabelen van de toevoegen() functie uit de collectie
  • Voeg na het uitvoeren van de code deze documenten toe aan onze verzameling "mijn informatie"

Vector-databases

We hebben geleerd dat de informatie die is opgeslagen in Vector Databases de vorm heeft van Vector Embeddings. Maar hier hebben we tekst / tekstbestanden, dwz documenten, verstrekt. Dus hoe slaat het ze op? Chroma DB gebruikt standaard een alles-MiniLM-L6-v2 vector inbeddingsmodel om de inbeddingen voor ons te maken. Dit model neemt onze documenten en converteert ze naar vectorinbeddingen. Als we willen werken met een specifieke inbeddingsfunctie zoals andere zinstransformatormodellen van HuggingFace of OpenAI inbeddingsmodel, kunnen we deze specificeren onder de embeddings_function=embedding_functie_naam variabele naam in de create_collection() methode.

We kunnen de inbeddingen ook rechtstreeks aan de Vector Store leveren, in plaats van de documenten eraan door te geven. Net als de documentparameter in maak_collectie, we hebben een inbedding parameter, waaraan we de inbeddingen doorgeven die we willen opslaan in de Vector Database.

Dus nu heeft het model onze drie documenten met succes opgeslagen in de vorm van vectorinbeddingen in de vectoropslag. Nu zullen we kijken naar het ophalen van relevante documenten van hen. We geven een query door en halen de documenten op die daarvoor relevant zijn. De bijbehorende code hiervoor is

results = collection.query( query_texts=["Car"], n_results=2
) print(results)

Zoek een vectorwinkel op

  • Om een ​​vectorwinkel te bevragen, hebben we een vraag () functie geleverd door de collecties waarmee we de vectordatabase kunnen doorzoeken op relevante documenten. In deze functie bieden we twee parameters
  • vraag_teksten – Aan deze parameter geven we een lijst met zoekopdrachten waarvoor we de relevante documenten moeten extraheren.
  • n_resultaten – Deze parameter geeft aan hoeveel topresultaten de database moet retourneren. In ons geval willen we dat onze verzameling de 2 meest relevante documenten met betrekking tot de zoekopdracht retourneert
  • Wanneer we de resultaten uitvoeren en afdrukken, krijgen we de volgende uitvoer
vraag een vectorwinkel | Chroma DB

We zien dat de vectorwinkel twee documenten retourneert die geassocieerd zijn met id1 en id3. De id1 is het document over auto's en de id3 is het document aantal vierwielers, wat weer gerelateerd is aan een auto. Dus toen we een vraag, converteert de Chrom DB de query naar een vectorinbedding met het inbeddingsmodel dat we aan het begin hebben gegeven. Vervolgens voert deze vectorinbedding een semantische zoekopdracht uit (vergelijkbare dichtstbijzijnde buren) op alle beschikbare documenten. De vraag hier “auto” is het meest relevant voor de id1- en id3-documenten, daarom krijgen we het volgende resultaat voor de query.

Dit is erg handig wanneer we een chattoepassing proberen te bouwen die meerdere documenten bevat. Via een vectoropslag kunnen we de relevante documenten voor de verstrekte zoekopdracht ophalen door een semantische zoekopdracht uit te voeren en alleen deze documenten naar het uiteindelijke generatieve AI-model te voeren, dat vervolgens deze relevante documenten zal nemen en een antwoord op de opgegeven zoekopdracht zal genereren.

Gegevens bijwerken en verwijderen

We voegen niet altijd alle informatie in één keer toe aan de Vector Store. In de meeste gevallen hebben we in het begin slechts beperkte gegevens/documenten, die we ongewijzigd toevoegen aan de Vector Store. Later, wanneer we meer gegevens krijgen, wordt het noodzakelijk om de bestaande gegevens/vector-inbeddingen in de Vector Store bij te werken. Om gegevens in Chroma DB bij te werken, doen we het volgende

collection.update( ids=["id2"], documents=["This is a document containing information about Cats"], metadatas=[{"source": "Cat Book"}],
)

Voorheen was de informatie in het document gekoppeld aan id2 ging over honden. Nu veranderen we het in Cats. Om ervoor te zorgen dat deze informatie binnen de Vector Store wordt bijgewerkt, geven we de id van het document, het bijgewerkte document en de bijgewerkte metadata van het document door aan de bijwerken() functie van de collecties. Dit zal nu het updaten id2 to Cats, dat voorheen over Dogs ging.

Vraag in database

results = collection.query( query_texts=["Felines"], n_results=1
) print(results)
opvragen in database | Chroma DB

We geven Felines door als de vraag aan de Vector Store. Katten behoren tot de familie van zoogdieren die katachtigen worden genoemd. De incasso moet dus het Cat-document als het relevante document aan ons retourneren. In de uitvoer krijgen we precies hetzelfde te zien. De vectoropslag was in staat om een ​​semantische zoekopdracht uit te voeren tussen de zoekopdracht en de inhoud van de documenten en kon het perfecte document terugsturen naar de verstrekte zoekopdracht.

De verstoorde functie

Er is een vergelijkbare functie als de update-functie genaamd de opsteken() functie. Het enige verschil tussen beide bijwerken() en opsteken() functie is, als de document-ID die is opgegeven in de bijwerken() functie bestaat niet, de bijwerken() functie geeft een foutmelding. Maar in het geval van de opsteken() functie, als de document-ID niet bestaat in de verzameling, dan wordt deze toegevoegd aan de verzameling, vergelijkbaar met de toevoegen() functie.

Om ruimte te verkleinen of onnodige/ongewenste informatie te verwijderen, willen we soms enkele documenten uit de collectie in de Vector Store verwijderen.

collection.delete(ids = ['id1']) results = collection.query( query_texts=["Car"], n_results=2
) print(results)
de verstoorde functie | Chroma DB

De verwijderfunctie

Om een ​​item uit een verzameling te verwijderen, hebben we de verwijderen () functie. In het bovenstaande verwijderen we het eerste document waaraan is gekoppeld id1 dat ging over auto's. Om dit te controleren, doorzoeken we de verzameling met de "auto” als de query en bekijk vervolgens de resultaten. We zien dat slechts 2 documenten id2 en id3 verschijnen, waar de id2 is het document over vierwielers die het dichtst bij auto's staan ​​en id3 is het document over katten dat het minst dicht bij auto's staat, maar zoals we hebben aangegeven n_resultaten = 2 krijgen we de id3 ook. Als we geen variabelen specificeren voor de verwijderen () functie, dan worden alle items uit die verzameling verwijderd

Verzamelfuncties

We hebben gezien hoe we een nieuwe verzameling kunnen maken en er vervolgens documenten en insluitingen aan kunnen toevoegen. We hebben zelfs gezien hoe we relevante informatie voor een zoekopdracht kunnen extraheren uit de verzameling, dwz uit de documenten die zijn opgeslagen in de Vector Store. Het verzamelingsobject van Chroma DB wordt ook geassocieerd met vele andere handige functies.

Laten we eens kijken naar enkele andere functionaliteiten van Chroma DB

new_collections = client.create_collection("new_collection") new_collections.add( documents=["This is Python Documentation", "This is a Javascript Documentation", "This document contains Flast API Cheatsheet"], metadatas=[{"source": "Python For Everyone"}, {"source": "JS Docs"}, {'source':'Everything Flask'}], ids=["id1", "id2", "id3"]
) print(new_collections.count())
print(new_collections.get())
verzamelfuncties | Chroma DB

De telfunctie

De tellen () functie uit de verzamelingen retourneert het aantal items in de verzameling. In ons geval hebben we 3 documenten opgeslagen in onze verzameling, dus de output zal 3 zijn krijgen() functie, retourneert het alle items die in onze collectie aanwezig zijn, samen met de metadata, ids en inbedding indien van toepassing. In de output zien we dat alle items die we aan onze collectie hebben door de krijgen() commando. Laten we nu kijken naar het wijzigen van de naam van de collectie

collection.modify(name="new_collection_name")

De wijzigingsfunctie

Gebruik de bewerken() functie vanuit collecties om de naam van de collectie te wijzigen die is opgegeven bij het maken van de collectie. Wijzig bij het uitvoeren de naam van de verzameling van de oude naam die aan het begin was gedefinieerd in de nieuwe naam die is opgegeven in het bewerken() functie onder de naam variabele. Stel nu, we hebben meerdere collecties in onze Vector Store. Hoe werk je aan een specifieke verzameling, d.w.z. hoe haal je een specifieke verzameling uit de Vector Store en hoe verwijder je een specifieke verzameling? Laten we dit eens bekijken

my_collection = client.get_collection(name="my_information_2") client.delete_collection(name="my_information_2")

De Get Collection-functie

De get_collection() functie zal een bestaande collectie ophalen op voorwaarde dat de naam, van de Vectorwinkel. Als de opgegeven verzameling niet bestaat, zal de functie hiervoor een fout genereren. Hier de get_collection() zal proberen om de mijn_informatie_2 verzameling en wijs deze toe aan de variabele mijn collectie. Om een ​​bestaande collectie te verwijderen, hebben we de verwijder_collectie() functie, die de naam van de verzameling als parameter (mijn informatie in dit geval) en verwijdert het vervolgens, als het bestaat.

Conclusie

In deze handleiding hebben we gezien hoe u aan de slag kunt met Chroma, een van de Open Source Vector Databases. We zijn in eerste instantie begonnen met te leren wat vectorinbedding is, waarom ze nodig zijn voor de generatieve AI-modellen en hoe Vector Stores deze generatieve grote taalmodellen helpen. Daarna zijn we diep in Chroma gedoken en hebben we gezien hoe je collecties kunt maken in Chroma. Vervolgens hebben we gekeken hoe we gegevens zoals documenten aan Chroma kunnen toevoegen en hoe de Chroma DB er vectorinbeddingen van maakt. Ten slotte hebben we gezien hoe we relevante informatie met betrekking tot de gegeven zoekopdracht kunnen ophalen uit een bepaalde verzameling in de Vector Store.

Enkele van de belangrijkste punten uit deze gids zijn:

  • Vector-inbeddingen zijn numerieke representaties (numerieke vectoren) van niet-numerieke gegevens zoals tekst, afbeeldingen, audio, enz.
  • Vector Stores zijn de databases die worden gebruikt om de vector-inbeddingen op te slaan in de vorm van collecties
  • Ze zorgen voor efficiënte opslag en ophalen van informatie uit de inbeddingsgegevens
  • Chroma DB kan zowel als een in-memory database als als backend werken
  • Chroma DB heeft de functionaliteit om de gegevens op te slaan bij het afsluiten en de gegevens in het geheugen te laden bij het tot stand brengen van een verbinding, waardoor de gegevens behouden blijven
  • Met Vector Stores wordt het veel eenvoudiger om informatie uit documenten te halen, aanbevelingen te genereren en chatbot-applicaties te bouwen

Veelgestelde Vragen / FAQ

Q1. Wat zijn Vector Databases / Vector Stores?

A. Vectordatabases zijn de plaats waar vectorinbeddingen worden opgeslagen. Deze bestaan ​​omdat ze zorgen voor het efficiënt ophalen van vectorinbeddingen. Ze worden gebruikt voor het extraheren van relevante informatie voor de zoekopdracht uit hun database door middel van semantisch zoeken.

Q2. Wat zijn vectorinbeddingen?

A. Vectorinbeddingen zijn representaties van tekst/afbeelding/audio/video's in een numerieke indeling in een n-dimensionale ruimte, meestal als een numerieke vector. Dit wordt gedaan omdat computers tekst of afbeeldingen of andere niet-numerieke gegevens niet van nature begrijpen. Deze inbeddingen stellen hen dus in staat de gegevens goed te begrijpen, omdat deze in een numeriek formaat worden gepresenteerd.

Q3. Wat zijn inbeddingsmodellen?

A. Inbeddingsmodellen zijn modellen die niet-numerieke gegevens zoals tekst/afbeeldingen omzetten in een numeriek formaat dat vectorinbedding is. Chroma DB gebruikt standaard het volledig MiniLM-L6-v2-model om inbeddingen te maken. Afgezien van deze modellen zijn er nog veel meer, zoals het Word2Vec-model van Google, het OpenAI Embedding-model, andere Sentence Transformers van HuggingFace en nog veel meer.

Q4. Waar kunnen deze inbeddingsvectoren/vectordatabases worden gebruikt?

A. Deze vectorwinkels vinden hun toepassing in bijna alles wat met generatieve AI-modellen te maken heeft. Zoals het extraheren van informatie uit documenten, het genereren van afbeeldingen van gegeven prompts, het bouwen van een aanbevelingssysteem, het samenvoegen van relevante gegevens en nog veel meer.

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.

spot_img

Laatste intelligentie

spot_img