Loading
Loading
Vector Database هي قاعدة بيانات مُصمَّمة خصيصاً لتخزين والبحث في الـ embeddings بكفاءة عالية. إنها قلب أي نظام RAG حقيقي.
في قاعدة بيانات عادية (SQL):
SELECT * FROM docs WHERE text LIKE '%ذكاء اصطناعي%'
هذا يبحث بالكلمات الحرفية فقط — لا يجد "ML" أو "تعلم الآلة".
في Vector Database:
results = db.similarity_search("كيف تعمل النماذج اللغوية؟", k=5)
# يجد: "LLMs", "الشبكات العصبية", "GPT", "Claude", "Transformers"
يبحث بالمعنى وليس بالكلمة.
Exact Search (KNN):
Approximate Nearest Neighbor (ANN):
HNSW (Hierarchical Navigable Small World):
| قاعدة البيانات | النوع | الاستخدام المثالي | |--------------|-------|----------------| | ChromaDB | Local/Cloud | مشاريع صغيرة، تطوير | | Pinecone | Cloud فقط | Production مُدار | | Qdrant | Local/Cloud | Performance عالي | | Weaviate | Local/Cloud | بحث متقدم + Filtering | | Supabase pgvector | PostgreSQL | إذا تستخدم Supabase بالفعل | | FAISS | Local (Meta) | بحث سريع في الذاكرة |
الميزة التي تجعل Vector DBs قوية فعلاً: الجمع بين البحث الدلالي وتصفية البيانات.
results = collection.query(
query_embeddings=[query_embedding],
n_results=5,
where={ # Metadata filter
"$and": [
{"category": "python"},
{"level": {"$in": ["beginner", "intermediate"]}},
{"date": {"$gte": "2024-01-01"}}
]
}
)
Collections: مجموعات مستقلة (مثل جداول SQL).
Namespaces: فصل بيانات عدة عملاء في نفس الـ index.
Hierarchical indexing:
المستوى 1: القسم (مثل: Python, ML, Cloud)
المستوى 2: الموضوع (مثل: Functions, Classes)
المستوى 3: chunk نصي محدد
إذا كنت تستخدم PostgreSQL/Supabase، يمكنك إضافة قدرات Vector Search مباشرةً:
-- تفعيل extension
CREATE EXTENSION IF NOT EXISTS vector;
-- إنشاء جدول مع عمود vector
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536),
metadata JSONB
);
-- إنشاء HNSW index
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);
-- البحث
SELECT content, (embedding <=> $1) AS distance
FROM documents
ORDER BY distance
LIMIT 5;
هذا يُعطيك قاعدة بيانات واحدة تدير البيانات التقليدية والـ vectors معاً.
# pip install chromadb sentence-transformers
import chromadb
from sentence_transformers import SentenceTransformer
import json
print("=" * 55)
print("ChromaDB: Vector Database عملي")
print("=" * 55)
# ─────────────────────────────────────────
# 1. إعداد ChromaDB و Embedding Model
# ─────────────────────────────────────────
client = chromadb.Client() # In-memory (لا يحتاج تثبيت سيرفر)
model = SentenceTransformer("all-MiniLM-L6-v2")
# إنشاء collection
collection = client.create_collection(
name="course_content",
metadata={"description": "محتوى دورات أكاديمية Darhous"}
)
# ─────────────────────────────────────────
# 2. إضافة وثائق (Indexing)
# ─────────────────────────────────────────
documents = [
{"id": "py_1", "text": "Python لغة برمجة متعددة الاستخدامات تتميز بسهولة القراءة", "category": "python", "level": "beginner"},
{"id": "py_2", "text": "الـ List Comprehension في Python طريقة أنيقة لإنشاء القوائم", "category": "python", "level": "intermediate"},
{"id": "ml_1", "text": "Linear Regression تتنبأ بقيم مستمرة من بيانات التدريب", "category": "ml", "level": "intermediate"},
{"id": "ml_2", "text": "Random Forest خوارزمية تجمع عدة Decision Trees للحصول على دقة أعلى", "category": "ml", "level": "intermediate"},
{"id": "ai_1", "text": "LLMs مثل Claude وGPT تتدرب على مليارات النصوص وتتنبأ بالكلمة التالية", "category": "ai", "level": "intermediate"},
{"id": "ai_2", "text": "RAG يحسن دقة LLMs بربطها بقواعد معرفة خارجية حديثة", "category": "ai", "level": "advanced"},
{"id": "ai_3", "text": "Embeddings تمثيل رياضي للنصوص يحافظ على التشابه الدلالي", "category": "ai", "level": "intermediate"},
{"id": "cloud_1", "text": "Supabase قاعدة بيانات PostgreSQL مدارة مع دعم vector search", "category": "cloud", "level": "beginner"},
]
# توليد الـ embeddings
texts = [d["text"] for d in documents]
embeddings = model.encode(texts).tolist()
# إضافة للـ collection
collection.add(
ids=[d["id"] for d in documents],
documents=texts,
embeddings=embeddings,
metadatas=[{"category": d["category"], "level": d["level"]} for d in documents]
)
print(f"\n✅ تم إضافة {len(documents)} وثيقة للـ vector database")
# ─────────────────────────────────────────
# 3. البحث الدلالي البسيط
# ─────────────────────────────────────────
print("\n3. البحث الدلالي:")
queries = [
"كيف أبني نموذج تنبؤ؟",
"ما هو أفضل طريقة لتخزين البيانات في السحابة؟",
"كيف تتعلم النماذج من البيانات؟",
]
for query in queries:
q_emb = model.encode([query]).tolist()
results = collection.query(
query_embeddings=q_emb,
n_results=2
)
print(f"\n🔍 '{query}'")
for doc, dist in zip(results["documents"][0], results["distances"][0]):
similarity = 1 - dist # ChromaDB يُرجع المسافة، نحوّلها لتشابه
print(f" ({similarity:.3f}) {doc[:60]}...")
# ─────────────────────────────────────────
# 4. البحث مع Metadata Filtering
# ─────────────────────────────────────────
print("\n4. البحث مع فلترة البيانات:")
query = "كيف تعمل الخوارزميات؟"
q_emb = model.encode([query]).tolist()
# البحث في فئة ml فقط
results_ml = collection.query(
query_embeddings=q_emb,
n_results=3,
where={"category": "ml"} # Metadata filter
)
print(f"\n🔍 '{query}' (في فئة ML فقط):")
for doc, meta in zip(results_ml["documents"][0], results_ml["metadatas"][0]):
print(f" [{meta['category']}/{meta['level']}] {doc[:60]}...")
# ─────────────────────────────────────────
# 5. إحصائيات الـ Collection
# ─────────────────────────────────────────
print("\n5. إحصائيات:")
print(f" عدد الوثائق: {collection.count()}")
all_items = collection.get()
categories = {}
for meta in all_items["metadatas"]:
cat = meta["category"]
categories[cat] = categories.get(cat, 0) + 1
print(f" توزيع الفئات: {json.dumps(categories, ensure_ascii=False)}")