أصبح الاسترجاع المعزز بالتوليد (RAG) المعيار الذهبي لدمج نماذج اللغات الكبيرة (LLMs) مع البيانات الخاصة أو الملكية. ومع ذلك، غالباً ما يفشل نهج "البدائي" لـ RAG—وهو التقسيم البسيط للنصوص، والتضمين المتجهي، والبحث باستخدام تشابه جيب التمام—في تلبية متطلبات السيناريوهات المؤسسية المعقدة. ومع نمو قدرات النماذج، ينتقل الاختناق من جودة التوليد إلى دقة الاسترجاع. في هذا المنشور، سنستكشف تقنيات متقدمة لتحويل خط أنابيب RAG الأساسي إلى نظام قوي وجاهز للإنتاج، قادر على التعامل مع الاستدلال متعدد الخطوات والاستعلامات الدلالية الكثيفة.
لماذا يفشل RAG الأساسي
القيود الرئيسية لـ RAG الأساسي هي اعتماده على فضاء متجهي واحد لالتقاط كل من المعنى الدلالي وملاءمة الكلمات المفتاحية. وهذا يؤدي غالباً إلى:
- الانحراف الدلالي: إرجاع وثائق متشابهة مفاهيمياً ولكن غير ذات صلة واقعية.
- عدم تطابق الكلمات المفتاحية: فقدان الكيانات المحددة (مثل رموز المنتجات، الأسماء) التي نادرة في بيانات تدريب نموذج التضمين.
- فقدان السياق: غالباً ما يؤدي التقسيم بحجم ثابت إلى قطع سياق حاسم أو تضمين ضوضاء غير ذات صلة.
البحث الهجين: الجمع بين أفضل ما في العالمين
لمعالجة هذه المشكلات، يجمع البحث الهجين بين الاسترجاع المتجهي الكثيف والاسترجاع القائم على الكلمات المفتاحية المتفرقة (مثل BM25). تلتقط المتجهات الكثيفة المعنى، بينما تلتقط المتجهات المتفرقة التطابقات الدقيقة. ثم يتم دمج النتائج من كلا المصدرين باستخدام خوارزميات مثل الاندماج التبادلي للترتيب (RRF).
إليك كيفية تنفيذ مسترجع هجين بسيط باستخدام LangChain:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# Initialize your vector store
vectorstore = FAISS.from_texts(["Your corpus here..."], OpenAIEmbeddings())
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 10})
# Initialize BM25 retriever for keyword matching
bm25_retriever = BM25Retriever.from_texts(["Your corpus here..."])
bm25_retriever.k = 10
# Combine them using RRF
retriever = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.6, 0.4]
)
docs = retriever.get_relevant_documents("What is the policy for Q3 refunds?")
يعزز هذا النهج بشكل كبير معدل الاستدعاء (Recall) للكيانات المحددة مع الحفاظ على الصلة الدلالية للأسئلة الأوسع.
التقسيم الذكي وتصفية البيانات الوصفية
ليس جميع التقسيمات متساوية. بدلاً من التقسيم التعسفي القائم على الأحرف، فكر في استخدام التقسيم الدلالي أو التقسيم الهرمي. يستخدم التقسيم الدلالي أوجه التشابه في التضمين للكشف عن الفواصل الطبيعية في النص، مما يحافظ على سلامة الفقرات. وعلاوة على ذلك، يعد الاستفادة من البيانات الوصفية أمراً بالغ الأهمية. من خلال تصفية الوثائق بناءً على البيانات الوصفية (مثل التاريخ، نوع المستند، المؤلف) قبل أو أثناء الاسترجاع، تقلل بشكل كبير من مساحة البحث والضوضاء.
على سبيل المثال، إذا سأل المستخدم عن "التقارير المالية لعام 2023"، فيجب عليك تصفية فهرس البيانات الوصفية ليشمل فقط الوثائق من ذلك العام قبل إجراء البحث المتجهي.
إعادة الترتيب للدقة
حتى مع البحث الهجين، قد يعود الاسترجاع الأولي بمرشحين منخفضي الجودة. يمكن لمعيد ترتيب من نوع Cross-encoder فحص زوج الاستعلام-الوثيقة مباشرة. وعلى عكس نماذج التضمين التي تشفر الاستعلام والوثيقة بشكل منفصل، تعالج نماذج Cross-encoder معاً، مما يسمح بنتيجة ملاءمة أكثر دقة وتفاصيل.
على الرغم من أنها أكثر تكلفة حسابياً، فإن إضافة خطوة إعادة الترتيب في نهاية خط أنابيب الاسترجاع (إعادة ترتيب أفضل k نتائج) غالباً ما تكون الطريقة الأكثر فعالية لتحسين دقة الإجابات. توفر المكتبات مثل sentence-transformers نماذج Cross-encoder فعالة يمكنها إعادة ترتيب أول 50 نتيجة لك إلى أهم 5 نتائج فقط.
الخاتمة
لا يتعلق الأمر بـ RAG المتقدم باستبدال نماذج اللغات الكبيرة (LLMs)، بل بتوفير سياق أعلى جودة لها. من خلال تنفيذ البحث الهجين، والتقسيم الذكي، وتصفية البيانات الوصفية، وإعادة ترتيب Cross-encoder، يمكن للمطورين بناء أنظمة ليست ذكية فحسب، بل موثوقة أيضاً. ومع تطور مشهد الذكاء الاصطناعي، سيظل إتقان هذه تقنيات الاسترجاع هو العامل المميز بين العرض التجريبي والحل المؤسسي القابل للنشر.