KI-Training ist ressourcenintensiv. Man braucht riesige Datensätze, fortschrittliche Algorithmen und spezielle Hardware (sprich: teure Grafikprozessoren), um einem Modell beizubringen, wie es Sprache, Bilder oder Audio verstehen kann. Aber auch nach Abschluss des Trainings kann die Durchführung von Schlussfolgerungen (der Prozess der Erzeugung von Ergebnissen) ebenso anstrengend sein.
Die Abfrage eines LLM in Echtzeit für jede Benutzeranfrage ist nicht nur teuer, sondern auch ineffizient. Vor allem, wenn die Antwort vielleicht schon vorhanden ist. Um diese Herausforderung zu lösen, haben sich die Entwicklungsteams an Vektordatenbanken gewandt.
Im Gegensatz zu herkömmlichen Datenbanken, die sich auf exakte Stichwortübereinstimmungen stützen, speichern Vektordatenbanken Informationen als hochdimensionale Einbettungen wie numerische Darstellungen von Daten wie Text, Bilder oder Ton. Dies ermöglicht die Durchführung semantischer Suchen. Sie suchen also nicht nach exakten Wörtern, sondern nach der Bedeutung.
Diese Unterscheidung ist in Anwendungsfällen wie z. B.:
- Retrieval-augmented Generation (RAG)
- Motoren für Empfehlungen
- Systeme zur Beantwortung von Fragen
- Semantische Suche
Mit Vektordatenbanken können KI-Systeme relevante Informationen schneller und effizienter abrufen, da unnötige Inferenzaufrufe übersprungen werden, wenn die Antwort bereits im Vektorindex vorhanden ist. Es gibt viele verschiedene Lösungen für Vektordatenbanken, aber heute werde ich über pgvector sprechen, eine Open-Source-PostgreSQL-Erweiterung, die ich persönlich benutze und empfehlen würde. Wir werden durchgehen, warum ich denke, dass es ein so großartiges Werkzeug ist und wie Sie damit anfangen können.
Warum pgvector ein großartiges Werkzeug für Entwickler ist
Zunächst einmal integriert pgvector Vektorsuchfunktionen direkt in PostgreSQL, eine der am weitesten verbreiteten relationalen Datenbanken der Welt. Für Entwickler und Teams, die bereits in einer PostgreSQL-basierten Umgebung arbeiten, stellt dies eine nahtlose, reibungslosere Option für die Erstellung intelligenter Anwendungen dar.
Anstatt einen neuen, separaten Stack einzuführen, der verwaltet werden muss, ermöglicht pgvector den Teams, sowohl relationale als auch Vektordaten an einem Ort zu speichern und abzufragen. Diese Vereinheitlichung beseitigt die Komplexität der Synchronisierung unterschiedlicher Datenbanken und ermöglicht einen einfacheren Entwicklungslebenszyklus. KI-Anwendungen erfordern oft die Kombination verschiedener Abfragetypen wie strukturierte Filter, Volltextsuche und semantische Ähnlichkeit in einem einzigen Vorgang. pgvector unterstützt dieses hybride Suchmuster nativ, indem es Entwicklern erlaubt, Vektorähnlichkeitsbewertungen mit SQL-basierten Filtern und Joins zu kombinieren. So können Sie einen Dokumentenkorpus nicht nur nach Schlüsselwörtern, sondern auch nach semantischer Bedeutung durchsuchen und dabei Filter wie Dokumentenkategorien oder Benutzerrechte innerhalb einer einzigen SQL-Abfrage anwenden.
pgvector ist auf Skalierbarkeit und Leistung in der Praxis ausgelegt. Für Anwendungen, die schnelle Ergebnisse über Millionen von Einbettungen liefern müssen, unterstützt pgvector die ANN-Suche (Approximate Nearest Neighbour) durch die IVFFlat-Indizierungsmethode. Dies ermöglicht schnelle Antworten für latenzempfindliche Anwendungen wie KI-gestützte Suchleisten oder Empfehlungssysteme, wobei ein gutes Gleichgewicht zwischen Genauigkeit und Geschwindigkeit gewahrt bleibt. Für Teams, die in Python entwickeln, lässt sich pgvector nahtlos in gängige PostgreSQL-Client-Bibliotheken wie psycopg2, asyncpg und SQLAlchemy integrieren, so dass es sich leicht in Ihre bestehenden Datenpipelines und ML-Workflows einfügen lässt.
Die Vielseitigkeit von pgvector erweist sich branchenübergreifend als wertvoll. Wir sehen, wie E-Commerce-Organisationen es für personalisierte Empfehlungen nutzen, um die Konversionsrate zu erhöhen. Eine große Medienplattform nutzt es, um relevante Inhalte zu präsentieren und die Nutzer zu binden. Teams im Gesundheitswesen und in den Biowissenschaften verlassen sich auf die Software, um schneller zu recherchieren, Wirkstoffe zu entdecken und diagnostische Erkenntnisse zu gewinnen. In vielen Technologieunternehmen ermöglicht sie einen LLM-gesteuerten Support und intelligentere interne Tools.
Was pgvector noch leistungsfähiger macht, ist der Einsatz auf einer Plattform wie Akamai Cloud. Die Cloud-Lösung von Akamai bietet Teams die verwaltete Infrastruktur, die Skalierbarkeit und den globalen Leistungsvorsprung, den sie für produktionsreife Workloads benötigen. Mit Managed PostgreSQL auf Akamai können Entwickler pgvector-gestützte Anwendungen bereitstellen, ohne sich um den operativen Overhead zu kümmern. Mit automatischen Backups, integrierter Sicherheit und automatischen Skalierungsoptionen bleibt Ihr Stack stabil, während sich Ihr Team auf die Entwicklung konzentrieren kann. Und da die Rechen- und Netzwerkinfrastruktur von Akamai für die globale Bereitstellung optimiert ist, profitieren Anwendungen, die auf schnelle Inferenz- oder Echtzeit-Empfehlungs-Engines angewiesen sind, von geringeren Latenzzeiten und größerer Zuverlässigkeit bei der Skalierung.
Wenn Sie bereits PostgreSQL verwenden oder nach einer KI-fähigen Vektorsuchmaschine suchen, die keine komplette Überarbeitung des Stacks erfordert, werde ich Ihnen im nächsten Abschnitt zeigen, wie Sie mit pgvector beginnen können.
Erste Schritte mit pgvector auf Akamai
- Stellen Sie einen PostgreSQL-Cluster über das Akamai Dashboard für verwaltete Datenbanken bereit.
- Melden Sie sich beim Cloud Manager an.
- Wählen Sie im Hauptmenü Datenbanken.
- Klicken Sie auf Datenbank-Cluster erstellen.
- Geben Sie in das Feld Cluster-Bezeichnung eine Bezeichnung ein, damit Sie den Cluster in Ihrem Konto leicht identifizieren können. Die Bezeichnung muss alphanumerisch sein und zwischen 3 und 32 Zeichen enthalten.
- Wählen Sie die Datenbank-Engine für Ihre neue Datenbank.
- Wählen Sie die Region aus, in der sich der Datenbank-Cluster befinden soll.
- Jeder Knoten eines Datenbank-Clusters wird auf einer eigenen Linode aufgebaut. Wählen Sie im Abschnitt " Plan auswählen" den Linode-Typ und den Plan, den die Knoten verwenden sollen.
- Klicken Sie auf Datenbank-Cluster erstellen. Die vollständige Bereitstellung des Clusters dauert etwa 10 bis 15 Minuten. Sie können den Status verfolgen, indem Sie sich die Status in der Liste der Datenbank-Cluster.
Hinweis: Sie können auch APIs für die Bereitstellung verwenden.
- Melden Sie sich bei Ihrem Cluster an
Um eine direkte Verbindung zur Datenbank über die Befehlszeile herzustellen, können Sie das Tool psql verwenden. Dieses Tool ist in den meisten PostgreSQL-Server-Installationen enthalten, Sie können es aber auf den meisten Betriebssystemen auch separat installieren.
Verwenden Sie den folgenden psql-Befehl, um eine Verbindung zu Ihrer Datenbank herzustellen, und ersetzen Sie dabei[host]
und[username]
mit den entsprechenden Werten im Abschnitt Verbindungsdetails.psql --host=[host] --username=[username] --password --dbname=postgres
- Eine Erweiterung installieren
Um eine der verfügbaren Erweiterungen in Ihrer Datenbank zu installieren, verwenden Sie den Befehl CREATE EXTENSION, wobei Sie [extension_name] durch den Namen der zu installierenden Erweiterung ersetzen. In diesem Fall ist die Erweiterungvector
.CREATE EXTENSION vector;
- Vektorspalten definieren
Nach der Installation der Vektorerweiterung haben Sie Zugriff auf einen neuen Datentyp namens vector. Die Größe des Vektors (in Klammern angegeben) steht für die Anzahl der Dimensionen, die in diesem Vektor gespeichert sind. In diesem Beispiel werden wir 13 verwenden, aber in einem tatsächlichen Anwendungsfall würde die Zahl in die Tausende gehen.CREATE TABLE items ( id serial PRIMARY KEY, description text, embedding vector(13) );
- Fügen Sie Einbettungen aus Ihrem ML-Modell ein (wie OpenAIs oder Gesicht umarmen). Um Beispiele für Einbettungen zu sammeln, können Sie das folgende Python verwenden, das von der Hugging Face-Demo übernommen wurde. Damit dieses Beispiel funktioniert, müssen Sie ein Hugging Face-Token erhalten.
import requests
import psycopg2
import os
# Hugging Face Configuration
model_id = "sentence-transformers/all-MiniLM-L6-v2"
hf_token = os.environ.get("HF_TOKEN") # Set an environmental variable called HF_TOKEN with your Hugging Face token
api_url = f"https://router.huggingface.co/hf-inference/models/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}
# Database Configuration
db_conn_string = os.environ.get("DB_CONN_STRING") # Replace with your connection string or set an env var
# Source for Embeddings
source_sentence = "How do I get Medicare?"
sentences = [
"How do I get a replacement Medicare card?",
"What is the monthly premium for Medicare Part B?",
"How do I terminate my Medicare Part B (medical insurance)?",
"How do I sign up for Medicare?",
"Can I sign up for Medicare Part B if I am working and have health insurance through an employer?",
"How do I sign up for Medicare Part B if I already have Part A?",
"What are Medicare late enrollment penalties?",
"What is Medicare and who can get it?",
"How can I get help with my Medicare Part A and Part B premiums?",
"What are the different parts of Medicare?",
"Will my Medicare premiums be higher because of my higher income?",
"What is TRICARE ?",
"Should I sign up for Medicare Part B if I have Veterans' Benefits?"
]
# Hugging Face API Query Function
def get_embeddings(source_sentence, sentences):
"""Queries the Hugging Face API to get sentence embeddings."""
try:
response = requests.post(
Api_url,
headers=headers,
json={"inputs": { "source_sentence": source_sentence, "sentences": sentences }, "options": {"wait_for_model": True}}
)
response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
return response.json()
except requests.exceptions.RequestException as e:
print(f"Error querying Hugging Face API: {e}")
return None
# Main Execution
print("Fetching embeddings from Hugging Face...")
embeddings = get_embeddings(source_sentence, sentences)
if embeddings:
print(f"Successfully fetched {len(embeddings)} embeddings.")
conn = None
Try:
# Establish connection to the database
print("Connecting to the PostgreSQL database...")
conn = psycopg2.connect(db_conn_string)
cur = conn.cursor()
print("Connection successful.")
# Insert descriptions and embeddings into the database
print("Inserting data into the 'items' table...")
for description, embedding in zip(sentences, embeddings):
# The pgvector extension expects the vector as a string representation of a list
cur.execute(
"INSERT INTO items (description, embedding) VALUES (%s, %s)",
(description, embeddings)
)
# Commit the transaction to make the changes permanent
conn.commit()
print(f"Successfully inserted {cur.rowcount} records into the database.")
except psycopg2.Error as e:
print(f"Database error: {e}")
if conn:
conn.rollback() # Rollback the transaction on error
Finally:
# Ensure the connection is closed
if conn:
cur.close()
conn.close()
print("Database connection closed.") - Verwenden Sie pgvectors Indizierung und Suche
Create the index after the table has some data
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);
SELECT *, embedding <-> query_embedding AS similarity FROM items ORDER BY similarity LIMIT 5;
Vektordatenbanken helfen Teams dabei, die Leistung zu optimieren, die Kosten für Inferenzen zu senken und intelligentere, schnellere Benutzererfahrungen zu liefern. Erweiterungen wie pgvector machen es einfacher, semantische Suche und hybride Abfragen in vertraute Umgebungen wie PostgreSQL zu bringen, ohne die Architektur zu überarbeiten.
Kommentare