AI Prompt Engineering · درس

ما بعد RAG الساذج

قيود الاسترجاع الأساسي.

الدرس 1 من 413 خطوة

ما بعد RAG الساذج درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

ما الذي يفعله Naive RAG

يمثل Naive RAG خط الأساس: تقسيم المستندات إلى مقاطع، وتحويلها إلى تمثيلات متجهية، وتخزين المتجهات، وتحويل الاستعلام إلى متجه، واسترجاع أعلى k مقاطع وفق التشابه الجيبي، وحشو المقاطع في المطالبة، ثم التوليد. وهو نقطة بداية قوية، لكنه يفشل بطرق يمكن التنبؤ بها عند التوسع.

ويُعد فهم أنماط الفشل هذه شرطًا أساسيًا للتقنيات المتقدمة، مثل إعادة الترتيب والضغط وإعادة كتابة الاستعلام، التي يغطيها هذا المقرر.

def naive_rag(query, k=5):
    q = embed(query)
    chunks = vector_store.search(q, k)        # top-k by cosine
    context = '\n\n'.join(c.text for c in chunks)
    return llm('Context:\n' + context + '\n\nQ: ' + query)

استدعاء الاسترجاع مقابل دقته

يعمل أعلى k في النهج الساذج على تحسين التشابه المتجهي الخام، الذي يخلط بين الصلة والتقارب الدلالي السطحي. وتواجهون مفاضلة: إذ يهدد صِغر k بفقدان الإجابة، أي انخفاض الاستدعاء؛ بينما يغمر كِبر k السياقَ بالمشتتات، أي انخفاض الدقة.

والتشابه بين التضمينات الذي يقود الاسترجاع ليس سوى مؤشر تقريبي خشن للصلة الحقيقية، وهو أصل عدة مشكلات لاحقة.

# The core dilemma
# small k -> may miss the gold chunk (recall problem)
# large k -> distractors crowd context (precision + cost problem)
# Advanced RAG decouples 'retrieve many' from 'use few'

مشكلة عدم تطابق التضمينات

غالبًا ما تنتمي الاستعلامات والمستندات إلى سجلات لغوية مختلفة: سؤال قصير مقابل مقطع طويل خبري. وقد تضع تضمينات bi-encoder إجابة ذات صلة بعيدًا عن السؤال لأن صياغتهما مختلفة، وهي مشكلة عدم تطابق المفردات.

وهذا ما يدفع إلى استخدام تقنيات مثل إعادة كتابة الاستعلام وHyDE، اللتين تعيدان تشكيل الاستعلام ليتوافق مع فضاء المستندات قبل الاسترجاع.

# Query:  'how do I revoke a token?'
# Doc:    'Token invalidation is performed via the /sessions endpoint.'
# Lexically and semantically distant -> bi-encoder may miss it
sim = cos(embed('how do I revoke a token?'),
          embed('Token invalidation via /sessions'))  # may be low

الضياع في المنتصف

حتى عند استرجاع المقطع الصحيح، يؤدي حشو عدد كبير من المقاطع إلى تأثير الضياع في المنتصف: إذ يقل انتباه النموذج إلى المحتوى الموضوع في وسط سياق طويل. وقد يُتجاهل عمليًا مقطع صحيح مدفون في المرتبة 3 من أصل 10.

وهذا ما يبرر إعادة الترتيب، لوضع أفضل مقطع في موضع ينتبه إليه النموذج، والضغط لتقليص السياق كي لا يُدفن أي محتوى.

# Retrieval rank != attention rank
# Place the highest-relevance chunk at the START or END,
# never stranded in the middle of a large concatenation.

الحساسية للمشتتات

تتأثر النماذج اللغوية الكبيرة بالسياق غير ذي الصلة. فقد تؤدي إضافة مقاطع معقولة لكنها خاطئة إلى دفع الإجابة في مسار خاطئ، حتى عند وجود المقطع الصحيح أيضًا. فزيادة السياق المسترجع لا تؤدي دائمًا إلى نتيجة أفضل.

