Reza-galaxy21 commited on
Commit
3f1f23f
·
verified ·
1 Parent(s): 12f27ee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -100
app.py CHANGED
@@ -1,117 +1,69 @@
1
  import os
2
  import gradio as gr
3
- import logging
 
4
  from langchain_community.vectorstores import FAISS
5
- from langchain_openai import OpenAIEmbeddings
6
- from langchain_community.chat_models import ChatOpenAI
7
-
8
- os.system("pip install pymupdf")
9
- import fitz # PyMuPDF
10
-
11
- import shutil
12
-
13
- # تنظیمات لاگ‌گیری
14
- logging.basicConfig(level=logging.INFO)
15
- logger = logging.getLogger(__name__)
16
-
17
- # مسیر دیتابیس برداری
18
- VECTOR_DB_PATH = "/home/user/app/vector_database"
19
-
20
- # بارگذاری مدل جاسازی متن
21
- embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
22
-
23
- # تابع بارگذاری دیتابیس برداری
24
  def load_database():
25
- if os.path.exists(VECTOR_DB_PATH):
26
- logger.info("✅ دیتابیس موجود است. بارگذاری در حال انجام...")
27
- return FAISS.load_local(VECTOR_DB_PATH, embeddings)
28
- else:
29
- logger.warning("❌ دیتابیس وجود ندارد. ایجاد دیتابیس جدید...")
30
- return FAISS.from_documents([], embeddings)
31
-
32
- global_vector_db = load_database()
33
-
34
- # تابع پردازش PDF
35
- def process_pdf(file_path):
36
  try:
37
- doc = PyMuPDF.open(file_path)
38
- text = "\n".join([page.get_text("text") for page in doc])
39
- return text
 
40
  except Exception as e:
41
- logger.error(f"❌ خطا در پردازش PDF: {e}")
42
  return None
43
 
44
- # تابع ذخیره‌سازی دیتابیس
45
- def save_database(db):
46
- db.save_local(VECTOR_DB_PATH)
47
-
48
- # تابع پردازش و ذخیره فایل
49
- def save_uploaded_file(file_path):
50
- try:
51
- if not file_path:
52
- return "❌ فایلی انتخاب نشده است."
53
-
54
- logger.info(f"✅ فایل دریافت شد: {file_path}")
55
-
56
- # کپی فایل به مسیر مشخص
57
- target_path = os.path.join("/home/user/app/uploads", os.path.basename(file_path))
58
- shutil.copy(file_path, target_path)
59
 
60
- # پردازش PDF و ایجاد دیتابیس برداری
61
- text = process_pdf(file_path)
62
- if not text:
63
- return "❌ پردازش PDF ناموفق بود."
64
-
65
- global global_vector_db
66
- new_vector_db = FAISS.from_texts([text], embeddings)
67
-
68
- # به‌روزرسانی دیتابیس برداری
69
- if new_vector_db:
70
- global_vector_db = new_vector_db
71
- save_database(global_vector_db)
72
- return f"✅ فایل پردازش و ذخیره شد: {os.path.basename(file_path)}"
73
- else:
74
- return "❌ خطا در پردازش فایل."
75
-
76
- except Exception as e:
77
- logger.error(f"❌ خطا در پردازش فایل: {e}")
78
- return f"❌ خطایی رخ داد: {e}"
79
-
80
- # تابع دریافت پاسخ
81
- def get_response(query):
82
  try:
83
- if not global_vector_db:
84
- return " دیتابیس هنوز ایجاد نشده است."
85
-
86
- # بازیابی اطلاعات مرتبط
87
- docs = global_vector_db.similarity_search(query, k=3)
88
- references = "\n".join([doc.page_content for doc in docs])
89
-
90
- if not docs:
91
- return "❌ هیچ نتیجه‌ای یافت نشد."
92
-
93
- return f"📖 **پاسخ:**\n{references}"
94
  except Exception as e:
95
- logger.error(f"❌ خطا در دریافت پاسخ: {e}")
96
- return f" خطایی رخ داد: {e}"
97
 
98
- # ساخت رابط کاربری Gradio
99
  with gr.Blocks() as demo:
