Kurs
pgvector Tutorial: Integration der Vektorsuche in PostgreSQL
Die Vektorsuche ist in den letzten Jahren immer beliebter geworden, dank der Fortschritte in der generativen KI und im Large Language Model Ökosystem.
Die Vektorsuche ist eine Methode der Informationsbeschaffung, bei der Dokumente und Abfragen als Vektoren und nicht als reiner Text dargestellt werden. Diese numerische Darstellung wird mit Hilfe eines großen, trainierten neuronalen Netzwerks erreicht, das unstrukturierte Daten wie Text, Bilder und Videos in Vektoren umwandeln kann.
Herkömmliche relationale Datenbanken sind nicht für die Verarbeitung großer Mengen von Vektordaten optimiert. Daher sind in den letzten Jahren viele Open-Source- und proprietäre exklusive Vektordatenbanken entstanden. Allerdings ist es vielleicht nicht für alle Unternehmen ideal, eine eigene Datenbank nur für Vektoren zu haben, die von der Hauptdatenbank getrennt ist.
Hier kommt pgvector ins Spiel, eine leistungsstarke Erweiterung für PostgreSQL, die eine der beliebtesten relationalen Datenbanken um die Möglichkeit der vektoriellen Ähnlichkeitssuche erweitert.
In diesem Tutorial werden wir die Funktionen von pgvector erkunden und zeigen, wie es dir bei deiner Arbeit helfen kann.
Was ist pgvector?
pgvector ist eine Open-Source-Erweiterung für PostgreSQL, die Unterstützung für Vektoroperationen und Ähnlichkeitssuchen bietet. Damit kannst du Vektordaten direkt in deiner PostgreSQL-Datenbank speichern, indizieren und abfragen.
Diese Integration bringt die Leistungsfähigkeit von Vektoroperationen in deine bestehende PostgreSQL-Infrastruktur und ist damit eine ausgezeichnete Wahl für Anwendungen, die Einbettungen, Empfehlungssysteme und Ähnlichkeitssuchen beinhalten.
Zu den Funktionen von pgvector gehören:
- Effiziente Speicherung von dichten Vektordaten
- Schnelle Ähnlichkeitssuche mit verschiedenen Distanzmetriken
- Integration mit dem bestehenden Query Planner und den Indexierungsmechanismen von PostgreSQL
- Unterstützung für die exakte und ungefähre Suche nach dem nächsten Nachbarn
Die Bedeutung von Vektordatenbanken
Vektordatenbanken sind spezielle Datenbanken, die für die Speicherung und Abfrage mehrdimensionaler Vektordaten entwickelt wurden. Diese Fähigkeit ist für moderne Anwendungen des maschinellen Lernens von Bedeutung, z. B. für Empfehlungssysteme, Bildabfragen und die Verarbeitung natürlicher Sprache.
Vektoren brauchen eine neue Art von Datenbank-Bilderquelle.
Herkömmliche relationale Datenbanken haben Schwierigkeiten mit hochdimensionalen Daten und der effizienten Durchführung von Ähnlichkeitssuchen. Vektordatenbanken sind jedoch speziell für diese Aufgaben optimiert und ermöglichen ein schnelles und präzises Abrufen von Daten auf der Grundlage von Vektornähe oder Ähnlichkeit.
Dieser Ansatz ermöglicht Suchen, die auf semantischer oder kontextbezogener Relevanz beruhen, und liefert so aussagekräftigere Ergebnisse als die exakte Suche in herkömmlichen Datenbanken.
Eine Vektordatenbank kann zum Beispiel:
- Suche anhand von Melodie und Rhythmus nach Liedern, die zu einer bestimmten Melodie passen.
- Entdecke Artikel, die thematisch und perspektivisch mit einem anderen Artikel übereinstimmen.
- Finde Gadgets, die die Eigenschaften und Bewertungen eines bestimmten Geräts widerspiegeln.
Wie können also unstrukturierte Daten wie Text oder Bilder in Zahlen umgewandelt werden? Die Antwort lautet: Einbettungen.
Die Einbettung ist ein Prozess, der unstrukturierte Daten in numerische Vektoren fester Größe umwandelt und die den Daten innewohnende Semantik und Beziehungen erfasst. Dies wird durch große neuronale Netze erreicht, die lernen, die Daten in einem kontinuierlichen Vektorraum darzustellen, in dem ähnliche Elemente näher beieinander liegen.
Wie funktioniert eine Vektordatenbank? Bildquelle.
Schritt-für-Schritt pgvector Tutorial
In diesem Tutorial werden wir pgvector einrichten, seine grundlegenden Funktionen nutzen und eine einfache Anwendung erstellen, indem wir es mit OpenAI integrieren.
Wir beschäftigen uns mit der Installation, den grundlegenden Operationen, der Indizierung und der Integration mit Python und LangChain.
1. Voraussetzungen
Um diesem Tutorial zu folgen, solltest du Grundkenntnisse in SQL und PostgreSQL haben und mit der Programmierung in Python vertraut sein.
Bevor wir beginnen, stelle sicher, dass du die folgenden Dinge hast:
- PostgreSQL 11 oder höher auf deinem System installiert
- Python 3.7 oder höher (für den Integrationsteil)
- Ein OpenAI API-Schlüssel (für die semantische Suchanwendung)
2. So installierst du pgvector
1. Stelle zunächst sicher, dass du die PostgreSQL-Entwicklungsdateien installiert hast. Unter Ubuntu oder Debian kannst du sie mit installieren:
sudo apt-get install postgresql-server-dev-all
Wenn du ein Windows-Benutzer bist, kannst du den PostgreSQL-Installer von der offiziellen Website herunterladen.
2. Klone das pgvector GitHub Repository:
git clone https://github.com/pgvector/pgvector.git
3. Erstelle und installiere die Erweiterung pgvector
:
cd pgvector
make
sudo make install
Wenn du ein Windows-Benutzer bist, stelle sicher, dass du die C++-Unterstützung in Visual Studio Code installiert hast. In der offiziellen Installationsdokumentation findest du eine Schritt-für-Schritt-Anleitung.
4. Verbinde dich mit deiner PostgreSQL-Datenbank:
Du hast mehrere Möglichkeiten, dich mit der PostgreSQL-Datenbank zu verbinden und mit ihr zu interagieren: pgAdmin ist eine der am häufigsten verwendeten Schnittstellen. Alternativ kannst du auch pSQL (PostgreSQL Command Line Interface) oder sogar eine VS Code-Erweiterung für PostgreSQL verwenden.
5. Nachdem du dich mit deiner PostgreSQL-Datenbank verbunden hast, erstellst du die Erweiterung:
CREATE EXTENSION vector;
pgAdmin Schnittstelle
3. Grundlegende Verwendung von pgvector
Jetzt, wo wir pgvector installiert haben, wollen wir seine grundlegende Verwendung erkunden.
1. Um unsere erste Vektordatenbank in PostgreSQL mit der pgvector-Erweiterung einzurichten, legen wir eine Tabelle an, in der wir unsere Vektordaten speichern:
CREATE TABLE items (
id SERIAL PRIMARY KEY,
embedding vector(3)
);
Dadurch wird eine Tabelle namens items
mit einer Spalte id
und einer Spalte embedding
vom Typ vector(3)
erstellt, in der 3-dimensionale Vektoren gespeichert werden.
2. Fügen wir nun einige Daten in unsere Tabelle ein:
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[1,1,1]');
3. Jetzt können wir Vektoroperationen durchführen. Zum Beispiel, um den nächsten Nachbarn des Vektors [2,3,4]
zu finden:
SELECT * FROM items ORDER BY embedding <-> '[2,3,4]' LIMIT 1;
Diese Abfrage verwendet den <->
Operator, der den euklidischen Abstand zwischen Vektoren berechnet.
4. Wir können auch andere Abstandsmetriken verwenden, z. B. den Kosinusabstand:
SELECT * FROM items ORDER BY embedding <=> '[2,3,4]' LIMIT 1;
Der <=>
Operator berechnet den Kosinusabstand zwischen Vektoren.
4. Indizierung von Vektordaten mit pgvector
Die Indizierung in Vektordatenbanken, einschließlich pgvector, ist notwendig, um die Suchleistung zu verbessern, insbesondere wenn dein Datensatz wächst.
Die Bedeutung der Indexierung kann gar nicht hoch genug eingeschätzt werden, denn sie bietet mehrere Vorteile:
- Erstens verbessert es die Geschwindigkeit erheblich. Ohne einen Index würde jede Ähnlichkeitssuche einen vollständigen Scan der Tabelle erfordern, bei dem der Abfragevektor mit jedem Vektor in der Datenbank verglichen wird. Dieser Prozess wird immer zeitaufwändiger, je mehr Daten du hast. Indizes schaffen eine Struktur, die eine viel schnellere Suche ermöglicht.
- Zweitens verbessert die Indizierung die Skalierbarkeit und ermöglicht es deiner Datenbank, größere Datenmengen effizient zu verwalten. Wenn du immer mehr Vektoren hinzufügst, bleibt die Leistung der richtig indizierten Suche erhalten.
- Schließlich trägt die Indizierung zur Ressourceneffizienz bei, indem sie die CPU- und I/O-Belastung bei der Suche reduziert. Das ist besonders wichtig für Systeme, die stark ausgelastet sind oder mit begrenzten Ressourcen arbeiten, denn so ist ein reibungsloser Betrieb auch unter anspruchsvollen Bedingungen gewährleistet.
Es gibt zwei Arten von Indizes für pgvector: ivfflat
und hnsw
. Sie dienen beide unterschiedlichen Zwecken:
- IVFFlat (Inverted File Flat) Index:
- Geeignet für die exakte Suche nach dem nächsten Nachbarn
- Teilt den Vektorraum in Cluster auf und beschleunigt die Suche, indem er zunächst die relevanten Cluster identifiziert
- Gute Balance zwischen Suchgeschwindigkeit und Genauigkeit
- HNSW (Hierarchical Navigable Small World) Index:
- Entwickelt für die ungefähre Suche nach den nächsten Nachbarn
- Erzeugt eine Graphenstruktur für eine schnelle Navigation zwischen Vektoren
- Extrem schnell, kann aber gelegentlich den absolut nächsten Nachbarn verpassen
Wann ist welcher Index zu verwenden?
- Verwende IVFFlat, wenn du genaue Ergebnisse brauchst und eine etwas langsamere Suche tolerieren kannst
- Nutze HNSW, wenn du eine schnelle Suche brauchst und leichte Ungenauigkeiten in Kauf nehmen kannst
1. Lass uns einen ivfflat
Index erstellen:
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
Dabei wird ein Index mit dem IVFFlat-Algorithmus erstellt, der für die exakte Suche nach den nächsten Nachbarn geeignet ist.
2. Für die ungefähre Suche nach dem nächsten Nachbarn können wir den Index hnsw
verwenden:
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);
Nachdem wir einen Index erstellt haben, werden unsere Abfragen ihn bei Bedarf automatisch verwenden.
5. Integration von pgvector mit anderen Tools
Pgvector unterstützt die Integration mit einigen Frameworks, was die Interaktion mit unserer Vektordatenbank vereinfacht. Schauen wir uns zwei hilfreiche davon an: Python und LangChain.
Verwendung von pgvector mit Python
pgvector lässt sich mit der Bibliothek psycopg2
leicht in Python integrieren. Richten wir eine Python-Umgebung ein und führen einige grundlegende Operationen durch.
1. Installiere zunächst die erforderlichen Bibliotheken:
!pip install psycopg2-binary numpy
2. Nun wollen wir ein Python-Skript erstellen, das mit unserer Vektordatenbank interagiert:
import psycopg2
import numpy as np
# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()
# Insert a vector
embedding = np.array([1.5, 2.5, 3.5])
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding.tolist(),))
# Perform a similarity search
query_vector = np.array([2, 3, 4])
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector.tolist(),))
result = cur.fetchone()
print(f"Nearest neighbor: {result}")
conn.commit()
cur.close()
conn.close()
Dieses Skript zeigt, wie man mit Python einen Vektor einfügt und eine Ähnlichkeitssuche durchführt.
Verwendung von pgvector mit LangChain
pgvector kann auch mit LangChain integriert werden, einem beliebten Framework für die Entwicklung von Anwendungen mit großen Sprachmodellen.
Hier ist ein einfaches Beispiel, wie du pgvector als Vektorspeicher in LangChain verwenden kannst:
from langchain_postgres.vectorstores import PGVector
from langchain.embeddings.openai import OpenAIEmbeddings
# Set up the connection string and embedding function
connection_string = "postgresql://user:pass@localhost:5432/db_name"
embedding_function = OpenAIEmbeddings()
# Create a PGVector instance
vector_store = PGVector.from_documents(
documents,
embedding_function,
connection_string=connection_string
)
# Perform a similarity search
query = "Your query here"
results = vector_store.similarity_search(query)
In diesem Beispiel wird davon ausgegangen, dass du die OpenAI-Einbettungen eingerichtet hast und eine Liste von Dokumenten hast, die du einbetten möchtest.
6. Erstellen einer Beispielanwendung mit pgvector und OpenAI
Lass uns jetzt eine einfache semantische Suchmaschine mit pgvector und OpenAI Embeddings bauen!
Diese Anwendung ermöglicht es den Nutzern, eine Sammlung von Textdokumenten mit natürlichsprachlichen Abfragen zu durchsuchen.
import openai
import psycopg2
import numpy as np
# Set up OpenAI API (replace with your actual API key)
openai.api_key = "your_openai_api_key"
# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()
# Create a table for our documents
cur.execute("""
CREATE TABLE IF NOT EXISTS documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
)
""")
# Function to get embeddings from OpenAI
def get_embedding(text):
response = openai.embeddings.create(input=text, model="text-embedding-ada-002")
return response['data'][0]['embedding']
# Function to add a document
def add_document(content):
embedding = get_embedding(content)
cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (content, embedding))
conn.commit()
# Function to search for similar documents
def search_documents(query, limit=5):
query_embedding = get_embedding(query)
cur.execute("""
SELECT content, embedding <-> %s AS distance
FROM documents
ORDER BY distance
LIMIT %s
""", (query_embedding, limit))
return cur.fetchall()
# Add some sample documents
sample_docs = [
"The quick brown fox jumps over the lazy dog.",
"Python is a high-level programming language.",
"Vector databases are essential for modern AI applications.",
"PostgreSQL is a powerful open-source relational database.",
]
for doc in sample_docs:
add_document(doc)
# Perform a search
search_query = "Tell me about programming languages"
results = search_documents(search_query)
print(f"Search results for: '{search_query}'")
for i, (content, distance) in enumerate(results, 1):
print(f"{i}. {content} (Distance: {distance:.4f})")
# Clean up
cur.close()
conn.close()
Diese einfache Anwendung zeigt, wie du mit pgvector eine semantische Suchmaschine erstellen kannst.
Es bettet Dokumente mit dem Texteinbettungsmodell von OpenAI ein und speichert sie in einer PostgreSQL-Datenbank mit pgvector. Die Suchfunktion findet die ähnlichsten Dokumente zu einer bestimmten Abfrage mithilfe der Kosinusähnlichkeit.
pgvector Vergleichende Analyse
Vergleichen wir pgvector mit anderen beliebten Vektordatenbanken. Dieser Vergleich hilft dir, die Unterschiede in Bezug auf Funktionen, Einsatzmöglichkeiten, Skalierbarkeit, Integration und Kosten zwischen pgvector und anderen auf dem Markt verfügbaren Lösungen zu verstehen.
pgvector versus Pinecone
Pinecone ist eine vollständig verwaltete Vektordatenbank, die für hohe Skalierbarkeit und Benutzerfreundlichkeit entwickelt wurde.
Feature |
pgvector |
Kiefernzapfen |
Datenbank-Typ |
Erweiterung für PostgreSQL |
Vollständig verwaltete Vektordatenbank |
Einsatz |
Selbstgehostet |
Cloud-basiert |
Skalierbarkeit |
Begrenzt durch PostgreSQL |
Hochgradig skalierbar |
Integration |
Arbeitet mit bestehendem PostgreSQL-Stack |
Erfordert separate Integration |
Kosten |
Frei, Open-Source |
Preisgestaltung nach dem Umlageverfahren |
pgvector ist eine ausgezeichnete Wahl für alle, die ihre bestehende PostgreSQL-Infrastruktur ohne zusätzliche Kosten nutzen wollen. Gleichzeitig bietet Pinecone eine hochgradig skalierbare, verwaltete Lösung mit nutzungsabhängigen Preisen.
pgvector versus Milvus
Milvus ist eine spezielle Vektordatenbank, die erweiterte Funktionen und hohe Skalierbarkeit bietet.
Feature |
pgvector |
Milvus |
Datenbank-Typ |
Erweiterung für PostgreSQL |
Dedizierte Vektordatenbank |
Einsatz |
Selbstgehostet |
Selbstgehostet oder Cloud |
Skalierbarkeit |
Begrenzt durch PostgreSQL |
Hochgradig skalierbar |
Integration |
Arbeitet mit bestehendem PostgreSQL-Stack |
Erfordert separate Integration |
Merkmalsset |
Grundlegende Vektoroperationen |
Erweiterte Funktionen wie dynamische Schemata |
Während pgvector grundlegende Vektoroperationen in der vertrauten PostgreSQL-Umgebung bereitstellt, bietet Milvus eine funktionsreichere und skalierbarere Lösung speziell für die Verarbeitung großer Vektordaten.
pgvector versus Weaviate
Weaviate ist eine Vektordatenbank mit integriertem Objektspeicher, die flexible Datenmodellierung und Skalierbarkeit bietet.
Feature |
pgvector |
Weaviate |
Datenbank-Typ |
Erweiterung für PostgreSQL |
Vektordatenbank mit Objektspeicherung |
Einsatz |
Selbstgehostet |
Selbstgehostet oder Cloud |
Skalierbarkeit |
Begrenzt durch PostgreSQL |
Entwickelt für Skalierbarkeit |
Integration |
Arbeitet mit bestehendem PostgreSQL-Stack |
Erfordert separate Integration |
Datenmodell |
Nur Vektoren |
Objekte mit Vektoren und Eigenschaften |
Die Einfachheit von pgvector und seine Integration in PostgreSQL machen es zu einer guten Lösung für Benutzer, die grundlegende Vektor-Funktionen benötigen. Im Gegensatz dazu eignen sich das ausgefeiltere Datenmodell und die Skalierbarkeit von Weaviate für komplexe Anwendungen, die neben Vektoren auch Objektspeicher benötigen.
Fazit
pgvector bringt leistungsstarke Funktionen für die Suche nach Vektorähnlichkeiten in PostgreSQL und ist damit eine ausgezeichnete Wahl für Entwickler, die ihre bestehenden PostgreSQL-basierten Anwendungen um KI-Funktionen erweitern möchten.
In diesem Tutorial haben wir uns mit der Installation, der grundlegenden Nutzung, den Indexierungsfunktionen und der Integration mit Python und LangChain beschäftigt.
Auch wenn pgvector nicht die gleiche Skalierbarkeit und die gleichen speziellen Funktionen wie spezielle Vektordatenbanken wie Pinecone oder Milvus bietet, macht es seine nahtlose Integration in PostgreSQL zu einer attraktiven Option für viele Anwendungsfälle.
Es eignet sich besonders gut für Projekte, die bereits PostgreSQL verwenden und Vektorsuchfunktionen hinzufügen möchten, ohne ein neues Datenbanksystem einzuführen.
Wir ermutigen dich, pgvector in deinen eigenen Projekten auszuprobieren. Egal, ob du ein Empfehlungssystem, eine semantische Suchmaschine oder eine andere Anwendung entwickelst, die eine Ähnlichkeitssuche erfordert, pgvector kann ein wertvolles Werkzeug in deinem Data Science Toolkit sein.
Wenn du dich weiterbilden möchtest, solltest du diese kostenlosen DataCamp-Kurse ausprobieren:
- PostgreSQL-Datenbanken erstellen
- Entwicklung von LLM-Anwendungen mit LangChain
- Einführung in Embeddings mit der OpenAI API
Diese Kurse werden dir helfen, dein Verständnis von Datenbanken und modernen LLM-Anwendungen zu vertiefen.
KI-Anwendungen entwickeln
FAQs
Muss ich meine gesamte Datenbank umstellen, um pgvector zu nutzen?
Nein, es ist ein Add-on für deine bestehende PostgreSQL-Datenbank.
Kann ich pgvector auch mit anderen Sprachen als Python verwenden?
Ja, mit jeder Sprache, die einen PostgreSQL-Adapter hat.
Wie kann ich die Leistung von pgvector-Abfragen überwachen?
Du kannst die in PostgreSQL integrierten Tools wie EXPLAIN
und ANALYZE
verwenden , um die Abfrageleistung zu überwachen. Außerdem können Logging- und Monitoring-Erweiterungen wie pg_stat_statements
Einblicke in die Abfrageleistung geben und helfen, Engpässe zu erkennen.
Ist es möglich, die Vektorsuche mit herkömmlichen SQL-Abfragen zu kombinieren?
Ja, mit pgvector kannst du die Vektorsuche mit herkömmlichen SQL-Abfragen kombinieren. Du kannst Vektorähnlichkeitsoperationen zusammen mit anderen Bedingungen in deine SQL-Abfragen einbeziehen und so komplexe Suchen ermöglichen, die sowohl Vektor- als auch relationale Daten nutzen.
Kann pgvector neben OpenAI auch mit anderen Frameworks für maschinelles Lernen verwendet werden?
Ja, pgvector kann mit verschiedenen Frameworks und Bibliotheken für maschinelles Lernen integriert werden. Du kannst Einbettungen mit Modellen aus Frameworks wie TensorFlow, PyTorch oder Hugging Face erzeugen und diese Einbettungen mit pgvector in PostgreSQL speichern und abfragen.
Wie gehe ich mit Versions-Upgrades von pgvector um?
Wenn du ein Upgrade von pgvector durchführst, stelle sicher, dass du die offiziellen Upgrade-Anweisungen in der pgvector-Dokumentation befolgst. Sichern Sie Ihre Daten, bevor Sie ein Upgrade durchführen. Nach dem Upgrade solltest du deine Anwendung gründlich testen, um Kompatibilität und Leistung sicherzustellen.
Kann pgvector effizient mit hochdimensionalen Vektoren umgehen?
Obwohl pgvector mit hochdimensionalen Vektoren umgehen kann, kann die Leistung durch die Möglichkeiten von PostgreSQL begrenzt sein. Für sehr hochdimensionale Daten solltest du dein PostgreSQL-System optimieren oder spezielle Vektordatenbanken wie Milvus oder Pinecone ausprobieren.
Lerne mehr über maschinelles Lernen und KI mit diesen Kursen!
Kurs
Vektordatenbanken für Einbettungen mit Pinecone
Kurs