AI: RAG (التوليد المعزز بالاسترجاع)

آخر تحديث: 2026-08-26

1. ماذا ستتعلم

❶ ما هي المشاكل التي حلّتها RAG — انقطاع المعرفة والهلاوس في نماذج اللغة الكبيرة (LLMs)
❷ الفهم الحدسي لتضمينات المتجهات (Vector Embeddings)
❸ البحث عن التشابه — تشابه جيب التمام (Cosine Similarity)
❹ عملية RAG: الاسترجاع → التحسين → التوليد
❺ تنفيذ نظام RAG بسيط بلغة بايثون (Python)


2. القصة

تتولى أليس إدارة المعرفة الداخلية في شركة متوسطة الحجم. لقد تراكمت لدى الشركة أكثر من 1000 مستند PDF - تتراوح من سياسات استرداد النفقات إلى إجراءات السلامة. كلما سأل موظف جديد سؤالاً، كان على أليس البحث اليدوي في المستندات، وهو أمر غير فعّال للغاية.

لقد حاولت استخدام ChatGPT مباشرة للإجابة عن الأسئلة الداخلية، لكن ChatGPT لم يكن يعرف شيئًا عن مستندات الشركة وغالبًا ما كان "يختلق" سياسات غير موجودة - على سبيل المثال، كانت تزعم أن "بدل السفر هو 80 دولارًا في اليوم"، بينما كانت السياسة الفعلية 45 دولارًا.

اقترح تشارلي حلاً: "أولاً، ابحث عن الفقرات المتعلقة بالسؤال في قاعدة المعرفة، ثم اطلب من نموذج اللغة الكبير (LLM) الإجابة بناءً على تلك الفقرات - بهذه الطريقة، لن يختلق الأشياء." هذا هو RAG (التوليد المعزز بالاسترجاع).

اتبعت أليس هذه الخطوات: لقد قسمت المستند إلى أجزاء، وأولدت المتجهات (vectors)، وحفظتها في قاعدة بيانات متجهات (vector database)؛ عندما يطرح المستخدم سؤالاً، تبدأ أولاً باسترجاع الفقرات الأكثر صلة، ثم تتضمنها في التوجيه (prompt) لنموذج اللغة الكبير (LLM) ليجيب. ومنذ ذلك الحين، أصبحت الإجابات "مبينة على الأدلة"، وانخفضت التوهات (hallucinations) بشكل كبير، وتمكن الموظفون الجدد من الحصول على إجابات دقيقة بسرعة.


3. قضايا قطع المعرفة والهلوسة في النماذج اللغوية الكبيرة

(1) قطع المعرفة

تأتي معرفة النموذج اللغوي الكبير من بيانات التدريب الخاصة به، وبمجرد اكتمال التدريب، يتم "تجميدها". بيانات تدريب GPT-4 حديثة حتى عام 2023، لذا لا يعرف شيئًا عن الأحداث التي وقعت منذ ذلك الحين. والأهم من ذلك، أن بياناتك الخاصة (وثائق الشركة، ملاحظاتك الشخصية) لم تكن مدرجة أبدًا في مجموعة التدريب، لذا فإن النموذج اللغوي الكبير عاجز بطبيعته عن الإجابة على الأسئلة المتعلقة بها.

(2) الهلوسة

عندما يواجه النموذج اللغوي الكبير سؤالًا لا يعرف إجابته، لا يقول "لا أعرف"، بل يختلق بثقة إابة تبدو معقولة - وهذا هو الهلوسة. تكون الهلوسة خطيرة بشكل خاص في مهام الإجابة على الأسئلة الواقعية.

(3) المفهوم الأساسي لـ RAG

بدلاً من جعل النموذج اللغوي الكبير "يحفظ" كل المعرفة، من الأفضل توفير المعلومات ذات الصلة ديناميكيًا عند طرح سؤال، مما يسمح للنموذج اللغوي الكبير بالاستجابة بناءً على السياق المعطى. هذا هو RAG:

