تفترض أنظمة توليد المعزز بالاسترجاع (RAG) التقليدية غالبًا أن المستندات المسترجعة ذات صلة دائمًا باستعلام المستخدم. ومع ذلك، في السيناريوهات الواقعية، قد تفشل أنظمة الاسترجاع بسبب الاستعلامات الغامضة أو مخازن المتجهات القديمة أو سوء محاذاة التضمينات. عندما تولد نظام RAG إجابة بناءً على سياق غير ذي صلة، تكون النتيجة غالبًا هلوسة. يعالج RAG التصحيحي (CRAG) هذه المشكلة من خلال تقديم طبقة تقييم آلية تقيّم جودة المقاطع المسترجعة وتطلق آليات احتياطية، مثل البحث في الويب، عند الضرورة.
بنية CRAG
الفلسفة الأساسية وراء CRAG هي "قيّم ثم تصرّف". بدلاً من تمرير المستندات المسترجعة بشكل أعمى إلى نموذج اللغة الكبير (LLM)، يستخدم CRAG مصنفًا خفيف الوزن أو النموذج نفسه لتحديد صلة النتائج الأعلى (top-k). عادةً ما يصنّف هذا الحكم الاسترجاع في ثلاث حالات:
- صحيح: تحتوي المستندات المسترجعة على معلومات كافية للإجابة على الاستعلام. يواصل النظام استخدام RAG القياسي.
- غامض: قد تكون المستندات مفيدة لكنها تفتقر إلى الاكتمال. قد يحسّن النظام البحث أو يعزز الأمر (prompt).
- خاطئ: المستندات غير ذات صلة. يتخلص النظام من السياق المحلي ويطلق بحثًا في الويب للعثور على معلومات جديدة وموثوقة.
تنفيذ تقييم الصلة
بينما يمكن استخدام نماذج تصنيف مخصصة، فإن نهجًا شائعًا وفعالًا لـ CRAG هو استخدام LLM لإجراء تصنيف بدون أمثلة (zero-shot) أو بعدد قليل من الأمثلة (few-shot) لجودة الاسترجاع. فيما يلي مثال بلغة بايثون باستخدام LangChain لإظهار كيفية هيكلة هذه المنطق.
from langchain_community.llms import OpenAI
from langchain.prompts import ChatPromptTemplate
def assess_relevance(query: str, context: str, llm: OpenAI) -> str:
"""
Uses an LLM to assess if the retrieved context is relevant to the query.
Returns 'Correct', 'Ambiguous', or 'Incorrect'.
"""
prompt_template = ChatPromptTemplate.from_template(
"""
You are a relevance classifier. Analyze the following query and retrieved context.
Query: {query}
Context: {context}
Determine the relevance of the context to the query.
- Correct: The context directly answers the query.
- Ambiguous: The context is partially relevant but missing key details.
- Incorrect: The context is completely unrelated.
Respond with only one word: Correct, Ambiguous, or Incorrect.
"""
)
chain = prompt_template | llm
return chain.invoke({"query": query, "context": context}).content.strip()
# Example usage logic
query = "What is the latest status of the Paris Agreement?"
retrieved_context = "The Earth is the third planet from the Sun..."
relevance_score = assess_relevance(query, retrieved_context, llm)
if relevance_score == "Incorrect":
# Trigger Web Search Fallback
print("Retrieval failed. Triggering web search...")
# web_search_results = search_engine(query)
# final_context = web_search_results
elif relevance_score == "Ambiguous":
print("Retrieval ambiguous. Augmenting with additional sources...")
else:
print("Retrieval successful. Using local context.")
آلية البحث الاحتياطية في الويب
عندما يؤدي التقييم إلى نتيجة "خاطئة"، ينقل CRAG عبء العثور على المعلومات من قاعدة بيانات المتجهات الثابتة إلى واجهات برمجة تطبيقات البحث الديناميكية في الويب. يضمن هذا وصول LLM إلى بيانات حديثة ودقيقة من الناحية الواقعية، مما يقلل بشكل كبير من معدلات الهلوسة. من الضروري تنفيذ تحديد المعدل (rate limiting) والتخزين المؤقت (caching) لهذه عمليات البحث في الويب لإدارة التكاليف وحصص API بفعالية.
خاتمة
يمثل RAG التصحيحي خطوة مهمة إلى الأمام في بناء تطبيقات LLM قوية. من خلال عدم الثقة العمياء في عملية الاسترجاع، يمكن للمطورين إنشاء أنظمة تصحح نفسها وتتكيف مع استعلامات المستخدمين المعقدة. يتطلب تنفيذ CRAG حسابات إضافية لخطوة التقييم، لكن المفاضلة تؤدي إلى تحسين كبير في دقة الإجابات وموثوقيتها، مما يجعله نمطًا أساسيًا لخطوط RAG بمستوى الإنتاج.