Text-Embeddings für RAG und Suche – Python, Ollama, OpenAI-kompatible APIs

RAG-Einbettungen – Python, Ollama, OpenAI-APIs.

Inhaltsverzeichnis

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).

Text-Embeddings und Abruf

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:

  1. Chunking von Dokumenten (Größe, Überlappung und Struktur sind wichtig – siehe Chunking-Strategien in RAG).
  2. Embedding jedes Chunks; optional Metadaten speichern (Quellen-ID, Abschnitt, ACL).
  3. Indizierung der Vektoren im Arbeitsspeicher, in einer Bibliotheksindexstruktur oder einer Vektor-Datenbank (Abwägungen in Vektor-Speicher für RAG – Vergleich).

Zum Abfragezeitpunkt:

  1. Embedding der Benutzerabfrage (ein kurzer String oder ein kleiner Batch).
  2. Abruf der k ähnlichsten Chunks durch Vektorsuche (optional plus Keyword- oder hybride Suche).
  3. 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

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 speichernVektor, 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:

  1. query_vec = embed(query)
  2. neighbors = index.search(query_vec, k)
  3. context = "\n\n".join(chunk.text for chunk in neighbors)
  4. Senden Sie context und 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