Text-Embeddings für RAG und Suche – Python, Ollama, OpenAI-kompatible APIs
RAG-Einbettungen – Python, Ollama, OpenAI-APIs.
Wenn Sie sich mit retrieval-augmented generation (RAG) beschäftigen, führt dieser Abschnitt Sie in einfachen Worten durch Text-Embeddings – was sie sind, wie sie in Suche und Abruf passen und wie man zwei gängige lokale Setups von Python aus mit Ollama oder einer OpenAI-kompatiblen HTTP-API aufruft (wie sie von vielen llama.cpp-basierten Servern bereitgestellt werden).

Für Go-Clients und SDK-Vergleiche für Ollama siehe Go SDKs für Ollama – Vergleich mit Beispielen.
Was ist ein Text-Embedding?
Ein Text-Embedding ist ein Vektor (eine Liste von Gleitkommazahlen), der von einem Embedding-Modell erzeugt wird. Das Modell bildet Text variabler Länge auf einen raum mit fester Dimension ab, sodass Texte mit ähnlicher Bedeutung unter einer Distanz- oder Ähnlichkeitsmetrik (oft Kosinus-ähnlichkeit bei L2-normalisierten Vektoren) nah beieinander liegen.
Embeddings sind nicht dasselbe wie Token-IDs und auch nicht dasselbe wie eine Chat-Vervollständigung. Sie sind eine Repräsentationsebene, die Sie für Suche, Clustering, Deduplizierung und – im Rahmen von RAG – für den Abruf verwenden.
Häufige Anwendungsfälle
| Anwendungsfall | Rolle der Embeddings |
|---|---|
| Semantische Suche / RAG-Abruf | Embeddings von Abfragen und Dokumentenabschnitten erstellen; nach Ähnlichkeit sortieren, um relevante Passagen zu holen. |
| Neusortierung mit Embedding-Modellen | Embedding der Abfrage und jedes Kandidaten erstellen; Paare nach Ähnlichkeit bewerten (siehe Neusortierung mit Embedding-Modellen). |
| Clustering und Deduplizierung | Elemente im Embedding-Raum gruppieren oder deduplizieren, ohne jedes Beispiel manuell zu labeln. |
| Klassifizierungsartiges Scoring | Text mit Prototypbeschreibungen oder Klassennamen im selben Raum vergleichen (Muster variieren je nach Modell). |
Für multimodale Einstellungen (Bild-Text und verwandte Ideen) siehe Cross-modale Embeddings.
Embeddings innerhalb einer RAG-Pipeline
Ein typischer Offline-Pfad ist:
- Chunking von Dokumenten (Größe, Überlappung und Struktur sind wichtig – siehe Chunking-Strategien in RAG).
- Embedding jedes Chunks; optional Metadaten speichern (Quellen-ID, Abschnitt, ACL).
- Indizierung der Vektoren im Arbeitsspeicher, in einer Bibliotheksindexstruktur oder einer Vektor-Datenbank (Abwägungen in Vektor-Speicher für RAG – Vergleich).
Zum Abfragezeitpunkt:
- Embedding der Benutzerabfrage (ein kurzer String oder ein kleiner Batch).
- Abruf der k ähnlichsten Chunks durch Vektorsuche (optional plus Keyword- oder hybride Suche).
- Erstellen eines Prompts aus den abgerufenen Plain-Text-Chunks und Aufruf Ihres Chat-Modells.
Wichtiger Nuance – große Sprachmodelle in Chat-APIs verbrauchen Text (und Tools), keine beliebigen Embedding-Tensoren. Sie verwenden Embeddings, um zu wählen, welchen Text Sie injizieren. Wenn Sie „Abfrage des LLM mit vorkalkulierten Embeddings" sehen, bedeutet das in der Praxis: Abrufen mit Embeddings, dann den ausgewählten Text an das LLM senden.
Embeddings mit Ollama holen (Python)
Ollama stellt eine HTTP-API zur Verfügung. Für Embeddings rufen Sie POST /api/embed auf Ihrem Ollama-Host auf (Standard http://127.0.0.1:11434). Der JSON-Body enthält einen model-Namen und input (ein String oder eine Liste von Strings). Die Antwort enthält embeddings, eine Liste von Vektoren, die mit Ihren Eingaben übereinstimmen.
Installieren Sie httpx (oder verwenden Sie requests auf die gleiche Weise).
import httpx
OLLAMA = "http://127.0.0.1:11434"
MODEL = "nomic-embed-text" # ersetzen Sie dies durch ein Embedding-Modell, das Sie heruntergeladen haben
def embed_ollama(texts: list[str]) -> list[list[float]]:
r = httpx.post(
f"{OLLAMA}/api/embed",
json={"model": MODEL, "input": texts},
timeout=120.0,
)
r.raise_for_status()
data = r.json()
return data["embeddings"]
if __name__ == "__main__":
q = "Was ist Retrieval-Augmented Generation?"
chunks = [
"RAG kombiniert Abruf mit Generierung.",
"Embeddings bilden Text in einen Vektorraum für Ähnlichkeitssuche ab.",
]
qv = embed_ollama([q])[0]
doc_vs = embed_ollama(chunks)
print(len(qv), len(doc_vs), len(doc_vs[0]))
Operationale Hinweise
- Ziehen Sie das Modell zuerst (
ollama pull …für Ihr gewähltes Tag). Für Qwen3-Klassenmodelle auf Ollama siehe Qwen3 Embedding & Reranker Models on Ollama. - Unter Last interagiert die Embedding-Durchsatzrate damit, wie Ollama Arbeit plant – siehe Wie Ollama parallele Anfragen handhabt.
Embeddings mit einem OpenAI-kompatiblen Server holen (Python)
Viele lokale Server (einschließlich gängiger llama.cpp-HTTP-Setups) stellen OpenAI-kompatible Routen wie POST /v1/embeddings zur Verfügung. Sie können das offizielle openai-Python-Paket verwenden und base_url auf das …/v1-Root-Verzeichnis Ihres Servers zeigen.
from openai import OpenAI
# Beispiel – ersetzen Sie Host, Port und Modell-ID durch die Werte Ihres Servers
client = OpenAI(
base_url="http://127.0.0.1:8080/v1",
api_key="not-needed", # viele lokale Server ignorieren dies
)
def embed_openai_compatible(text: str, model: str) -> list[float]:
r = client.embeddings.create(model=model, input=text)
return r.data[0].embedding
if __name__ == "__main__":
v = embed_openai_compatible("hallo von llama.cpp", "ihre-embedding-modell-id")
print(len(v))
Warum beide Muster auf einer Seite halten? Die Konzepte (chunk, embed, index, query, retrieve text) sind identisch; nur die HTTP-Oberfläche ändert sich. Ein Artikel im Workshop-Stil vermeidet es, dieselbe Erzählung unter zwei URLs zu duplizieren.
Vektoren speichern und abfragen
Sie müssen mindestens pro Chunk drei Dinge speichern – Vektor, Text und Metadaten (Quellen-ID, Offsets, ACL). Für einen schnellen Prototyp können Sie alles in einer Python-Liste behalten und Kosinus-ähnlichkeit mit NumPy oder scikit-learn verwenden. Für wachsende Daten verwenden Sie eine Vektor-Datenbank oder einen Bibliotheksindex (FAISS usw.); siehe Vektor-Speicher für RAG – Vergleich für produktionsrelevante Abwägungen.
Konzeptionelle Abfrageschleife:
query_vec = embed(query)neighbors = index.search(query_vec, k)context = "\n\n".join(chunk.text for chunk in neighbors)- Senden Sie
contextund die Benutzerfrage an Ihre Chat-API.
Neusortierung nach dem Abruf
Ein Reranker (oft ein Cross-Encoder oder ein zweites Scoring-Modell) kann die Top-Kandidaten nach dem Vektorabruf neu sortieren. Diese Site enthält Python- und Go-Beispiele, einschließlich Neusortierung mit Embedding-Modellen und Neusortierung mit Ollama und Qwen3 Embedding in Go.
Auf dieser Site – verwandte Artikel
| Thema | Artikel |
|---|---|
| Vollständige RAG-Architektur | RAG-Tutorial – Architektur, Implementierung, Produktion |
| Chunking vor dem Embedding | Chunking-Strategien in RAG |
| Wahl der Vektor-Datenbank | Vektor-Speicher für RAG – Vergleich |
| Qwen3 auf Ollama | Qwen3 Embedding & Reranker auf Ollama |
| Cross-modale | Cross-modale Embeddings |
| Ollama CLI & Tipps | Ollama Cheatsheet |
| Go + Ollama | Ollama in Go verwenden – SDK-Vergleich |
Nützliche Links
- Ollama – Modelle und Laufzeitumgebung
- Ollama API – embed – Upstream-API-Referenz für
/api/embed - OpenAI Python-Bibliothek – funktioniert mit jeder OpenAI-kompatiblen
base_url