Reza-galaxy21 commited on
Commit
81ad41f
·
verified ·
1 Parent(s): a2cc67b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -53
app.py CHANGED
@@ -1,10 +1,132 @@
1
- برای عیب‌یابی بهتر و شناسایی دقیق‌تر مشکل، می‌توانیم بخش دباگ موقت را گسترش دهیم و چک‌های پیشنهادی را به آن اضافه کنیم. این بخش به شما کمک می‌کند تا وضعیت فایل‌ها، دیتابیس، و مراحل پردازش را به دقت بررسی کنید. در زیر کد به‌روز شده با اضافه شدن چک‌های جدید آورده شده است:
2
-
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
- ### کد به‌روز شده با بخش دباگ گسترش‌یافته
 
 
 
 
 
6
 
7
- ```python
8
  # **بخش دباگ موقت برای بررسی مسیر و فایل‌ها**
9
  def check_files():
10
  base_path = "/home/user/app"
@@ -110,51 +232,4 @@ with gr.Blocks() as demo:
110
  debug_faiss_btn.click(check_faiss_database, outputs=debug_output)
111
  debug_merge_btn.click(check_database_merge, outputs=debug_output)
112
 
113
- demo.launch()
114
- ```
115
-
116
- ---
117
-
118
- ### توضیحات بخش‌های جدید دباگ
119
-
120
- 1. **بررسی فایل‌های آپلود شده (`check_uploaded_files`)**:
121
- - این تابع بررسی می‌کند که آیا فایل‌ها در پوشه `UPLOAD_FOLDER` ذخیره شده‌اند یا خیر.
122
-
123
- 2. **بررسی پردازش فایل‌های PDF (`check_pdf_processing`)**:
124
- - این تابع بررسی می‌کند که آیا فایل‌های PDF به درستی پردازش شده‌اند و متن آن‌ها استخراج شده است.
125
-
126
- 3. **بررسی ایجاد embeddings و ذخیره‌سازی در FAISS (`check_faiss_database`)**:
127
- - این تابع بررسی می‌کند که آیا دیتابیس FAISS ایجاد شده است و تعداد اسناد موجود در آن را نمایش می‌دهد.
128
-
129
- 4. **بررسی ادغام دیتابیس‌ها (`check_database_merge`)**:
130
- - این تابع بررسی می‌کند که آیا دیتابیس جدید با دیتابیس موجود ادغام شده است.
131
-
132
- ---
133
-
134
- ### نحوه استفاده از بخش دباگ
135
-
136
- 1. **بررسی فایل‌ها**:
137
- - روی دکمه `🔍 بررسی فایل‌ها` کلیک کنید تا فایل‌های موجود در مسیر `/home/user/app` بررسی شوند.
138
-
139
- 2. **بررسی دیتابیس**:
140
- - روی دکمه `📂 بررسی دیتابیس` کلیک کنید تا وجود فایل دیتابیس (`vector_database.pkl`) بررسی شود.
141
-
142
- 3. **بررسی مسیر جاری**:
143
- - روی دکمه `📁 بررسی مسیر` کلیک کنید تا مسیر جاری برنامه نمایش داده شود.
144
-
145
- 4. **بررسی فایل‌های آپلود شده**:
146
- - روی دکمه `📄 بررسی فایل‌های آپلود شده` کلیک کنید تا فایل‌های موجود در پوشه `UPLOAD_FOLDER` بررسی شوند.
147
-
148
- 5. **بررسی پردازش PDF**:
149
- - روی دکمه `📑 بررسی پردازش PDF` کلیک کنید تا پردازش فایل‌های PDF بررسی شود.
150
-
151
- 6. **بررسی FAISS**:
152
- - روی دکمه `🔍 بررسی FAISS` کلیک کنید تا وضعیت دیتابیس FAISS بررسی شود.
153
-
154
- 7. **بررسی ادغام دیتابیس**:
155
- - روی دکمه `🔄 بررسی ادغام دیتابیس` کلیک کنید تا ادغام دیتابیس‌ها بررسی شود.
156
-
157
- ---
158
-
159
- ### ارسال نتایج
160
- پس از اجرای برنامه و کلیک روی دکمه‌های دباگ، نتایج را برای من ارسال کنید تا بتوانم مشکل را دقیق‌تر شناسایی و راه‌حل ارائه دهم.
 
