# ============================================================ # 📄 الملف: config.py # 🎯 الغرض: الإعدادات المركزية للمشروع (المسارات + تعريف النماذج). # # هذا الملف هو "لوحة التحكم" لكل المشروع. أي مسار أو إعداد # تحتاج تغيّره (مكان البيانات، مكان النموذج المحلي، أسماء النماذج، # عدد النتائج...) تعدّله من هنا فقط — ولا تلمس باقي الملفات. # # القيم الحساسة (مثل مسار النموذج المحلي) تُقرأ من ملف .env # عشان ما نكتبها داخل الكود مباشرة. # ============================================================ import os from pathlib import Path import torch from dotenv import load_dotenv # تحميل متغيّرات البيئة من ملف .env بمساره الصريح (backend/.env) # نحدّد المسار صراحةً حتى يُقرأ مهما كان مجلد التشغيل (CWD) — # مثلاً عند تشغيل Streamlit من جذر المشروع. load_dotenv(Path(__file__).resolve().parent / ".env") # ------------------------------------------------------------ # 📁 المسارات الأساسية # ------------------------------------------------------------ # BASE_DIR = جذر المشروع (المجلد اللي يحتوي backend/ و frontend/ و data/) BASE_DIR = Path(__file__).resolve().parent.parent DATA_DIR = BASE_DIR / "data" RAW_DATA_PATH = DATA_DIR / "raw" / "lexicalentries.csv" # البيانات الخام PROCESSED_DATA_PATH = DATA_DIR / "processed" / "data.csv" # البيانات بعد التنظيف EMBEDDINGS_DIR = DATA_DIR / "embeddings" # ملفات .npy RATINGS_PATH = DATA_DIR / "ratings.csv" # سجل التقييمات # مسار النموذج الثالث المحلي (يُقرأ من .env، وله قيمة افتراضية) MODEL_3_PATH = os.getenv("MODEL_3_PATH", str(BASE_DIR / "models" / "ksaa_custom")) # مسار النموذج الرابع المحلي (نسخة أحدث من نموذج المعاجم — للمقارنة) MODEL_4_PATH = os.getenv("MODEL_4_PATH", str(BASE_DIR / "models" / "ksaa_v2")) # ------------------------------------------------------------ # 🖥️ الجهاز (GPU إن توفّر، وإلا CPU) # - cuda : كروت NVIDIA # - mps : معالج Apple الرسومي (أجهزة Apple Silicon — M1/M2/M3...) # - cpu : الافتراضي # ------------------------------------------------------------ if torch.cuda.is_available(): DEVICE = "cuda" elif torch.backends.mps.is_available(): DEVICE = "mps" else: DEVICE = "cpu" # ------------------------------------------------------------ # 🤖 تعريف النماذج الثلاثة # ------------------------------------------------------------ # كل نموذج له: # key = اسم داخلي قصير (يُستخدم لتسمية ملف الـ embeddings) # display_name = الاسم الظاهر للمستخدم في الواجهة # hf_id = معرّف النموذج في HuggingFace أو مسار محلي # use_prefix = هل يحتاج بادئة "query:" / "passage:" (خاص بنماذج e5) # top_k = الحد الأقصى للنتائج (None = بدون حد) # ------------------------------------------------------------ MODELS = [ { "key": "model_1_microsoft", "display_name": "النموذج الأول", "hf_id": "intfloat/multilingual-e5-large", "use_prefix": True, "top_k": 10, }, { "key": "model_2_researchers", "display_name": "النموذج الثاني", "hf_id": "Omartificial-Intelligence-Space/Arabic-Triplet-Matryoshka-V2", "use_prefix": False, "top_k": None, }, { "key": "model_3_ksaa", "display_name": "النموذج الثالث", "hf_id": MODEL_3_PATH, "use_prefix": False, "top_k": None, }, { "key": "model_4_ksaa_v2", "display_name": "النموذج الرابع", "hf_id": MODEL_4_PATH, "use_prefix": False, "top_k": None, }, ] # ------------------------------------------------------------ # ⚙️ إعدادات عامة # ------------------------------------------------------------ DEFAULT_THRESHOLD = 0.70 # حد التشابه الافتراضي BATCH_SIZE = 64 # حجم الدفعة عند بناء الـ embeddings # الأعمدة المستخدمة في بناء النص المُدمج للـ embedding TEXT_COLUMNS = ["lemma", "definition", "example"] def embedding_path(model_key: str) -> Path: """يرجّع مسار ملف الـ embeddings (.npy) الخاص بنموذج معيّن.""" return EMBEDDINGS_DIR / f"{model_key}.npy"