الميزة النموذج اللغوي الكبير النقي النموذج اللغوي الكبير المعزز بـ RAG
مصدر المعرفة بيانات التدريب فقط بيانات التدريب + التوثيق الخارجي
البيانات الخاصة غير قابلة للوصول قابلة للاسترجاع
مخاطر الهلوسة مرتفعة (معرضة للتأليف) منخفضة (مقيّدة سياقيًا)
تحديث المعرفة يتطلب إعادة التدريب فقط قم بتحديث التوثيق
التكلفة تكلفة الاستدلال تكلفة الاستدلال + الاسترجاع
القابلية للتتبع لا يوجد فقرة مصدر قابلة للاستشهاد

  1. التضمينات المتجهية

(1) كيف يتم تحويل النص إلى متجه؟

التضمين هو عملية تحويل النص إلى متجهات عالية الأبعاد. على سبيل المثال، بعد المرور عبر نموذج التضمين، يتم تحويل الجملة إلى مصفوفة من الأعداد العشرية المتحركة بحجم 1,536 بُعدًا. النصوص ذات المعاني المتشابهة تكون متجهاتها متشابهة، بينما النصوص ذات المعاني المختلفة تكون متجهاتها متباعدة.

يمكنك التفكير في التضمينات كـ"نظام إحداثيات دلالي": كل نص له موضع في هذا النظام، والنصوص الأقرب إلى بعضها دلاليًا هي الأكثر تشابهًا في المعنى.

(2) نماذج التضمين الشائعة

النموذج الأبعاد المزود الميزات
text-embedding-3-small 1536 OpenAI قيمة ممتازة مقابل السعر، سريع
text-embedding-3-large 3072 OpenAI دقة أعلى، تكلفة أعلى
text-embedding-ada-002 1536 OpenAI الجيل السابق، لا يزال مستخدمًا على نطاق واسع
bge-large-en-v1.5 1024 BAAI مفتوح المصدر، أداء ممتاز باللغة الإنجليزية
bge-large-zh-v1.5 1024 BAAI مفتوح المصدر، أداء ممتاز باللغة الصينية
m3e-base 768 Moka AI مفتوح المصدر، يدعم كلاً من الصينية والإنجليزية

▶ مثال: توليد التضمينات النصية باستخدام واجهة برمجة تطبيقات OpenAI (الصعوبة: ⭐)

PYTHON
from openai import OpenAI

client = OpenAI()

def get_embedding(text: str, model: str = "text-embedding-3-small") -> list[float]:
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

# النص: "بدل السفر للشركة هو 45 دولارًا في اليوم."
text = "The company travel allowance is $45 per day."
vector = get_embedding(text)

# طباعة الأبعاد والقيم الأولى للمتجه
print(f"البُعد: {len(vector)}")
print(f"أول 5 قيم: {vector[:5]}")
TEXT 📖 للعرض فقط
البُعد: 1536
أول 5 قيم: [0.0123, -0.0045, 0.0378, -0.0211, 0.0056]


4. البحث عن التشابه و cosine similarity

(1) تشابه جيب التمام (cosine similarity)

يقيس تشابه جيب التمام (cosine similarity) درجة التشابه بين اتجاهي متجهين، حيث تتراوح قيمته بين [-1، 1]:

$$\text{cosine_similarity}(A, B) = \frac{A \cdot B}{|A| \times |B|}$$

(2) قواعد بيانات المتجهات

قاعدة بيانات المتجهات هي نظام مصمم خصيصًا لتخزين المتجهات واسترجاعها، ويدعم عمليات البحث التقريبية عن الجيران الأقرب (ANN) بكفاءة.

قاعدة البيانات النوع الميزات
Chroma مفتوح المصدر، مدمج بايثون أصلي، مناسب للنماذج الأولية
FAISS مفتوح المصدر، مكتبة مدعومة من Meta، سريعة للغاية، محلية بالكامل
Pinecone خدمات سحابية إدارة متكاملة، قابلة للتوسع، الدفع حسب الاستخدام
Milvus مفتوح المصدر، موزع مناسب لبيئات الإنتاج الكبرى
Qdrant مفتوح المصدر مُنفذ بلغة Rust، بأداء ممتاز

▶ مثال: حساب تشابه جيب التمام (cosine similarity) بين جملتين (الصعوبة: ⭐)

