Loading
Loading
A Vector Database is designed specifically for storing and searching embeddings efficiently. It's the heart of any real RAG system.
SQL LIKE search finds literal keywords. Vector DBs search by meaning — finding semantically similar documents even if they share no exact words.
| Database | Type | Best For | |----------|------|---------| | ChromaDB | Local/Cloud | Development & prototyping | | Pinecone | Cloud only | Managed production | | Qdrant | Local/Cloud | High performance | | pgvector | PostgreSQL | If already using Supabase/Postgres |
The killer feature: combine semantic search with structured filters:
results = collection.query(
query_embeddings=[q_emb],
where={"category": "python", "level": "beginner"}
)
# 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)}")