Embedding via ChromaDB Vektordatenbank

Dieser Blogbeitrag behandelt das Konzept von Embeddings und Vektordatenbanken. Dabei wird zunächst erklärt, was Embeddings sind und wie sie im Bereich des Natural Language Processing (NLP) genutzt werden. Anschließend folgt eine Erklärung der Vektoren in einem Raum mit drei Koordinaten und deren Erweiterung auf mehrdimensionale Vektoren. Schließlich wird ChromaDB vorgestellt, eine spezialisierte Vektordatenbank.

Was ist ein Embedding?

Ein Embedding ist eine Technik im Bereich des maschinellen Lernens und der Datenverarbeitung, die darauf abzielt, Objekte wie Wörter, Sätze oder Dokumente in einen kontinuierlichen Vektorraum zu transformieren. In diesem Vektorraum sind ähnliche Objekte durch ähnliche Vektoren repräsentiert, was bedeutet, dass sie nahe beieinander liegen. Embeddings werden häufig verwendet, um die semantische Bedeutung von Texten zu erfassen und zu analysieren.

Vektoren und der numerische Raum

Vektoren in drei Dimensionen

Ein Vektor ist eine Liste von Zahlen, die als Koordinaten in einem Raum betrachtet werden können. Im Alltag sind meistens drei Dimensionen bekannt: x, y und z. Diese Dimensionen können leicht visuell dargestellt werden:

  • x: Horizontale Achse
  • y: Vertikale Achse
  • z: Tiefe

Ein Punkt in diesem dreidimensionalen Raum kann durch einen Vektor wie (x, y, z) beschrieben werden. Zum Beispiel könnte ein Punkt durch den Vektor (1, 2, 3) repräsentiert werden, was seine Position in diesem Raum angibt. Im dreidimensionalen Raum wäre das Wort „Lebewesen“ näher am Wort „Mensch“ positioniert als am Wort „Handball“.

Mehrdimensionale Vektoren

In der Mathematik und im maschinellen Lernen wird oft mit hochdimensionalen Räumen gearbeitet, die mehr als drei Dimensionen haben. Jede zusätzliche Dimension repräsentiert eine weitere unabhängige Eigenschaft oder ein Merkmal der Daten. Zum Beispiel:

  • 4 Dimensionen: (x, y, z, w)
  • 100 Dimensionen: (x1, x2, x3, …, x100)

Obwohl diese zusätzlichen Dimensionen nicht visuell vorstellbar sind, helfen sie dabei, komplexe Daten und deren Beziehungen genauer zu erfassen. Jede Dimension fügt eine neue Art von Information hinzu, die zur Gesamtdarstellung des Punktes (oder Wortes) beiträgt, z.B. Temperatur, Gewicht, Farbe etc. Bei mehrdimensionalen Vektoren müssen daher die x-, y- und z-Koordinaten nicht mehr für die räumliche Beschreibung verwendet werden. Diese drücken die Beziehung der einzelnen Wörter zueinander aus.

Diese Formulierung verdeutlicht, dass in hochdimensionalen Vektorräumen die Dimensionen verschiedene Merkmale oder Eigenschaften darstellen und nicht auf räumliche Beschreibungen beschränkt sind. Die Koordinaten zeigen vielmehr, wie die Wörter semantisch zueinander in Beziehung stehen.

Textkorpusanalyse und Embeddings

Um die Effizienz und Genauigkeit der Vektordatenbank von ChromaDB zu maximieren, ist eine sorgfältige Analyse des Textkorpus unerlässlich. Diese Analyse dient dazu, die Texte vorzubereiten und relevante Merkmale zu extrahieren, die anschließend in den Vektorraum eingebettet werden. Durch diesen Prozess können semantische Ähnlichkeiten zwischen den Texten präziser erfasst und genutzt werden, was die Leistungsfähigkeit von ChromaDB in der Praxis erheblich steigert. Dieser Prozess umfasst mehrere Schritte:

  1. Korpusvorbereitung: Sammlung und Bereinigung von Texten.
  2. Tokenisierung: Zerlegung des Textes in Wörter oder Sätze.
  3. Normalisierung: Vereinheitlichung der Wörter (z.B. Kleinschreibung, Stemming).
  4. Stoppwörter entfernen: Entfernen häufig vorkommender, aber wenig informativer Wörter.
  5. Feature-Extraktion: Methoden wie Bag of Words oder TF-IDF zur Gewichtung der Wörter.
  6. Modellierung und Analyse: Einsatz von Word Embeddings oder Themenmodellierung zur Erfassung semantischer Bedeutungen und Themen.

ChromaDB

ChromaDB ist eine spezialisierte Vektordatenbank, die darauf ausgelegt ist, Vektoren zu speichern, zu verwalten und abzufragen. Vektordatenbanken sind besonders nützlich für Anwendungen im Bereich NLP, wo die semantische Ähnlichkeit zwischen Texten erfasst werden muss. ChromaDB ermöglicht es, Dokumente hinzuzufügen, die in Vektoren umgewandelt werden, und ermöglicht es, Abfragen basierend auf diesen Vektoren durchzuführen.

ChromaDB Beispiel

Im Folgenden findet sich ein Beispiel, das zeigt, wie ChromaDB verwendet werden kann, um Dokumente hinzuzufügen und eine Abfrage durchzuführen. Hinweis: Innerhalb von Visual Studio Code gab es zahlreiche Bugs bei der Ausführung der Beispiele. PyCharm hat hingegen ohne Probleme funktioniert.

# Importiert das chromadb-Modul, das für die Arbeit mit eingebetteten Vektoren und Datenbankoperationen verwendet wird.
import chromadb

# Erstellt eine neue Instanz eines ChromaDB-Clients, um mit der Datenbank zu interagieren.
# Der Client verwaltet die Verbindung zur Datenbank und bietet Methoden zur Manipulation von Sammlungen und Dokumenten.
chroma_client = chromadb.Client()

# Erstellt eine neue Sammlung in der Datenbank mit dem Namen "my_collection".
# Eine Sammlung kann als eine Tabelle in einer relationalen Datenbank betrachtet werden, die Dokumente enthält.
collection = chroma_client.create_collection(name="my_collection")

# Fügt zwei Dokumente zur Sammlung hinzu, mit den zugehörigen IDs "id1" und "id2".
# Jedes Dokument wird als Text gespeichert und mit einer eindeutigen ID versehen.
collection.add(
documents=[
"This is a document about pineapple",
"This is a document about oranges"
],
ids=["id1", "id2"]
)

# Führt eine Abfrage in der Sammlung durch, indem der Text "This is a query document about hawaii" eingebettet wird.
# Die Abfrage sucht nach den 2 ähnlichsten Dokumenten in der Sammlung.
results = collection.query(
query_texts=["This is a query document about hawaii"], # Chroma wird diesen Text einbetten
n_results=2 # Anzahl der zurückzugebenden Ergebnisse
)

# Gibt die Ergebnisse der Abfrage aus. Dies beinhaltet IDs, Distanzen, Dokumenttexte und Metadaten der ähnlichsten Dokumente.
print(results)
chromadb_test.py
{
'ids': [['id1', 'id2']],
'distances': [[1.0404009819030762, 1.2430799007415771]],
'metadatas': [[None, None]],
'embeddings': None,
'documents': [
['This is a document about pineapple', 'This is a document about oranges']
],
'uris': None,
'data': None,
'included': ['metadatas', 'documents', 'distances']
}
Ausgabe des Codes
FeldBeschreibungWert
idsListe der IDs der zurückgegebenen Dokumente[[‚id1‘, ‚id2‘]]
distancesListe der Distanzen zwischen der Abfrage und den zurückgegebenen Dokumenten. Je kleiner der Wert, desto ähnlicher.[[1.0404009819030762, 1.2430799007415771]]
metadatasListe der Metadaten der zurückgegebenen Dokumente[[None, None]]
embeddingsEinbettungen der Dokumente. In diesem Fall nicht enthaltenNone
documentsListe der tatsächlichen Dokumenttexte, die als Ergebnis der Abfrage zurückgegeben wurden[[‚This is a document about pineapple‘, ‚This is a document about oranges‘]]
urisURIs der zurückgegebenen Dokumente. In diesem Fall nicht enthaltenNone
dataZusätzliche Daten, falls vorhanden. In diesem Fall nicht enthaltenNone
includedListe der Felder, die in den Ergebnissen enthalten sind[‚metadatas‘, ‚documents‘, ‚distances‘]

Distanzmessung zwecks Ermittlung der Ähnlichkeit zwischen Vektoren

Die Distanzwerte in der Ausgabe repräsentieren die Ähnlichkeit zwischen der Abfrage und den zurückgegebenen Dokumenten. ChromaDB verwendet Einbettungsmodelle, um Dokumente in einen mehrdimensionalen Vektorraum zu projizieren, wo die Ähnlichkeit durch die Distanzen zwischen diesen Vektoren gemessen wird.

Die Distanz zwischen Vektoren im mehrdimensionalen Raum wird üblicherweise durch verschiedene metrische Methoden berechnet. Eine der häufigsten Methoden ist die Berechnung der euklidischen Distanz. Andere Methoden umfassen die kosinussimilarität, Manhattan-Distanz und weitere.

Persistierung der Einträge

import chromadb

# Erstellt eine persistente ChromaDB-Client-Instanz, die Daten im angegebenen Pfad speichert.
client = chromadb.PersistentClient(path=r"C:\sources\PycharmProjects\pythonProject\db")

# Versucht, eine vorhandene Sammlung mit dem Namen "books_collection" zu laden. Falls sie nicht existiert, wird sie erstellt.
try:
collection = client.get_collection(name="books_collection")
except ValueError as e:
if "Collection books_collection does not exist." in str(e):
collection = client.create_collection(name="books_collection")
else:
raise

# Beispielbücher
books = [
"This is the content of book one",
"This is the content of book two"
]

# Feste IDs für die Beispielbücher, um eine konsistente Überprüfung und Aktualisierung zu ermöglichen
book_ids = ["book1-id", "book2-id"]

# Funktion zur Überprüfung, ob eine ID bereits existiert
def document_exists(collection, id):
try:
result = collection.get(ids=[id])
return len(result['ids'][0]) > 0
except (IndexError, KeyError):
return False

# Liste für neue Dokumente und IDs
new_documents = []
new_ids = []

# Prüft, ob die Bücher bereits existieren und sortiert sie entsprechend
for book, book_id in zip(books, book_ids):
if document_exists(collection, book_id):
print(f"Der Eintrag mit der ID {book_id} existiert bereits.")
else:
new_documents.append(book)
new_ids.append(book_id)

# Fügt neue Bücher hinzu
if new_documents:
collection.add(
documents=new_documents,
ids=new_ids
)

# Führt eine Abfrage in der Sammlung durch, indem der Text "This is a query document about hawaii" eingebettet wird.
results = collection.query(
query_texts=["This is a query document about hawaii"], # Chroma wird dies für Sie einbetten
n_results=2 # Anzahl der zurückzugebenden Ergebnisse
)

# Gibt die Ergebnisse der Abfrage aus. Dies beinhaltet IDs, Distanzen, Dokumenttexte und Metadaten der ähnlichsten Dokumente.
print(results)
chromadb_test.py

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.