الدرس 10 من 23
تصميم نظام RAG

اختيار قاعدة البيانات المتجهة

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

اختيار قاعدة البيانات المتجهة الصحيحة أمر حاسم لأداء نظام RAG. يغطي هذا الدرس الخيارات الرئيسية وكيفية اختيار الأفضل لحالة استخدامك.

مشهد قواعد البيانات المتجهة

┌─────────────────────────────────────────────────────────────┐
│              خيارات قواعد البيانات المتجهة                  │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  الخدمات المُدارة          │    الاستضافة الذاتية           │
│  ──────────────────────    │    ─────────────────────────   │
│  • Pinecone                │    • Milvus                    │
│  • Weaviate Cloud          │    • Qdrant                    │
│  • Zilliz Cloud            │    • Chroma                    │
│                            │    • Weaviate                  │
│  امتدادات قواعد البيانات   │                                │
│  ──────────────────────    │    في الذاكرة                  │
│  • pgvector (PostgreSQL)   │    ─────────────────────────   │
│  • Atlas Vector (MongoDB)  │    • FAISS                     │
│                            │    • Annoy                     │
│                                                              │
└─────────────────────────────────────────────────────────────┘

جدول المقارنة

قاعدة البياناتالأفضل لـالنطاقالتصفيةمُدارة
Pineconeالإنتاج، سهولة الاستخدامملياراتجيدةنعم
Qdrantالتصفية، الاستضافة الذاتيةملياراتممتازةاختياري
Milvusالأداء العاليملياراتجيدةاختياري
pgvectorمستخدمو PostgreSQLملايينأصلية SQLعبر مزودين
WeaviateGraphQL، البحث الهجينملياراتجيدةاختياري
Chromaالنماذج الأولية، نطاق صغيرآلافأساسيةلا

Pinecone

نقاط القوة:

  • مُدارة بالكامل، صفر عمليات
  • خيار التسعير بدون خادم
  • API بسيطة
from pinecone import Pinecone

# التهيئة
pc = Pinecone(api_key="your-key")
index = pc.Index("documents")

# إدراج المتجهات
index.upsert(
    vectors=[
        {
            "id": "doc1",
            "values": embedding,
            "metadata": {"source": "manual.pdf", "page": 5}
        }
    ],
    namespace="product-docs"
)

# الاستعلام
results = index.query(
    vector=query_embedding,
    top_k=10,
    namespace="product-docs",
    filter={"source": {"$eq": "manual.pdf"}}
)

الاعتبارات:

  • الارتباط بالمورد
  • التكاليف تتناسب مع المتجهات المخزنة
  • تصفية محدودة مقارنة بـ Qdrant

Qdrant

نقاط القوة:

  • قدرات تصفية ممتازة
  • مفتوح المصدر مع خيار سحابي
  • دعم حمولة غني
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient(url="http://localhost:6333")

# إنشاء مجموعة
client.create_collection(
    collection_name="documents",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# الإدراج
client.upsert(
    collection_name="documents",
    points=[
        PointStruct(
            id=1,
            vector=embedding,
            payload={
                "source": "manual.pdf",
                "page": 5,
                "category": "technical"
            }
        )
    ]
)

# الاستعلام مع تصفية معقدة
results = client.search(
    collection_name="documents",
    query_vector=query_embedding,
    query_filter={
        "must": [
            {"key": "category", "match": {"value": "technical"}},
            {"key": "page", "range": {"gte": 1, "lte": 10}}
        ]
    },
    limit=10
)

الاعتبارات:

  • الاستضافة الذاتية تتطلب DevOps
  • خيار سحابي متاح لكنه أحدث

pgvector

نقاط القوة:

  • PostgreSQL مألوف
  • ضم SQL مع البحث المتجه
  • بنية تحتية موجودة
import psycopg2

# تمكين الامتداد
cursor.execute("CREATE EXTENSION IF NOT EXISTS vector")

# إنشاء جدول
cursor.execute("""
    CREATE TABLE documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(1536),
        metadata JSONB
    )
""")

# إنشاء فهرس للبحث الأسرع
cursor.execute("""
    CREATE INDEX ON documents
    USING ivfflat (embedding vector_cosine_ops)
    WITH (lists = 100)
""")

# الاستعلام
cursor.execute("""
    SELECT id, content, metadata,
           1 - (embedding <=> %s) AS similarity
    FROM documents
    WHERE metadata->>'category' = 'technical'
    ORDER BY embedding <=> %s
    LIMIT 10
""", (query_embedding, query_embedding))

الاعتبارات:

  • نطاق محدود (ملايين، ليس مليارات)
  • وقت بناء الفهرس على مجموعات البيانات الكبيرة
  • رائع للتطبيقات الصغيرة إلى المتوسطة

إطار الاختيار

شجرة القرار

البداية
  ├─ تحتاج مليارات المتجهات؟
  │     ├─ نعم ──▶ Pinecone أو Milvus
  │     └─ لا ───▶ تابع
  ├─ تحتاج تصفية معقدة؟
  │     ├─ نعم ──▶ Qdrant
  │     └─ لا ───▶ تابع
  ├─ تستخدم PostgreSQL بالفعل؟
  │     ├─ نعم ──▶ pgvector
  │     └─ لا ───▶ تابع
  ├─ تحتاج صفر عمليات؟
  │     ├─ نعم ──▶ Pinecone
  │     └─ لا ───▶ Qdrant أو Milvus
  └─ نموذج أولي فقط؟
        ├─ نعم ──▶ Chroma
        └─ لا ───▶ Qdrant

مقارنة التكلفة (100 مليون متجه)

المزودالتكلفة الشهريةملاحظات
Pinecone$700-2000بدون خادم أو قائم على البودات
Qdrant Cloud$500-1500بناءً على حجم المجموعة
استضافة ذاتية$200-500الحوسبة + التخزين
pgvector$100-300قاعدة البيانات الموجودة قد تعمل

⚠ Prices change frequently. The values above are for illustration only and may be out of date. Always verify current pricing directly with the provider before making cost decisions: Anthropic · OpenAI · Google Gemini · Google Vertex AI · AWS Bedrock · Azure OpenAI · Mistral · Cohere · Together AI · DeepSeek · Groq · Fireworks AI · Perplexity · xAI · Cursor · GitHub Copilot · Windsurf.

نصيحة للمقابلة

عند مناقشة قواعد البيانات المتجهة، دائماً اذكر:

  1. متطلبات النطاق - ملايين مقابل مليارات
  2. احتياجات التصفية - استعلامات البيانات الوصفية
  3. التعقيد التشغيلي - مُدار مقابل استضافة ذاتية
  4. التكلفة على نطاق واسع - أظهر أنك تفهم الاقتصاديات

بعد ذلك، سنستكشف استراتيجيات الاسترجاع الهجين التي تجمع بين الاسترجاع الكثيف والمتناثر. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 3: تصميم نظام RAG

خذ الاختبار