PYTHON
import numpy as np

def cosine_similarity(a: list[float], b: list[float]) -> float:
    a_arr = np.array(a)
    b_arr = np.array(b)
    dot = np.dot(a_arr, b_arr)
    norm_a = np.linalg.norm(a_arr)
    norm_b = np.linalg.norm(b_arr)
    return float(dot / (norm_a * norm_b))

sentences = {
    "travel_allowance": get_embedding("The company travel allowance is $45 per day."),
    "reimbursement": get_embedding("How do I claim travel reimbursement?"),
    "unrelated": get_embedding("The weather is sunny today."),
}

sim1 = cosine_similarity(sentences["travel_allowance"], sentences["reimbursement"])
sim2 = cosine_similarity(sentences["travel_allowance"], sentences["unrelated"])

print(f"Related sentences:   {sim1:.4f}")
print(f"Unrelated sentences: {sim2:.4f}")
TEXT 📖 للعرض فقط
Related sentences:   0.8234
Unrelated sentences: 0.3012

▶ مثال: استرجاع متجهات بسيط—إيجاد المستند الأكثر تشابهًا (الصعوبة: ⭐⭐)

PYTHON
def top_k_search(
    query_embedding: list[float],
    doc_embeddings: list[list[float]],
    doc_texts: list[str],
    k: int = 3,
) -> list[tuple[str, float]]:
    similarities = [
        (doc_texts[i], cosine_similarity(query_embedding, doc_embeddings[i]))
        for i in range(len(doc_texts))
    ]
    similarities.sort(key=lambda x: x[1], reverse=True)
    return similarities[:k]

documents = [
    "Travel allowance is $45 per day for domestic trips.",
    "International travel requires VP approval in advance.",
    "Employees must submit receipts within 30 days.",
    "Remote work policy allows up to 2 days per week at home.",
    "The office kitchen is stocked with free coffee and snacks.",
]

doc_embeddings = [get_embedding(doc) for doc in documents]
query = "How much can I spend on travel per day?"
query_embedding = get_embedding(query)

results = top_k_search(query_embedding, doc_embeddings, documents, k=3)

for text, score in results:
    print(f"[{score:.4f}] {text}")
TEXT 📖 للعرض فقط
[0.8912] Travel allowance is $45 per day for domestic trips.
[0.7634] Employees must submit receipts within 30 days.
[0.7102] International travel requires VP approval in advance.


5. بنية RAG: الاسترجاع → التحسين → التوليف

(1) عملية RAG الكاملة

يجمع RAG بين "الاسترجاع" و"التوليف" لتشكيل سير عمل كامل:

  1. سؤال المستخدم: يدخل المستخدم سؤالًا باللغة الطبيعية.
  2. استعلام التضمين: تحويل الاستعلام إلى متجه.
  3. الاسترجاع بالمتجهات: البحث عن أكثر أجزاء المستندات تشابهًا (Top-K) في قاعدة بيانات المتجهات.
  4. تحسين السياق: دمج المستندات المسترجعة في الموجه (prompt).
  5. توليف LLM: يجيب LLM على الأسئلة بناءً على الموجه المحسّن.

(2) مخطط Mermaid Flowchart

100%
graph TB
    A["سؤال المستخدم"] --> B["استعلام التضمين"]
    B --> C["بحث بالمتجهات"]
    D["مقاطع المستندات<br/>+ التضمينات"] --> C
    C --> E["النتائج الأعلى (Top-K)"]
    E --> F["موجه محسّن<br/>السياق + السؤال"]
    F --> G["توليف LLM"]
    G --> H["الإجابة"]

(3) القرارات التصميمية الرئيسية

▶ مثال: سير استدعاء RAG الكامل (الصعوبة: ⭐⭐)

PYTHON
from openai import OpenAI

client = OpenAI()

def rag_query(question: str, documents: list[str], k: int = 3) -> str:
    query_emb = get_embedding(question)
    doc_embs = [get_embedding(doc) for doc in documents]
    top_docs = top_k_search(query_emb, doc_embs, documents, k=k)

    context = "\n\n".join([f"[Doc {i+1}] {text}" for i, (text, _) in enumerate(top_docs)])

    prompt = f"""Answer the question based ONLY on the following context.
If the context does not contain the answer, say "I don't know."

Context:
{context}

Question: {question}
Answer:"""

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0,
    )
    return response.choices[0].message.content

