تحديات RAG

جرّب هذه التحديات بعد إتمام خطوات RAG الخمس جميعها.


اختبار المعرفة

  1. ما الفرق بين RAG والضبط الدقيق (fine-tuning)؟

  2. لماذا نقطّع المستندات قبل تضمينها؟

  3. ما الذي يقيسه تشابه جيب التمام (cosine similarity)؟

  4. لماذا يبلغ عدد أبعاد نموذج all-MiniLM-L6-v2 384؟

  5. ماذا يحدث إذا لم تحتوِ قاعدة المعرفة على مستند ذي صلة؟


تحديات برمجية

التحدي 1: تبديل نموذج التضمين

استبدل all-MiniLM-L6-v2 بنموذج آخر مثل all-mpnet-base-v2 بأبعاد 768. حدّث نموذج Document ليستخدم Vector(768)، ثم أعد الفهرسة. وقارن جودة البحث.

التحدي 2: البحث الهجين

اجمع بين البحث المتجهي والبحث بالكلمات المفتاحية. على سبيل المثال، استخدم البحث النصي الكامل في PostgreSQL (tsvector) كخيار احتياطي. اعرض النتائج من كليهما، ثم ادمجها وأزل التكرار.

تلميح:

SELECT * FROM document
WHERE to_tsvector('english', content) @@ plainto_tsquery('english', :query)

التحدي 3: إعادة الترتيب (reranking)

بعد استرجاع أفضل 20 نتيجة من pgvector، استخدم نموذج cross-encoder (مثل cross-encoder/ms-marco-MiniLM-L-6-v2) لإعادة ترتيبها، ثم أعد أفضل 5 نتائج بعد إعادة الترتيب.

التحدي 4: أداة كشط الويب

ابنِ أداة كشط تجلب أحدث أخبار Clark College وتضيفها تلقائيا إلى قاعدة المعرفة:

import requests
from bs4 import BeautifulSoup

url = "https://www.clark.edu/news-and-media/24-7/"
# حلّل الصفحة، واستخرج المقالات، وأضفها إلى DOCUMENTS

التحدي 5: سجل المحادثة في RAG

عدّل نقطة النهاية (endpoint) /api/rag-chat بحيث تضم آخر 5 رسائل في السياق (وليس السؤال الأخير فقط). وهذا يتيح للذكاء الاصطناعي أن يطرح أسئلة متابعة.


مشروع مفتوح: ذاكرة التخزين المؤقت الدلالية

ابنِ ذاكرة تخزين مؤقت تحفظ تضمينات الأسئلة الشائعة وأجوبتها. وقبل استدعاء النموذج اللغوي الكبير (LLM)، تحقق مما إذا كان قد سبق طرح سؤال مشابه:

def check_cache(db, query, threshold=0.95):
    """Return cached answer if a very similar question exists."""
    query_vec = embed_text(query)
    cached = (
        db.session.query(CachedQA)
        .order_by(CachedQA.question_embedding.cosine_distance(query_vec))
        .limit(1)
        .first()
    )
    if cached and (1 - cached.question_embedding.cosine_distance(query_vec)) > threshold:
        return cached.answer
    return None

وهذا يوفّر استدعاءات API ويسرّع الاستجابات للأسئلة الشائعة.