الـ RAG· الدرس 2 من 4
الـ Agentic RAG — لما الـ RAG ياخد قرارات — Agentic RAG
في سطر واحد · **الـ Agentic RAG هو RAG بيدّي الموديل القرار: هل أدوّر أصلًا؟ أدوّر فين؟ أعيد الصياغة؟ أدوّر تاني؟ أجاوب ولا أقول مش عارف؟ — بدل مسار واحد ثابت «دوّر ← لزّق ← جاوب».** <!-- Field 3: TL;DR -->
- الـ RAG الكلاسيكي مسار واحد ثابت: استرجاع مرة واحدة ← حشو الـ Context ← إجابة. بيشتغل حلو في أسئلة مباشرة، وبيقع في: الأسئلة متعددة الخطوات (Multi-hop)، الأسئلة الغامضة، وحالات «مش لاقي».
- الـ Agentic RAG بيضيف قرار: الموديل بقى بيحكم على كل خطوة — يدوّر ولا لأ، فين، يعيد الصياغة، يدوّر تاني بنتيجة أول بحث، ويقول «مش عارف» بدل ما يفتي.
- خمس أنماط أساسية: Query Routing (توجيه لمصدر مناسب)، Query Decomposition (تقسيم سؤال مركّب)، Iterative Retrieval (بحث ← قراءة ← بحث أعمق)، Self-check قبل الإجابة، والاسترجاع كأداة جوّه Agent Loop.
- التكلفة الصادقة: الـ Agentic RAG بيضاعف استدعاءات الموديل. الكلاسيكي ~1–2 استدعاء للسؤال؛ الـ Agentic ~4–8. يعني الفاتورة والـ Latency بيتضاعفوا.
- خرافة لازم تموت: «الـ Agentic RAG أدق دايمًا». لأ — أغلى دايمًا، وأدق أحيانًا. أغلب حالات الـ FAQ والـ Doc-QA الكلاسيكي فيها كفاية.
<!-- Field 4: Why does this matter? -->
بنيت RAG، شغّال حلو على الأسئلة البسيطة. بعدين جه سؤال زي: «مين المدير اللي وقّع على أكبر صفقة السنة اللي فاتت، وإيه سياسة الخصم اللي طبّقها؟». ده سؤال محتاج خطوتين: الأول تلاقي الصفقة الأكبر، بعدين تلاقي مين وقّع، بعدين تلاقي سياسته. الـ RAG الكلاسيكي بيدوّر مرة واحدة بالسؤال كامل — والنتيجة بتبقى خليط مالوش معنى، والموديل بيفتي إجابة مقنعة وغلط.
هنا بييجي دور الـ Agentic RAG: بدل ما الاسترجاع خطوة ميكانيكية، بيبقى قرار الموديل بياخده وبيكرّره. المفهوم ده مهم لأنه بيفرّق بين «RAG بيجاوب أسئلة FAQ» و«RAG بيحلّ أسئلة بحثية حقيقية».
بس — وده الأهم — المفهوم ده كمان بيعلّمك إمتى متعملهوش. لأن أغلب الناس أول ما تسمع «agentic» بتفتكره ترقية مجانية. وهو مش مجاني: بيضاعف الفلوس والـ Latency. الـ Developer الشاطر بيعرف يفرّق بين السؤال اللي يستاهل القرار الزيادة، والسؤال اللي مسار واحد كفايته.
<!-- Field 5: Explain it simply (Layer 1) -->
الـ RAG الكلاسيكي زي طالب بيجاوب امتحان مفتوح الكتاب بقاعدة واحدة: افتح الكتاب مرة، انقل أقرب فقرة، اكتب الإجابة. خلاص. لو الفقرة الأولى مش كافية أو غلط، مفيش خطة تانية.
الـ Agentic RAG زي باحث حقيقي: بيقرأ السؤال، ويقرّر — «ده محتاج بحث أصلًا؟ في أنهي مصدر؟ الصياغة كده كويسة؟». بيدوّر، يقرأ النتيجة، ويسأل نفسه: «ده كفاية؟ ولا محتاج أدوّر تاني بمعلومة اتعلمتها لسه؟». وفي الآخر، لو مش لاقي، بيقول «مش عارف» بدل ما يخترع.
الفرق الجوهري: الكلاسيكي بيسترجع. الـ Agentic بيقرّر يسترجع — وبيكرّر لحد ما يقتنع.
<!-- Field 6: Real-world analogy (Layer 2) -->
تخيّل اتنين موظفين في مكتبة، وسألتهم سؤال بحثي معقّد:
الموظف الأول (RAG كلاسيكي) — بياخد سؤالك، يمشي لأقرب رفّ، يجيب أول كتاب لقاه فيه كلمات شبه سؤالك، يفتح صفحة، ويقرالك منها. لو الكتاب مش مظبوط؟ ملهوش دعوة. لو السؤال محتاج تلات كتب؟ برضه هيجيب واحد. سريع ورخيص — وكفاية لو سؤالك بسيط.
الموظف التاني (Agentic RAG) — بيقف يفكّر: «السؤال ده محتاج قسم التاريخ ولا القانون؟» (Routing). «ده في الحقيقة تلات أسئلة في واحد، خليني أقسّمهم» (Decomposition). يجيب كتاب، يقرأ، يقول «آها، ده بيشاور على مرجع تاني، خليني أجيبه» (Iterative). قبل ما يرجعلك: «هو أنا عندي إجابة كاملة فعلًا؟» (Self-check). ولو مالقاش: «معنديش مصدر مؤكّد للجزء ده» بدل ما يألّف.
الموظف التاني أدق في السؤال المعقّد — بس بياخد وقت أطول وشغل أكتر. لو سؤالك كان «فين دورة المياه؟»، الموظف الأول كان كفاية وزيادة. مش كل سؤال يستاهل باحث.
<!-- Field 7: Simple example -->
مثال حقيقي
نفس السؤال متعدد الخطوات، في النظامين:
> RAG كلاسيكي: > السؤال: «مين وقّع أكبر صفقة السنة اللي فاتت، وإيه سياسة الخصم بتاعته؟» > يدوّر مرة واحدة بالسؤال كامل ← يرجّع Chunks مخلوطة (شوية عن صفقات، شوية عن خصومات، مفيش رابط بينهم) ← الموديل يفتي إجابة تربط حاجات مش مرتبطة. مقنعة وغلط.
> Agentic RAG: > 1. Decompose: الموديل يقسّم — «(أ) إيه أكبر صفقة؟ (ب) مين وقّعها؟ (ج) إيه سياسة خصم الشخص ده؟». > 2. بحث 1: يدوّر عن أكبر صفقة ← «صفقة X، وقّعها أحمد». > 3. بحث 2 (Iterative): دلوقتي عارف الاسم، يدوّر عن «سياسة خصم أحمد» ← يلاقيها. > 4. Self-check: «عندي الصفقة + الموقّع + سياسته؟ آه» ← يجاوب مأسّس على 3 مصادر واضحة.
نفس الموديل، نفس البيانات. الفرق: الأول دوّر مرة؛ التاني قرّر يدوّر بذكاء وكرّر. الأول كلّف استدعاء؛ التاني كلّف 4–5.
<!-- Field 8: How it works (Layer 3) -->
الفكرة المحورية: الاسترجاع بيتحوّل من خطوة ثابتة لـ أداة (Tool) الموديل بيقرّر يستخدمها.
في الكلاسيكي، الكود بتاعك بيفرض التسلسل: retrieve() بعدها generate()، دايمًا، بالترتيب ده. الموديل مالوش رأي — بس بيكتب الإجابة في الآخر.
في الـ Agentic، بتدّي الموديل الاسترجاع كأداة جوّه Agent Loop، وبيقرّر هو: 1. يلاحظ السؤال. 2. يقرّر: أدوّر؟ فين؟ بأي صياغة؟ ولا أعرف الإجابة أصلًا؟ 3. ينفّذ الاسترجاع (لو قرّر). 4. يشوف النتيجة، ويسأل: كفاية؟ 5. يكرّر من 2 — أو يجاوب — أو يقول «مش لاقي».
الحتة اللي بتلخبط الناس: في الكلاسيكي الاسترجاع مضمون بيحصل مرة. في الـ Agentic، الاسترجاع ممكن يحصل صفر مرة (لو الموديل عارف الإجابة)، مرة، أو 5 مرات. عدم الحتمية ده هو مصدر القوة ومصدر التكلفة والمشاكل في آن واحد.
<!-- Field 9: Step-by-step explanation -->
خطوة بخطوة — الأنماط الخمسة
كل نمط بمثال صغير محدّد:
1) Query Routing — توجيه السؤال الموديل بيقرّر السؤال يروح لأنهي مصدر/Index. «كام سعر المنتج X؟» → Index المنتجات. «إيه سياسة الإجازات؟» → Index الموارد البشرية. بدل ما تدوّر في كل حاجة، بتدوّر في المكان الصح.
2) Query Decomposition — تقسيم السؤال المركّب سؤال فيه كذا جزء بيتقسّم لأسئلة فرعية. «قارن سياسة الاسترجاع بين 2023 و2024» → «(أ) سياسة 2023؟ (ب) سياسة 2024؟» → بحث لكل واحد → دمج.
3) Iterative Retrieval — البحث المتكرّر بحث ← قراءة ← بحث أعمق بناءً على اللي اتعلمته. أول بحث كشف اسم/مصطلح جديد، فالبحث التاني بيستخدمه. ده اللي بيحلّ الأسئلة متعددة الخطوات (Multi-hop).
4) Self-check قبل الإجابة قبل ما يرجّع الإجابة، الموديل بيسأل نفسه: «الـ Context اللي قدّامي كافي للسؤال ده؟». لو لأ → يدوّر تاني أو يقول «معنديش معلومة كافية». دي الخطوة اللي بتحوّل «بيفتي» لـ «بيعترف».
5) Retrieval-as-a-Tool — الاسترجاع كأداة الغلاف اللي بيجمع الأربعة فوق: الاسترجاع أداة جوّه Agent Loop، الموديل بيناديها إمتى ما قرّر، بأي مدخلات قرّرها، عدد المرات اللي يشوفها مناسب.
<!-- Field 10: Visual explanation -->
بالرسم
الفرق بين المسارين — ده جوهر المفهوم كله:
┌───────────────── CLASSIC RAG — مسار واحد ثابت ─────────────────┐
│ │
│ Question ──► Retrieve (مرة) ──► Stuff context ──► Generate │
│ │ │
│ ▼ │
│ Answer │
│ عدد استدعاءات الموديل: ~1–2 · حتمي · رخيص · سريع │
└───────────────────────────────────────────────────────────────┘
┌──────────── AGENTIC RAG — حلقة فيها قرارات ────────────────────┐
│ │
│ Question ──► [ LLM يقرّر ] │
│ │ │
│ ┌──────────┼───────────┬──────────────┐ │
│ ▼ ▼ ▼ ▼ │
│ أدوّر؟ فين؟ أقسّم السؤال؟ أعيد الصياغة؟ أعرف الإجابة؟ │
│ │ │ │ │ │
│ └────► Retrieve (أداة) ◄───────────────┘ │
│ │ │
│ ▼ │
│ [ Self-check: كفاية؟ ] ──► لأ ──┐ │
│ │ آه │ (كرّر الحلقة) │
│ ▼ └──────────┘ │
│ Answer أو "مش عارف" │
│ عدد استدعاءات الموديل: ~4–8 · غير حتمي · أغلى · أبطأ │
└───────────────────────────────────────────────────────────────┘خد بالك من الفرق الجوهري: في الكلاسيكي، السهم بيمشي في خط واحد. في الـ Agentic، فيه حلقة بترجع لنفسها. الحلقة دي هي مصدر الذكاء — وكمان مصدر خطر «الـ Agent اللي مبيبطّلش بحث». كل لفة في الحلقة = استدعاء موديل = فلوس + وقت.
<!-- Field 11: Technical explanation (Layer 4) -->
أول حاجة تثبتها: الفرق مش في الاسترجاع نفسه — في مين ماسك زمام التحكم (Control Flow). في الكلاسيكي، كودك بيتحكم في التسلسل: retrieve ثم generate، ثابت. في الـ Agentic، الموديل بيتحكم في التسلسل عن طريق قراراته. أنت نقلت التحكم من كود حتمي لموديل احتمالي. ده بيديك مرونة، وبياخد منك القدرة على التنبؤ.
تاني حاجة: الاسترجاع بقى Tool Call عادي. لو فاهم Tool Calling، أنت فاهم الآلية: بتعرّف أداة search(query, source)، بتحطّها في الحلقة، والموديل بيقرّر ينادیها بأي مدخلات وكام مرة. الـ Agentic RAG حرفيًا هو «RAG مبني بأدوات جوّه Agent Loop» — مفيش سحر جديد، دمج مفهومين تعرفهم.
تالت حاجة، وهي أخطر قرار تصميمي: لازم حدود صارمة (Guardrails) على الحلقة. موديل بيقرّر «أدوّر تاني» ممكن يقرّرها للأبد. لازم: سقف لعدد اللفّات (مثلًا 5)، سقف تكلفة، وTimeout. من غير الحدود دي، سؤال واحد صعب ممكن يعمل 30 استدعاء ويحرق $2 لوحده. الحلقة اللي بلا حدود هي أكتر Bug متكرر في الـ Agentic RAG.
رابع حاجة: الـ Self-check نفسه استدعاء موديل — يعني بيكلّف. إنك تسأل الموديل «الـ Context كافي؟» ده استدعاء إضافي كل لفة. مفيد جدًا للجودة، بس حطّه في حساب التكلفة. مفيش حاجة ببلاش في الـ Agentic.
<!-- Field 12: Developer perspective (API-level reality) -->
على مستوى الـ API — الواقع العملي
خمس حقايق هتقابلك أول ما تنفّذ:
- بتدفع تمن كل لفة في الحلقة. كل قرار، كل استرجاع، كل Self-check = استدعاء موديل بـ Input + Output Tokens. السؤال اللي كان استدعاء واحد بقى 5. الفاتورة بتتضاعف خطيًا مع عدد اللفّات.
- الـ Latency بيتراكم. 5 استدعاءات متسلسلة، كل واحد 1–2 ثانية = 5–10 ثواني للإجابة. المستخدم اللي متعوّد رد في ثانية هيحسّ إنه بطيء. الأنماط المتوازية بتخفّف — بس مش كل خطوة تتوازى.
- الحلقات اللانهائية خطر حقيقي. من غير سقف لفّات صارم، الموديل ممكن يدخل «أدوّر تاني... مش كفاية... أدوّر تاني...» بلا نهاية. سقف صريح إلزامي — مش تحسين.
- الموديل ممكن يفتي حتى بعد فشل الاسترجاع. أخطر Failure: بحث فشل 3 مرات، وبدل ما يقول «مش عارف»، الموديل يستسلم ويجاوب من ذاكرته. لازم تعليمات صريحة: «لو الاسترجاع فشل، قول مش عارف — متجاوبش من معرفتك العامة».
- الـ Debugging أصعب بكتير. لإنه غير حتمي، نفس السؤال ممكن ياخد مسارات مختلفة كل مرة. من غير Tracing (تسجيل كل قرار واسترجاع)، أنت أعمى. سجّل الحلقة كاملة من أول يوم.
<!-- Field 13: Code example (D-4 provider-agnostic, CR-4 Arabic surround) -->
الكود
الكود ده مش من Framework معيّن — دي الفكرة عريانة: الاسترجاع كأداة جوّه حلقة محدودة، مع Self-check ومخرج «مش عارف». اقراه كسودوكود:
# الاسترجاع بقى أداة الموديل بيقرّر ينادیها — مش خطوة مفروضة
def search(query: str, source: str = "default") -> str:
chunks = vector_store.search(embed(query), top_k=5, index=source)
return format_chunks(chunks)
MAX_STEPS = 5 # Guardrail: سقف لفّات صارم
question = "مين وقّع أكبر صفقة السنة اللي فاتت، وإيه سياسة خصمه؟"
context = []
for step in range(MAX_STEPS): # الحلقة محدودة — مش لا نهائية
decision = llm.decide( # الموديل بيقرّر الخطوة الجاية
question=question,
gathered=context,
tools=[search],
instructions=(
"قرّر: تدوّر (بأي صياغة/مصدر)، ولا عندك كفاية تجاوب؟ "
"لو الاسترجاع مرجّعش حاجة مفيدة، قول 'مش عارف' — "
"ممنوع تجاوب من معرفتك العامة." # ضد الإفتاء بعد الفشل
),
)
if decision.type == "answer":
break
if decision.type == "give_up": # مخرج صادق
return "معنديش معلومة كافية في المصادر للإجابة على ده."
# الموديل قرّر يدوّر — نفّذ وضيف للسياق (Iterative)
result = search(decision.query, decision.source)
context.append(result)
# Self-check: كفاية؟ (استدعاء موديل إضافي — بيكلّف)
if llm.is_context_sufficient(question, context):
break
answer = llm.generate(question, context) # إجابة مأسّسة على المجموعلاحظ تلات حاجات قبل ما تكمّل:
- `MAX_STEPS` مش تفصيلة — دي صمام الأمان. شيلها، وسؤال صعب واحد ممكن يحرق فلوسك في حلقة لا نهائية. ده أول سطر بيتحطّ، مش آخر واحد.
- مخرج «مش عارف» صريح. سطر
give_upوالتعليمات اللي بتمنع الإفتاء هما الفرق بين نظام أمين ونظام بيخترع بثقة بعد فشل البحث. - كل استدعاء `llm.` بيكلّف. عدّهم في الكود ده:
decide× N +is_context_sufficient× N +generate. ده 4–8 استدعاء بسهولة مقابل 1–2 في الكلاسيكي.
<!-- Field 14: Common mistakes -->
تمرين (20 دقيقة): خد RAG كلاسيكي شغّال عندك، وجهّزله 3 أسئلة multi-hop (كل واحد محتاج معلومتين من مكانين). شغّلها على الكلاسيكي وسجّل: كام مرة جاوب صح؟ (غالبًا هتفشل). دلوقتي — على ورق بس — قسّم كل سؤال لأسئلته الفرعية بإيدك، ودوّر عن كل جزء لوحده، وادمج. شوف الفرق في الدقة. مبروك — أنت لسه عملت Query Decomposition يدوي، وحسّيت بالمشكلة اللي الـ Agentic RAG اتوجد ليها — وبتكلفتها (عدّ كام بحث عملت).
<!-- Field 27: Interview questions -->
| # | ❌ الغلط | ✅ الصح |
|---|---|---|
| 1 | حلقة بلا سقف لفّات — الموديل يدوّر للأبد | MAX_STEPS صريح + سقف تكلفة + Timeout من أول سطر |
| 2 | استخدام Agentic لكل سؤال «عشان أدق» | وجّه الأسئلة: البسيط لمسار كلاسيكي رخيص، المركّب بس للـ Agentic |
| 3 | السماح بالإفتاء بعد فشل الاسترجاع | تعليمات صريحة + مخرج «مش عارف»: بحث فشل = اعتراف، مش تأليف من الذاكرة |
| 4 | تجاهل الـ Latency — 8 استدعاءات متسلسلة | وازِن التكلفة/الوقت؛ استخدم التوازي حيثما أمكن؛ اعرض للمستخدم إنه «بيبحث» |
| 5 | مفيش Tracing للحلقة — «بيغلط ومش عارف ليه» | سجّل كل قرار واسترجاع؛ عدم الحتمية بيخلّي الـ Tracing إلزامي مش رفاهية |
| 6 | مفيش Evaluation يقارن بالكلاسيكي | قِس: هل الـ Agentic فعلًا حسّن الدقة كفاية يبرّر ضعف التكلفة؟ غالبًا لأ |
⚠️ خد بالك: الغلطة #1 و#2 هما الأشهر. الحلقة اللانهائية بتحرق فلوس؛ واستخدام Agentic في كل حتة بيحرق فلوس بهدوء على أسئلة كان مسار واحد كفايتها.
<!-- Field 15: Common misconceptions -->
مفاهيم غلط منتشرة
1) «الـ Agentic RAG أدق دايمًا» — ❌ لأ. أغلى دايمًا، وأدق أحيانًا. على الأسئلة البسيطة (أغلب حالات FAQ وDoc-QA)، الكلاسيكي بيجاوب صح بجزء بسيط من التكلفة. الـ Agentic بيكسب في المركّب والمتعدد الخطوات بس. تدفع ضعف التكلفة عشان دقة زيادة في جزء من الأسئلة — مش كلها.
2) «Agentic RAG معماري جديد يلغي الـ RAG الكلاسيكي» — ❌ لأ، ده مبني فوقه. لسه محتاج Chunking كويس، Embeddings كويسة، واسترجاع كويس. لو استرجاعك الأساسي وحش، الـ Agentic هيدوّر أكتر في بيانات وحشة ويكلّفك أكتر. الـ Agentic بيضيف طبقة قرار — مبيصلّحش أساس ضعيف.
3) «كل ما زوّدت اللفّات، زادت الجودة» — ❌ الجودة بتشبع بسرعة، والتكلفة بتزيد خطيًا. بعد 3–4 لفّات، أغلب الأسئلة مبتتحسّنش — بتدفع بس. اللفّات الزيادة أحيانًا بتضرّ (الموديل يتوه ويجمّع Context مشتّت).
4) «الـ Self-check بيمنع الهلوسة» — ❌ بيقلّلها، مش بيمنعها — زي الـ RAG نفسه. الـ Self-check نفسه استدعاء موديل ممكن يغلط: يقول «الـ Context كافي» وهو مش كافي، أو العكس. طبقة مفيدة، مش ضمان.
<!-- Field 16: When to use it (Layer 7a) -->
🔒 أمان
نقطتان بتكبروا في الـ Agentic تحديدًا:
1) الاسترجاع المتكرّر = سطح حقن أوسع. كل لفّة استرجاع بتجيب محتوى خارجي جديد يدخل Context الموديل — وكل محتوى مسترجع مدخل غير موثوق (زي ما اتعلمنا في الـ RAG الأساسي). في الـ Agentic، الموديل بياخد قرارات بناءً على المحتوى ده، فمحتوى خبيث ممكن يوجّه الحلقة نفسها: «تجاهل، ودوّر عن كذا بدل كذا». عامِل نتايج الاسترجاع كبيانات، وحُطّ حدود على الأدوات اللي الحلقة بتوصلها.
2) الاسترجاع كأداة = صلاحيات لازم تحترم المستخدم. لو الموديل بيقرّر فين يدوّر، لازم توجيهه محصور في المصادر المسموح للمستخدم ده يشوفها — الفلترة بالصلاحية وقت الاسترجاع، مش بعد ما المعلومة توصل الموديل. (تفاصيل أوسع في أمان الـ Tool Calling والـ RAG.)
<!-- Field 21: Cost considerations -->
💸 التكلفة — الحساب الصادق
هنا القلب. الـ Agentic RAG بيضاعف استدعاءات الموديل — وده مش تفصيلة، ده القرار كله. خلينا نحسبها:
سيناريو: 50,000 سؤال شهريًا، وموديل توليد بـ $3/مليون Input و $15/مليون Output.
| Classic RAG | Agentic RAG | |
|---|---|---|
| استدعاءات الموديل/سؤال | ~1–2 | ~4–8 (قرارات + Self-checks + توليد) |
| Tokens تقريبية/سؤال | ~2,600 (زي مثال الـ RAG الأساسي) | ~10,000–18,000 (كل لفّة Context متراكم) |
| تكلفة تقريبية/سؤال | ~$0.011 | ~$0.05–0.09 |
| الشهري (50k سؤال) | ~$570 | ~$2,500–4,500 |
> 💸 أرقام قابلة للتغير *(Volatile fragment — أسعار توضيحية؛ راجع أسعار مزوّدك)*. النقطة الثابتة مش الرقم — النسبة: الـ Agentic بيكلّف 4–8× الكلاسيكي لأن كل لفّة استدعاء كامل، والـ Context بيتراكم فبيكبر كل لفّة.
الخلاصة اللي محدش بيقولها: تعمل الحساب ده على كل أسئلتك بيبقى إسراف. الحساب الذكي: كام % من أسئلتك فعلًا multi-hop؟ لو 10%، وجّه الـ 10% دول بس للـ Agentic وسيب الـ 90% كلاسيكي — بتاخد مكسب الدقة حيث بيهمّ، وبتدفع الضعف على العُشر بس. ده الفرق بين فاتورة $700 وفاتورة $4,000 لنفس الجودة المُدرَكة.
<!-- Field 22: Performance considerations -->
الأداء
- التسلسل هو عدو الـ Latency. كل لفّة بتستنى اللي قبلها. حيثما القرارات مستقلة (زي أجزاء Decomposition)، دوّرها بالتوازي — بيقصّ الوقت بشكل كبير.
- الـ Context المتراكم بيبطّئ كل لفّة. كل لفّة بتضيف للـ Context، فاللفّة الخامسة أبطأ وأغلى من الأولى. نضّف الـ Context بين اللفّات — شيل اللي مبقاش مفيد.
- اعرض تقدّم للمستخدم. «بيبحث… بيراجع المصادر…» بيخلّي الـ 6 ثواني محتملة نفسيًا. الـ Latency الحقيقي مش هيقلّ، بس الإحساس بيه بيتحسّن.
<!-- Field 23: Related concepts -->
- أسئلة متعددة الخطوات (Multi-hop): الإجابة محتاجة تربط معلومتين أو أكتر من أماكن مختلفة — «مين عمل X، وإيه Y بتاعته؟».
- مصادر متنوّعة (Heterogeneous): بيانات موزّعة على Indexes/أنظمة مختلفة، والسؤال محتاج توجيه للصح (Routing).
- أسئلة غامضة محتاجة توضيح أو إعادة صياغة قبل ما الاسترجاع ينجح.
- مواقف عالية الحساسية «لازم مصدر»: قانوني، طبي، مالي — حيث «مش عارف» أأمن بكتير من إجابة غير مؤكّدة، والـ Self-check يستاهل تكلفته.
- الاسترجاع الأول بيفشل كتير: لو أسئلتك بطبيعتها محتاجة أكتر من محاولة، الـ Iterative بيبرّر نفسه.
<!-- Field 17: When NOT to use it (Layer 7b) -->
- أسئلة FAQ وDoc-QA مباشرة (أغلب الحالات!): «إيه سياسة الاسترجاع؟» → استرجاع واحد كفاية. الـ Agentic هنا بيدفع ضعف التكلفة بلا مكسب دقة يُذكر.
- التكلفة أو الـ Latency حسّاسة: تطبيق بحجم كبير أو محتاج رد فوري — ضعف الاستدعاءات وضعف الوقت ممكن يكونوا قاتلين.
- الاسترجاع الأساسي بتاعك ضعيف: صلّح الـ Chunking والاسترجاع الأول. الـ Agentic فوق أساس وحش بيكبّر المشكلة والفاتورة.
- بيانات بسيطة ومنظّمة: لو مصدر واحد نظيف ومباشر، مفيش «قرارات» حقيقية الموديل ياخدها — الحلقة تعقيد بلا عائد.
💡 نصيحة: القاعدة العملية: ابدأ كلاسيكي دايمًا. قِس. لو لقيت فئة أسئلة (multi-hop، مصادر متنوّعة) بتفشل باستمرار، رقّي الفئة دي بس لـ Agentic. متبدأش Agentic — بتنتهي بيه لما البيانات تثبت إنك محتاجه.
<!-- Field 18: Alternatives -->
البدايل
| البديل | يعني إيه | إمتى يكسب |
|---|---|---|
| Classic RAG | استرجاع مرة واحدة ← إجابة | أغلب الأسئلة المباشرة؛ التكلفة والـ Latency مهمين — ابدأ من هنا |
| Reranking + استرجاع أفضل | حسّن جودة الاسترجاع الواحد بموديل إعادة ترتيب | مشكلتك «النتايج مش مرتّبة صح»، مش «محتاج خطوات» — أرخص من Agentic بكتير |
| Query rewriting (بس) | أعد صياغة السؤال مرة قبل استرجاع واحد | أسئلة محادثة قصيرة الغموض؛ تحسين رخيص من غير حلقة كاملة |
| Long context | حط مستندات أكتر في Context بدل بحث متكرر | البيانات تدخل الـ Window، والتكلفة مش حسّاسة |
البدايل مش أعداء: كتير من الأنظمة الناضجة كلاسيكي + Reranking + Query rewriting، وتلجأ للـ Agentic الكامل لفئة أسئلة محدّدة بس. القرار الكامل في مفهوم RAG vs. long context vs. fine-tuning وامتداده الـ Agentic.
<!-- Field 19: Trade-offs -->
الموازنات
| المعيار | Classic RAG | Agentic RAG |
|---|---|---|
| الدقة على أسئلة بسيطة | ✅ عالية | ✅ عالية (بلا مكسب يُذكر) |
| الدقة على multi-hop | ❌ ضعيفة | ✅ أفضل بوضوح |
| تكلفة السؤال | ✅ منخفضة (~1–2 استدعاء) | ❌ عالية (~4–8 استدعاء) |
| الـ Latency | ✅ سريع (استدعاء أو اتنين) | ❌ أبطأ (استدعاءات متسلسلة) |
| القدرة على التنبؤ / Debugging | ✅ حتمي، سهل التتبّع | ❌ غير حتمي، محتاج Tracing |
| حالة «مش عارف» | ⚠️ ممكنة بتعليمات | ✅ طبيعية (Self-check + give up) |
| خطر الحلقة اللانهائية | ✅ غير موجود | ⚠️ حقيقي — محتاج Guardrails |
الخلاصة: الـ Agentic بيشتري دقة على الأسئلة الصعبة + قدرة على قول «مش عارف» بتمن تكلفة أعلى + Latency أطول + تعقيد أكبر. مقايضة تكسب في المركّب، وتخسر في البسيط.
<!-- Field 20: Security considerations -->
أسئلة الانترفيو
س1: إيه الفرق الجوهري بين Classic و Agentic RAG؟ مين ماسك التحكم في التسلسل (Control Flow). الكلاسيكي: الكود بيفرض retrieve ثم generate، حتمي، مرة واحدة. الـ Agentic: الموديل بيقرّر — يدوّر ولا لأ، فين، يعيد الصياغة، يكرّر، ولا يقول «مش عارف» — عن طريق الاسترجاع كأداة جوّه Agent Loop. النتيجة: مرونة أعلى مقابل تكلفة وLatency وعدم حتمية أعلى.
س2: امتى تختار Classic بدل Agentic؟ لما الأسئلة مباشرة (FAQ / Doc-QA — أغلب الحالات)، أو التكلفة/الـ Latency حسّاسة، أو الاسترجاع الأساسي لسه محتاج تحسين. القاعدة: ابدأ كلاسيكي، قِس، ورقّي لـ Agentic فئة الأسئلة اللي بتفشل بس (multi-hop، مصادر متنوّعة) — مش كل حاجة. الإجابة القوية بتذكر التكلفة صراحةً: 4–8× استدعاءات.
س3: اذكر تلات أنماط في الـ Agentic RAG بمثال لكل واحد. Query Routing: توجيه «سعر المنتج X» لـ Index المنتجات بدل البحث في كله. Query Decomposition: تقسيم «قارن سياسة 2023 و2024» لسؤالين ودمج. Iterative Retrieval: بحث أول يكشف اسم، بحث تاني يستخدمه — لحلّ multi-hop. (وممكن تضيف Self-check: يسأل «الـ Context كافي؟» قبل الإجابة.)
س4: إيه أخطر Failure Modes في الـ Agentic RAG وإزاي تخفّفها؟ تلاتة: (1) الحلقة اللانهائية — يخفّفها سقف لفّات صريح + سقف تكلفة + Timeout. (2) الإفتاء بعد فشل الاسترجاع — يخفّفها تعليمات صريحة + مخرج «مش عارف». (3) انفجار الـ Latency والتكلفة — يخفّفها التوجيه (Agentic للأسئلة الصعبة بس) والتوازي وتنظيف الـ Context. الإجابة القوية بتربط كل Failure بحلّه.
<!-- Field 28: Knowledge check (scenario-based per F5) -->
- جوه BuildAI (بالترتيب): The RAG pipeline ← Retrieval quality ← Query understanding: rewriting & expansion ← The agent loop ← Guardrails & boundaries ← Evaluating RAG systems.
- مبدأ يستاهل: أنماط زي *ReAct* (Reason + Act) و*self-reflection* هي الجذور الفكرية للـ Agentic RAG. اقرا عنها بعد ما تفهم المفهوم ده — هتلاقيها بتوصف نفس الحلقة اللي فوق بمصطلحات أكاديمية.
- نصيحة قياس: قبل ما تعتمد Agentic في الإنتاج، ابنِ Golden Set فيه أسئلة بسيطة و multi-hop، وقِس الاتنين: الدقة والتكلفة لكل نظام. القرار بيتاخد بالأرقام — «هل مكسب الدقة يبرّر ضعف التكلفة على مزيج أسئلتك الحقيقي؟».
<!-- Reading→building exit — single primary CTA per Phase 1 §6 -->