docs = [
    "Travel allowance is $45 per day for domestic trips.",
    "International travel requires VP approval at least 2 weeks in advance.",
    "Employees must submit expense reports within 30 days of the trip.",
    "The maximum hotel reimbursement is $200 per night.",
    "Flight bookings must use the company travel portal.",
]

answer = rag_query("What is the daily travel allowance?", docs)
print(answer)
TEXT 📖 للعرض فقط
بدل السفر اليومي هو 45 دولارًا للرحلات المحلية.

▶ مثال: مقارنة جودة الإجابة مع RAG وبدونه (الصعوبة: ⭐⭐)

PYTHON
def ask_without_rag(question: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": question}],
        temperature=0,
    )
    return response.choices[0].message.content

question = "What is Acme Corp's daily travel allowance?"

print("=== Without RAG ===")
print(ask_without_rag(question))

print("\n=== With RAG ===")
print(rag_query(question, docs))
TEXT 📖 للعرض فقط
=== بدون RAG ===
ليس لدي معلومات محددة عن بدل السفر اليومي في شركة Acme Corp.
تختلف بدلات السفر للشركات، لكن النطاق الشائع هو 50-100 دولار في اليوم.
يرجى التحقق من سياسة السفر في شركتك للحصول على المبلغ الدقيق.

=== مع RAG ===
بدل السفر اليومي هو 45 دولارًا للرحلات المحلية.

بدون RAG، إما يعترف نماذج LLM بأنها لا تعرف أو تقدم إجابة عامة مختلقة؛ مع RAG، تكون إجاباتها دقيقة وموثوقة.


6. استراتيجية التقسيم (Chunking Strategy)

(1) لماذا التقسيم ضروري؟

غالباً ما تكون المستندات طويلة جداً لا يمكن تضمينها (embedding) مباشرة. يجب تقسيم المستندات الطويلة إلى أجزاء أصغر تسمى chunks، ثم إنشاء تضمينات لكل جزء على حدة. تؤثر استراتيجية التقسيم مباشرة على جودة الاسترجاع.

(2) استراتيجيات التقسيم الشائعة

الاستراتيجية المبدأ المزايا العيوب
أجزاء ذات حجم ثابت التقسيم إلى مقاطع كل N رمز (token) بسيطة التنفيذ قد تقطع المعنى
التقسيم على مستوى الجمل التقسيم عبر نقاط التوقف / فواصل الأسطر مكتملة دلالياً قد تكون المقاطع صغيرة جداً أو كبيرة جداً
التقسيم على مستوى الفقرات التقسيم حسب الفقرات تماسك دلالي طول غير منتظم
التقسيم الدلالي (Semantic Chunking) يكشف الحدود الدلالية بناءً على تشابه التضمين أكمل دلالياً تكلفة حسابية عالية
التقسيم التكراري للشخصيات تقسيم تكراري عبر تسلسل الفواصل موازنة بين الدلالة والطول يتطلب ضبط المعلمات

(3) توصيات حول معلمات التقسيم

(4) التقسيم التكراري باستخدام LangChain

PYTHON
from langchain.text_splitter import RecursiveCharacterTextSplitter

text = """Acme Corp Travel Policy

1. Domestic Travel
The daily travel allowance is $45. This covers meals and incidental expenses.
Hotel reimbursement is capped at $200 per night.

2. International Travel
All international trips require VP approval at least 2 weeks in advance.
The daily allowance for international travel is $75.
Hotel reimbursement is capped at $300 per night.

3. Expense Reporting
All expense reports must be submitted within 30 days of trip completion.
Receipts are required for all expenses over $25."""

splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=50,
    separators=["\n\n", "\n", ". ", " "],
)

chunks = splitter.split_text(text)
for i, chunk in enumerate(chunks):
    print(f"--- Chunk {i+1} ---")
    print(chunk)
    print()
