Bedeutung als Koordinaten: Von Embeddings zu Vektordatenbanken und RAG
Embeddings, kosinusähnlichkeit, Vektordatenbanken und der RAG-Loop werden anhand von vier kurzen Sätzen über Hunde, Katzen und Paris erklärt, um Klicks bei semantischer Suche zu erzielen.
Quellen: Meaning as Coordinates: Semantic Search, Vector Databases, and RAG
Ein Suchfeld, das für „ein guter Haustier für eine aktive Person“ nichts anzeigt, obwohl die Wissensdatenbank voller Ratschläge zu Hunden ist, zeigt genau, wo die Schlüsselwortabgleichsfunktion versagt. Die Behebung dieses Problems bedeutet, Bedeutung als Position im Raum zu betrachten. Diese Idee liegt der semantischen Suche, Vektordatenbanken sowie retrieval-augmented generation zugrunde, und ein kleines Beispiel reicht aus, um all das zu veranschaulichen.
Das durchgehend verwendete Beispiel
Stellen Sie sich eine Miniatur-Wissensdatenbank mit vier Sätzen vor:
1. Dogs are loyal and need daily walks and exercise
2. Cats are independent pets that groom themselves
3. Golden retrievers are friendly family dogs
4. The capital of France is Paris
Ein Benutzer fragt:
"What's a good pet for an active person who exercises a lot?"
Die Frage enthält niemals die Wörter Hund oder Spaziergang. Eine einfache Schlüsselwortsuche würde nichts Nützliches ergeben. Dennoch kann eine Maschine trotzdem die richtige Antwort liefern, weil sie vergleicht, wo die Texte in einem Bedeutungsräumchen liegen, und nicht, welche Wörter sie teilen.
Ähnliche Bedeutungen, nahegelegene Punkte
Ein Vektor ist einfach eine Zeile von Zahlen, die die Bedeutung eines Textabschnitts kodieren. Da ähnliche Bedeutungen ähnliche Vektoren erzeugen, wird das Finden von verwandten Texten zum Finden von nahegelegenen Punkten. Dadurch verwandelt sich ein Sprachproblem in ein Geometrieproblem, was die Grundlage der modernen Suchfunktionen, Empfehlungssysteme sowie von RAG darstellt – einer Technik, bei der einem Sprachmodell eine externe Bibliothek zur Verfügung gestellt wird, damit es aufhört, Dinge auszudenken.
Wenn Bedeutung eine Reihe von Koordinaten ist, bedeutet die Arbeit mit Bedeutung, mit Entfernung und Richtung zu arbeiten – etwas, was Computer hervorragend können.
Embeddings für ganze Abschnitte
Wortebene-Vektoren reichen nicht aus, um Dokumente zu durchsuchen. Für einen Satz, einen Absatz oder eine Seite ist ein einziger Vektor erforderlich. Transformer-Modelle können einen solchen Vektor erzeugen: Man gibt einen Textabschnitt ein und erhält einen Vektor, der in der Regel als Embedding bezeichnet wird und die Bedeutung des Abschnitts zusammenfasst.
"Dogs need daily walks" ──► [ 0.91, 0.08, -0.30, ... ] (e.g. 384 numbers)
"The capital is Paris" ──► [-0.05, 0.62, 0.44, ... ]
Eine Satzembedding komprimiert einen Textabschnitt in eine Liste von Zahlen fester Länge. Zwei Texte zum selben Thema ergeben ähnliche Listen, während unverwandte Texte sehr unterschiedliche Ergebnisse liefern. Die einzelnen Zahlen bedeuten für einen Menschen nichts. Entscheidend ist vielmehr, wie sie zueinander stehen, und niemand liest sie direkt. Sie werden lediglich miteinander verglichen.
Das Bild, das man im Kopf behalten sollte
Stellen Sie sich jeden Text als einen Punkt im Raum vor. Texte mit ähnlicher Bedeutung befinden sich in der Nähe voneinander, während unverwandte Texte weit voneinander entfernt sind.
(a simplified 2-D "meaning space")
dog walks • • golden retriever ← the "dogs" neighborhood
\ /
(pets)
cat grooming • • Paris ← far away, different topic
In dieser vereinfachten Karte liegen die beiden Sätze über Hunde zusammen, der Satz über die Katze befindet sich in ihrer Nähe, da er ebenfalls von einem Haustier handelt, während der Satz über Paris in einer völlig anderen Region liegt. Reale Embedding-Räume haben Hunderte von Dimensionen, doch die Intuition bleibt dieselbe: Beziehungsreiche Bedeutungen bedeuten nahegelegene Punkte. Alles, was folgt, ist eine Methode, um die nächstgelegenen Punkte zu finden.
Schlüsselwortsuche gegenüber semantischer Suche
Bei der Schlüsselwortsuche werden Wörter abgeglichen. Eine Suche nach „Übung“ überspringt ein Dokument, das von täglichen Spaziergängen spricht, da keine Wörter übereinstimmen. Sie ist schnell, aber wörtlich und vernachlässigt die Bedeutung.
Bei der semantischen Suche werden Bedeutungen abgeglichen. Die Abfrage wird in einen Vektor umgewandelt, und es werden die Dokumentvektoren zurückgegeben, die am nächsten daran liegen – unabhängig davon, welche Wörter sie verwenden. Hier ist die für das Beispiel ermittelte Rangliste unter Verwendung tatsächlicher Ähnlichkeitswerte:
Query: "a good pet for an active person who exercises"
0.999 ############################# Golden retrievers are friendly family dogs
0.995 ############################# Dogs are loyal and need daily walks and exercise
0.398 ########### Cats are independent pets that groom themselves
0.059 # The capital of France is Paris
Die Abfrage weist keine Schlüsselwörter mit den Sätzen über Hunde auf, doch beide erzielen einen Wert von etwa 1,0. Der Satz über die Katze liegt in der Mitte, weil es sich immer noch um ein Haustier handelt, und der Satz über Paris liegt nahe bei null. Eine Schlüsselwortsuche hätte nichts ergeben. Deshalb wirkt die semantische Suche intelligent: Sie erkennt, dass eine aktive Person, die Sport treibt, und ein Hund, der täglich ausgeführt werden muss, im Grunde dasselbe bedeuten. Der Unterschied zwischen Schlüsselwort- und semantischer Suche ist der Unterschied zwischen „keine Ergebnisse gefunden“ und der tatsächlich gewünschten Antwort.
Abmessung der Ähnlichkeit mit der Kosinusähnlichkeit
Das übliche Werkzeug zur Messung der Nähe zweier Vektoren ist die Kosinusähnlichkeit. Dabei wird der Winkel zwischen zwei Pfeilen berücksichtigt, während ihre Länge ignoriert wird.
- Pfeile, die in dieselbe Richtung zeigen, ergeben eine Ähnlichkeit nahe 1, was eine sehr ähnliche Bedeutung bedeutet.
- Pfeile, die rechtwinklig zueinander stehen, ergeben eine Ähnlichkeit nahe 0, was eine Unverwandtschaft bedeutet.
- Pfeile, die in entgegengesetzte Richtungen zeigen, geben eine Ähnlichkeit von fast -1 an, was eine entgegengesetzte Bedeutung bedeutet.
Ein kleiner Winkel zwischen der Abfrage und einem Dokument über Hunde sieht so aus:
^ query
│ /
│/ small angle → cosine ≈ 1 (similar)
└──────► dog doc
Und ein Weitwinkelbild zum Pariser Dokument:
^ query
│
└──────► Paris doc big angle → cosine ≈ 0 (unrelated)
Strecke wird anstelle der Länge verwendet, damit lange und kurze Texte fair verglichen werden können. Die Mathematik passt in eine Zeile: Multiplizieren Sie die Vektoren miteinander und normalisieren Sie sie.
import numpy as np
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
Jede Zahl in der obigen Rangliste entsteht durch diese kleine Funktion. Die Werte reichen von -1 bis 1, wobei Werte nahe 1 bedeuten, dass die beiden Texte dasselbe bedeuten.
Vektordatenbanken für skalierbaren Suchverkehr
Im Beispiel sind vier Dokumente enthalten. Reale Systeme speichern Millionen oder Milliarden von Dokumenten – beispielsweise alle Support-Tickets, Produktseiten oder Abschnitte aus Unternehmensdokumentationen. Jedes Suchanfrage gegen eine Milliarde Vektoren einzeln zu vergleichen, wäre äußerst langsam.
Dafür gibt es Vektordatenbanken. Es handelt sich dabei um Speicherlösungen, die darauf ausgelegt sind, eine Aufgabe besonders gut zu erledigen: Eine Abfragenvektor zu nehmen und schnell die am nächsten liegenden gespeicherten Vektoren zurückzugeben. Dabei wird die annähernde Näherungs-Nachbarnsuche genutzt – eine Gruppe intelligenter Indizes, die nahezu die passendsten Ergebnisse finden, indem sie die meisten Vergleiche überspringen. Ein geringer Verlust an Genauigkeit wird durch eine enorme Geschwindigkeitssteigerung ausgeglichen.
documents ─► embed ─► [ vector database ]
│ stores millions of vectors
│ + a smart index (ANN)
query ─► embed ─────────► │
▼
top-k nearest matches (in milliseconds)
Die Dokumente durchlaufen das Embedding-Modell nur einmal und werden zusammen mit einem Index gespeichert. Wenn eine Frage eintrifft, wird auch sie eingebettet, und die Datenbank antwortet umgehend mit den k besten passenden Elementen – unabhängig davon, wie viele Vektoren sie enthält. Zu den Produkten in diesem Bereich gehören FAISS, Pinecone, Weaviate, Chroma und Milvus sowie pgvector, eine Erweiterung, die die Vektorabfrage in herkömmliches PostgreSQL bringt. Die Details unterscheiden sich, doch alle speichern Embeddings und finden schnell Nachbarn. Kurz gesagt: Eine Vektordatenbank ist ein Suchmaschinen für Bedeutung.
Was Sprachmodelle im Alltag falsch machen
Große Sprachmodelle sind beeindruckend, haben aber allein drei erhebliche Schwächen:
- Halluzinationen. Wenn sie unsicher sind, liefern sie flüssige, selbstbewusste – aber falsche – Antworten.
- Wissensgrenze. Das Modell kennt nur das, was sich in den Trainingsdaten befand, die zu einem früheren Zeitpunkt festgehalten wurden.
- Keine Kenntnis Ihrer Daten. Interne Dokumente, private Notizen sowie die Besprechung von letzter Woche sind dem Modell völlig unbekannt.
You: "What's our refund policy?"
Plain LLM: "Typically, refunds are offered within 30 days..." ← a guess, not YOUR policy
Beim Fragen nach einer Rückerstattungspolitik antwortet ein einfaches Modell aus dem Gedächtnis mit einer plausiblen Schätzung, anstatt die tatsächliche Firmenpolitik anzugeben. Das ist riskant, wenn es um faktische oder vertrauliche Informationen geht. Es ist notwendig, genau dann die richtigen Fakten bereitzustellen, wenn das Modell antwortet – ohne erneutes Trainieren – und RAG leistet genau das.
Retrieval-augmented Generation
RAG vereint all das in einem einzigen Prozessschritt. Anstatt vom Modell zu verlangen, aus dem Gedächtnis zu antworten, werden zunächst relevante Dokumente über eine semantische Suche abgerufen, und anschließend wird das Modell gebeten, auf dieser Grundlage zu antworten. Der Name beschreibt den Prozess: „Retrieval“ bedeutet das Finden relevanter Texte, „augmented“ bedeutet deren Hinzufügen zum Prompt, und „Generation“ ermöglicht es dem Modell, die Antwort zu verfassen.
1. Question ─► embed ─► search the vector DB ─► top relevant chunks
│
2. Build a prompt: "Using ONLY the context below, answer the question.
Context: [retrieved chunks]
Question: [user's question]"
│
3. LLM generates an answer grounded in the retrieved text ─► with sources
Das Beispiel durchlaufen:
Question: "What's a good pet for an active person?"
→ retrieves docs 1 & 3 (the dog sentences, from Figure 3)
→ prompt: "Using this context: [Dogs need daily walks and exercise;
Golden retrievers are friendly family dogs] — answer the question."
→ LLM: "A dog — especially a golden retriever — is a great fit, since
they need daily walks and exercise. (Source: docs 1, 3)"
Die Antwort basiert nun auf fundierten Quellen. Sie stützt sich auf echte Dokumente, die der Eigentümer kontrolliert, und kann angeben, woher eine Information stammt. Weit weniger erfundene Antworten dringen durch. RAG ist eine semantische Suche in Kombination mit einem Sprachmodell: Zuerst werden die richtigen Fakten abgerufen, anschließend formuliert das Modell die Antwort.
Der praktische Ablauf und seine Hauptfallstricke
RAG umfasst zwei Phasen. Die Einrichtung erfolgt einmalig, während Abfragen jedes Mal stattfinden, wenn jemand eine Frage stellt.
── SETUP (once) ── ── QUERY (every question) ──
documents user question
│ split into chunks │ embed
│ embed each chunk │ search vector DB
│ store in vector DB │ get top-k chunks
▼ │ build prompt with chunks
[ vector database ] ◄───── search ──────┤ send to LLM
▼
grounded answer
Dokumente werden in Blöcke aufgeteilt, eingebettet und nur einmal gespeichert. Jede Frage wird eingebettet, mit den gespeicherten Daten abgeglichen, und die besten Blöcke werden an das Modell weitergeleitet, um die endgültige Antwort zu erstellen.
Das Problem liegt bei der Aufteilung in Blöcke, also bei der Art und Weise, wie Dokumente vor dem Einbetten aufgeteilt werden. Zu große Blöcke vermischen mehrere Themen zu einem einzigen Vektor und führen zu ungenauen Abgleichen. Zu kleine Blöcke führen zum Verlust des Kontexts, wodurch eine Antwort möglicherweise in zwei Teile geteilt wird. Die Wahl der Blöckengröße gehört zu den wichtigsten praktischen Entscheidungen in einem funktionsfähigen RAG-System – und erinnert daran, dass eine unauffällige Datenvorbereitung alles im weiteren Verlauf beeinflusst.
Dasselbe in Code
Der für die Suche zuständige Teil von RAG, eine einfache semantische Suche, benötigt nur wenige Zeilen in NumPy. Er erhält Vektoren für einige Dokumente sowie einen Vektor für die Abfrage und sortiert die Dokumente nach kosinusähnlicher Ähnlichkeit:
import numpy as np
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))def search(query_vec, doc_vecs, docs, k=2):
scores = [(cosine(query_vec, v), d) for v, d in zip(doc_vecs, docs)]
return sorted(scores, reverse=True)[:k] # top-k most similar
Wenn man die vier Tier- und Paris-Vektoren sowie die Abfrage für aktive Personen verwendet, werden zuerst die beiden Hund-Dokumente zurückgegeben, was mit der zuvor gezeigten Rangliste übereinstimmt. Das ist semantische Suche in nur wenigen Zeilen.
In einem echten Projekt werden Vektoren nicht manuell erstellt. Stattdessen wird ein Embedding-Modell sowie ein Vektorlager aufgerufen, und der Code sieht ungefähr so aus:
# Illustrative real-world usage (libraries download a model, so not run here)
from sentence_transformers import SentenceTransformer
import chromadb
model = SentenceTransformer("all-MiniLM-L6-v2") # turns text into vectors
db = chromadb.Client().create_collection("pets")db.add(documents=my_docs, embeddings=model.encode(my_docs).tolist(),
ids=[str(i) for i in range(len(my_docs))])q = "a good pet for an active person"
hits = db.query(query_embeddings=model.encode([q]).tolist(), n_results=2)
# hits now holds the top-2 most semantically similar documents
Die Bibliotheken übernehmen die schwierigen Aufgaben, doch im Grunde führen sie dieselbe Kosinus-Ähnlichkeitssuche durch. Die semantische Suche basiert auf einigen mathematischen Formeln für Vektoren, und echte Tools umhüllen diese Idee mit Geschwindigkeit und Skalierbarkeit.
Der gesamte Prozess
Der Text beginnt als Zeichen und Token, wird anschließend zu Embeddings, erhält durch Attention-Mechanismen innerhalb eines Transformers Kontext und verwandelt sich schließlich in eine suchbare Karte des Wissens, die Sprachmodelle präzise und nützlich macht.
raw text
→ characters / tokens / embeddings [article 1: From Characters to Meaning]
→ attention turns them into context-aware
vectors inside a transformer [article 2: Attention, Explained Simply]
→ those vectors become coordinates we can
store, search, and retrieve [article 3: this one]
→ semantic search (find by meaning)
→ vector databases (search at scale)
→ RAG (ground an LLM in real data)
Der rote Faden durch all das ist eine im Laufe der Zeit gewachsene Idee: Bedeutung ist ein Punkt im Raum. Zunächst gilt das für Wörter, dann für Sätze im Kontext und schließlich für ganze Bibliotheken von Dokumenten, die durchsucht und analysiert werden können.
Es gibt noch eine weitere Unterscheidung, die man im Hinterkopf behalten sollte. RAG gewährt einem Modell Zugang zu Wissen, ohne das Modell selbst zu verändern – ähnlich wie man ihm Notizen zur Lektüre zum Zeitpunkt der Antwort gibt. Feinabstimmung ist ein anderer Ansatz, bei dem die internen Gewichte des Modells durch Training an Beispielen angepasst werden. RAG stellt Wissen zum Lesen bereit, während Feinabstimmung das Wesen des Modells verändert. Zu wissen, welchen Ansatz man wählen soll, ist an sich eine praktische Fähigkeit.
Verwandte Literatur
- Praktische Hinweise: Die Grenzen der Vektorsuche in RAG – Kosinusähnlichkeit und mehr — Schritt-für-Schritt-Anleitung zu den Praktischen Hinweisen: Die Grenzen der Vektorsuche in RAG – Kosinusähnlichkeit und mehr: Vorlagen, Überprüfungen sowie Code-Blöcke für Teams, die dieses Muster einsetzen.
- Praktische Hinweise: Vektordatenbanken für die Produktivnutzung in RAG – Indexierung, hybride Suche — Schritt-für-Schritt-Anleitung zu den Praktischen Hinweisen: Vektordatenbanken für die Produktivnutzung in RAG – Indexierung, hybride Suche: Vorlagen, Überprüfungen sowie Code-Blöcke für Teams, die dieses Muster einsetzen.