ولهذا تهم الدقة: فالسياق المحكم، المُعاد ترتيبه والمضغوط، يتفوق غالبًا على كمية كبيرة من المقاطع المرتبطة ارتباطًا فضفاضًا.

# Empirically: appending a single highly-similar but WRONG chunk
# can flip a previously-correct answer. RAG quality depends on
# keeping distractors OUT, not just getting the gold chunk IN.

مشكلات تقطيع المقاطع

يقطع التقطيع ثابت الحجم الأفكار في منتصف الجملة، ويفصل الادعاء عن دليله، ويجرد النص من السياق البنيوي، مثل تحديد القسم والمستند. وقد يبدو المقطع متماسكًا عند قراءته منفردًا، لكنه قد يكون عديم الفائدة أو مضللًا من دون محيطه.

وتستخدم المسارات المتقدمة تقطيعًا واعيًا بالبنية، وتداخلًا بين المقاطع، وتوسيعًا إلى المستند الأصلي، وبيانات وصفية للحفاظ على المعنى.

def structure_aware_chunks(doc, max_tokens=400, overlap=50):
    sections = split_by_headings(doc)        # respect document structure
    chunks = []
    for sec in sections:
        for c in sliding_window(sec.text, max_tokens, overlap):
            chunks.append(Chunk(c, meta={'section': sec.title}))
    return chunks

فجوات الاسترجاع الدلالي وحده

يفوّت الاسترجاع الكثيف الخالص احتياجات المطابقة الحرفية، مثل المعرّفات، ورموز الأخطاء، وأسماء العلم النادرة، وأسماء API. وهذه تحديدًا هي المواضع التي يتوقع فيها المستخدمون دقة حرفية. ويجمع الاسترجاع الهجين بين إشارات كثيفة دلالية وإشارات متناثرة، مثل BM25 والكلمات المفتاحية، لتغطية النوعين.

ويُعد دمج الرتب التبادلي طريقة بسيطة ومتينة لدمج القائمتين المرتبتين من دون ضبط وزن.

def rrf(dense_ranks, sparse_ranks, k0=60):
    scores = {}
    for ranks in (dense_ranks, sparse_ranks):
        for rank, doc_id in enumerate(ranks):
            scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k0 + rank)
    return sorted(scores, key=scores.get, reverse=True)

سياق قديم وغير قابل للتحقق

لا يملك Naive RAG مفهومًا عن الحداثة أو مصدرية المعلومات. فقد يسترجع مستندات قديمة، ولا يوفر طريقة مدمجة لإسناد الادعاءات إلى مصادرها، مما يقوض الثقة ويجعل اكتشاف الهلوسة صعبًا.

وتربط الأنظمة المتقدمة بيانات وصفية بالمحتوى، مثل الطابع الزمني والمصدر والإصدار، وتُجري التصفية بناءً عليها، وتلزم المولّد بالاستشهاد بمعرّفات المقاطع كي يمكن التحقق من الإجابات.

def filtered_retrieve(q, after_date):
    cands = vector_store.search(embed(q), k=50)
    fresh = [c for c in cands if c.meta['date'] >= after_date]
    return fresh  # then re-rank; generator must cite c.id

لا تغذية راجعة، لا تكيّف

يسترجع Naive RAG المحتوى بصورة عمياء: فلا يستطيع معرفة فشل الاسترجاع، ولا تقرير أن الاسترجاع غير ضروري، ولا التكرار والتحسين. وتضيف الأنماط المتقدمة فحصًا للصلة، واسترجاعًا مشروطًا، واسترجاعًا متعدد الخطوات قائمًا على الوكلاء يعيد صياغة الاستعلام عندما تبدو النتائج ضعيفة.

ويتحول المسار بذلك إلى حلقة تتضمن تقييمًا ذاتيًا بدل تمريرة أمامية واحدة.

