Vektordatenbanken zählen für KI-basierte Applikationen wie ChatGPT zu den kritischen Komponenten. Der populäre Chatbot ist auf Abfragen angewiesen, die per Vektorsuche Wissenszusammenhänge aus ungeheuren Datenmengen extrahieren. Nur so können sie fast immer eine korrekte Antwort geben.
Wie der Name bereits sagt, speichern Vektordatenbanken Daten in einem numerischen Format, den Vektoren. Bei einem beliebigen Satz wie “Ein blau gestreiftes Baumwoll-Shirt”, sähe eine Vektor-Repräsentation etwa wie folgt aus:
[0.1, -0.2, 0.91, 0.7, -0.21, 0.1 -0.7, 0.4]
Der numerische Ausdruck steht für die Koordinaten des Satzes in einem vieldimensionalen Raum. Wenn ein Satz, ein Bild oder ein Video in einen Vektor konvertiert wird, stehen die numerischen Werte für die Bedeutung der jeweiligen Aussage. Im Beispiel würden die Vektoren der Sätze “Ein blau gestreiftes Baumwoll-Shirt” und “Ein maritimes Baumwoll-Shirt” auf nahe beieinander liegende Orte im vieldimensionalen Raum verweisen. Der Witz dabei ist, dass der Suchalgorithmus einer Vektordatenbank eine Anfrage abarbeitet und dabei die Entfernung zwischen zwei solcherart verbundenen Vektoren berechnet. Sie dient als Maß für die Ähnlichkeit der Vektoren, und die wiederum generiert in vielen modernen KI-Systemen Bedeutung.
Als kritische Softwareinfrastruktur ist eine Vektordatenbank darauf ausgelegt, hochdimensionale Vektoren effizient zu speichern. Eine traditionelle OLTP- oder OLAP-Datenbank (Abbildung 1) organisiert Daten in Zeilen und Spalten. Abfragen beziehen sich auf die darin abgelegten Werte. Manche KI-Anwendungen bauen auf solchen Datenbanken auf und versuchen, Daten darin schnell abzulegen und wieder aufzurufen. In manchen Applikationen, etwa solchen zur Bilderkennung oder Verarbeitung natürlicher Sprache sowie Empfehlungssystemen, werden die Daten allerdings durch Vektoren in einem vieldimensionalen Raum repräsentiert. Eine Vektordatenbank speichert Sammlungen solcher Vektoren. Dabei werden sie als Raumkoordinaten notiert, die eine ID und eine optionale Nutzlast tragen. Letztere enthält in der Regel Metadaten, die sich verwenden lassen, um die Vektorsuche für eine genauere Abfrage weiter zu filtern.

