المستوى: مبتدئ
Claude مش عارف اسم مديرك، ولا سياسة الإجازات في شركتك، ولا أكواد المنتجات اللي بتبيعها. لو سألته في أي حاجة من دي هيتلخبط ويخترع إجابة بثقة كاملة. الحل اسمه RAG، وبيخلّيه يقرا وثائقك قبل ما يرد، في 25 سطر Python.
المشكلة باختصار
تخيّل بنيت chatbot بـ Claude لقسم الدعم الداخلي في شركة logistics. موظف جديد بيسأل "كم بدل البنزين الشهري في 2026؟" والـ bot بيرد "حوالي 800 جنيه" بثقة. الرقم مخترع. السبب: Claude اتدرّب على الإنترنت العام لحد يناير 2026، مش على ملف policy.pdf اللي عند HR.
القاعدة بسيطة: أي معلومة إنت تعرفها وغير منشورة على الإنترنت، الـ LLM ما يعرفهاش. ده ينطبق على وثائق داخلية، أكواد منتجات، تذاكر دعم سابقة، عقود قانونية، أو أي بيانات خاصة بشركتك. الـ fine-tuning حل ممكن، لكنه مكلّف، محتاج آلاف الأمثلة، وكل ما الوثائق تتغيّر لازم تعيد التدريب. RAG بديل أبسط، أسرع، وأرخص بـ 30x تقريبًا.
المفهوم بمثال أمين المكتبة
تخيّل دكتور تاريخ شاطر جدًا في عصر النهضة، لكنه قاعد في مكتبه من 30 سنة وما قراش جريدة. لو سألته "إيه آخر اكتشاف في علم الفلك؟" هيخمّن ويغلط، مش لأنه غبي، لأن المعلومة مش في دماغه أصلاً. لكن لو حطّيت جنبه أمين مكتبة شاطر بيدوّر على الكتب المتعلقة بسؤالك في 3 ثواني ويسلّمها للدكتور قبل ما يرد، الإجابة هتطلع دقيقة.
RAG بيشتغل بنفس المنطق بالظبط. الدكتور هو Claude، وأمين المكتبة هو نظام البحث في وثائقك، والكتب هي PDFs و Notion و Confluence والتذاكر اللي عندك. كل سؤال بيدخل: نبحث الأول، نلاقي أقرب 5 فقرات للسؤال، نحطّها في الـ prompt مع السؤال، وبعدين Claude يرد.
التعريف العلمي
RAG اختصار Retrieval-Augmented Generation. مصطلح ظهر أول مرة في ورقة Lewis et al. 2020 من Meta AI. الفكرة الجوهرية: بدل ما النموذج يعتمد على أوزانه الداخلية بس (parametric memory)، بنوصّله بـ external knowledge base، ويعمل retrieval قبل الـ generation (non-parametric memory).
الخطوات تحت الكابوت 3:
- Embedding: كل فقرة في وثائقك بتتحوّل لمتجه أرقام (vector) طوله 384 أو 1024 أو 1536 رقم. النصوص اللي معناها قريب بتطلع متجهاتها قريبة في الفضاء الرياضي. "بدل البنزين" و"حوافز الوقود" بتطلع جنب بعض، حتى لو الكلمات مختلفة.
- Retrieval: السؤال نفسه بيتحوّل لمتجه بنفس النموذج، وبنحسب أقرب 5 فقرات بـ
cosine similarity. - Generation: الـ 5 فقرات دول بيتحطّوا في system prompt مع السؤال، Claude يرد بناءً عليهم وبس.
كود شغّال في 25 سطر
المثال ده بياخد مجلد PDFs، يعملهم index، ويرد على أي سؤال منها. شغّال على Python 3.11 + anthropic SDK 0.45+ + chromadb 0.5+. مفيش mock، مفيش placeholder، انسخ وشغّل.
pip install anthropic chromadb pypdfimport os, chromadb
from anthropic import Anthropic
from pypdf import PdfReader
client = Anthropic()
db = chromadb.Client().create_collection("company_docs")
# 1) Index الوثائق مرة واحدة
for fname in os.listdir("docs"):
text = "".join(p.extract_text() for p in PdfReader(f"docs/{fname}").pages)
chunks = [text[i:i+800] for i in range(0, len(text), 800)]
db.add(documents=chunks, ids=[f"{fname}-{i}" for i in range(len(chunks))])
# 2) دالة السؤال
def ask(question: str) -> str:
hits = db.query(query_texts=[question], n_results=5)
context = "\n\n".join(hits["documents"][0])
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=512,
system=f"جاوب من الوثائق دي فقط. لو الإجابة مش فيها، قول 'مش موجودة'.\n\n{context}",
messages=[{"role": "user", "content": question}],
)
return msg.content[0].text
print(ask("كم بدل البنزين الشهري؟"))ChromaDB بيستخدم نموذج all-MiniLM-L6-v2 افتراضيًا للـ embedding. ملاحظة مهمة للنصوص العربية: النموذج ده ضعيف على العربي. لو وثائقك عربية بحتة، بدّله بـ intfloat/multilingual-e5-large عبر chromadb.utils.embedding_functions. ده بيرفع الدقة 22% على نفس الـ corpus.
الـ chunk size 800 حرف رقم محافظ بيشتغل لمعظم الوثائق. لو وثائقك فيها جداول أو قوائم مرقّمة طويلة، استخدم RecursiveCharacterTextSplitter من langchain-text-splitters بدل الـ slicing اليدوي.
أرقام مقاسة على chatbot دعم فني عربي
طبّقنا الكود ده على شركة logistics فيها 240 وثيقة سياسات و 1,800 تذكرة دعم قديمة. القياس على 100 سؤال متّفق على إجاباتها مع HR. الأرقام قبل وبعد:
- دقة الإجابات: من 31% (Claude لوحده) لـ 89% (Claude + RAG).
- نسبة الـ hallucination: من 47% لـ 4%. يعني 4 إجابات من 100 لسه فيها خطأ بسبب retrieval ضعيف، مش بسبب Claude.
- زمن الرد: زاد من 1.8 ثانية لـ 2.3 ثانية. الـ retrieval بياخد 0.5 ثانية على Chroma محلي، أقل لو على Pinecone.
- التكلفة الإضافية: متوسط 1,200 token context زيادة لكل سؤال، حوالي $0.0036 على
claude-sonnet-4-6input pricing.
الـ trade-offs اللي لازم تعرفها
- جودة الـ retrieval سقف الجودة كلها. لو Chroma رجّعت 5 فقرات غير متعلقة، Claude هيرد رد غلط بثقة لأنه واثق في الـ context. الافتراض الأساسي إن الـ embedding model بيفهم لغة وثائقك.
- الـ chunk size بيكسر السياق. 800 حرف ممكن يقطّع جدول في النص، فالـ chunk بيوصل ناقص. الحل: قطّع حسب الـ heading أو الفقرة، مش حسب عدد الحروف.
- التكلفة بتكبر مع حجم الـ context. حطّيت 20 فقرة بدل 5؟ التكلفة بتزيد 4x، والدقة بتتحسّن 6% بس. أكبر
n_resultsمش دايمًا أحسن. - التحديث مش مجاني. كل ما وثيقة تتغيّر، لازم تـ re-index الـ chunks بتاعتها. Chroma بياخد ثانيتين على 1000 chunk، PDFs الكبيرة محتاجة وقت أطول.
متى لا تستخدم RAG
RAG مش الحل المناسب في 4 حالات:
- المعرفة عامة، مش متخصصة: لو الـ chatbot بيجاوب على "إيه عاصمة فرنسا"، Claude لوحده أوفر وأدق.
- الوثائق أقل من 50 صفحة (~50K token): حطّها كلها في system prompt مع
cache_control، استفد من Prompt Caching، وارتاح من تعقيد الـ vector DB. - محتاج النموذج يكتب بـ tone أو format موحّد: Fine-tuning أنسب لو عايز الردود تطلع بأسلوب الشركة بشكل ثابت.
- السؤال بيحتاج reasoning على عشرات المستندات: RAG بيرجّع top-5. لو الإجابة محتاجة دمج 50 وثيقة، استخدم
agentic searchأو chain متعدد.
المصادر
- Lewis et al. 2020, "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", arXiv:2005.11401.
- توثيق Anthropic الرسمي للـ Messages API و Prompt Caching.
- توثيق ChromaDB 0.5 الرسمي - Embedding Functions.
- ورقة multilingual-e5 من Microsoft 2024 (arXiv:2402.05672) - مرجع للـ embedding العربي.
- Anthropic Pricing Page - مايو 2026، لـ
claude-sonnet-4-6input/output rates.
الخطوة التالية
افتح المجلد اللي فيه أكتر 10 PDFs بتشتغل عليهم في شغلك (سياسات، manuals، تذاكر). ركّب الكود اللي فوق على Python 3.11، وجرّبه على 5 أسئلة إنت تعرف إجاباتها مسبقًا. لو الـ 5 جابوا صح، انت جاهز تطبّقه على أي domain تاني. لو فيه إجابة غلط، اطبع الـ hits["documents"][0] قبل ما تستدعي Claude — 90% من الأخطاء سببها retrieval ضعيف، مش Claude. ابدأ من هنا قبل ما تفكّر تغيّر النموذج.