TEXT 📖 للعرض فقط
--- Chunk 1 ---
Acme Corp Travel Policy

1. Domestic Travel
The daily travel allowance is $45. This covers meals and incidental expenses.
Hotel reimbursement is capped at $200 per night.

--- Chunk 2 ---
2. International Travel
All international trips require VP approval at least 2 weeks in advance.
The daily allowance for international travel is $75.

--- Chunk 3 ---
international travel is $75.
Hotel reimbursement is capped at $300 per night.

3. Expense Reporting
All expense reports must be submitted within 30 days of trip completion.


7. مثال شامل: نظام أسئلة شائعة قاعدة معرفية مصغرة

بناء خط معالجة RAG كامل: 3 مستندات → تقسيم النص → التضمين (Embedding) → التخزين → استعلام المستخدم → الاسترجاع → دمج التوجيهات (Prompt) → استجابة نموذج اللغة الكبيرة (LLM).

▶ مثال: نظام أسئلة شائعة قاعدة معرفية مصغرة (الصعوبة: ⭐⭐⭐)

PYTHON
import numpy as np
from openai import OpenAI

client = OpenAI()

# --- الخطوة 1: إعداد المستندات ---
documents = [
    {
        "title": "Travel Policy",
        "content": (
            "Acme Corp Travel Policy\n\n"
            "1. Domestic Travel\n"
            "The daily travel allowance is $45 for domestic trips. "
            "This covers meals and incidental expenses. "
            "Hotel reimbursement is capped at $200 per night.\n\n"
            "2. International Travel\n"
            "All international trips require VP approval at least 2 weeks in advance. "
            "The daily allowance for international travel is $75. "
            "Hotel reimbursement is capped at $300 per night."
        ),
    },
    {
        "title": "Leave Policy",
        "content": (
            "Acme Corp Leave Policy\n\n"
            "1. Annual Leave\n"
            "Full-time employees receive 15 days of paid annual leave per year. "
            "Unused leave can be carried over to the next year, up to a maximum of 5 days.\n\n"
            "2. Sick Leave\n"
            "Employees receive 10 days of paid sick leave per year. "
            "A doctor's note is required for absences exceeding 3 consecutive days."
        ),
    },
    {
        "title": "IT Security Policy",
        "content": (
            "Acme Corp IT Security Policy\n\n"
            "1. Password Requirements\n"
            "All passwords must be at least 12 characters long and include uppercase, "
            "lowercase, numbers, and special characters. "
            "Passwords must be changed every 90 days.\n\n"
            "2. Device Policy\n"
            "Personal devices may not connect to the corporate network. "
            "All company devices must have approved antivirus software installed."
        ),
    },
]

# --- الخطوة 2: تقسيم المستندات (Chunking) ---
def chunk_text(text: str, chunk_size: int = 200, overlap: int = 50) -> list[str]:
    words = text.split()
    chunks = []
    start = 0
    while start < len(words):
        end = start + chunk_size
        chunks.append(" ".join(words[start:end]))
        start += chunk_size - overlap
    return chunks

all_chunks: list[str] = []
chunk_sources: list[str] = []

for doc in documents:
    chunks = chunk_text(doc["content"])
    for chunk in chunks:
        all_chunks.append(chunk)
        chunk_sources.append(doc["title"])

print(f"Total chunks: {len(all_chunks)}")

# --- الخطوة 3: توليد التضمينات (Embeddings) ---
def get_embedding(text: str, model: str = "text-embedding-3-small") -> list[float]:
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

chunk_embeddings = [get_embedding(chunk) for chunk in all_chunks]
print(f"Embedding dimension: {len(chunk_embeddings[0])}")

# --- الخطوة 4: البحث المتجهي (Vector Search) ---
def cosine_similarity(a: list[float], b: list[float]) -> float:
    a_arr = np.array(a)
    b_arr = np.array(b)
    return float(np.dot(a_arr, b_arr) / (np.linalg.norm(a_arr) * np.linalg.norm(b_arr)))

