الاختبار: بناء خطوط أنابيب RAG
اختبر معرفتك بـ LangChain وLlamaIndex وبناء خطوط أنابيب RAG.
30 سؤالًا - انقر على كل سؤال لكشف الإجابة الصحيحة.
الأسئلة 1-10: LangChain
السؤال 1: ما هو LCEL في LangChain؟
الإجابة: LangChain Expression Language - طريقة تصريحية قابلة للتركيب لبناء chains باستخدام عامل الأنبوب (|).
السؤال 2: ماذا يفعل نوع السلسلة "stuff"؟
الإجابة: يضع كل الوثائق المسترجعة في prompt واحد - الأفضل للسياقات الصغيرة التي تتسع في نافذة سياق LLM.
السؤال 3: متى تستخدم نوع السلسلة map_reduce؟
الإجابة: عند التعامل مع مجموعات بيانات كبيرة لا تتسع في prompt واحد - يعالج الوثائق منفصلة ثم يدمج النتائج.
السؤال 4: فيما يُستخدم ConversationBufferMemory؟
الإجابة: للحفاظ على تاريخ المحادثة في تطبيقات RAG بأسلوب روبوت محادثة.
السؤال 5: ماذا يفعل RunnablePassthrough في LCEL؟
الإجابة: يمرّر الإدخال كما هو دون تغيير - مفيد لتضمين الاستعلام الأصلي في تركيبات السلسلة.
السؤال 6: كيف تنشئ مسترجعًا من vector store في LangChain؟
الإجابة: باستخدام طريقة vectorstore.as_retriever().
السؤال 7: ما الغرض من ChatPromptTemplate؟
الإجابة: إنشاء قوالب prompt قابلة لإعادة الاستخدام مع عناصر نائبة متغيّرة للمحتوى الديناميكي.
السؤال 8: ماذا يفعل StrOutputParser؟
الإجابة: يحلّل مخرجات LLM لاستخراج المحتوى النصي فقط من الإجابة.
السؤال 9: ما الأنسب لنوع السلسلة "refine"؟
الإجابة: الاستعلامات المعقّدة حيث يحسّن تحسين الإجابة تكراريًا مع كل وثيقة الجودة.
السؤال 10: كيف تضيف البث إلى سلسلة LangChain؟
الإجابة: استخدم chain.stream() بدل chain.invoke() للحصول على مكرّر لأجزاء الإجابة.
الأسئلة 11-20: LlamaIndex
السؤال 11: ما الاسم السابق لـ LlamaIndex؟
الإجابة: GPT Index
السؤال 12: ما نوع الفهرس الرئيسي في LlamaIndex؟
الإجابة: VectorStoreIndex - يخزّن الوثائق مع embeddings الخاصة بها للبحث بالتشابه.
السؤال 13: كيف تنشئ محرّك استعلام من فهرس؟
الإجابة: باستخدام طريقة index.as_query_engine().
السؤال 14: ما محرّك المحادثة في LlamaIndex؟
الإجابة: محرّك استعلام بذاكرة محادثة مدمجة للتفاعلات متعددة الأدوار.
السؤال 15: ماذا يفعل وضع الإجابة "compact"؟
الإجابة: يلائم كل السياق في prompt واحد - الوضع الافتراضي والأكثر كفاءة.
السؤال 16: ما وضع الإجابة tree_summarize؟
الإجابة: يلخّص الوثائق هرميًا، مفيد لمجموعات نتائج كبيرة جدًا.
السؤال 17: ما هو SimpleDirectoryReader؟
الإجابة: أداة لتحميل كل الوثائق من مجلد مع اكتشاف تلقائي لنوع الملف.
السؤال 18: بماذا يتحكّم معامل similarity_top_k؟
الإجابة: عدد الوثائق المتشابهة المراد استرجاعها لكل استعلام.
السؤال 19: فيما يُستخدم SummaryIndex؟
الإجابة: إنشاء ملخصات للوثائق بدل البحث بالتشابه.
السؤال 20: كيف يختلف تركيز LlamaIndex عن LangChain؟
الإجابة: يركّز LlamaIndex على فهرسة البيانات والاستعلام عنها، بينما LangChain أعمّ لبناء chains.
الأسئلة 21-30: RAG عام ومخصّص
السؤال 21: متى ينبغي بناء RAG مخصّص بدل استخدام الأطر؟
الإجابة: عندما تحتاج تحكّمًا دقيقًا، أو أقل قدر من التبعيات، أو متطلبات أداء محددة.
السؤال 22: ما الخطوات الثلاث الأساسية في أي نظام RAG؟
الإجابة: 1) تحويل الاستعلام إلى embedding، 2) استرجاع الوثائق ذات الصلة، 3) توليد إجابة بالسياق.
السؤال 23: لماذا قد يكون RAG المخصّص أسرع من الأطر؟
الإجابة: عبء أقل، بلا طبقات تجريد، محسَّن لحالة استخدام محددة.
السؤال 24: ما العيب الرئيسي لـ RAG المخصّص؟
الإجابة: عمل تطوير وصيانة أكثر - تبني كل شيء بنفسك.
السؤال 25: كيف تضيف تخزينًا مؤقتًا إلى RAG مخصّص؟
الإجابة: استخدم تقنيات مثل @lru_cache لتخزين embeddings مؤقتًا أو Redis لتخزين النتائج.
السؤال 26: فيما يفيد البث في RAG؟
الإجابة: تقديم مخرجات الإجابة في الوقت الحقيقي للمستخدمين دون انتظار اكتمال التوليد.
السؤال 27: أي إطار أفضل للنماذج الأولية السريعة؟
الإجابة: LlamaIndex لأسئلة وأجوبة بسيطة على الوثائق، وLangChain للخطوط الأكثر تعقيدًا.
السؤال 28: ما الحد الأدنى الذي تحتاجه لنظام RAG أساسي؟
الإجابة: نموذج embeddings، وvector store، ونموذج LLM، وشيفرة لربطها.
السؤال 29: كيف تتعامل مع الأخطاء في RAG الإنتاجي؟
الإجابة: كتل try-catch، وإجابات احتياطية، وتسجيل، ومراقبة.
السؤال 30: ما الذي يحدّد جودة إجابة RAG أكثر من غيره؟
الإجابة: جودة الاسترجاع - إذا استرجعت الوثائق الصحيحة، يمكن لنموذج LLM توليد إجابات جيدة.
النتائج
| الدرجة | المستوى |
|---|---|
| 27-30 | ممتاز - فهم قوي لأطر RAG |
| 21-26 | جيد - يُوصى ببعض المراجعة |
| 15-20 | متوسط - راجع الفصول مرة أخرى |
| أقل من 15 | يحتاج مراجعة شاملة |