الدرس 10 من 20

الذاكرة والمعرفة

تكامل RAG

4 دقيقة للقراءة

التوليد المعزز بالاسترجاع (RAG) يمنح الوكلاء الوصول إلى المعرفة الخارجية خارج بيانات تدريبهم. إنه ضروري لبناء وكلاء يحتاجون معلومات حالية أو محددة أو ملكية.

كيف يعمل RAG

استعلام المستخدم ← التضمين ← البحث في قاعدة بيانات المتجهات ← استرجاع المستندات ← تعزيز الموجه ← التوليد

تنفيذ RAG الأساسي

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# 1. إنشاء التضمينات
embeddings = OpenAIEmbeddings()

# 2. تحميل وتقسيم المستندات
documents = load_documents("./knowledge_base/")
chunks = split_into_chunks(documents, chunk_size=500)

# 3. إنشاء مخزن المتجهات
vectorstore = Chroma.from_documents(chunks, embeddings)

# 4. إنشاء المسترد
retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 5}  # إرجاع أفضل 5 تطابقات
)

# 5. سلسلة RAG
def rag_query(question):
    # استرجاع المستندات ذات الصلة
    docs = retriever.get_relevant_documents(question)
    context = "\n".join([doc.page_content for doc in docs])

    # التوليد مع السياق
    response = llm.generate(f"""
    السياق: {context}

    السؤال: {question}

    أجب بناءً على السياق المقدم:
    """)
    return response

RAG للوكلاء

ادمج RAG كأداة لوكيلك:

from langchain.tools import Tool

# إنشاء أداة RAG
rag_tool = Tool(
    name="knowledge_base",
    description="ابحث في قاعدة معرفة الشركة عن السياسات والإجراءات والوثائق",
    func=rag_query
)

# أضف للوكيل
agent = create_agent(
    llm=llm,
    tools=[rag_tool, other_tools...]
)

استراتيجيات التقسيم

الاستراتيجية الأفضل لـ حجم القطعة
حجم ثابت النص العام 500-1000 رمز
دلالي المستندات التقنية متغير
جملة المحادثات 1-3 جمل
مستند الملفات القصيرة المستند كاملاً
# مثال التقسيم الدلالي
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,  # التداخل يمنع فقدان السياق عند الحدود
    separators=["\n\n", "\n", ". ", " "]
)

تقنيات RAG المتقدمة

البحث الهجين

اجمع بين البحث الدلالي والكلمات المفتاحية:

from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever

# بحث الكلمات المفتاحية
bm25 = BM25Retriever.from_documents(documents)

# البحث الدلالي
semantic = vectorstore.as_retriever()

# اجمع الاثنين
hybrid = EnsembleRetriever(
    retrievers=[bm25, semantic],
    weights=[0.3, 0.7]  # أعط الدلالي وزناً أعلى
)

إعادة الترتيب

تحسين الصلة بمرور ثانٍ:

from cohere import Client

def rerank_results(query, documents):
    cohere = Client(api_key="...")
    results = cohere.rerank(
        query=query,
        documents=[doc.page_content for doc in documents],
        top_n=3
    )
    return [documents[r.index] for r in results]

أفضل ممارسات RAG

افعل:

  • استخدم قطعاً متداخلة
  • ضمّن البيانات الوصفية (المصدر، التاريخ)
  • نفّذ تصفية الصلة
  • حدّث الفهرس بانتظام

لا تفعل:

  • تقسيم صغير جداً (يفقد السياق)
  • تقسيم كبير جداً (ضوضاء)
  • تجاهل نسب المصدر
  • تخطي التقييم

بعد ذلك، سنستكشف أنواع الذاكرة المختلفة للحفاظ على حالة الوكيل. :::

اختبار

الوحدة 3: الذاكرة والمعرفة

خذ الاختبار