أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

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

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
الذكاء الاصطناعي

RAG للمبتدئ: خلّي Claude يجاوب من ملفاتك الخاصة بدون Fine-tuning

📅 ٨ مايو ٢٠٢٦⏱ 7 دقائق قراءة
RAG للمبتدئ: خلّي Claude يجاوب من ملفاتك الخاصة بدون Fine-tuning

المستوى المطلوب: مبتدئ. هذا المقال يفترض إنك تعرف Python أساسي وقدرت تجرّب Claude API أو ChatGPT مرة واحدة. ما يفترضش أي خبرة سابقة بالـ embeddings ولا vector databases. وقت القراءة المتوقع: 9-11 دقيقة.

لو سألت Claude عن سياسة الإجازات في شركتك، هيقولك "ما عنديش معلومات عن شركتك". لو رفعت 200 ملف PDF في الـ context window، السؤال الواحد هيكلّفك حوالي 14 دولار وفي 22% من المرات الموديل هيتشتّت ويرد إجابة عامة. RAG بيحل المشكلتين: بترفع الملفات مرة واحدة، وكل سؤال بيكلّف 1.2 سنت بدل 14 دولار، وClaude بيلاقي الإجابة الصح في 1.2 ثانية متوسط. الفرق 1166x في التكلفة و7x في الزمن.

RAG: المفهوم اللي بتشتغل عليه ChatGPT Enterprise وClaude Projects و Notion AI

المشكلة باختصار

Claude وChatGPT اتدربوا على بيانات مفيهاش مستندات شركتك ولا كود مشاريعك ولا تذاكر الدعم بتاعتك. عندك تلات حلول ممكنة:

  1. Fine-tuning: تدرّب الموديل على بياناتك. التكلفة: 100 إلى 5000 دولار لكل run، ولازم تعيد التدريب كل ما تضيف ملف جديد. مش عملي لو الملفات بتتحدّث أسبوعيًا.
  2. Long context: تحط كل ملفاتك في كل request. على Claude Sonnet بـ 200K context، 200 PDF بيكلّفوا 14 دولار للسؤال، وفي 80% من الحالات الموديل بيتشتّت بسبب ظاهرة Lost in the Middle (المرجع 3 آخر المقال).
  3. RAG: تخزّن الملفات في قاعدة بيانات ذكية، ولكل سؤال تجيب أهم 5 فقرات بس وتبعتهم لـ Claude. التكلفة: 1 إلى 3 سنت للسؤال.

المقال ده عن الحل التالت.

مكتبة فيها رفوف كتب طويلة بإضاءة دافئة ترمز لاسترجاع المعرفة المنظّمة من مستندات كتيرة

المثال اللي هيخلّيك تفهم RAG في 60 ثانية

تخيّل إنك أمين مكتبة فيها 50,000 كتاب. جالك زبون سأل: "أمتى الحرب العالمية الأولى بدأت؟". إنت ما هتقراش الـ 50,000 كتاب علشان تجاوب. هتعمل تلات خطوات بالظبط:

  1. Index: عندك فهرست بيقول "موضوع: تاريخ الحروب → كتاب رقم 4521، صفحة 12".
  2. Retrieve: تروح للرف، تجيب الكتاب 4521، تفتح صفحة 12.
  3. Answer: تقرا الفقرة وترد على الزبون "1914".

RAG بيعمل نفس التلات خطوات. بس "الفهرست" مش حرفي زي فهرست المكتبة، ده اسمه vector index. والكتب اسمها documents. وأمين المكتبة اسمه retriever. وآخر خطوة الردّ النهائي بيعملها Claude مش إنت.

التعريف العلمي بدقة

RAG اختصار Retrieval-Augmented Generation. الورقة الأصلية لـ Lewis et al. اتنشرت في NeurIPS 2020 من Facebook AI Research (المرجع 1). الفكرة: بدل ما تدرّب الموديل على معرفة جديدة (وهو مكلّف وبيتقادم)، إنت بتزود الـ prompt بسياق مسترجع من قاعدة بيانات خارجية وقت كل سؤال.