def adaptive_rag(q):
    chunks = retrieve(q)
    if relevance_score(q, chunks) < 0.4:
        q2 = rewrite_query(q)            # reformulate and retry
        chunks = retrieve(q2)
    if relevance_score(q, chunks) < 0.4:
        return 'I could not find this in the sources.'
    return generate(q, chunks)

حزمة RAG المتقدمة

عند جمع أنماط الفشل، يضيف المسار المتقدم طبقات تشمل: تقطيعًا واعيًا بالبنية مع بيانات وصفية، واسترجاعًا هجينًا عالي الاستدعاء، وأداة إعادة ترتيب قائمة على cross-encoder لتحسين الدقة، وضغط السياق لملاءمة المحتوى وتركيزه، وإعادة كتابة الاستعلام أو HyDE لمعالجة عدم التطابق، وبوابة صلة مع الاستشهادات.

تبني الدروس التالية كل طبقة على حدة. والخيط الناظم هو: الاسترجاع على نطاق واسع، ثم التصفية والتنقيح المكثفان.

def advanced_rag(q):
    cands = hybrid_retrieve(rewrite_query(q), k=50)  # high recall
    top = rerank(q, cands)[:8]                       # precision
    ctx = compress(q, top)                            # focus + fit
    return generate_with_citations(q, ctx)            # verifiable

قيسوا قبل التحسين

شخّصوا الفشل الذي تواجهونه فعليًا قبل إضافة آليات جديدة. قيسوا recall@k للاسترجاع، أي ما إذا كان المقطع المرجعي قد استُرجع أصلًا، بشكل منفصل عن دقة الإجابة، أي ما إذا كان المولّد قد استخدمه. فمشكلة الاستدعاء ومشكلة الدقة تتطلبان إصلاحين مختلفين.

راقبوا نصفي المسار كليهما؛ ولا تضيفوا أداة إعادة ترتيب عندما تكون المشكلة الحقيقية في التقطيع أو عدم تطابق الاستعلام.

def diagnose(eval_set):
    return {
        'recall@5':  recall_at_k(eval_set, k=5),     # retrieval health
        'recall@50': recall_at_k(eval_set, k=50),    # ceiling with rerank
        'answer_acc': answer_accuracy(eval_set),      # generation health
    }

تحقق سريع

شخّصوا نمط فشل في RAG.

مراجعة

أهم النقاط:

  • يمثل Naive RAG، أي التقطيع والتحويل إلى تمثيلات متجهية واختيار أعلى k والحشو والتوليد، خط أساس قويًا ذا أنماط فشل يمكن التنبؤ بها.
  • يُعد تشابه bi-encoder مؤشرًا تقريبيًا خشنًا للصلة؛ ويؤدي عدم تطابق السجل بين الاستعلام والمستند إلى الإضرار بالاستدعاء.
  • لا يعني المزيد من السياق نتيجة أفضل: فالحساسية للمشتتات والضياع في المنتصف يضعفان الإجابات مع زيادة k.
  • تحد مشكلات التقطيع، والفجوات الدلالية، والقدم، وغياب التغذية الراجعة من قدرات Naive RAG.
  • يسترجع RAG المتقدم على نطاق واسع ثم يُجري التصفية: الاسترجاع الهجين، وإعادة الترتيب، والضغط، وإعادة كتابة الاستعلام، وبوابات الصلة. قيسوا الاستدعاء ودقة الإجابة كلًّا على حدة قبل التحسين.
البدء مجانًا

تعلم AI Prompt Engineering مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
53
الدروس
199

الأسئلة الشائعة

هل درس «ما بعد RAG الساذج» مجاني؟

نعم — نص درس «ما بعد RAG الساذج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

ماذا ستتعلم في «ما بعد RAG الساذج»؟

قيود الاسترجاع الأساسي. تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟

لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «ما بعد RAG الساذج»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟

نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما بعد RAG الساذج
  2. إعادة ترتيب المقاطع المسترجعة
  3. ضغط السياق
  4. إعادة صياغة الاستعلام وHyDE
← العودة إلى AI Prompt Engineering