import os from pathlib import Path from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS # المسارات BASE_DIR = Path(__file__).resolve().parent KB_DIR = BASE_DIR / "data" / "kb" PERSIST_DIR = BASE_DIR / ".faiss" # نموذج التضمين (يجب أن يكون نفس المستخدم في rag.py) EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2" def build_and_save_vectorstore(): print("🚀 بدء إنشاء قاعدة بيانات FAISS...") # 1. التحقق من وجود مجلد المعرفة if not KB_DIR.exists(): print(f"❌ مجلد المعرفة غير موجود: {KB_DIR}") return # 2. تحميل ملفات الـ Markdown documents = [] for md_file in KB_DIR.glob("*.md"): print(f" جاري قراءة: {md_file.name}") loader = TextLoader(str(md_file), encoding="utf-8") docs = loader.load() # إضافة اسم الملف كـ metadata for doc in docs: doc.metadata["source"] = md_file.name documents.extend(docs) if not documents: print("⚠️ لم يتم العثور على أي مستندات.") return # 3. تقسيم النصوص (Chunking) print("✂️ جاري تقسيم النصوص...") text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, length_function=len, ) chunks = text_splitter.split_documents(documents) print(f"✅ تم إنشاء {len(chunks)} قطعة نصية (Chunks).") # 4. تحميل نموذج التضمين (Embeddings) print("🧠 جاري تحميل نموذج التضمين (قد يستغرق وقتاً في المرة الأولى)...") embeddings = HuggingFaceEmbeddings( model_name=EMBEDDING_MODEL, model_kwargs={"device": "cpu"}, encode_kwargs={"normalize_embeddings": True} ) # 5. إنشاء قاعدة بيانات FAISS print("️ جاري بناء قاعدة بيانات FAISS...") vectorstore = FAISS.from_documents(chunks, embeddings) # 6. الحفظ على القرص if not PERSIST_DIR.exists(): PERSIST_DIR.mkdir(parents=True) print(f"💾 جاري الحفظ في: {PERSIST_DIR}") vectorstore.save_local(folder_path=str(PERSIST_DIR)) print("🎉 تم إنشاء قاعدة البيانات بنجاح!") if __name__ == "__main__": build_and_save_vectorstore()