FastEmbed - Embeddings légers locaux
FastEmbed (par Qdrant) est une bibliothèque rapide et légère pour générer des embeddings de texte localement. Elle exécute les modèles via ONNX Runtime (aucune dépendance PyTorch lourde), ce qui la rend petite, rapide à installer et efficace sur CPU. Au-delà des embeddings denses, elle prend en charge les creux (BM25, SPLADE), late-interaction (ColBERT) et les modèles de réorganisation — tout ce dont vous avez besoin pour construire la recherche hybride dense + sparse pour la RAG. Elle s’intègre étroitement avec la base de données vectorielle Qdrant.
Installation
| Méthode | Commande |
|---|
| pip | pip install fastembed |
| GPU (CUDA) | pip install fastembed-gpu |
| Vérifier | python -c "from fastembed import TextEmbedding; print('ok')" |
Embeddings denses
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)
| Appel | Description |
|---|
TextEmbedding(model_name) | Charger un modèle d’embedding dense |
.embed(list) | Intégrer des documents (par lot, lazy) |
.query_embed(str) | Intégrer une requête (certains modèles diffèrent q/d) |
.passage_embed(list) | Intégrer des passages |
TextEmbedding.list_supported_models() | Voir les modèles disponibles |
Types de modèles
| Type | Classe | Utilisation |
|---|
| Denses | TextEmbedding | Similarité sémantique |
| Creux (BM25/SPLADE) | SparseTextEmbedding | Correspondance de mots-clés/terme exact |
| Late interaction (ColBERT) | LateInteractionTextEmbedding | Récupération de réorganisation haute précision |
| Réorganisation | TextCrossEncoder | Réorganiser les candidats |
| Image | ImageEmbedding | Embeddings multimodaux |
Embeddings creux (pour la recherche hybride)
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
Les vecteurs creux capturent les termes exacts (identifiants, nombres) que les embeddings denses lissent — la clé d’une forte recherche hybride.
Réorganisation
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."])
Recherche hybride avec 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")
| Étape | Outil |
|---|
| Vecteurs denses | TextEmbedding |
| Vecteurs creux | SparseTextEmbedding (BM25) |
| Stocker + fusionner | Requête hybride native Qdrant |
| Réorganisation optionnelle | TextCrossEncoder |
Pourquoi FastEmbed (conception)
| Propriété | Avantage |
|---|
| ONNX Runtime | Pas de PyTorch ; petite installation, rapide sur CPU |
| Modèles quantifiés | Mémoire/latence inférieure |
| Générateurs lazy | Embeds de flux, basse mémoire |
| Local | Pas d’appels API ; les données restent privées |
Flux de travail courants
# 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 | API d’embeddings OpenAI |
|---|
| Runtime | ONNX (pas torch) | PyTorch | API hébergée |
| Creux/ColBERT | Intégré | Libs supplémentaires | Non |
| Local/privé | Oui | Oui | Non |
| Meilleur pour | Hybride local léger + | Écosystème torch complet | Simplicité gérée |
Ressources