100
- gr.Markdown("# 📘 **دستیار هوش مصنوعی تحلیل اسناد توزیع برق**")
101
-
102
- with gr.Row():
103
- upload_button = gr.File(label="📂 آپلود فایل PDF", type="filepath")
104
- upload_status = gr.Textbox(label="📢 وضعیت آپلود", interactive=False)
105
-
106
- process_button = gr.Button("📥 پردازش فایل")
107
- process_button.click(fn=save_uploaded_file, inputs=[upload_button], outputs=[upload_status])
108
-
109
- query_input = gr.Textbox(label="🔍 سوال خود را وارد کنید:")
110
- response_output = gr.HTML(label="📢 پاسخ") # حذف `interactive=False`
111
-
112
- search_button = gr.Button("🔎 دریافت پاسخ")
113
- search_button.click(fn=get_response, inputs=[query_input], outputs=[response_output])
114
 
115
  # اجرای برنامه
116
  if __name__ == "__main__":
 
117
  demo.launch()
 
1
  import os
2
  import gradio as gr
3
+ import faiss
4
+ import PyMuPDF
5
  from langchain_community.vectorstores import FAISS
6
+ from langchain.embeddings.openai import OpenAIEmbeddings
7
+ from sentence_transformers import SentenceTransformer
8
+
9
+ # مدل برای embeddings
10
+ print("⏳ در حال بارگذاری مدل embeddings...")
11
+ model = SentenceTransformer("all-MiniLM-L6-v2")
12
+ print("✅ مدل embeddings بارگذاری شد.")
13
+
14
+ # تولید embeddings اولیه
15
+ try:
16
+ sample_text = ["نمونه متن برای تست"]
17
+ embeddings = model.encode(sample_text)
18
+ print(f"✅ Embeddings اولیه تولید شد: {embeddings.shape}")
19
+ except Exception as e:
20
+ print(f"❌ خطا در تولید embeddings: {e}")
21
+ embeddings = None
22
+
23
+ # بررسی دیتابیس FAISS
 
24
  def load_database():
25
+ global embeddings
26
+ if embeddings is None or len(embeddings) == 0:
27
+ print("⚠️ خطا: لیست embeddings خالی است. FAISS مقداردهی نمی‌شود.")
28
+ return None
29
+
30
+ print("⏳ در حال مقداردهی FAISS...")
 
 
 
 
 
31
  try:
32
+ index = faiss.IndexFlatL2(len(embeddings[0]))
33
+ faiss_db = FAISS(index)
34
+ print("✅ FAISS مقداردهی شد.")
35
+ return faiss_db
36
  except Exception as e:
37
+ print(f"❌ خطا در مقداردهی FAISS: {e}")
38
  return None
39
 
40
+ # بررسی اینکه دیتابیس از قبل وجود دارد یا خیر
41
+ if not os.path.exists("faiss_index"):
42
+ print("❌ دیتابیس وجود ندارد. ایجاد دیتابیس جدید...")
43
+ global_vector_db = load_database()
44
+ else:
45
+ print("✅ دیتابیس FAISS موجود است.")
 
 
 
 
 
 
 
 
 
46
 
47
+ # تابع پردازش فایل
48
+ def process_pdf(file):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  try:
50
+ doc = PyMuPDF.open(file.name)
51
+ text = "\n".join([page.get_text() for page in doc])
52
+ print(f"✅ فایل پردازش شد. {len(text)} کاراکتر استخراج شد.")
53
+ return text
 
 
 
 
 
 
 
54
  except Exception as e:
55
+ print(f"❌ خطا در پردازش PDF: {e}")
56
+ return "⚠️ خطا در پردازش فایل"
57
 
58
+ # رابط گرافیکی
59
  with gr.Blocks() as demo:
60
+ gr.Markdown("# 🚀 ابزار تحلیل اسناد توزیع برق")
61
+ file_input = gr.File(label="آپلود فایل PDF", type="filepath")
62
+ output_text = gr.Textbox(label="📄 محتوای پردازش شده")
63
+
64
+ file_input.change(process_pdf, inputs=file_input, outputs=output_text)
 
 
 
 
 
 
 
 
 
65
 
66
  # اجرای برنامه
67
  if __name__ == "__main__":
68
+ print("🚀 برنامه در حال اجرا است...")
69
  demo.launch()