Abbildung 1: Vektordatenbanken nutzen keine Zeilen und Spalten, sondern speichern ihre Werte in Vektoren zusammen mit einer ID und einem anhängenden Payload. Quelle: Qdrant
Qdrant [1] gehört zu den Beispielen für eine KI-kompatible Vektordatenbank. Sie kann riesige Datenmengen aufnehmen und effektiv durchsuchen. Dabei liefert sie sehr genaue Resultate in hoher Geschwindigkeit. Typischerweise sind die Ergebnisse semantisch relevant für die gestellte Frage. Solange die Daten in Vektoren umgewandelt wurden, macht es keinerlei Unterschied, ob es sich um Texte, Bilder oder Audio-Material handelt.
Warum man sie nutzen soll
Vektordatenbanken spielen vor allem da eine herausragende Rolle, wo es um die Suche nach Ähnlichkeiten geht, etwa bei Empfehlungssystemen, inhaltsbasierter Bildersuche oder personalisierter Suche. Durch ihre effizienten Indizierungs- und Suchtechniken ermöglichen Vektordatenbanken eine akkuratere und schnellere Suche in unstrukturierten Daten, die bereits als Vektoren vorliegen. Somit tragen sie dazu bei, die relevantesten Antworten auf Suchanfragen der Anwender zu ermitteln.
Zu bestehenden KI-Anwendungen hinzugefügt, dient eine Vektordatenbank dem Abrufen von Kontext. Das bedeutet, sie verbessert die Qualität der Informationen, die KI-Modelle zum Generieren der Antworten heranziehen. Wenn Sie ein KI-Modell beispielsweise dazu auffordern, eine coole Idee oder ein Stück Code zu erzeugen, kann es mithilfe einer Vektordatenbank schneller und präziser zu einer Inspiration gelangen. Dabei sind die Möglichkeiten einer Vektorsuche oft erst der eigentliche Grund dafür, die Daten überhaupt als Vektoren zu speichern. Das hat zu einer steigenden Nachfrage nach Vektordatenbanken geführt, da globale Technologieunternehmen auf Retrieval-Systeme angewiesen sind, um ihre KI-Projekte voranzubringen. Datenbanken eigen sich wegen ihres Fokus auf Echtzeitspeicherung hervorragend dazu.
Wie Vektorensuche funktioniert
Vektordatenbanken greifen nicht auf konventionelle Suchmethoden zurück, sondern bedienen sich für die Suche neuer, spezialisierter Algorithmen. Ein gespeicherter dreidimensionaler Vektor könnte zum Beispiel mit den Werten »[1.4, 3.8, -0.8]« belegt sein. Jede Anfrage an die Datenbank wird ebenso in einen Vektor übersetzt, beispielsweise in »[1.3, 3.5, -0.7]«. Der Algorithmus versucht daraufhin herauszubekommen, ob der gespeicherte Vektor dem der Anfrage ähnelt, also ob die Punkte im Raum, auf die die Vektoren zeigen, nah beieinander liegen. Wenn nicht, setzt sich die Suche fort, bis ein verwandter Vektor identifiziert ist. Das Verfahren nennt sich Ähnlichkeitssuche und funktioniert selbst mit 2::000 und mehr Dimensionen und einer Milliarde Einträgen in Millisekunden.
In einem Vektorsuchprozess verwendet ein Machine-Learning-Modell zum Beispiel einen umfangreichen Textkorpus als Eingabe und erzeugt eine mathematische Repräsentation aller Wörter in Form von Vektoren. Die Vektoren werden dabei so gewählt, dass Wörter mit ähnlicher Bedeutung und in einem ähnlichen Kontext gruppiert werden und zu ähnlichen Vektoren führen. Außerdem lässt sich ein Mittelwert aller Wörter einer Anfrage, eines Satzes oder eines Absatzes errechnen (Abbildung 2).
Der Prozess der Vektorisierung lässt sich allerdings nicht wieder umkehren – aus dem Vektor eines Absatzes können Sie nicht mehr auf dessen Formulierung schließen, weil seine Dimensionen nicht mehr das Vorhandensein bestimmter Wörter anzeigen. Die gespeicherten Vektoren stehen ausschließlich für die Bedeutung, nicht aber für die enthaltenen Wörter in einem Text. Auf dieser Grundlage können Large Language Models (LLMs) automatisch mit Synonymen umgehen. Ja mehr noch: Wenn die zugrunde liegenden neuronalen Netze mit mehrsprachigen Sammlungen von Trainingsdaten (Corpora) trainiert wurden, können sie zudem übersetzen, denn derselbe Satz in verschiedenen Sprachen erzeugt ähnliche Vektoren (Embeddings). Anschließend lassen sich über die Sprachgrenze hinweg ähnliche Textpassagen finden, indem man den Abstand der Vektoren durch die Datenbank berechnen lässt (Abbildung 3).
Selbst wenn die eingegebenen Anfragen andere Wörter enthalten als die Antworten, werden sie in ähnliche Vektordarstellungen umgewandelt, da der neuronale Encoder die Bedeutung der Sätze erfassen kann. Diese Funktion ist mit Synonymen und verschiedenen Sprachen kompatibel. Der gesamte Prozess heißt Vektorsuche und beruht darauf, ähnliche Objekte aufgrund der Ähnlichkeit ihrer Embeddings zu finden.
Das Gute daran: Sie müssen Ihr neuronales Netz weder selbst entwerfen, noch müssen Sie trainieren. Viele vortrainierte Modelle stehen bereits zur Verfügung, entweder auf der Webseite Hugging Face [2] oder mithilfe von Bibliotheken wie SentenceTransformers [3]. Wenn Sie sich nicht selbst die Hände mit neuronalen Modellen schmutzig machen wollen, können Sie die Einbettungen alternativ mit SaaS-Tools wie der co.embed-API [4] erstellen.
Vektordatenbanken nutzen
Die Herausforderung bei der Vektorsuche beginnt damit, ähnliche Dokumente in einem sehr großen Set von Objekten auszumachen. Ein naiver Ansatz bestünde darin, die Entfernungen von jedem Objekt zu jedem anderen zu berechnen, um die nächsten Nachbarn zu erkennen. Das mag womöglich mit Dutzenden, vielleicht auch Hunderten Beispielen gelingen, gerät jedoch bei einer größeren Anzahl zum Flaschenhals. In der Welt der relationalen Datenbanken verwendet man Indizes, um die Dinge zu beschleunigen – genau dasselbe tun Vektordatenbanken. Eine vollwertige Vektordatenbank verkürzt den Suchprozess, indem sie eine Graph-ähnliche Struktur einsetzt, um die nächstgelegenen Objekte in sublinearer Zeit zu finden. Sie berechnet dann nicht die Entfernung zu jedem Objekt aus der Datenbank, sondern lediglich zu einigen Kandidaten.
Das Beispiel aus Abbildung 4 demonstriert, wie die Vektoren auf Punkte im vieldimensionalen Raum verweisen – obwohl sich zeichnerisch nur drei Dimensionen abbilden lassen. Die Vektorensuche greift auf den Algorithmus Approximate Nearest Neighbor zurück, um sinnverwandte Einträge zu finden. Abbildung 5 veranschaulicht, wie sich die semantische Relevanz zwischen Objekten (Tieren) in einem einfachen zweidimensionalen Diagramm ausdrücken lässt: Von Natur aus ähnliche Objekte, liegen näher beieinander, während weniger verwandte Objekte weiter voneinander entfernt sind.