def search(query: str, k: int = 3) -> list[tuple[str, str, float]]:
    query_emb = get_embedding(query)
    scores = [
        (all_chunks[i], chunk_sources[i], cosine_similarity(query_emb, chunk_embeddings[i]))
        for i in range(len(all_chunks))
    ]
    scores.sort(key=lambda x: x[2], reverse=True)
    return scores[:k]

# --- الخطوة 5: استعلام RAG ---
def rag_answer(question: str, k: int = 3) -> str:
    results = search(question, k=k)

    context_parts = []
    for i, (chunk, source, score) in enumerate(results):
        context_parts.append(f"[Source: {source}, Relevance: {score:.2f}]\n{chunk}")
    context = "\n\n---\n\n".join(context_parts)

    prompt = f"""Answer the question based ONLY on the following context.
If the context does not contain enough information, say "I don't have enough information."
Always cite which source document your answer comes from.

Context:
{context}

Question: {question}
Answer:"""

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0,
    )
    return response.choices[0].message.content

# --- الخطوة 6: اختبار ---
questions = [
    "What is the daily travel allowance for domestic trips?",
    "How many days of annual leave do employees get?",
    "What are the password requirements?",
    "What is the company's remote work policy?",
]

for q in questions:
    print(f"Q: {q}")
    print(f"A: {rag_answer(q)}")
    print()
TEXT 📖 للعرض فقط
Total chunks: 9
Embedding dimension: 1536

Q: What is the daily travel allowance for domestic trips?
A: The daily travel allowance for domestic trips is $45, according to the Travel Policy.

Q: How many days of annual leave do employees get?
A: Full-time employees receive 15 days of paid annual leave per year, according to the Leave Policy.

Q: What are the password requirements?
A: Passwords must be at least 12 characters long and include uppercase, lowercase, numbers, and special characters. They must be changed every 90 days, according to the IT Security Policy.

Q: What is the company's remote work policy?
A: I don't have enough information. The provided context does not contain any remote work policy.

لاحظ السؤال الأخير: يستجيب نظام RAG بشكل صحيح بـ "معلومات غير كافية" بدلاً من اختلاق إجابة - وهذا هو بالضبط قيمة نظام RAG.

❓ أسئلة شائعة

س أيهما أفضل، RAG أم الضبط الدقيق؟
ج يعالجان مشكلات مختلفة. مناسبة RAG للمهام المكثفة للمعرفة (تمكين نماذج اللغة الكبيرة من الوصول إلى المعرفة الخارجية) دون الحاجة إلى إعادة التدريب؛ بينما الضبط الدقيق مناسب للتكيف مع النمط/الشكل (تعليم نماذج اللغة الكبيرة تنسيقات مخرجات محددة). في كثير من السيناريوهات، يكمل النهجان بعضهما البعض - أولاً باستخدام RAG لتوفير المعرفة، ثم الضبط الدقيق لتحسين الأسلوب. RAG أقل تكلفة ويمكن تحديثها بشكل أسرع، لذا تكون عادةً الخيار المفضل.
س ما هي قاعدة بيانات المتجهات؟
ج قاعدة بيانات المتجهات هي نظام مصمم خصيصًا لتخزين المتجهات عالية الأبعاد ودعم عمليات البحث السريعة عن التشابه. تقليديًا، تؤسس قواعد البيانات الاستعلامات على المطابقة الدقيقة، بينما تؤسس قواعد بيانات المتجهات الاستعلامات على "التشابه الدلالي". تشمل الخيارات الشائعة: Chroma (مدمجة، مناسبة للتطوير)، FAISS (مكتبة مستقلة، سريعة)، و Pinecone (خدمة سحابية مُدارة بالكامل).
س هل الأبعاد الأعلى للترميز دائمًا أفضل؟
ج ليس بالضرورة. من النظري، تسمح الأبعاد الأعلى بترميز المزيد من المعلومات الدلالية، لكنها تستلزم أيضًا تكلفة تخزينية وحسابية أكبر. يعتمد الأداء الفعلي على جودة النموذج وبيانات التدريب. على سبيل المثال، فإن نموذج text-embedding-3-small (1,536 بُعدًا) كافٍ للعديد من المهام، بينما يوفر نموذج text-embedding-3-large (3,072 بُعدًا) تحسينات ملحوظة فقط في سيناريوهات محددة. عند اتخاذ القرار، يجب الموازنة بين الدقة والتكلفة.
س لماذا حجم القطعة مهم؟
ج إذا كانت القطعة كبيرة جدًا، قد يفتقر الاسترجاع إلى الدقة، مما قد يُدخل كمية كبيرة من المحتوى غير ذي الصلة، ويُهدر الرموز، ويُعطل نموذج اللغة الكبيرة. أما إذا كانت القطعة صغيرة جدًا، فقد يكون السياق غير كافٍ، وقد لا تُجيب الأجزاء المسترجعة بشكل كامل على السؤال. بالنسبة لسيناريوهات الأسئلة والأجابات العامة، يُوصى بحجم قطعة يتراوح بين 256-512 رمزًا، مع تداخل بنسبة 10%-20% لتجنب عدم استمرارية المعنى.
س هل يمكن أن تُلغي RAG الهلاوس تمامًا؟
ج لا يمكنها إلغاءها تمامًا، لكن يمكنها تقليلها بشكل كبير. توفر RAG قيودًا سياقية، لذا من المرجح أن تُبني نماذج اللغة الكبيرة إجاباتها على المعلومات المعطاة. ومع ذلك، قد لا تزال نماذج اللغة الكبيرة: تتجاهل السياق، أو تُفرط في الاستدلال، أو تختلق أشياء عندما يكون السياق نفسه غير مكتمل. يمكنك تقليل هذا بشكل أكبر من خلال: توجيه النموذج صراحةً للإجابة "استنادًا فقط إلى السياق"، وضبط temperature=0، ودمج إعادة الترتيب، وطلب الإشارة إلى المصادر في الإجابة.

