FastEmbed - Incrustaciones ligeras locales
FastEmbed (de Qdrant) es una biblioteca rápida y ligera para generar incrustaciones de texto localmente. Ejecuta modelos a través de ONNX Runtime (sin dependencia pesada de PyTorch), lo que lo hace pequeño, rápido de instalar y eficiente en CPU. Más allá de incrustaciones densas, admite disperso (BM25, SPLADE), interacción tardía (ColBERT) y modelos de reranking — todo lo que necesitas para construir búsqueda densa+dispersa híbrida para RAG. Se integra estrechamente con la base de datos de vectores de Qdrant.
Instalación
| Método | Comando |
|---|
| pip | pip install fastembed |
| GPU (CUDA) | pip install fastembed-gpu |
| Verificar | python -c "from fastembed import TextEmbedding; print('ok')" |
Incrustaciones densas
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-small-en-v1.5") # descarga una vez
docs = ["FastEmbed runs on ONNX.", "It is CPU-friendly."]
vectors = list(model.embed(docs)) # generador de arrays numpy
print(len(vectors), vectors[0].shape)
| Llamada | Descripción |
|---|
TextEmbedding(model_name) | Carga un modelo de incrustación densa |
.embed(list) | Incrusta documentos (lote, perezoso) |
.query_embed(str) | Incrusta una consulta (algunos modelos difieren q/d) |
.passage_embed(list) | Incrusta pasajes |
TextEmbedding.list_supported_models() | Ver modelos disponibles |
Tipos de modelo
| Tipo | Clase | Usar |
|---|
| Densa | TextEmbedding | Similitud semántica |
| Disperso (BM25/SPLADE) | SparseTextEmbedding | Coincidencia de palabra clave/término exacto |
| Interacción tardía (ColBERT) | LateInteractionTextEmbedding | Recuperación de reranking de precisión alta |
| Reranking | TextCrossEncoder | Reordena candidatos |
| Imagen | ImageEmbedding | Incrustaciones multimodales |
Incrustaciones dispersas (para búsqueda híbrida)
from fastembed import SparseTextEmbedding
sparse = SparseTextEmbedding("Qdrant/bm25")
sv = list(sparse.embed(["exact term ABC-123 matters"]))
print(sv[0].indices, sv[0].values) # disperso: índices de token + pesos
Los vectores dispersos capturan términos exactos (identificadores, números) que las incrustaciones densas suavizan — la clave para una búsqueda híbrida fuerte.
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."])
Búsqueda híbrida con Qdrant
from fastembed import TextEmbedding, SparseTextEmbedding
# Calcula vectores densos y dispersos para cada fragmento, upsert a Qdrant,
# luego consulta con ambos y deja que Qdrant funda (RRF) los resultados.
dense = TextEmbedding("BAAI/bge-small-en-v1.5")
sparse = SparseTextEmbedding("Qdrant/bm25")
| Paso | Herramienta |
|---|
| Vectores densos | TextEmbedding |
| Vectores dispersos | SparseTextEmbedding (BM25) |
| Almacena + funde | Consulta híbrida nativa de Qdrant |
| Reranking opcional | TextCrossEncoder |
Por qué FastEmbed (Diseño)
| Propiedad | Beneficio |
|---|
| ONNX Runtime | Sin PyTorch; instalación pequeña, rápida en CPU |
| Modelos cuantizados | Memoria/latencia inferior |
| Generadores perezosos | Incrusta streams, baja memoria |
| Local | Sin llamadas API; los datos permanecen privados |
Flujos de trabajo comunes
# Incrusta lote un corpus para una base de datos de vectores (amigable con CPU)
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-base-en-v1.5")
embeddings = list(model.embed(corpus, batch_size=64))
# Construir recuperación híbrida: densa + BM25 dispersa, fusionada en Qdrant
FastEmbed vs alternativas
| Aspecto | FastEmbed | sentence-transformers | OpenAI embeddings API |
|---|
| Runtime | ONNX (sin torch) | PyTorch | API alojada |
| Disperso/ColBERT | Incorporado | Librerías extra | No |
| Local/privado | Sí | Sí | No |
| Mejor para | Ligero local + híbrido | Ecosistema torch completo | Simplicidad gestionada |
Recursos