Reza-galaxy21 commited on
Commit
a2cc67b
·
verified ·
1 Parent(s): 0499eda

Update app.py

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