Key Takeaways
- RAG = رفع المستندات + الاسترجاع + إجابة LLM المحلي. لا يتطلب تدريبًا.
- خمس خطوات: (1) تحميل المستندات، (2) تقسيم إلى أجزاء 500-1000 رمز، (3) توليد embeddings، (4) تخزين في قاعدة بيانات متجهية، (5) الاسترجاع عند الاستعلام.
- أفضل نموذج embedding: nomic-embed-text (137M، يعمل محليًا، متجهات 768 بُعدًا).
- أفضل قاعدة بيانات متجهية: Chroma (بسيطة، مدمجة) لأقل من مليون مستند؛ Qdrant (موزّعة) للإنتاج.
- اعتبارًا من أبريل 2026، RAG المحلي أسرع وأرخص من واجهات API السحابية. تعتمد الجودة على دقة الاسترجاع وهندسة المطالبات.
كيف يعمل RAG خطوة بخطوة؟
- 1استيعاب المستندات: تحميل ملفات PDF أو نصية أو صفحات ويب.
- 2التقسيم: تقسيم المستندات إلى أجزاء 500-1000 رمز (تداخل 20% لتجنّب قطع السياق).
- 3Embedding: تحويل كل جزء إلى متجه (768-1536 بُعدًا) باستخدام نموذج embedding محلي.
- 4التخزين: حفظ المتجهات في قاعدة بيانات متجهية (Chroma، Qdrant، Milvus) مع بيانات وصفية (اسم المستند، الصفحة، الطابع الزمني).
- 5وقت الاستعلام: تحويل سؤال المستخدم إلى embedding والبحث في قاعدة البيانات المتجهية عن أكثر K جزء تشابهًا (k=5-10).
- 6تجميع السياق: دمج الأجزاء المسترجَعة في مطالبة مع تعليمات لـLLM المحلي.
- 7التوليد: يولّد LLM المحلي الإجابة بناءً على السياق المسترجَع.
- 8العزو: إعادة المستندات التي جاءت منها الإجابة.
ما استراتيجية التقسيم المثلى؟
تحدّد استراتيجية التقسيم جودة الاسترجاع. تقسيم سيئ = معلومات ذات صلة مقسّمة بين الأجزاء، يفشل الاسترجاع.
التقسيم الدلالي (موصى به): التقسيم حسب الجمل أو الفقرات، مع الحفاظ على المعنى. مثال: كل فقرة = جزء واحد.
التقسيم بحجم ثابت: 500 رمز لكل جزء، تداخل 20%. بسيط لكنه قد يقسّم الجمل.
التقسيم العَودي: أولًا حسب الفقرات، ثم حسب الجمل إذا كانت كبيرة جدًا. يحافظ على التسلسل الهرمي.
اعتبارًا من أبريل 2026، التقسيم الدلالي بأجزاء 500-1000 رمز وتداخل 20% هو الأمثل لمعظم حالات الاستخدام.
# Python: semantic chunking example
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200, # 20% overlap
separators=["\n\n", "\n", ".", " "] # Split on paragraph, then sentence
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")أي قاعدة بيانات متجهية يجب أن تستخدم؟
| قاعدة البيانات | النوع | السعة | جهد الإعداد | الأفضل لـ |
|---|---|---|---|---|
| Chroma | مدمجة | <مليون مستند | pip install | النماذج الأولية، RAG صغير |
| Qdrant | موزّعة | غير محدودة | Docker أو سحابة | الإنتاج، قابلة للتوسّع |
| Milvus | موزّعة | غير محدودة | معقّد | مؤسسات، نطاق كبير |
| Weaviate | رسم بياني + متجه | غير محدودة | Docker | استعلامات معقّدة، علاقات |
| Pinecone (سحابة) | مُدارة | غير محدودة | مفتاح API | بلا خادم، بلا صيانة |
أي نموذج embedding يجب أن تختار؟
| النموذج | أبعاد المتجه | السرعة | الجودة | التوصية |
|---|---|---|---|---|
| nomic-embed-text (محلي) | 768 | سريع | ممتاز | الأفضل لـRAG المحلي |
| bge-m3 (محلي) | 1024 | سريع | ممتاز | دعم متعدد اللغات |
| OpenAI text-embedding-3 (سحابي) | 3072 | سريع جدًا | الأفضل في فئته | نهج هجين |
| Cohere (سحابي) | 4096 | سريع | ممتاز | RAG سحابي للإنتاج |
كيف تحسّن جودة الاسترجاع؟
تحدّد جودة الاسترجاع نجاح RAG. استرجاع جيد = إجابات جيدة. استرجاع سيئ = هلوسات.
- اختيار Top K: استرجاع k=5-10 أجزاء. K أعلى = سياق أكثر (أبطأ)، K أقل = تشتيت أقل.
- عتبة التشابه: تصفية النتائج حسب أدنى درجة تشابه (مثلًا، >0.75). يتجنّب الأجزاء قليلة الصلة.
- إعادة الترتيب: استخدام reranker (cross-encoder) لإعادة ترتيب الأجزاء حسب الصلة. تحسّن دقة طفيف.
- البحث الهجين: الجمع بين البحث الدلالي (embeddings) والبحث بالكلمات المفتاحية BM25. يلتقط المستندات ذات الكلمات المفتاحية الدقيقة.
- توسيع الاستعلام: توسيع استعلام المستخدم بمرادفات أو مصطلحات ذات صلة. يحسّن الاستدعاء (recall).
كيف تقيّم جودة RAG؟
لجودة RAG بُعدان: (1) جودة الاسترجاع (هل حصلنا على أجزاء ذات صلة؟)، و(2) جودة التوليد (هل أجاب LLM جيدًا؟).
تقييم الاسترجاع: إنشاء استعلامات اختبار بمستندات صحيحة معروفة. قياس الدقة (كم من المسترجَع ذو صلة؟) والاستدعاء (هل حصلنا على جميع المستندات ذات الصلة؟).
تقييم التوليد: تشغيل LLM على الأجزاء المسترجَعة وتقييم الإجابات يدويًا (مقياس 0-5) من حيث الدقة والاكتمال.
اعتبارًا من أبريل 2026، يمكن لأدوات التقييم الآلي (مثل Ragas) قياس مقاييس الاسترجاع والتوليد تلقائيًا.
أنماط RAG في الإنتاج
لخدمات الإنتاج، استخدم هذه الأنماط:
- التخزين المؤقت: تخزين embeddings المستندات المستعلَم عنها بكثرة مؤقتًا لتجنّب إعادة حسابها.
- الفهرسة التدريجية: إضافة مستندات جديدة دون إعادة فهرسة كل شيء. يدعمها Qdrant وMilvus.
- المراقبة: تتبّع زمن استجابة الاسترجاع، ومعدل إصابة التخزين المؤقت، وملاحظات المستخدمين حول جودة الإجابات.
- الحل البديل: إذا فشل الاسترجاع (لا أجزاء ذات صلة)، أجب بـ"لا أملك معلومات حول ذلك" بدلًا من الهلوسة.
- الإصدارات: الاحتفاظ بإصدارات المستندات لسجلات التدقيق. تخزين أي إصدار استُخدم لكل إجابة.
أخطاء شائعة في تنفيذ RAG المحلي
- تقسيم المستندات بشكل خاطئ. أجزاء صغيرة كثيرة جدًا = ضوضاء في الاسترجاع. أجزاء كبيرة قليلة = معلومات مقسّمة. اختبر أحجام الأجزاء تجريبيًا.
- عدم تقييم الاسترجاع. بناء RAG دون اختبار ما إذا كان الاسترجاع يعمل كبناء سيارة دون اختبار المحرك. قِس دائمًا الدقة/الاستدعاء.
- استخدام embeddings عامة لمستندات متخصصة. قد تحتاج المستندات القانونية أو الطبية أو التقنية إلى embeddings مضبوطة. ضع في اعتبارك نماذج متخصصة بالمجال.
- نسيان تردد التحديث. إذا تغيّرت المستندات أسبوعيًا، تصبح قاعدة البيانات المتجهية قديمة. ابنِ خط أنابيب لإعادة embedding والتحديثات.
- توقّع أن يحل RAG محل الضبط الدقيق. RAG هو حقن سياق. الضبط الدقيق هو تكييف نموذج. لأفضل النتائج، اجمع بينهما.
الأسئلة الشائعة حول RAG المحلي
كم عدد المستندات التي يتعامل معها RAG المحلي؟
يتعامل Chroma مع 100 ألف إلى مليون مستند على عتاد استهلاكي. يتوسّع Qdrant إلى مليارات بإعداد موزّع. فوق مليون، استخدم Qdrant أو Milvus.
ما زمن الاستجابة الذي يجب أن أتوقّعه؟
استعلام embedding (nomic-embed-text على CPU): 50-200 مللي ثانية. الاسترجاع (Chroma على القرص): 10-50 مللي ثانية. توليد LLM: 2-10 ثوانٍ (يعتمد على حجم النموذج). الإجمالي: 2-10 ثوانٍ لكل استعلام.
هل يستطيع RAG التعامل مع تحديثات المستندات في الوقت الفعلي؟
نعم. أضف مستندات جديدة إلى قاعدة البيانات المتجهية ديناميكيًا. زمن استجابة الفهرسة 100-500 مللي ثانية لكل مستند، لذا فإن التحديثات في الوقت الفعلي قابلة للتطبيق.
هل RAG المحلي أرخص من واجهات API السحابية؟
نعم. بلا تكلفة لكل رمز، بلا مكالمات API لخدمات خارجية. إعداد embeddings لمرة واحدة ثم استعلامات مجانية.
هل يمكنني استخدام embeddings سحابية مع نماذج LLM محلية؟
نعم. استخدم embeddings من OpenAI أو Cohere أو خدمات سحابية أخرى للفهرسة ثم نماذج LLM محلية للتوليد. نهج هجين.
المصادر
- توثيق LlamaIndex -- docs.llamaindex.ai
- دليل RAG من LangChain -- python.langchain.com/docs/use_cases/question_answering
- توثيق Chroma -- docs.trychroma.com
- محرك البحث المتجهي Qdrant -- qdrant.tech
- ورقة RAG (Lewis et al.) -- arxiv.org/abs/2005.11401