Abbildung 5: Der Encoder berechnet Vektoren, die auf näher beieinander liegende Punkte verweisen, wenn die bezeichneten Objekte einander ähnlicher sind. Quelle: Qdrant
Für eine semantische Suche in großem Umfang benötigen Sie ein spezielles Tool. Open-Source-Vektordatenbanken gibt es kostenlos. Sie erfreuen sich großer Beliebtheit bei Datenwissenschaftlern, KI-Entwicklern und Ingenieuren für maschinelles Lernen. Ihr großer Vorteil zeigt sich darin, dass sie sich in jeder Hosting-Umgebung installieren lassen, selbst auf den am stärksten gesicherten Servern. Das spielt eine sehr wichtige Rolle für Projekte, bei denen die Daten geheim sind und nicht weitergegeben werden dürfen, etwa bei Behörden, im Gesundheitswesen oder in der Forschung.
Arbeiten mit einer Vektordatenbank
Nachdem Sie Ihre Daten in die Datenbank geladen haben, können Sie sie auf verschiedene Weise durchsuchen. Standardmäßig werden Sie vermutlich nach semantisch relevanten Resultaten schauen. Darüber hinaus können Sie die Suche so konfigurieren, dass sie Dinge empfiehlt, an denen Sie interessiert sein könnten, oder umgekehrt, dass sie auf unerwünschte Dinge aufmerksam macht. Die spannendste Variante: Sie können die Suche so einstellen, dass sie Daten entdeckt, von denen Sie nie dachten, dass Sie sie brauchen würden.
Der Suche vorgeschaltet ist der in drei Schritten verlaufende Prozess der Vektorisierung: Zuerst werden Wörter, Sätze, Audios oder selbst Bilder mittels eines Transformer-Modells in Vektoren übersetzt.
Diese Modelle sind generell über APIs zu erreichen. Einige Transformer sind Open Source, andere wie JinaAI [5] verlangen ein geringes Entgelt, um Daten in Vektoren zu verwandeln. Das Ergebnis dieses ersten Schritts besteht in jedem Fall in Vektoren. Im zweiten Schritt legt der Anwender sie in einer Vektordatenbank ab. Hinter Vektoren stecken grundsätzlich kommaseparierte Zahlen, die sich in einer Reihe von Formaten darstellen lassen, beispielsweise binär in BLOBs. Beim Ablegen werden die Vektoren außerdem indiziert, wofür es verschiedene Algorithmen gibt.
Den letzten Schritt bildet die semantische Suche, die ihrerseits auf verschiedene Algorithmen zurückgreift, darunter:
- Die Cosinus-Ähnlichkeit misst den Winkel zwischen zwei Objekten. Je kleiner der Winkel, desto ähnlicher sind sie sich.
- Die Euklidische Distanz misst die Entfernung zwischen zwei Objekten.
- Die Manhattan Distance berechnet die Distanz zwischen zwei Objekten durch Aufsummieren der Unterschiede ihrer Koordinaten.
- Die Dot Product Distance berechnet die Summe der Produkte der entsprechenden Komponenten zweier Vektoren, was eine skalare Größe ergibt.
Im Folgenden möchten wir kurz demonstrieren, wie Sie den Python-Client von Qdrant dazu verwenden, eine Datenbank-Collection zu erstellen, Daten hinein zu laden und eine einfache Suche laufen zu lassen.
Ein praktisches Beispiel
Zuerst laden Sie die aktuelle Qdrant-Version von Dockerhub mithilfe des Befehls »docker pull qdrant/qdrant« herunter. Danach startet das nachstehende Kommando den Service:
$ docker run -p 6333:6333 -p 6334:6334 -v $(pwd)/qdrant_storage:/qdrant/storage:z qdrant/qdrant
Mit der Standardkonfiguration landen alle Daten im Verzeichnis »’./qdrant_storage«. Das ist zugleich das einzige Verzeichnis, das sowohl vom Container als auch vom Container-Host aus zu sehen ist. Qdrant ist nun über die API unter http://localhost:6333/ zu erreichen. Außerdem greifen Sie über http://localhost:6333/dashboard auf das Dashboard zu.
Nun gilt es zunächst, den Client zu initialisieren (Listing 1, erste und zweite Zeile). Danach müssen Sie eine Datenbank anlegen, im Beispiel heißt sie »test_collection« (Listing 1, Zeilen 4 bis 8). Schließlich werden eine Handvoll Testdaten importiert (Listing 1, Zeilen 10 bis 21).
Listing 1
Datenbank anlegen und befüllen
from qdrant_client import QdrantClient
client = QdrantClient(url="")
from qdrant_client.models import Distance, VectorParams
client.create_collection(
collection_name="test_collection",
vectors_config=VectorParams(size=4, distance=Distance.DOT),
)
from qdrant_client.models import PointStruct
operation_info = client.upsert(
collection_name="test_collection",
wait=True,
points=[
PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
PointStruct(id=4, vector=[0.18, 0.01, 0.85, 0.80], payload={"city": "New York"}),
PointStruct(id=5, vector=[0.24, 0.18, 0.22, 0.44], payload={"city": "Beijing"}),
PointStruct(id=6, vector=[0.35, 0.08, 0.11, 0.44], payload={"city": "Mumbai"}),
],
)
Auf die Anweisung »print(operation_info)« sollte die Datenbank jetzt mit folgendem Code antworten:
operation_id=0 status=<UpdateStatus.COMPLETED: 'completed'>
Nun können Sie schon eine einfache Abfrage formulieren, zum Beispiel: “Welcher der gespeicherten Vektoren ist [0.2, 0.1, 0.9, 0.7] am ähnlichsten?” Den Code und die Antwort der Datenbank zeigt Listing 2. Zusätzlich können Sie einen Filter anwenden, etwa um das ähnlichste Ergebnis zu erhalten, das “London” einschließt (Listing 3). Damit haben Sie eine Datenbank erzeugt, mit Vektoren befüllt und abgefragt. Qdrant hat die nächstliegenden Antworten gefunden und mit einem Ähnlichkeits-Score ausgegeben.
Listing 2
Beispiel-Query
search_result = client.search(
collection_name="test_collection", query_vector=[0.2, 0.1, 0.9, 0.7], limit=3
)
print(search_result)
### Ausgabe:
ScoredPoint(id=4, version=0, score=1.362, payload={"city": "New York"}, vector=None),
ScoredPoint(id=1, version=0, score=1.273, payload={"city": "Berlin"}, vector=None),
ScoredPoint(id=3, version=0, score=1.208, payload={"city": "Moscow"}, vector=None)
Listing 3
Filter anwenden
from qdrant_client.models import Filter, FieldCondition, MatchValue
search_result = client.search(
collection_name="test_collection",
query_vector=[0.2, 0.1, 0.9, 0.7],
query_filter=Filter(
must=[FieldCondition(key="city", match=MatchValue(value="London"))]
),
with_payload=True,
limit=3,
)
print(search_result)
### Ausgabe:
ScoredPoint(id=2, version=0, score=0.871, payload={"city": "London"}, vector=None)
Retrieval Augmented Generation (RAG)
Seit der Veröffentlichung von ChatGPT ist der Hype um Sprachmodelle im Internet regelrecht explodiert – zu Recht. Sie schreiben Aufsätze, programmieren oder erstellen Memes, wobei wir noch nicht ganz sicher sind, ob das eine gute Sache ist. Aber so brillant diese Chatbots auch wirken, sie tun sich noch immer schwer mit Aufgaben, die externes Wissen und faktische Informationen erfordern. Ja, sie können den Schwänzeltanz der Honigbiene bis ins kleinste Detail beschreiben. Aber sie wären weitaus wertvoller, wenn sie Erkenntnisse aus allen von uns bereitgestellten Daten gewinnen könnten und nicht nur aus ihren ursprünglichen Trainingsdaten. Da es horrende Summen kostet und Monate dauert, diese großen Sprachmodelle von Grund auf neu zu trainieren, brauchen wir bessere Möglichkeiten, um unseren bestehenden LLMs Zugang zu unseren benutzerdefinierten Daten zu geben.
Zwar kann man kreativ bei der Formulierung der Prompts sein, aber das taugt nur als eine kurzfristige Lösung. Denn die LLMs können lediglich eine begrenzte Menge Text aus dem Prompt in ihre Antworten einbeziehen, man nennt diese Spanne das Context Window. Einige Modelle wie GPT-3 können bis zu 4::096 Token Kontext berücksichtigen. Das genügt für die meisten Wissensgrundlagen nicht.
Abbildung 6 zeigt, wie stattdessen ein RAG-System (Retrieval Augmented Generation) arbeitet: Bevor eine Frage beim LLM ankommt, schaltet sich eine Schicht dazwischen, die zunächst eine Wissensbasis konsultiert und daraus relevante Informationen liest. In diesem Fall handelt es sich um die Ausgabendaten des letzten Monats. Unser LLM kann nun eine relevante, nicht halluzinierte Antwort über unser Budget generieren.

