الدرس 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 عبر مزودين
Weaviate GraphQL، البحث الهجين مليارات جيدة اختياري
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 قاعدة البيانات الموجودة قد تعمل

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

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

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

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

اختبار

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

خذ الاختبار