الدرس 6 من 23

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

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

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

قواعد البيانات المتجهة مبنية خصيصاً لتخزين والبحث في المتجهات عالية الأبعاد. فهم المقايضات يساعدك على اختيار الحل الصحيح.

فئات قواعد البيانات

الفئة الأمثلة الأفضل لـ
سحابة مدارة Pinecone, Weaviate Cloud الإنتاج، بدون عمليات
استضافة ذاتية Qdrant, Milvus, Weaviate التحكم، التكلفة على نطاق واسع
مضمنة Chroma, LanceDB التطوير، الحافة
إضافات pgvector بنية Postgres موجودة

Pinecone

قاعدة بيانات متجهة مدارة بالكامل، بدون خادم:

from pinecone import Pinecone

pc = Pinecone(api_key="your-api-key")

# إنشاء فهرس
pc.create_index(
    name="rag-index",
    dimension=1536,
    metric="cosine",
    spec={"serverless": {"cloud": "aws", "region": "us-east-1"}}
)

index = pc.Index("rag-index")

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

# استعلام
results = index.query(
    vector=query_embedding,
    top_k=5,
    include_metadata=True,
    filter={"source": {"$eq": "manual.pdf"}}
)

نقاط القوة: صفر عمليات، تحجيم تلقائي، تصفية بيانات وصفية ممتازة اعتبارات: التكلفة على نطاق واسع، قفل المورد

Qdrant

قاعدة بيانات مفتوحة المصدر عالية الأداء:

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient(host="localhost", port=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}
        )
    ]
)

# البحث مع التصفية
results = client.search(
    collection_name="documents",
    query_vector=query_embedding,
    limit=5,
    query_filter={
        "must": [{"key": "source", "match": {"value": "manual.pdf"}}]
    }
)

نقاط القوة: سريع، تصفية ممتازة، دعم البحث الهجين اعتبارات: تعقيد الاستضافة الذاتية

Weaviate

قاعدة بيانات متجهة قائمة على المخطط مع GraphQL:

import weaviate
from weaviate.classes.config import Property, DataType

client = weaviate.connect_to_local()

# إنشاء مجموعة مع مخطط
collection = client.collections.create(
    name="Document",
    properties=[
        Property(name="content", data_type=DataType.TEXT),
        Property(name="source", data_type=DataType.TEXT),
        Property(name="page", data_type=DataType.INT),
    ]
)

# إدراج مع تحويل تلقائي للمتجهات (اختياري)
collection.data.insert({
    "content": "نص المستند هنا",
    "source": "manual.pdf",
    "page": 5
})

# البحث
results = collection.query.near_vector(
    near_vector=query_embedding,
    limit=5,
    filters=weaviate.classes.query.Filter.by_property("source").equal("manual.pdf")
)

نقاط القوة: تحويل متجه مدمج، GraphQL، متعدد الوسائط اعتبارات: منحنى التعلم، متطلبات الموارد

Chroma

قاعدة بيانات مضمنة خفيفة الوزن (رائعة للتطوير):

import chromadb
from chromadb.utils import embedding_functions

client = chromadb.PersistentClient(path="./chroma_db")

# استخدم تضمينات OpenAI
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="your-api-key",
    model_name="text-embedding-3-small"
)

# إنشاء مجموعة
collection = client.get_or_create_collection(
    name="documents",
    embedding_function=openai_ef
)

# إضافة مستندات (تضمين تلقائي)
collection.add(
    documents=["نص المستند هنا"],
    metadatas=[{"source": "manual.pdf", "page": 5}],
    ids=["doc1"]
)

# استعلام
results = collection.query(
    query_texts=["استعلام البحث"],
    n_results=5,
    where={"source": "manual.pdf"}
)

نقاط القوة: API بسيط، لا حاجة لخادم، إعداد سريع اعتبارات: ليس للنطاق الإنتاجي

pgvector (إضافة PostgreSQL)

أضف المتجهات لـ Postgres موجود:

import psycopg2
from pgvector.psycopg2 import register_vector

conn = psycopg2.connect("postgresql://localhost/mydb")
register_vector(conn)

cur = conn.cursor()

# إنشاء جدول مع عمود متجه
cur.execute("""
    CREATE TABLE documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        source TEXT,
        embedding vector(1536)
    )
""")

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

# إدراج
cur.execute(
    "INSERT INTO documents (content, source, embedding) VALUES (%s, %s, %s)",
    ("نص المستند", "manual.pdf", embedding)
)

# استعلام
cur.execute("""
    SELECT content, source, 1 - (embedding <=> %s) as similarity
    FROM documents
    WHERE source = 'manual.pdf'
    ORDER BY embedding <=> %s
    LIMIT 5
""", (query_embedding, query_embedding))

نقاط القوة: استخدم Postgres موجود، امتثال ACID، الضم اعتبارات: ليس بسرعة قواعد البيانات المتجهة المخصصة

مصفوفة المقارنة

الميزة Pinecone Qdrant Weaviate Chroma pgvector
الاستضافة مدار كلاهما كلاهما مضمن ذاتي
التصفية ممتاز ممتاز جيد أساسي SQL
البحث الهجين نعم نعم نعم لا يدوي
التحجيم تلقائي يدوي يدوي محدود محدود
التكلفة $$ مجاني/$ مجاني/$ مجاني مجاني
الإعداد سهل متوسط متوسط سهل سهل

إطار القرار

البداية
تحتاج خدمة مدارة مع صفر عمليات؟
  ├─ نعم → Pinecone
تستخدم PostgreSQL بالفعل؟
  ├─ نعم → pgvector
تطوير/نماذج أولية؟
  ├─ نعم → Chroma
تحتاج بحث هجين + تصفية متقدمة؟
  ├─ نعم → Qdrant أو Weaviate
الافتراضي → Qdrant (أفضل توازن أداء/ميزات)

نصيحة الترحيل: ابدأ مع Chroma للتطوير، ثم انتقل إلى Qdrant أو Pinecone للإنتاج. تجريد LangChain يجعل التبديل سهلاً نسبياً.

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

اختبار

الوحدة 2: نماذج التضمين وقواعد البيانات المتجهة

خذ الاختبار