BestRAG - تخزين واسترجاع RAG الهجين
BestRAG (أفضل توليد معتمد على الاسترجاع) هي مكتبة Python لبناء خطوط أنابيب راج هجينة. تجمع بين كثيفة و قليلة و تفاعل متأخر التضمينات لتخزين واسترجاع المستندات بكفاءة باستخدام Qdrant كمتجر المتجهات و FastEmbed للتضمينات. الفكرة: تخزين كل مقطع مرة واحدة مع تمثيلات متعددة ثم استرجاع مع دمج الملاءمة حتى تحصل على كل من استعادة كثيفة الدلالات ودقة قليلة بدقة المصطلحات.
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install bestrag |
| المتطلبات | مثيل Qdrant (محلي Docker أو Qdrant Cloud) |
| التضمينات | يستخدم FastEmbed تحت الغطاء |
| التحقق | python -c "import bestrag; print('ok')" |
لماذا هجين
| نوع الاسترجاع | قوي في | ضعيف في |
|---|
| كثيف (متجه) | المعنى والإعادة الصيغة | معرّفات دقيقة وأرقام ومصطلحات نادرة |
| قليل (BM25) | المصطلحات الدقيقة والمعرّفات | المرادفات والإعادة صيغة |
| تفاعل متأخر | مطابقة الرمز الدقيقة | التكلفة |
| مدمجة (هجين) | أفضل من كثيفة + قليلة | — |
BestRAG يخزن جميع التمثيلات بحيث يستفيد استعلام واحد من كل واحد منهم.
الاستخدام الأساسي
from bestrag import BestRAG
rag = BestRAG(
url="http://localhost:6333", # Qdrant
api_key="...", # إذا كان يستخدم Qdrant Cloud
collection_name="docs",
)
# التعاطي مع المستندات (تضمينات كثيفة + قليلة + تفاعل متأخر، إدراج في Qdrant)
rag.store_pdf("handbook.pdf")
rag.store_text("Nick تفضل الإجابات المختصرة.", metadata={"source": "prefs"})
# استرجاع مع دمج ملاءمة هجينة
results = rag.search("ماذا تقول سياسة الاسترجاع؟", limit=5)
for r in results:
print(r.score, r.text)
| الطريقة | الوصف |
|---|
BestRAG(url, collection_name, ...) | الاتصال بـ Qdrant اختر مجموعة |
store_pdf(path) | تحليل + مقطع + تضمين + إدراج PDF |
store_text(text, metadata=...) | تعاطي النص الخام |
search(query, limit=k) | استرجاع هجين (مندمج) |
delete(...) | إزالة المستندات |
ما الذي يحدث عند الاستخدام
| خطوة | التفاصيل |
|---|
| تحليل | استخراج النصوص (على سبيل المثال من PDF) |
| مقطع | انقسم إلى مقاطع |
| تضمين | ناقل كثيف + قليل + تفاعل متأخر لكل مقطع |
| إدراج | تخزين جميع المتجهات + الحمولة في Qdrant |
ما الذي يحدث عند البحث
| خطوة | التفاصيل |
|---|
| تضمين الاستعلام | كثيف + قليل (+ تفاعل متأخر) |
| Qdrant الاستعلام | استعادة المرشحين لكل تمثيل |
| دمج | دمج الترتيبات (نمط RRF) في قائمة واحدة |
| إرجاع | الممرات العليا مع الدرجات + البيانات الوصفية |
تغذية النتائج إلى LLM
# استرجاع ثم بناء موجه مؤسس
hits = rag.search(user_question, limit=5)
context = "\n\n".join(h.text for h in hits)
prompt = f"الإجابة باستخدام هذا السياق فقط:\n{context}\n\nQ: {user_question}"
# → أرسل الموجه إلى LLM الخاص بك
الضبط
| الرافعة | التأثير |
|---|
| حجم/تداخل المقطع | دقة الاسترجاع |
| نموذج كثيف | الجودة الدلالية (عبر FastEmbed) |
| نموذج قليل | مطابقة المصطلح الدقيقة (BM25) |
limit (k) | استعادة مقابل حجم الموجه |
| مرشحات البيانات الوصفية | تقييد نطاق البحث / التحكم في الوصول |
BestRAG مقابل البناء الخاص بك
| الجانب | BestRAG | يدوي (LangChain/LlamaIndex) |
|---|
| إعداد هجين | مدمج (كثيف+قليل+LI) | الأسلاك اليدوية |
| متجر | Qdrant، بآراء الأمور | أي، مرن |
| السيطرة | أبسط، عدد أقل من الأزرار | تحكم كامل |
| الأفضل لـ | بداية راج هجينة سريعة | خطوط أنابيب مخصصة |
مبني على FastEmbed و Qdrant؛ الوصول إلى LangChain أو LlamaIndex عندما تحتاج إلى تحكم خط أنابيب كامل.
الموارد