1
+ # برای عیب‌یابی بهتر و شناسایی دقیق‌تر مشکل، می‌توانیم بخش دباگ موقت را گسترش دهیم و چک‌های پیشنهادی را به آن اضافه کنیم.
2
+ # این بخش به شما کمک می‌کند تا وضعیت فایل‌ها، دیتابیس، و مراحل پردازش را به دقت بررسی کنید.
3
+
4
+ import os
5
+ import logging
6
+ import gradio as gr
7
+ import pickle
8
+ import shutil
9
+ from langchain_community.document_loaders import PDFMinerLoader
10
+ from langchain_community.embeddings import OpenAIEmbeddings
11
+ from langchain_community.vectorstores import FAISS
12
+ from langchain_community.chat_models import ChatOpenAI
13
+
14
+ # تنظیمات لاگ‌گیری
15
+ logging.basicConfig(level=logging.INFO)
16
+ logger = logging.getLogger(__name__)
17
+
18
+ # تنظیمات مسیرها
19
+ UPLOAD_FOLDER = "uploaded_files"
20
+ DATABASE_FILE = "/home/user/app/vector_database.pkl" # مشخص کردن مسیر دقیق
21
+ os.makedirs(UPLOAD_FOLDER, exist_ok=True)
22
+
23
+ # بارگذاری دیتابیس برداری در صورت وجود
24
+ def load_database():
25
+ if os.path.exists(DATABASE_FILE):
26
+ with open(DATABASE_FILE, "rb") as f:
27
+ return pickle.load(f)
28
+ return None
29
+
30
+ # ذخیره دیتابیس
31
+ def save_database(vector_db):
32
+ with open(DATABASE_FILE, "wb") as f:
33
+ pickle.dump(vector_db, f)
34
+ logger.info(f"✅ دیتابیس ذخیره شد: {DATABASE_FILE}")
35
+
36
+ # دیتابیس کلی
37
+ global_vector_db = load_database()
38
+
39
+ # پردازش و ذخیره‌سازی فایل‌های PDF
40
+ def process_and_store_pdfs(file_paths):
41
+ texts = []
42
+ for file_path in file_paths:
43
+ try:
44
+ logger.info(f"در حال پردازش فایل: {file_path}")
45
+ if file_path.endswith(".pdf"):
46
+ loader = PDFMinerLoader(file_path)
47
+ documents = loader.load()
48
+ texts.extend(documents)
49
+ else:
50
+ logger.warning(f"فرمت فایل {file_path} پشتیبانی نمی‌شود.")
51
+ except Exception as e:
52
+ logger.error(f"خطا در پردازش فایل {file_path}: {e}")
53
+
54
+ try:
55
+ logger.info("در حال ایجاد embeddings و ذخیره‌سازی در FAISS...")
56
+ embeddings = OpenAIEmbeddings()
57
+ vector_db = FAISS.from_documents(texts, embeddings)
58
+ logger.info("✅ ذخیره‌سازی در FAISS با موفقیت انجام شد.")
59
+ return vector_db
60
+ except Exception as e:
61
+ logger.error(f"خطا در ایجاد embeddings یا ذخیره‌سازی در FAISS: {e}")
62
+ return None
63
+
64
+ # پاسخ‌گویی بر اساس اسناد بارگذاری‌شده
65
+ def chat_with_doc(query):
66
+ try:
67
+ global global_vector_db
68
+ if not global_vector_db:
69
+ logger.warning("❌ دیتابیس برداری خالی است.")
70
+ return "❌ لطفاً یک فایل مرتبط آپلود کنید."
71
+
72
+ if not query.strip():
73
+ return "❌ لطفاً سوال خود را وارد کنید."
74
+
75
+ logger.info("در حال جستجو در دیتابیس برداری...")
76
+ retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
77
+ docs = retriever.get_relevant_documents(query)
78
+ context = "\n\n".join([doc.page_content for doc in docs])
79
+
80
+ if not context:
81
+ logger.warning("هیچ سند مرتبطی یافت نشد.")
82
+ return "هیچ اطلاعات مرتبطی یافت نشد."
83
+
84
+ logger.info("در حال تولید پاسخ با GPT...")
85
+ llm = ChatOpenAI(model_name="gpt-4", openai_api_key=os.getenv("My_huggingface_key"))
86
+ response = llm.predict(f"""سوال: {query}\n\nاطلاعات مرتبط:\n{context}\n\nپاسخ:""")
87
+
88
+ final_response = f"پاسخ:\n{response}\n\nمنابع:\n"
89
+ for doc in docs:
90
+ final_response += f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}\n"
91
+
92
+ return final_response
93
+ except Exception as e:
94
+ logger.error(f"خطا در پاسخ‌گویی بر اساس سند: {e}")
95
+ return f"❌ خطایی رخ داده است: {e}"
96
+
97
+ # پردازش فایل و ذخیره در دیتابیس
98
+ def handle_file_upload(file):
99
+ global global_vector_db
100
+ if not file:
101
+ return "❌ خطا: فایلی انتخاب نشده است."
102
+
103
+ file_path = os.path.join(UPLOAD_FOLDER, os.path.basename(file.name))
104
+ try:
105
+ shutil.copy(file.name, file_path)
106
+ logger.info(f"✅ فایل {file.name} ذخیره شد.")
107
+
108
+ new_vector_db = process_and_store_pdfs([file_path])
109
+ if new_vector_db:
110
+ if global_vector_db:
111
+ global_vector_db.merge_from(new_vector_db)
112
+ else:
113
+ global_vector_db = new_vector_db
114
+
115
+ save_database(global_vector_db)
116
+ return f"✅ فایل {file.name} با موفقیت آپلود و پردازش شد."
117
+ else:
118
+ return "❌ خطا در پردازش فایل."
119
+ except Exception as e:
120
+ logger.error(f"خطا در پردازش فایل: {e}")
121
+ return f"❌ خطا: {e}"
122
 
123
+ # نمایش تعداد فایل‌های آپلود شده در دیتابیس
124
+ def list_files_in_db():
125
+ if global_vector_db:
126
+ file_count = len(global_vector_db.docstore._dict)
127
+ return f"تعداد فایل‌های آپلود شده در دیتابیس: {file_count} فایل"
128
+ return "هیچ فایلی در دیتابیس وجود ندارد."
129
 
 
130
  # **بخش دباگ موقت برای بررسی مسیر و فایل‌ها**
131
  def check_files():
132
  base_path = "/home/user/app"
 
232
  debug_faiss_btn.click(check_faiss_database, outputs=debug_output)
233
  debug_merge_btn.click(check_database_merge, outputs=debug_output)
234
 
235
+ demo.launch()