مقدمة إلى RAG: من الأساسيات إلى الإتقان الجزء 5: التوصيل السريع (ANN) وإعادة الترتيب في هذا الجزء الأخير من السلسلة، نستعرض المكونين المهمين جدًا لتحسين أداء أنظمة RAG القائمة على التخزين والبحث في البيانات: البحث التقريبي القريب (ANN) وإعادة الترتيب (Reranking). هذه التقنيات تُعد حجر الزاوية في بناء أنظمة RAG قابلة للتوسع، وسريعة، ودقيقة. البحث التقريبي القريب (ANN) عند بناء نظام RAG، يُعدّ التوسع في سرعة الاسترجاع أحد أكبر التحديات. عندما يكون حجم المعرفة صغيرًا (بضع آلاف من الوثائق)، يمكن استخدام البحث الدقيق (exact search) حيث تُقارن متجهات الاستعلام بكل متجهات الوثائق، وهو أمر ممكن من حيث الأداء. لكن مع نمو البيانات إلى ملايين أو حتى مليارات المدخلات — مثل مخازن المنتجات الإلكترونية، أو مكتبات الأبحاث، أو مصادر المعرفة المؤسسية — يصبح هذا النهج غير عملي من حيث السرعة واستهلاك الذاكرة. هنا يأتي دور خوارزميات البحث التقريبي القريب (Approximate Nearest Neighbors أو ANN). مثل FAISS وHNSW، تقوم هذه الخوارزميات ببناء هيكل فهرسة ذكية (كأشجار أو رسوم بيانية) للمتجهات، بحيث لا يُطلب من النظام مسح كل المتجهات. بدلًا من ذلك، يُستخدم الهيكل لاستكشاف المسارات السريعة للعثور على المرشحين الأقرب "بدرجة كافية". النتيجة: خسارة في الدقة تقل عن 1% في كثير من الحالات، مقابل مكاسب هائلة في السرعة — من 100 إلى 1000 مرة أسرع. هذا يجعل ANN ضروريًا لتطبيقات RAG التي تتطلب استجابات فورية، مثل المساعدات الذكية، أو أنظمة الدعم الفني، أو محركات البحث في الشركات. إعادة الترتيب (Reranking) رغم فعالية ANN، إلا أنه لا يضمن أن النتائج المُسترجعة تكون مرتبة بأفضل طريقة من حيث الأهمية السياقية. قد تكون النتائج "مقبولة" من حيث التشابه، لكن المُستند الأكثر صلة بالسؤال قد يكون مصنفًا في الموضع 15، بينما نتائج أقل صلة تظهر في الموضع 3. هنا يأتي دور إعادة الترتيب. بعد أن تُسترجع مجموعة من المرشحين عبر ANN، تُستخدم نموذج أقوى — غالبًا نموذج تقاطع (cross-encoder) أو نموذج لغة كبير (LLM) — لتقييم كل مستند مُسترجع من حيث صلته بالسؤال. يُعاد ترتيب النتائج بناءً على هذه التقييمات الدقيقة، مما يضمن وصول المُستندات الأكثر ملاءمة إلى الأعلى. مثلاً: إذا سألت "أحذية ركض خفيفة"، قد يُرجع ANN 50 منتجًا يحتوي على كلمات مثل "ركض" أو "خفيفة"، لكن إعادة الترتيب تُميز بين الأحذية المصممة لسباقات الماراثون والأحذية الرياضية العادية، وترفع المُستندات الأكثر دقة إلى المقدمة. الخلاصة النظرية - البحث الدقيق مقابل التقريبي: الدقيق مناسب للبيانات الصغيرة، بينما التقريبي ضروري للبيانات الكبيرة. - الاستعاضة عن الدقة بسرعة: خسارة دقة بسيطة مقابل تحسين كبير في الأداء. - إعادة الترتيب: خطوة حاسمة لتحسين الجودة النهائية، خاصة في السياقات التي تتطلب دقة عالية. التدفق العملي خطوة بخطوة 1. إنشاء المتجهات (Embeddings) (نفس الخطوة كما في الأجزاء السابقة، لكن نخزن المتجهات في FAISS بدلًا من Chroma) ```python from sentence_transformers import SentenceTransformer import numpy as np # نموذج التضمين embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2") # كتالوج المنتجات (النصوص المُقسّمة) all_products = [ "Red running shoes with breathable mesh", "Wireless noise-cancelling headphones", # ... (الباقي من القائمة) ] # توليد المتجهات embeddings = embedder.encode(all_products, convert_to_numpy=True, show_progress_bar=True) embeddings = np.array(embeddings).astype("float32") ``` بناء فهرس ANN باستخدام FAISS ```python import faiss # إنشاء فهرس بـ 128 بعدًا (مطابق لحجم المتجهات) dimension = embeddings.shape[1] index = faiss.IndexFlatIP(dimension) # استخدام الضرب الداخلي (Inner Product) # إضافة المتجهات إلى الفهرس index.add(embeddings) ``` استعلام وبحث تقريبي ```python query = "lightweight running shoes" query_embedding = embedder.encode(query).astype("float32").reshape(1, -1) # البحث عن 5 نتائج أقرب k = 5 distances, indices = index.search(query_embedding, k) # استرجاع النصوص المقابلة retrieved_texts = [all_products[i] for i in indices[0]] ``` إعادة الترتيب باستخدام نموذج تقاطع (Cross-Encoder) ```python from sentence_transformers import CrossEncoder # تحميل نموذج إعادة الترتيب reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2") # إنشاء أزواج (سؤال، مستند) pairs = [(query, text) for text in retrieved_texts] # تقييم الصلاحيات scores = reranker.predict(pairs) # إعادة الترتيب حسب التصنيف ranked_results = sorted(zip(retrieved_texts, scores), key=lambda x: x[1], reverse=True) ``` النتائج النهائية الآن، تكون النتائج مرتبة بدقة عالية، حيث تظهر أكثر المستندات صلة في المقدمة. مخطط تدفق الخطوات المتقدمة في RAG 1. تضمين النصوص → 2. تخزين المتجهات في فهرس ANN (مثل FAISS) → 3. استعلام وبحث تقريبي → 4. استرجاع أول 10–50 نتيجة → 5. تمرير النتائج إلى نموذج إعادة الترتيب → 6. إعادة ترتيب النتائج حسب الدقة السياقية → 7. إرسال النتائج النهائية إلى نموذج LLM للإجابة. هذا التدفق يُعد النموذج الذهبي لتطبيقات RAG الحديثة، حيث يوازن بين السرعة والدقة، ويُمكنه التعامل مع مجموعات بيانات ضخمة بسلاسة.
في هذا الجزء الأخير من سلسلة "مقدمة إلى RAG"، نستعرض التطورات المتقدمة التي تُحسّن كفاءة ودقة أنظمة الاسترجاع المعتمدة على الذكاء الاصطناعي، مع التركيز على طريقتين رئيسيتين: البحث التقريبي للجوار الأقرب (ANN) وإعادة الترتيب (Reranking). عندما تنمو قواعد المعرفة إلى ملايين أو حتى مليارات السجلات — مثل مخازن المنتجات الإلكترونية أو مكتبات الأبحاث — يصبح الاسترجاع الدقيق (Exact Search) بطيئًا جدًا من حيث الأداء وشديد الاستهلاك للذاكرة. هنا يأتي دور ANN، وهو تقنية تُحسّن سرعة الاسترجاع بشكل كبير. بدلًا من مقارنة الاستعلام مع كل متجه في القاعدة، تُستخدم خوارزميات مثل FAISS أو HNSW لبناء هيكل فهرسة ذكي (مثل الرسم البياني أو الشجرة) يسمح بالتنقل السريع نحو المتجهات الأقرب، دون الحاجة إلى فحص جميعها. النتيجة: تسريع الاسترجاع من 100 إلى 1000 مرة، مع فقدان دقيق لا يتجاوز 1% في الدقة — وهو تنازل مقبول تمامًا في التطبيقات التي تتطلب استجابات فورية. لكن حتى ANN ليس مثاليًا. فعلى الرغم من أن النتائج الأولية تكون قريبة من المطلوب، إلا أن الترتيب قد لا يكون الأمثل من حيث الصلة السياقية. قد تظهر منتجات ذات صلة عامة في المقدمة، بينما تُهمل نتائج أكثر دقة. لحل هذه المشكلة، تأتي مرحلة إعادة الترتيب (Reranking). هنا، تُستخدم نماذج أكثر تطورًا — غالبًا نماذج Cross-Encoder أو نماذج لغة كبيرة (LLM) — لتحليل كل نتيجة مُسترجعة بحسب الاستعلام، وإعادة تقييمها وترتيبها وفقًا لدقة الصلة. على سبيل المثال، عند بحث "أحذية ركض خفيفة"، قد تُرجع ANN 50 منتجًا يحملون كلمات مفتاحية مشابهة، لكن إعادة الترتيب تُقدّم الأحذية المصممة خصيصًا للتدريب على الماراثون، بدلًا من الأحذية الرياضية العادية. الخطوة التالية في التدفق هي إنشاء التمثيلات المتجهة (Embeddings) باستخدام نموذج مثل all-MiniLM-L6-v2، ثم حفظها في بنية FAISS لتسهيل الاسترجاع السريع. يتم ترميز جميع وصف المنتجات إلى متجهات رقمية، ثم تحويلها إلى نوع بيانات float32 متوافق مع FAISS. بعد ذلك، عند استقبال استعلام، يتم: 1. ترميز الاستعلام إلى متجه. 2. استخدام FAISS لاسترجاع مجموعة من المتجهات "الأقرب تقريبًا" (مثل 100 نتيجة). 3. تمرير هذه النتائج إلى نموذج إعادة الترتيب (مثل cross-encoder/ms-marco-MiniLM-L-6-v2) لحساب تقييم دقيق لكل نتيجة. 4. إعادة ترتيب النتائج حسب الصلة، وتقديم أقوى 5 نتائج. النتيجة النهائية: نظام RAG سريع جدًا، دقيق للغاية، ويُقدّم معلومات ذات صلة حقيقية في لحظات، مما يجعله مناسبًا للتطبيقات الصناعية مثل الدعم الفني الذكي، التوصية الشخصية، أو استعلامات البحث داخل منصات كبيرة. بالتالي، فإن الجمع بين ANN وReranking يمثل الحد الأقصى من التوازن بين السرعة والدقة، وهو المعيار الذهبي في تصميم أنظمة RAG الحديثة.