FastEmbed - Lightweight Local Embeddings Cheatsheet
FastEmbed (von Qdrant) ist eine schnelle, leichte Bibliothek zum Generieren von Text-Embeddings lokal. Es führt Modelle über ONNX Runtime aus (keine schwere PyTorch-Abhängigkeit), was es klein, schnell zu installieren und effizient auf CPU macht. Neben Dense Embeddings unterstützt es Sparse (BM25, SPLADE), Late-Interaction (ColBERT) und Reranking Modelle — alles, was du brauchst, um Hybrid Dense+Sparse Search für RAG zu erstellen. Es integriert sich eng mit der Qdrant Vector-Datenbank.
Installation
| Method | Command |
|---|
| pip | pip install fastembed |
| GPU (CUDA) | pip install fastembed-gpu |
| Verify | python -c "from fastembed import TextEmbedding; print('ok')" |
Dense Embeddings
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-small-en-v1.5") # downloads once
docs = ["FastEmbed runs on ONNX.", "It is CPU-friendly."]
vectors = list(model.embed(docs)) # generator of numpy arrays
print(len(vectors), vectors[0].shape)
| Call | Beschreibung |
|---|
TextEmbedding(model_name) | Lade ein Dense-Embedding-Modell |
.embed(list) | Embedde Dokumente (gebündelt, lazy) |
.query_embed(str) | Embedde eine Abfrage (einige Modelle unterscheiden q/d) |
.passage_embed(list) | Embedde Passagen |
TextEmbedding.list_supported_models() | Sehe verfügbare Modelle |
Model Types
| Type | Class | Use |
|---|
| Dense | TextEmbedding | Semantische Ähnlichkeit |
| Sparse (BM25/SPLADE) | SparseTextEmbedding | Keyword/Exact-Term Matching |
| Late interaction (ColBERT) | LateInteractionTextEmbedding | High-Precision Reranking Retrieval |
| Reranking | TextCrossEncoder | Ordne Kandidaten neu |
| Image | ImageEmbedding | Multimodale Embeddings |
Sparse Embeddings (for Hybrid Search)
from fastembed import SparseTextEmbedding
sparse = SparseTextEmbedding("Qdrant/bm25")
sv = list(sparse.embed(["exact term ABC-123 matters"]))
print(sv[0].indices, sv[0].values) # sparse: token indices + weights
Sparse Vektoren erfassen exakte Begriffe (Identifikatoren, Zahlen), die Dense Embeddings glätten — der Schlüssel zu starker Hybrid Search.
Reranking
from fastembed.rerank.cross_encoder import TextCrossEncoder
reranker = TextCrossEncoder("Xenova/ms-marco-MiniLM-L-6-v2")
scores = reranker.rerank("what is fastembed?",
["FastEmbed is an embedding lib.", "Unrelated text."])
Hybrid Search with Qdrant
from fastembed import TextEmbedding, SparseTextEmbedding
# Compute both dense and sparse vectors for each chunk, upsert to Qdrant,
# then query with both and let Qdrant fuse (RRF) the results.
dense = TextEmbedding("BAAI/bge-small-en-v1.5")
sparse = SparseTextEmbedding("Qdrant/bm25")
| Step | Tool |
|---|
| Dense vectors | TextEmbedding |
| Sparse vectors | SparseTextEmbedding (BM25) |
| Store + fuse | Qdrant Native Hybrid Query |
| Optional rerank | TextCrossEncoder |
Why FastEmbed (Design)
| Property | Vorteil |
|---|
| ONNX Runtime | Kein PyTorch; kleine Installation, schnell auf CPU |
| Quantized models | Niedrigerer Speicher/Latenz |
| Lazy generators | Stream Embeddings, Niedriger Speicher |
| Local | Keine API-Aufrufe; Daten bleiben privat |
Common Workflows
# Batch-embed a corpus for a vector DB (CPU-friendly)
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-base-en-v1.5")
embeddings = list(model.embed(corpus, batch_size=64))
# Build hybrid retrieval: dense + BM25 sparse, fused in Qdrant
FastEmbed vs Alternatives
| Aspect | FastEmbed | sentence-transformers | OpenAI embeddings API |
|---|
| Runtime | ONNX (no torch) | PyTorch | Hosted API |
| Sparse/ColBERT | Built-in | Extra libs | No |
| Local/private | Yes | Yes | No |
| Best for | Lightweight local + hybrid | Full torch ecosystem | Managed simplicity |
Resources