الفصل 3: تصحيح خطوط أنابيب RAG
أنماط الإخفاق الشائعة
1. استُرجعت وثائق خاطئة
الأعراض: يعطي نموذج LLM إجابات خاطئة أو غير ذات صلة
الأسباب:
- حجم chunk سيئ
- نموذج embedding خاطئ
- مرشّحات metadata ناقصة
الحلول:
# Check what's being retrieved
docs = retriever.get_relevant_documents(query)
for doc in docs:
print(f"Score: {doc.metadata.get('score')}")
print(f"Content: {doc.page_content[:200]}...")
print("---")
2. يتجاهل نموذج LLM السياق
الأعراض: الإجابة لا تعكس الوثائق المسترجعة
الأسباب:
- مشكلات في قالب الـ prompt
- السياق طويل جدًا
- السياق غير منسَّق بوضوح
الحلول:
# Better prompt structure
prompt = """
CONTEXT (use this information to answer):
{context}
QUESTION: {question}
INSTRUCTIONS: Answer ONLY using the context above.
If the context doesn't contain the answer, say "I don't know."
ANSWER:"""
3. الهلوسات
الأعراض: إجابات واثقة لكنها خاطئة
الأسباب:
- استُرجعت وثائق خاطئة
- يخرج نموذج LLM عن السياق
الحلول:
- حسّن جودة الاسترجاع
- استخدم prompts تثبيت صريحة
- خفّض درجة الحرارة (temperature)
التتبّع باستخدام LangSmith
from langsmith import Client
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-key"
# Now all LangChain calls are traced
# View at smith.langchain.com
قائمة تصحيح الأخطاء
| الخطوة | التحقّق | الأداة |
|---|---|---|
| 1 | هل تعمل embeddings؟ | اختبر embedding لاستعلام |
| 2 | هل اُسترجعت الوثائق الصحيحة؟ | اطبع الوثائق المسترجعة |
| 3 | هل يتسع السياق في الـ prompt؟ | تحقّق من عدد الـ tokens |
| 4 | هل يرى نموذج LLM السياق؟ | اطبع الـ prompt الكامل |
| 5 | هل الإجابة مثبتة؟ | قارن بالسياق |
تحسين الأداء
تقليل زمن الاستجابة
# Async retrieval
async def fast_rag(query):
# Parallel embedding and retrieval
embedding_task = embed_async(query)
embedding = await embedding_task
docs = await retrieve_async(embedding)
return await generate_async(query, docs)
تقليل التكاليف
- استخدم نماذج أصغر حيث أمكن
- خزّن الاستعلامات المتكرّرة مؤقتًا
- عالج embeddings على دفعات
- حدّ من حجم السياق