Abbildung 6: Relevantes Wissen aus einer Knowledge Base wird dem LLM zusätzlich zur Verfügung gestellt. Quelle: Qdrant
Angesichts dessen, wie der Datenbestand wächst, braucht es effizientere Methoden, um die relevantesten Informationen für den begrenzten Speicher des LLM aufzuspüren. In diesem Fall benötigen Sie eine geeignete Methode, um die spezifischen, für Ihre Abfrage notwendigen Daten zu speichern und abzurufen, ohne dass das LLM sie sich merken muss.
Vektordatenbanken speichern Informationen als Vektoreinbettungen. Genau dieses Format unterstützt effiziente Ähnlichkeitssuchen, um relevante Daten für Ihre Abfrage zu finden. Qdrant zum Beispiel ist speziell dafür ausgelegt, selbst in Szenarien mit Milliarden von Vektoren schnell zu einem Ergebnis zu kommen.
In seinem Kern besteht ein RAG-System aus zwei Komponenten: einem Retriever und einem Generator. Wenn der Retriever eine Frage bekommt, setzt er die Ähnlichkeitssuche dazu ein, aus einer riesigen Wissensdatenbank, die sich aus Vektor-Embeddings zusammensetzt, die zum Beantworten der Frage relevantesten Vektoren zu extrahieren. Um zu bestimmen, was wichtig ist, greift das System auf unterschiedliche Techniken zurück. Dabei geht es zunächst um die Vektorisierung der Anfrage. Das geschieht mit den denselben Preprocessing- und Vektorisierungsmethoden, die bereits beim Befüllen der Datenbank zum Zug kamen – dadurch sind die Ergebnisse kompatibel.
Danach ist ein Vektorähnlichkeitsverfahren an der Reihe, um die relevantesten Dokumente oder Passagen zur Beantwortung einer Anfrage zu ermitteln. Vektorielle Ähnlichkeit ist ein grundlegendes Konzept des maschinellen Lernens und der Verarbeitung natürlicher Sprache (NLP), das die Ähnlichkeit zwischen Vektoren quantifiziert, die Datenpunkte mathematisch abbilden. Im Anschluss kommt der Generator ins Spiel, der die finale Antwort in natürlicher Sprache formuliert und zusammenbaut.
Beim LLM handelt es sich typischerweise um ein Modell wie GPT, BART oder T5, das mit einem gewaltigen Dataset trainiert wurde, um natürliche Sprache zu verstehen und hervorzubringen. Es erhält nicht nur die Frage als Input, sondern auch die vom Retriever ermittelten zusätzlichen Passagen oder Dokumente, die bei der Antwort helfen können. Das Zusammenspiel von Retriever und Generator zeigt Abbildung 7.
Wo RAG-Systeme zum Einsatz kommen
Aufgrund ihrer sachkundigeren und kontextbezogenen Antworten tauchen die RAG-Modelle heute in vielen Bereichen auf, insbesondere in solchen, in denen es auf sachliche Genauigkeit und Wissenstiefe ankommt. Das betrifft beispielsweise fortgeschrittene Antwortsysteme, die auf Wissensdatenbanken zurückgreifen und Antworten in flüssiger Sprache erzeugen. Textgeneratoren profitieren ebenso von RAG, etwa bei kontextualisierten Zusammenfassungen längerer Texte. Ein weiteres Anwendungsfeld liegt in der Verwandlung von Daten in Text, etwa für Business-Intelligence-Reports oder die Beschreibung von aus der Visualisierung von Daten gewonnenen Einsichten. Schließlich ist RAG auch nicht auf Text beschränkt, sondern kann multi-mediale Informationen verarbeiten und beispielsweise Textantworten auf Fragen zu Bildern oder Videos geben.
Fazit
Generell schafft die Kombination aus LLM und Vektordatenbank ein leistungsstarkes System, das genaue Antworten gibt. Die Vektordatenbank zielt darauf ab, präzise Resultate mit geringem Ressourceneinsatz zu produzieren. Einer der größten Nachteile von KI-Applikationen offenbart sich immerhin in ihrem Ressourcenbedarf (CPU, RAM, GPU), der in hohen Kosten mündet. Das Betreiben eines Chatbots kann erhebliche Summen pro Tag verschlingen. Hier spielen Vektordatenbanken einen großen Vorteil aus, indem sie in erweiterten KI-Anwendungen für bessere und genauere Ergebnisse bei geringeren Kosten sorgen.
Infos
- Qdrant: https://qdrant.tech
- Hugging Face: https://huggingface.co
- SentenceTransformers: https://huggingface.co/sentence-transformers
- co.embed-API: https://huggingface.co/Cohere/Cohere-embed-multilingual-v3.0
- JinaAI: https://jina.ai/










