HNU-Final / create_vector_store.py
mokh2x's picture
Upload 3 files
dcc277e verified
# create_vector_store.py
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_community.embeddings import HuggingFaceEmbeddings
from dotenv import load_dotenv
import os
import shutil
# --- إعدادات المشروع ---
DATA_PATH = "university_data_arabic"
DB_PATH = "vectorstores/db/"
# نستخدم تضمينات جوجل المستضافة لتقليل حجم الحزم وعدم تحميل نماذج محلياً
# EMBEDDING_MODEL_NAME = "models/text-embedding-004"
EMBEDDING_MODEL_NAME = "intfloat/multilingual-e5-small"
HF_CACHE_DIR = "/app/.cache/huggingface" # could be deleted if not using local models
# # ---------------------
def build_vector_store():
"""
يقوم هذا السكربت ببناء قاعدة البيانات المعرفية (Vector Store)
من ملفات الماركداون الموجودة في مجلد البيانات.
"""
# تحميل المتغيرات البيئية (مثل GOOGLE_API_KEY)
load_dotenv()
# التأكد من وجود مجلد البيانات
if not os.path.exists(DATA_PATH):
print(f"خطأ: مجلد البيانات '{DATA_PATH}' غير موجود. يرجى إنشاؤه ووضع ملفات البيانات بداخله.")
return
# تنظيف قاعدة البيانات القديمة إذا كانت موجودة لضمان التحديث
if os.path.exists(DB_PATH):
print(f"يتم حذف قاعدة البيانات القديمة في {DB_PATH}")
shutil.rmtree(DB_PATH)
# 1. تحميل كل ملفات .md من مجلد البيانات
print(f"يتم تحميل الملفات من المسار: {DATA_PATH}...")
loader = DirectoryLoader(DATA_PATH, glob="**/*.md", loader_cls=TextLoader, loader_kwargs={'encoding': 'utf-8'}, show_progress=True)
documents = loader.load()
if not documents:
print("لم يتم العثور على أي ملفات. يرجى التأكد من وجود ملفات .md في مجلد البيانات.")
return
# 2. تقسيم المستندات إلى أجزاء (chunks) أصغر
print("يتم تقسيم المستندات إلى أجزاء أصغر...")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunked_documents = text_splitter.split_documents(documents)
# 3. إنشاء دالة التضمين باستخدام واجهة جوجل (عن بعد)
# لا يتم تحميل أي نموذج محلياً، مما يقلل المساحة المطلوبة بشكل كبير
# print(f"يتم تهيئة تضمينات جوجل: {EMBEDDING_MODEL_NAME}...")
# embedding_model = GoogleGenerativeAIEmbeddings(
# model=EMBEDDING_MODEL_NAME
# )
#print(f"يتم تهيئة تضمينات هاجنج فيس: {EMBEDDING_MODEL_NAME} ...")
# embedding_model = HuggingFaceEmbeddings(
# model_name=EMBEDDING_MODEL_NAME,
# model_kwargs={'device': 'cpu'},
# encode_kwargs={'normalize_embeddings': True}
# )
print(f"يتم تهيئة تضمينات هاجنج فيس: {EMBEDDING_MODEL_NAME} ...")
embedding_model = HuggingFaceEmbeddings(
model_name=EMBEDDING_MODEL_NAME,
cache_folder=HF_CACHE_DIR,
model_kwargs={'device': 'cpu'},
encode_kwargs={'normalize_embeddings': True}
)
# 4. إنشاء قاعدة بيانات ChromaDB وحفظها على الجهاز
print(f"يتم إنشاء قاعدة البيانات المعرفية في المسار: {DB_PATH}...")
vector_store = Chroma.from_documents(
documents=chunked_documents,
embedding=embedding_model,
persist_directory=DB_PATH
)
print("-----------------------------------------")
print("✅ تم إنشاء قاعدة البيانات بنجاح! ✅")
print("-----------------------------------------")
if __name__ == "__main__":
build_vector_store()