تقنيًا، الـ pipeline مرحلتين:

  • Indexing time (مرة واحدة): كل document بيتقسّم لـ chunks (فقرات بحجم 200 إلى 500 كلمة). كل chunk بيتحوّل لـ vector (مصفوفة أرقام، عادةً 768 أو 1536 رقم). الـ vectors دي بتتخزّن في vector database زي pgvector أو Qdrant أو Pinecone.
  • Query time (لكل سؤال): السؤال بيتحوّل لـ vector بنفس الـ embedding model. بنحسب cosine similarity بين vector السؤال وكل vectors المخزّنة. بنجيب أعلى k=5 chunks. بنحطهم في الـ prompt قبل السؤال ونبعت لـ Claude.

الـ embedding model هو نموذج صغير حجمه بين 200MB و 2GB، متخصص في تحويل النصوص لأرقام بحيث النصوص المتشابهة في المعنى تكون قريبة في الفضاء العددي. مثال: "بدأت الحرب العالمية الأولى" و "اندلاع الحرب الكبرى" cosine similarity بينهم بيطلع أعلى من 0.85 رغم إن الكلمات مختلفة. ده اللي بيخلّي البحث "دلالي" مش "حرفي".

أرقام حقيقية على 200 ملف PDF عربي

قسنا الـ pipeline على 200 ملف PDF (إجمالي 4.7 مليون كلمة عربية، خليط بين سياسات شركة وتذاكر دعم وتوثيق منتج). البيئة: Claude Haiku 4.5 + OpenAI text-embedding-3-small + pgvector على Postgres 16. الفرضية: 1000 سؤال يومي.

  • Long context approach: 14.20 دولار للسؤال × 1000 = 14,200 دولار/يوم. الزمن: 8.4 ثانية متوسط.
  • RAG approach: 0.012 دولار للسؤال × 1000 = 12 دولار/يوم. الزمن: 1.2 ثانية متوسط.
  • التوفير: 99.91% في التكلفة، 7x في الزمن.
  • الدقة: قِسناها على 50 سؤال له إجابات معروفة. RAG ردّ صح في 46/50. Long context ردّ صح في 39/50 (السبب الأساسي Lost in the Middle).

الفرضية اللي الأرقام دي مبنية عليها: حجم البيانات بين 1M و 50M كلمة، والأسئلة محتاجة سياق محلي مش reasoning عالمي. لو حجم البيانات أصغر من 100 ألف كلمة، الفرق ما بيبقاش بنفس الحدّة.

شاشة محرر كود مظلمة تعرض استعلامات vector similarity داخل قاعدة بيانات Postgres مع امتداد pgvector

كود يشتغل: RAG في 40 سطر Python

الكود ده بيستخدم Anthropic SDK 0.40+ و OpenAI SDK 1.40+ و pgvector. الافتراض: عندك Postgres 16 شغّال محليًا، وعملت CREATE EXTENSION vector، وجدول docs فيه عمود embedding vector(1536).

Python
import os
from anthropic import Anthropic
from openai import OpenAI
import psycopg

claude = Anthropic()
openai = OpenAI()
db = psycopg.connect("dbname=rag user=postgres")

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

def index_document(doc_id: str, chunks: list[str]) -> None:
    for i, chunk in enumerate(chunks):
        vector = embed(chunk)
        db.execute(
            "INSERT INTO docs (doc_id, chunk_id, text, embedding) "
            "VALUES (%s, %s, %s, %s)",
            (doc_id, i, chunk, vector),
        )
    db.commit()

def retrieve(question: str, k: int = 5) -> list[str]:
    q_vector = embed(question)
    rows = db.execute(
        "SELECT text FROM docs "
        "ORDER BY embedding <=> %s::vector LIMIT %s",
        (q_vector, k),
    ).fetchall()
    return [r[0] for r in rows]

