Pgvector: Wie man PostgreSQL mühelos in eine Vektordatenbank verwandelt
Published on
Wenn Sie PostgreSQL verwenden und noch nicht von pgvector gehört haben, dann verpassen Sie eine bahnbrechende Erweiterung. Entwickelt, um Ihre PostgreSQL-Datenbank zu beschleunigen, ist pgvector das ultimative Werkzeug für die effiziente Speicherung von Vektoren und die Ähnlichkeitssuche. Es ist nicht nur ein Add-On; es handelt sich um eine umfassende Lösung, die sich nahtlos in PostgreSQL integriert und seine Möglichkeiten auf ein neues Niveau hebt.
Aber warum sollten Sie sich dafür interessieren? Weil in der heutigen datengetriebenen Welt die Fähigkeit, große Mengen von Vektoren effizient zu speichern und abzufragen, für Machine Learning, Empfehlungssysteme und viele andere Anwendungen entscheidend ist. pgvector macht dies nicht nur möglich, sondern auch mit einer Effizienz und Geschwindigkeit, die schwer zu übertreffen sind.
Warum pgvector unverzichtbar für PostgreSQL-Benutzer ist
Was ist pgvector?
pgvector ist eine PostgreSQL-Erweiterung, die sich auf die Speicherung von Vektoren spezialisiert hat und Ähnlichkeitssuchen innerhalb dieser Vektoren durchführt. Im Gegensatz zu herkömmlichen PostgreSQL-Datentypen ist pgvector für hochdimensionale Daten optimiert und daher ideal für Machine Learning-Modelle, Bilderkennung und Aufgaben der natürlichen Sprachverarbeitung.
Kernfunktionen von pgvector:
-
Effiziente Vektorspeicherung: pgvector komprimiert hochdimensionale Vektoren, ohne die Integrität der Daten zu beeinträchtigen. Dies ist besonders wichtig, da hochdimensionale Daten zu einem Speicherplatzproblem führen können.
-
Verschiedene Distanzmetriken: Egal, ob Sie mit euklidischen, kosinussimilaren oder manhattan-Distanzen arbeiten, pgvector unterstützt eine Vielzahl von Distanzmetriken und bietet Ihnen die Flexibilität, diejenige auszuwählen, die am besten zu Ihrem spezifischen Anwendungsfall passt.
-
Nahtlose Integration: Eine der besten Eigenschaften von pgvector ist die mühelose Integration mit PostgreSQL. Sie müssen nicht zwischen verschiedenen Datenbanken jonglieren; pgvector funktioniert als nativer Erweiterung, mit der Sie komplexe Abfragen direkt in PostgreSQL durchführen können.
Kommen wir zu den Zahlen. Mit pgvector können Sie etwa 1 Million OpenAI-Embeddings mit ungefähr 1800 Abfragen pro Sekunde (QPS) und einer Genauigkeitsrate von 91% ausführen. Wenn Sie eine höhere Genauigkeit anstreben, können Sie mit einer erstaunlichen Genauigkeitsrate von 98% 670 QPS erreichen. Diese Kennzahlen sind nicht nur beeindruckend, sondern auch revolutionär.
Die Leistung von pgvector beschränkt sich nicht nur auf hohe QPS-Werte und Genauigkeit. Es ist auch unglaublich skalierbar. Egal, ob Sie es auf einem 8-Kern-ARM mit 32 GB RAM oder einem 64-Kern-ARM mit 256 GB RAM ausführen, pgvector skaliert auf beeindruckende Weise und stellt sicher, dass Sie das Beste aus Ihren Hardware-Ressourcen herausholen.
Wie schnell ist pgvector wirklich? (pgvector-Benchmarks)
Untersuchung von Geschwindigkeit und Genauigkeit von pgvector
Wenn Sie Geschwindigkeit und Genauigkeit bei Vektorsuchen suchen, sind Sie bei pgvector genau richtig. Die neueste Version, pgvector 0.4.0, wurde einem rigorosen Test unterzogen, um ihre Leistung zu messen. Lassen Sie uns ins Detail gehen:
Benchmark-Methodik
- Test Runner: Ein Python-Skript wurde für das Hochladen von Daten, die Erstellung von Indizes und die Ausführung von Abfragen verwendet.
- Laufzeit: Jeder Test lief 30-40 Minuten und deckte verschiedene Workloadstufen ab, um die Leistung zu messen.
- Aufwärmen des RAM: Vor jedem Test wurden 10.000 bis 50.000 "Aufwärm"-Abfragen ausgeführt, um die RAM-Nutzung zu optimieren.
Verwendete Hardware für die Tests
- 2XL: 8-Kern-ARM, 32 GB RAM
- 4XL: 16-Kern-ARM, 64 GB RAM
- 8XL: 32-Kern-ARM, 128 GB RAM
- 12XL: 48-Kern-ARM, 192 GB RAM
- 16XL: 64-Kern-ARM, 256 GB RAM
Datensatz
Bei den Tests wurde der dbpedia-entities-openai-1M (opens in a new tab) Datensatz verwendet, der 1 Million Embeddings mit 1536 Dimensionen enthält. Dieser Datensatz wurde mit OpenAI erstellt und basiert auf Wikipedia-Artikeln.
Leistungsergebnisse
- Bei 10 Probes: pgvector erreichte eine Treffergenauigkeit von 0,91 und eine QPS (Abfragen pro Sekunde) von 380.
- Bei 40 Probes: pgvector wurde nicht nur schneller, sondern behielt auch fast die gleiche Genauigkeit wie Qdrant bei, mit einer Treffergenauigkeit von 0,98 und einer QPS von 140.
Skalierung der Datenbank
Die Leistung von pgvector skaliert vorhersehbar mit der Größe der Datenbank. Zum Beispiel erreichte eine 4XL-Instanz eine Treffergenauigkeit von 0,98 und eine QPS von 270 bei 40 Probes. Eine 8XL-Instanz erzielte eine Treffergenauigkeit von 0,98 und eine QPS von 470 und übertraf damit die Ergebnisse von Qdrant.
Benchmark-Ergebnisse von pgvector
Auf einem Server mit 64 Kernen und 256 GB RAM erreichte pgvector rund 1800 QPS bei einer Genauigkeit von 0,91. Dies gilt für Version 0.4.0 und es ist erwähnenswert, dass neuere Versionen voraussichtlich eine noch bessere Leistung zeigen werden.
Warum pgvector gegenüber kommerziellen Vektordatenbanken gewinnt
Nachdem Sie sich mit den beeindruckenden Benchmark-Ergebnissen von pgvector beschäftigt haben, fragen Sie sich vielleicht, wie es im Vergleich zu anderen kommerziellen Vektordatenbanklösungen wie Milvus abschneidet. Nun, lassen Sie es uns genauer betrachten:
Einfache Integration
- Milvus: Arbeitet als separater Service und bringt Komplexität in Ihren Technologie-Stack.
- pgvector: Integriert sich nahtlos in PostgreSQL und vereinfacht damit Ihren Technologie-Stack.
Daten-Synchronisierung
- Milvus: Bietet keine native Integration, was zu Problemen bei der Daten-Synchronisierung führen kann.
- pgvector: Bietet native Integration und eliminiert damit Synchronisierungsprobleme.
Leistungskennzahlen
- Milvus: Kann nicht mit der Leistung von pgvector mithalten.
- pgvector: Verarbeitet 1 Million OpenAI-Embeddings mit 1800 QPS und einer Genauigkeitsrate von 91%.
Kennzahl | Milvus | pgvector |
---|---|---|
Integrationskomplexität | Hoch | Niedrig |
Daten-Synchronisierung | Problematisch | Nahtlos |
Abfragegeschwindigkeit (QPS) | Niedriger | 1800 |
Genauigkeit | Niedriger | 91% |
Zusammenfassend lässt sich sagen, dass pgvector die klare Gewinnerlösung ist, wenn Sie eine vereinfachte, effiziente und hochperformante Lösung für die Speicherung und Suche von Vektoren suchen.
Tipps zur Optimierung der Leistung von pgvector
- Passen Sie Ihre Postgres-Konfiguration an: Stellen Sie sicher, dass diese mit Ihrem RAM und Ihren CPU-Kernen übereinstimmt.
- Wärmen Sie Ihre Datenbank vor: Verwenden Sie die zuvor beschriebene Warm-up-Technik.
- Wählen Sie die richtige Distanzfunktion: Wenn Ihre Vektoren normalisiert sind, verwenden Sie bitte das inner-Produkt anstelle von L2- oder Kosinus-Entfernungen.
- Passen Sie die Listenkonstante an: Durch Erhöhen dieser Konstante können Sie Ihre Abfragen beschleunigen. Bei Tests mit OpenAI-Embeddings wurde beispielsweise eine Listenkonstante von 2000 anstelle der vorgeschlagenen 1000 verwendet.
Anhand dieser detaillierten Metriken und Tipps wird deutlich, dass pgvector eine robuste Leistung für die Speicherung von Vektoren und die Ähnlichkeitssuche bietet und damit die erste Wahl für PostgreSQL-Benutzer ist.
Was Sie mit pgvector tun können?
So verwenden Sie pgvector als Open-Source-Vektor-Datenbank
Pgvector ist nicht nur eine Erweiterung; es handelt sich dabei um ein transformative Tool, das Ihre PostgreSQL-Datenbank in eine mächtige Vektordatenbank verwandelt. Dies ist besonders nützlich für diejenigen, die komplexe Operationen mit hochdimensionalen Daten durchführen möchten, ohne auf eine spezialisierte Datenbank umsteigen zu müssen. In diesem Abschnitt werden wir genauer darauf eingehen, wie Sie pgvector als Open-Source-Vektor-Datenbank einrichten und verwenden können.
Installation und Einrichtung:
- Klonen des Repositories: Beginnen Sie damit, das pgvector-GitHub-Repository auf Ihren lokalen Rechner zu klonen.
git clone https://github.com/Ihr/pgvector/repo.git
- Kompilieren und Installieren: Navigieren Sie zum Verzeichnis und kompilieren Sie die Erweiterung.
cd pgvector
make
make install
- Datenbankkonfiguration: Melden Sie sich bei Ihrer PostgreSQL-Datenbank an und erstellen Sie die pgvector-Erweiterung.
CREATE EXTENSION pgvector;
- Tabellenerstellung: Erstellen Sie eine Tabelle mit einer Vektorspalte, um Ihre hochdimensionalen Daten zu speichern.
CREATE TABLE meine_vektoren (id SERIAL PRIMARY KEY, vektor_feld VECTOR(128));
Grundlegende Operationen:
- Vektoren einfügen: Fügen Sie Daten in das Vektorfeld ein.
INSERT INTO meine_vektoren (vektor_feld) VALUES ('{1.1, 2.2, 3.3, ..., 128.128}');
- Vektor-Suche: Führen Sie eine Ähnlichkeitssuche mit dem Vektorfeld durch.
SELECT * FROM meine_vektoren ORDER BY vektor_feld <-> '{3.3, 2.2, 1.1, ..., 128.128}' LIMIT 10;
- Indizierung: Erstellen Sie einen Index, um Ihre Ähnlichkeitssuchen zu beschleunigen.
CREATE INDEX idx_vektor_feld ON meine_vektoren USING ivfflat(vektor_feld);
Erweiterte Funktionen:
- Anpassung von Parametern: Sie können die Parameter Ihres Index anpassen, um zwischen Geschwindigkeit und Genauigkeit abzuwägen.
SET pgvector.index_type = 'hnsw';
SET pgvector.ef_search = 64;
-
Batch-Operationen: Pgvector unterstützt Batch-Operationen zum Einfügen und Aktualisieren von Vektoren, was insbesondere für maschinelles Lernen nützlich sein kann.
-
Überwachung und Beobachtbarkeit: Verwenden Sie die integrierten Überwachungswerkzeuge von PostgreSQL, um die Leistung Ihrer Vektoroperationen im Auge zu behalten.
k-NN Suchfunktionen von pgvector
Was ist k-NN-Suche?
Die k-NN (k-nächsten Nachbarn)-Suche ist ein Algorithmus, der verwendet wird, um die "k" nächsten Punkte zu einem gegebenen Punkt in einem mehrdimensionalen Raum zu finden. Sie wird häufig im maschinellen Lernen für Klassifizierung und Clustering eingesetzt.
Wie pgvector k-NN ermöglicht:
- Datentyp: Pgvector führt einen neuen Datentyp namens
vector
ein, der mehrdimensionale Daten speichern kann. - Operatoren: Es stellt Operatoren wie
<->
für den euklidischen Abstand und<=>
für den Kosinusabstand zur Berechnung der Ähnlichkeit zwischen Vektoren bereit. - Indizierung: Sie können Indizes auf den Vektorspalten erstellen, um k-NN-Abfragen zu beschleunigen.
Hier ist eine SQL-Funktion, die eine k-NN-Suche mit pgvector durchführt:
CREATE OR REPLACE FUNCTION knn_search(query_vector vector, k int)
RETURNS TABLE(id INT, distance FLOAT)
LANGUAGE SQL STABLE AS $$
SELECT id, query_vector <=> vector_column AS distance
FROM your_table
ORDER BY distance ASC
LIMIT k;
$$;
Speichern von OpenAI Embeddings mit pgvector
Warum OpenAI Embeddings speichern? OpenAI Embeddings sind hochdimensionale Vektoren, die die semantische Bedeutung von Text erfassen. Sie sind nützlich für Aufgaben wie Textähnlichkeit, Clustering und Klassifizierung.
So speichern Sie OpenAI Embeddings mit pgvector
- Erstellen Sie eine Tabelle: Erstellen Sie eine PostgreSQL-Tabelle mit einer Spalte vom Typ
vector
.
CREATE TABLE dokumente (
id SERIAL PRIMARY KEY,
inhalt TEXT,
ergießung VECTOR(1536)
);
- Daten einfügen: Fügen Sie die OpenAI Embeddings in die
ergießung
-Spalte ein.
INSERT INTO dokumente(inhalt, ergießung) VALUES ('etwas Text', '{Ihr 1536-dimensionaler Vektor}');
- Abfrage: Verwenden Sie die Operatoren von pgvector, um die Embeddings abzufragen.
SELECT * FROM dokumente WHERE ergießung <=> '{Abfrage-Vektor}' < 0.5;
PGVector mit Langchain: Fortgeschrittene Textsuche
Langchain und PGVector können kombiniert werden, um ein leistungsstarkes Textsuch- und Abrufsystem zu erstellen. Nachfolgend finden Sie eine Anleitung, wie Sie PGVector mit Langchain integrieren können, um fortgeschrittene Textsuche durchzuführen.
Voraussetzungen
- Stellen Sie sicher, dass Sie alle erforderlichen Pakete installiert haben und Ihre Umgebungsvariablen gemäß dem Anfangsteil Ihrer Notizbuchdatei festgelegt haben.
Schritt 1. Initialisieren Sie die Langchain-Komponenten
Zunächst initialisieren Sie die Langchain-Komponenten wie OpenAIEmbeddings
, TextLoader
und CharacterTextSplitter
.
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
loader = TextLoader("Ihre_Textdatei.txt")
dokumente = loader.load()
text_splitter = CharacterTextSplitter(chunk_size = 1000, chunk_overlap = 0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
Schritt 2. Initialisieren von PGVector Initialisieren Sie als nächstes PGVector mit dem Verbindungszeichenfolgen zu Ihrer Postgres-Datenbank.
from langchain.vectorstores.pgvector import PGVector
CONNECTION_STRING = "hier_ihre_verbindungszeichenfolge"
COLLECTION_NAME = "hier_ihr_sammlungsname"
db = PGVector.from_documents(
embedding=embeddings,
documents=docs,
collection_name=COLLECTION_NAME,
connection_string=CONNECTION_STRING,
)
Schritt 3. Ähnlichkeitssuche durchführen
Sie können jetzt eine Ähnlichkeitssuche mit der Methode similarity_search_with_score
von PGVector durchführen.
query = "Geben Sie Ihre Suchanfrage hier ein"
docs_with_score = db.similarity_search_with_score(query)
for doc, score in docs_with_score:
print("Score: ", score)
print(doc.page_content)
Schritt 4. Maximal Marginal Relevance-Suche Für eine fortgeschrittene Suche können Sie die Maximal Marginal Relevance (MMR) verwenden, um sowohl die Ähnlichkeit zur Suchanfrage als auch die Vielfalt unter den ausgewählten Dokumenten zu optimieren.
docs_with_score = db.max_marginal_relevance_search_with_score(query)
for doc, score in docs_with_score:
print("Score: ", score)
print(doc.page_content)
Schritt 5. Arbeiten mit vorhandenem VectorStore Wenn Sie bereits einen vorhandenen Vektorstore haben, können Sie ihn direkt initialisieren und Dokumente hinzufügen.
store = PGVector(
collection_name=COLLECTION_NAME,
connection_string=CONNECTION_STRING,
embedding_function=embeddings,
)
store.add_documents([Document(page_content="neuer_inhalt_hier")])
Schritt 6. Überschreiben eines vorhandenen VectorStores Wenn Sie eine vorhandene Sammlung aktualisieren müssen, können Sie sie überschreiben.
db = PGVector.from_documents(
documents=docs,
embedding=embeddings,
collection_name=COLLECTION_NAME,
connection_string=CONNECTION_STRING,
pre_delete_collection=True,
)
Schritt 7. Verwenden von VectorStore als Retriever Schließlich können Sie den Vektorstore als Retriever für fortgeschrittene Operationen verwenden.
retriever = store.as_retriever()
print(retriever)
AI-gestützte Suche erstellen mit Amazon SageMaker, Amazon RDS für PostgreSQL und pgvector
In diesem Abschnitt zeigen wir, wie Sie mithilfe von Amazon SageMaker und Amazon RDS für PostgreSQL mit der pgvector-Erweiterung eine Lösung für die Ähnlichkeitssuche in einem Produktkatalog erstellen können. Wir verwenden ein vortrainiertes Hugging Face-Modell, um Dokumenteneinbettungen zu generieren und diese in einer RDS für PostgreSQL-Datenbank zu speichern. Anschließend nutzen wir die Ähnlichkeitssuchfunktionen von pgvector, um Artikel im Produktkatalog zu finden, die am besten mit der Suchanfrage eines Kunden übereinstimmen.
Schritte zur Implementierung der Lösung:
-
Einrichten einer SageMaker-Notebook-Instanz: Erstellen Sie eine SageMaker-Notebook-Instanz, um den Python-Code in einem Jupyter-Notebook auszuführen.
-
Datenanpassung: Übersetzen Sie Artikelbeschreibungen aus dem Deutschen ins Englische mithilfe von Amazon Translate.
-
Modellhosting: Veröffentlichen Sie ein vortrainiertes Hugging Face-Modell in SageMaker, um 384-dimensionale Vektoreinbettungen für den Produktkatalog zu generieren.
-
Datenspeicherung: Verbinden Sie sich mit RDS für PostgreSQL und erstellen Sie eine Tabelle zur Speicherung des Rohtextes und der Texteinbettungen.
-
Echtzeit-Inferenz: Verwenden Sie SageMaker, um den Abfragetext in Einbettungen zu codieren.
-
Ähnlichkeitssuche: Führen Sie eine Ähnlichkeitssuche mithilfe von pgvector in der RDS für PostgreSQL-Datenbank durch.
Voraussetzungen:
- Ein AWS-Konto mit entsprechenden IAM-Berechtigungen.
- Vertrautheit mit AWS-Diensten wie SageMaker, RDS und CloudFormation.
Bereitstellung: Verwenden Sie eine AWS CloudFormation-Stack zur Bereitstellung der Lösung. Dadurch werden alle erforderlichen Ressourcen, einschließlich Netzwerkkomponenten, einer SageMaker-Notebook-Instanz und einer RDS für PostgreSQL-Instanz, erstellt.
Hier sind einige wesentliche Codeausschnitte zur Implementierung der Lösung:
- Datenübernahme: Verwenden Sie Amazon Translate, um Artikelbeschreibungen aus dem Deutschen ins Englische zu übersetzen.
import boto3
translate = boto3.client(service_name='translate', use_ssl=True)
result = translate.translate_text(Text = str(j), SourceLanguageCode = "de", TargetLanguageCode = "en")
- Modellhosting: Veröffentlichen Sie ein vortrainiertes Hugging Face-Modell in SageMaker.
from sagemaker.huggingface.model import HuggingFaceModel
predictor = HuggingFaceModel(env = hub, role = role).deploy(initial_instance_count = 1, instance_type = "ml.m5.xlarge")
- Datenspeicherung: Erstellen Sie eine Tabelle in RDS für PostgreSQL zur Speicherung von Einbettungen.
CREATE TABLE IF NOT EXISTS products(
id bigserial primary key,
description text,
descriptions_embeddings vector(384)
);
- Ähnlichkeitssuche: Führen Sie eine Ähnlichkeitssuche mithilfe von pgvector durch.
SELECT id, url, description, descriptions_embeddings
FROM products
ORDER BY descriptions_embeddings <-> ARRAY[...];
Verwendung von PgVector in Python
Sicherlich können Sie die Funktionalität von pgvector
in Python erweitern, indem Sie benutzerdefinierte Methoden hinzufügen oder es mit anderen Python-Bibliotheken integrieren. Nachfolgend finden Sie ein Beispiel, wie Sie pgvector
erweitern könnten, um eine Methode zur Berechnung des euklidischen Abstands zwischen zwei Vektoren in Django einzuschließen.
Erweiterung der Django-Funktionalität
Erstellen wir zuerst einen benutzerdefinierten Manager für das Item
-Modell, der eine Methode zur Berechnung des euklidischen Abstands enthält.
from django.db import models
from pgvector.django import VectorField, L2Distance
import math
class ItemManager(models.Manager):
def euclidean_distance(self, vector):
# Verwenden Sie die L2Distance-Funktion von pgvector, um den quadrierten euklidischen Abstand zu erhalten
queryset = self.annotate(distance_squared = L2Distance('embedding', vector))
# Nehmen Sie die Quadratwurzel, um den tatsächlichen euklidischen Abstand zu erhalten
for item in queryset:
item.distance = math.sqrt(item.distance_squared)
return queryset
class Item(models.Model):
embedding = VectorField(dimensions = 3)
objects = ItemManager()
Jetzt können Sie diesen benutzerdefinierten Manager in Ihren Django-Ansichten oder der Shell verwenden:
# Items nach ihrer euklidischen Distanz zum Vektor [3, 1, 2] sortiert abrufen
items = Item.objects.euclidean_distance([3, 1, 2]).order_by('distance')
# Die Items und ihre Distanzen ausgeben
for item in items:
print(f"Item-ID: {item.id}, Distanz: {item.distance}")
Erweiterung der SQLAlchemy-Funktionalität
Ähnlich können Sie die SQLAlchemy-Funktionalität erweitern, indem Sie eine benutzerdefinierte Abfragenklasse hinzufügen.
from sqlalchemy import Column, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, BaseQuery
from sqlalchemy.sql import func
from pgvector.sqlalchemy import Vector
Base = declarative_base()
class VectorQuery(BaseQuery):
def euclidean_distance(self, vector):
return self.add_columns(
func.sqrt(
func.pow(Vector.l2_distance(self._entities[0].field, vector), 2)
).label('distance')
)
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True, autoincrement=True)
embedding = Column(Vector(3))
@classmethod
def query(cls):
return VectorQuery(cls)
# Datenbank-Setup
engine = create_engine('postgresql://localhost/mydatabase')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Items und ihre euklidische Distanz zum Vektor [3, 1, 2] abrufen
items_with_distance = session.query(Item).euclidean_distance([3, 1, 2]).all()
# Die Items und ihre Distanzen ausgeben
for item, distance in items_with_distance:
print(f"Item-ID: {item.id}, Distanz: {distance}")
In diesem Beispiel habe ich ein id-Feld zur Item-Klasse als Primärschlüssel hinzugefügt. Die VectorQuery-Klasse wird verwendet, um die Abfragefähigkeiten zu erweitern und eine Methode zur Berechnung der euklidischen Distanz hinzuzufügen. Schließlich wird die query-Klassenmethode verwendet, um diese benutzerdefinierte Abfragenklasse für das Item-Modell festzulegen.
Sie können dies dann in Ihrem SQLAlchemy-Code verwenden:
# Items und ihre euklidische Distanz zum Vektor [3, 1, 2] abrufen
items = session.query(Item).euclidean_distance([3, 1, 2]).all()
# Die Items und ihre Distanzen ausgeben
for item, distance in items:
print(f"Item-ID: {item.id}, Distanz: {distance}")
Fazit
Pgvector ist eine echte Bereicherung, wenn Sie PostgreSQL-Datenbanken verwenden. Es ist nicht nur ein Add-On, sondern eher ein Turbolader für Ihre Datenbank. Es ermöglicht Ihnen, große Datenmengen schnell und genau zu speichern und durchsuchen. Dies ist besonders nützlich für Anwendungen wie maschinelles Lernen, wo Sie schnell durch Unmengen von Daten filtern müssen.
Darüber hinaus passt sich pgvector nahtlos in PostgreSQL ein, sodass Sie nicht mehrere Datenbanken verwalten müssen. Es ist auch flexibel und ermöglicht es Ihnen, die "Distanz" zwischen Datenpunkten frei zu wählen. Sie können seine Funktionen sogar erweitern, wenn Sie Python-Frameworks wie Django verwenden. Kurz gesagt, wenn Sie an Daten interessiert sind und PostgreSQL verwenden, sollten Sie pgvector nicht verpassen.
FAQ
Wofür wird Pgvector verwendet?
Pgvector ist eine Erweiterung für PostgreSQL-Datenbanken, die sich auf das Speichern und Durchsuchen großer Vektormengen spezialisiert hat. Sie ist besonders nützlich für Anwendungen, die schnelle und genaue Ähnlichkeitssuchen erfordern, wie zum Beispiel maschinelles Lernen, Empfehlungssysteme und natürliche Sprachverarbeitungsaufgaben.
Welche Vorteile bietet Pgvector?
Pgvector bietet mehrere Vorteile:
- Schnelligkeit: Es ermöglicht schnelle Abfragen, auch bei hochdimensionalen Daten.
- Effizienz: Es komprimiert Daten, ohne deren Integrität zu verlieren, und spart Speicherplatz.
- Flexibilität: Es unterstützt verschiedene Distanzmetriken wie euklidische, kosinusähnliche und manhattan-Distanz, sodass Sie die für Ihre Anforderungen beste auswählen können.
- Nahtlose Integration: Es integriert sich direkt in PostgreSQL, sodass Sie nicht mehrere Datenbanken verwalten müssen.
- Skalierbarkeit: Es funktioniert auf verschiedenen Hardwarekonfigurationen und gewährleistet eine optimale Ressourcennutzung.
Ist PostgreSQL eine Vektordatenbank?
Nein, PostgreSQL ist von Natur aus keine Vektordatenbank. Mit der Pgvector-Erweiterung können Sie PostgreSQL jedoch effektiv in eine leistungsstarke Vektordatenbank verwandeln, die in der Lage ist, hochdimensionale Daten zu speichern und Ähnlichkeitssuchen durchzuführen.
Wie verwendet man Pgvector in PostgreSQL?
Um Pgvector in PostgreSQL zu verwenden, müssen Sie folgende Schritte ausführen:
- Installieren Sie die Pgvector-Erweiterung, indem Sie
CREATE EXTENSION pgvector;
in Ihrer PostgreSQL-Datenbank ausführen. - Erstellen Sie eine Tabelle mit einer Vektor-Spalte, zum Beispiel:
CREATE TABLE my_vectors (id SERIAL PRIMARY KEY, vector_field VECTOR(128));
. - Fügen Sie Vektoren in die Tabelle ein:
INSERT INTO my_vectors (vector_field) VALUES ('{1.1, 2.2, 3.3, ..., 128.128}');
. - Führen Sie Ähnlichkeitssuchen mithilfe von SQL-Abfragen durch, z.B.:
SELECT * FROM my_vectors ORDER BY vector_field <-> '{3.3, 2.2, 1.1, ..., 128.128}' LIMIT 10;
.