📖 ملخص


📝 تمارين

الأساسيات (⭐)

استخدم واجهة برمجة تطبيقات التضمينات (Embeddings) من OpenAI لإنشاء متجهات للنصوص الخمسة التالية، وقم بحساب تشابه جيب التمام (cosine similarity) بين كل زوج:

PYTHON
texts = [
    "Cats are popular pets known for their independence.",
    "Dogs are loyal companions that love to play fetch.",
    "The stock market rose 3% today on strong earnings.",
    "Felines enjoy climbing and sleeping in sunny spots.",
    "Interest rates were raised by the central bank.",
]

أخرج النتائج كمصفوفة تشابه بحجم 5×5 لمعرفة أي النصوص هي الأكثر تشابهاً.

متقدم (⭐⭐)

قم بتنفيذ وظيفة Top-K retrieval عامة تدعم الميزات التالية:

PYTHON
def vector_search(
    query: str,
    corpus: list[str],
    k: int = 5,
    embedding_model: str = "text-embedding-3-small",
) -> list[dict]:
    """
    Returns top-k most similar documents with scores.
    Each result is a dict: {"text": ..., "score": ..., "rank": ...}
    """
    # Your implementation here
    pass

المتطلبات: استخدم وثيقة اختبارية مكونة من 10 فقرات على الأقل للتحقق من صحة نتائج البحث.

تحدٍّ (⭐⭐⭐)

قم ببناء نظام RAG مصغر يحتوي على 5 وثائق على الأقل ونفذ سير العمل التالي بالكامل:

  1. تحميل الوثائق والتقطيع التكراري (chunk_size=300, overlap=60)
  2. إنشاء وتخزين التضمينات (embeddings)
  3. استعلام المستخدم → استرجاع أفضل 3 → دمج وتحسين النص التوجيهي → استجابة نموذج اللغة الكبير (LLM)
  4. قارن الاختلافات في الإجابات على نفس السؤال مع وبدون نظام RAG.
  5. اختبر سؤالاً غير موجود في قاعدة المعرفة للتحقق مما إذا كان نظام RAG يرفض الإجابة عليه بشكل صحيح.

تحدي الإضافة: أضف خطوة إعادة الترتيب (reranking)—قم أولاً باسترجاع أفضل 10، ثم اطلب من نموذج اللغة الكبير تقييم وترتيب النتائج العشر، ثم أدخل أفضل 3 في عملية التوليد النهائية.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%