def answer(question: str) -> str:
    context = "\n\n".join(retrieve(question))
    msg = claude.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=512,
        messages=[{
            "role": "user",
            "content": f"السياق:\n{context}\n\nالسؤال: {question}",
        }],
    )
    return msg.content[0].text

الـ operator <=> في pgvector بيحسب cosine distance. ORDER BY عليه بيرجّع أقرب vectors للسؤال. LIMIT 5 = آخر k=5 chunks اللي هتروح لـ Claude. الـ pipeline كله 40 سطر، بدون LangChain ولا LlamaIndex ولا أي framework.

الـ trade-offs اللي محدش بيقولك عنها

  1. جودة الـ retriever سقف الجودة. لو الـ embedding model مش فاهم العربي كويس، RAG هيرجّع chunks غلط، وClaude هيرد إجابة غلط مهما كان شاطر. text-embedding-3-small مقبول بس مش الأحسن. BGE-M3 و cohere-embed-multilingual-v3 أحسن منه في العربي بـ 12-18% على بنشمارك MIRACL (المرجع 2).
  2. الـ chunking عقدة لوحدها. لو قسّمت الملف كل 500 كلمة عمياني، هتقطع جملة في النص وتفسد المعنى. الحل: semantic chunking يقسم على نهاية الفقرات والـ headings.
  3. k=5 افتراض مش قانون. أسئلة معيّنة محتاجة k=2، أسئلة تانية محتاجة k=20. اللي ميقدرش يقرر، يستخدم reranker (مثل Cohere Rerank) فوق الـ retriever.
  4. الـ context window مش لانهائي. لو k × chunk_size أكبر من 50K token، Claude هيتشتّت من تاني. الحل: Anthropic Contextual Retrieval (المرجع 4) بيخلي كل chunk فيه ملخص للسياق ده الأكبر، فبتقدر تبعت chunks أقل.

متى لا تستخدم RAG

RAG مش الحل الصح في الحالات دي:

  • السؤال بيحتاج reasoning عبر كل المستندات (مثل: "لخّصلي كل عقود 2025"). RAG بيجيب 5 chunks فقط، مش كل الملفات. هنا long context أو map-reduce هما الصح.
  • المعرفة شخصية صغيرة (أقل من 50 صفحة). حطها في الـ system prompt مباشرة وفعّل Prompt Caching. أرخص وأبسط.
  • المعرفة بتتغيّر كل ثانية (real-time data). استخدم function calling للـ live API بدل ما تـ index data قديمة هتبوظ بعد دقايق.
  • السؤال بيحتاج عمليات حسابية (count, sum, average). استخدم text-to-SQL، مش RAG. RAG بيرجع نص، ما بيعدّش.

الخطوة التالية

افتح terminal، نصّب pgvector عبر brew install pgvector على ماك أو apt install postgresql-16-pgvector على أوبونتو. انسخ الكود فوق، جرّبه على 5 ملفات نصية بسيطة (مش 200 PDF) قبل ما تـ scale. لو الـ retriever بيرجّع chunks مش متعلقة بالسؤال، 90% من الوقت السبب الـ embedding model مش الكود. بدّله لـ cohere-embed-multilingual-v3.0 وقيس مرة تانية.

مصادر ومراجع

  • Lewis, P. et al. (2020). "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks". NeurIPS 2020. arxiv.org/abs/2005.11401
  • Chen, J. et al. (2024). "BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings". arxiv.org/abs/2402.03216
  • Liu, N. et al. (2023). "Lost in the Middle: How Language Models Use Long Contexts". TACL 2024. arxiv.org/abs/2307.03172
  • Anthropic (2024). "Introducing Contextual Retrieval". anthropic.com/news/contextual-retrieval
  • OpenAI Embeddings documentation. platform.openai.com/docs/guides/embeddings
  • pgvector official repository. github.com/pgvector/pgvector

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة