FastEmbed - مكتبة التضمينات المحلية الخفيفة
FastEmbed (من Qdrant) هي مكتبة سريعة وخفيفة لإنشاء تضمينات النصوص محلياً. تقوم بتشغيل النماذج عبر ONNX Runtime (بدون اعتماد PyTorch الثقيل) الذي يجعلها صغيرة وسريعة التثبيت وفعالة على وحدة المعالجة المركزية. بالإضافة إلى التضمينات الكثيفة فإنها تدعم قليلة (BM25, SPLADE), تفاعل متأخر (ColBERT), وإعادة ترتيب النماذج — كل ما تحتاجه لبناء بحث كثيف+قليل هجين لـ RAG. يتكامل بإحكام مع قاعدة بيانات Qdrant المتجهة.
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install fastembed |
| GPU (CUDA) | pip install fastembed-gpu |
| التحقق | python -c "from fastembed import TextEmbedding; print('ok')" |
تضمينات كثيفة
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-small-en-v1.5") # التنزيلات مرة واحدة
docs = ["FastEmbed يعمل على ONNX.", "إنها صديقة للـ CPU."]
vectors = list(model.embed(docs)) # مولد مصفوفات numpy
print(len(vectors), vectors[0].shape)
| استدعاء | الوصف |
|---|
TextEmbedding(model_name) | قم بتحميل نموذج التضمين الكثيف |
.embed(list) | تضمين المستندات (مجموعة، كسول) |
.query_embed(str) | تضمين استعلام (بعض النماذج تختلف q/d) |
.passage_embed(list) | تضمين المقاطع |
TextEmbedding.list_supported_models() | انظر النماذج المتاحة |
أنواع النماذج
| النوع | الفئة | الاستخدام |
|---|
| كثيف | TextEmbedding | التشابه الدلالي |
| قليل (BM25/SPLADE) | SparseTextEmbedding | مطابقة الكلمات الرئيسية/الحد الأدنى |
| تفاعل متأخر (ColBERT) | LateInteractionTextEmbedding | استرجاع إعادة ترتيب عالي الدقة |
| إعادة ترتيب | TextCrossEncoder | إعادة ترتيب المرشحين |
| صورة | ImageEmbedding | التضمينات متعددة الأنماط |
تضمينات قليلة (للبحث الهجين)
from fastembed import SparseTextEmbedding
sparse = SparseTextEmbedding("Qdrant/bm25")
sv = list(sparse.embed(["مصطلح دقيق ABC-123 يهم"]))
print(sv[0].indices, sv[0].values) # متناثر: فهارس الرمز + الأوزان
المتجهات القليلة تلتقط المصطلحات الدقيقة (المعرفات والأرقام) التي تُتمع التضمينات الكثيفة — المفتاح لبحث هجين قوي.
إعادة الترتيب
from fastembed.rerank.cross_encoder import TextCrossEncoder
reranker = TextCrossEncoder("Xenova/ms-marco-MiniLM-L-6-v2")
scores = reranker.rerank("ما هو fastembed؟",
["FastEmbed هي مكتبة تضمين.", "نص غير ذي صلة."])
البحث الهجين مع Qdrant
from fastembed import TextEmbedding, SparseTextEmbedding
# قم بحساب المتجهات الكثيفة والقليلة لكل مقطع، الإدراج إلى Qdrant،
# ثم الاستعلام عن كليهما وللسماح لـ Qdrant بدمج نتائج (RRF).
dense = TextEmbedding("BAAI/bge-small-en-v1.5")
sparse = SparseTextEmbedding("Qdrant/bm25")
| خطوة | الأداة |
|---|
| المتجهات الكثيفة | TextEmbedding |
| المتجهات القليلة | SparseTextEmbedding (BM25) |
| التخزين + الدمج | استعلام هجين أصلي Qdrant |
| إعادة ترتيب اختيارية | TextCrossEncoder |
لماذا FastEmbed (التصميم)
| الملكية | الفائدة |
|---|
| ONNX Runtime | لا PyTorch؛ تثبيت صغير وسريع على وحدة المعالجة المركزية |
| نماذج مُحددة الكمية | ذاكرة منخفضة/زمن وصول |
| مولدات كسولة | بث التضمينات والذاكرة المنخفضة |
| محلي | بدون استدعاءات API؛ البيانات تبقى خاصة |
سير العمل العام
# دفعة - تضمين مجموعة بيانات لـ DB متجه (صديق CPU)
from fastembed import TextEmbedding
model = TextEmbedding("BAAI/bge-base-en-v1.5")
embeddings = list(model.embed(corpus, batch_size=64))
# بناء استرجاع هجين: كثيف + BM25 متناثر، مندمج في Qdrant
FastEmbed مقابل البدائل
| الجانب | FastEmbed | جملة-محولات | OpenAI تضمين API |
|---|
| وقت التشغيل | ONNX (بدون torch) | PyTorch | API مستضاف |
| Sparse/ColBERT | مدمج | مكتبات إضافية | لا |
| محلي/خاص | نعم | نعم | لا |
| الأفضل لـ | محلي خفيف + هجين | نظام المشاعل الكامل | بساطة مُدارة |
الموارد