Reza-galaxy21 commited on
Commit
9f6a01c
·
verified ·
1 Parent(s): f3f311d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +143 -146
app.py CHANGED
@@ -9,189 +9,186 @@ from langchain_community.chat_models import ChatOpenAI
9
 
10
  # تنظیمات لاگ‌گیری
11
  logging.basicConfig(level=logging.INFO)
12
- logger = logging.getLogger(name)
13
 
14
  # تنظیمات مسیرها
15
  UPLOAD_FOLDER = "uploaded_files"
16
- DATABASE_FILE = "/home/user/app/vector_database"  # بدون پسوند .pkl
17
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
18
 
 
 
 
 
 
19
  # بررسی و بارگذاری دیتابیس برداری
20
  def load_database():
21
-     try:
22
-         if os.path.exists(DATABASE_FILE):
23
-             embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
24
-             vector_db = FAISS.load_local(DATABASE_FILE, embeddings)
25
-             logger.info(f"✅ دیتابیس بارگذاری شد: {DATABASE_FILE}")
26
-             return vector_db
27
-         else:
28
-             logger.warning(f"❌ دیتابیس در مسیر {DATABASE_FILE} وجود ندارد.")
29
-             return None
30
-     except Exception as e:
31
-         logger.error(f"❌ خطا در بارگذاری دیتابیس: {e}")
32
-         return None
33
 
34
  def save_database(vector_db):
35
-     try:
36
-         vector_db.save_local(DATABASE_FILE)
37
-         logger.info(f"✅ دیتابیس ذخیره شد: {DATABASE_FILE}")
38
-     except Exception as e:
39
-         logger.error(f"❌ خطا در ذخیره دیتابیس: {e}")
40
-         raise e
41
 
42
  global_vector_db = load_database()
43
 
44
  # پردازش و ذخیره‌سازی فایل‌های PDF
45
  def process_and_store_pdfs(file_paths):
46
-     texts = []
47
-     for file_path in file_paths:
48
-         try:
49
-             logger.info(f"در حال پردازش فایل: {file_path}")
50
-             if file_path.endswith(".pdf"):
51
-                 loader = PyPDFLoader(file_path)
52
-                 documents = loader.load()
53
-                 texts.extend(documents)
54
-                 logger.info(f"✅ تعداد صفحات پردازش شده: {len(documents)}")
55
-             else:
56
-                 logger.warning(f"فرمت فایل {file_path} پشتیبانی نمی‌شود.")
57
-         except Exception as e:
58
-             logger.error(f"خطا در پردازش فایل {file_path}: {e}")
59
-
60
-     try:
61
-         logger.info("در حال ایجاد embeddings و ذخیره‌سازی در FAISS...")
62
-         openai_api_key = os.getenv("My_huggingface_key")
63
-
64
-         if not openai_api_key:
65
-             logger.error(" کلید API مقداردهی نشده است!")
66
-             raise ValueError("❌ کلید OpenAI API یافت نشد.")
67
-
68
-         embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
69
-         vector_db = FAISS.from_documents(texts, embeddings)
70
-         logger.info(f"✅ ذخیره‌سازی در FAISS با موفقیت انجام شد. تعداد اسناد: {vector_db.index.ntotal}")
71
-         return vector_db
72
-     except Exception as e:
73
-         logger.error(f"خطا در ایجاد embeddings یا ذخیره‌سازی در FAISS: {e}")
74
-         return None
75
 
76
  # پاسخ‌گویی بر اساس اسناد بارگذاری‌شده
77
  def chat_with_doc(query):
78
-     try:
79
-         global global_vector_db
80
-         if not global_vector_db:
81
-             return "❌ لطفاً یک فایل مرتبط آپلود کنید."
82
 
83
-         if not query.strip():
84
-             return "❌ لطفاً سوال خود را وارد کنید."
85
 
86
-         retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
87
-         docs = retriever.get_relevant_documents(query)
88
 
89
-         if len(docs) == 0:
90
-             return "هیچ اطلاعات مرتبطی یافت نشد."
91
 
92
-         context = "\n\n".join([doc.page_content for doc in docs])
93
-         logger.info(f"✅ اطلاعات مربوط به پرسش: {context}")
94
 
95
-         llm = ChatOpenAI(model_name="gpt-4", openai_api_key=os.getenv("My_huggingface_key"))
96
-         response = llm.predict(f"""سوال: {query}\n\nاطلاعات مرتبط:\n{context}\n\nپاسخ:""")
97
 
98
-         final_response = f"پاسخ:\n{response}\n\nمنابع:\n"
99
-         for doc in docs:
100
-             final_response += f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}\n"
101
 
102
-         return final_response
103
-     except Exception as e:
104
-         logger.error(f"خطا در پاسخ‌گویی بر اساس سند: {e}")
105
-         return f"❌ خطایی رخ داده است: {e}"
106
 
107
  # ذخیره فایل آپلود شده
108
  def save_uploaded_file(file):
109
-     try:
110
-         file_name = os.path.basename(file)
111
-         file_path = os.path.join(UPLOAD_FOLDER, file_name)
112
-         shutil.copy(file, file_path)
 
 
 
113
 
114
- global global_vector_db
115
-         global_vector_db = process_and_store_pdfs([file_path])
116
-         if global_vector_db:
117
-             save_database(global_vector_db)
 
118
 
119
-         return f"✅ فایل ذخیره شد: {file_path}"
120
-     except Exception as e:
121
-         return f"❌ خطا در ذخیره فایل: {e}"
122
 
123
  # دباگ موقت
124
  def debug_temp():
125
-     debug_results = []
126
-
127
-     # بررسی مقدار کلید API
128
-     openai_api_key = os.getenv("My_huggingface_key")
129
-     if openai_api_key:
130
-         debug_results.append(f"✅ کلید API مقداردهی شده: {openai_api_key[:5]}****")
131
-     else:
132
-         debug_results.append("❌ کلید API مقداردهی نشده است!")
133
-
134
-     # بررسی نسخه langchain_community
135
-     try:
136
-         import langchain_community
137
-         version = langchain_community.version
138
-         debug_results.append(f"✅ نسخه langchain_community: {version}")
139
-     except Exception as e:
140
-         debug_results.append(f"❌ خطا در بررسی نسخه langchain_community: {e}")
141
-
142
-     # بررسی فایل‌های PDF در مسیر آپلود
143
-     try:
144
-         pdf_files = [f for f in os.listdir(UPLOAD_FOLDER) if f.endswith(".pdf")]
145
-         if pdf_files:
146
-             file_paths = [os.path.join(UPLOAD_FOLDER, f) for f in pdf_files]
147
-             debug_results.append(f" فایل‌های PDF در مسیر {UPLOAD_FOLDER}:")
148
-            
149
-             # بررسی تعداد صفحات هر فایل
150
-             for file_path in file_paths:
151
-                 try:
152
-                     loader = PyPDFLoader(file_path)  # استفاده از PyPDFLoader
153
-                     documents = loader.load()
154
-                     debug_results.append(f"   - {os.path.basename(file_path)}: {len(documents)} صفحه")
155
-                 except Exception as e:
156
-                     debug_results.append(f" خطا در بررسی صفحات {file_path}: {str(e)}")
157
-         else:
158
-             debug_results.append(f"❌ هیچ فایل PDF در مسیر {UPLOAD_FOLDER} وجود ندارد.")
159
-     except Exception as e:
160
-         debug_results.append(f" خطا در بررسی پوشه {UPLOAD_FOLDER}: {e}")
161
-
162
-     # بررسی وضعیت دیتابیس
163
-     try:
164
-         if os.path.exists(DATABASE_FILE):
165
-             debug_results.append(f"✅ دیتابیس در مسیر {DATABASE_FILE} وجود دارد.")
166
-            
167
-             # بررسی تعداد اسناد ذخیره شده
168
-             if global_vector_db:
169
-                 debug_results.append(f"   - تعداد اسناد در دیتابیس: {global_vector_db.index.ntotal}")
170
-             else:
171
-                 debug_results.append("❌ دیتابیس در حافظه بارگذاری نشده است")
172
-         else:
173
-             debug_results.append(f"❌ دیتابیس در مسیر {DATABASE_FILE} وجود ندارد.")
174
-     except Exception as e:
175
-         debug_results.append(f"❌ خطا در بررسی دیتابیس: {e}")
176
-
177
-     return "\n".join(debug_results)
178
 
179
  # رابط کاربری با Gradio
180
  with gr.Blocks() as demo:
181
-     gr.Markdown("# هوش مصنوعی همراه کارشناسان توزیع برق ایران")
182
 
183
-     query = gr.Textbox(label="سوال خود را بپرسید", lines=2)
184
-     response = gr.Textbox(label="پاسخ", lines=10, interactive=False)
185
-     submit_btn = gr.Button("ارسال سوال")
186
 
187
-     file = gr.File(label="📎 آپلود فایل", file_types=[".pdf"])
188
-     upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
189
-     upload_btn = gr.Button("ارسال فایل")
190
 
191
-     debug_btn = gr.Button("🔍 بررسی دباگ موقت")
192
-     debug_output = gr.Textbox(label="نتایج دباگ", lines=10, interactive=False)
193
 
194
-     upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
195
-     debug_btn.click(debug_temp, outputs=debug_output)
196
 
197
- demo.launch()
 
9
 
10
  # تنظیمات لاگ‌گیری
11
  logging.basicConfig(level=logging.INFO)
12
+ logger = logging.getLogger(__name__)
13
 
14
  # تنظیمات مسیرها
15
  UPLOAD_FOLDER = "uploaded_files"
16
+ DATABASE_FILE = "/home/user/app/vector_database" # بدون پسوند .pkl
17
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
18
 
19
+ # مقداردهی کلید API
20
+ openai_api_key = os.getenv("My_huggingface_key")
21
+ if not openai_api_key:
22
+ logger.error("❌ کلید OpenAI API مقداردهی نشده است!")
23
+
24
  # بررسی و بارگذاری دیتابیس برداری
25
  def load_database():
26
+ try:
27
+ if os.path.exists(DATABASE_FILE):
28
+ embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
29
+ vector_db = FAISS.load_local(DATABASE_FILE, embeddings)
30
+ logger.info(f"✅ دیتابیس بارگذاری شد: {DATABASE_FILE}")
31
+ return vector_db
32
+ else:
33
+ logger.warning(f"❌ دیتابیس در مسیر {DATABASE_FILE} وجود ندارد.")
34
+ return None
35
+ except Exception as e:
36
+ logger.error(f"❌ خطا در بارگذاری دیتابیس: {e}")
37
+ return None
38
 
39
  def save_database(vector_db):
40
+ try:
41
+ vector_db.save_local(DATABASE_FILE)
42
+ logger.info(f"✅ دیتابیس ذخیره شد: {DATABASE_FILE}")
43
+ except Exception as e:
44
+ logger.error(f"❌ خطا در ذخیره دیتابیس: {e}")
 
45
 
46
  global_vector_db = load_database()
47
 
48
  # پردازش و ذخیره‌سازی فایل‌های PDF
49
  def process_and_store_pdfs(file_paths):
50
+ texts = []
51
+ for file_path in file_paths:
52
+ try:
53
+ logger.info(f"در حال پردازش فایل: {file_path}")
54
+ if file_path.endswith(".pdf"):
55
+ loader = PyPDFLoader(file_path)
56
+ documents = loader.load()
57
+ texts.extend(documents)
58
+ logger.info(f"✅ تعداد صفحات پردازش شده: {len(documents)}")
59
+ else:
60
+ logger.warning(f"فرمت فایل {file_path} پشتیبانی نمی‌شود.")
61
+ except Exception as e:
62
+ logger.error(f"خطا در پردازش فایل {file_path}: {e}")
63
+
64
+ if not texts:
65
+ logger.warning(" هیچ متنی برای ذخیره‌سازی در FAISS یافت نشد.")
66
+ return None
67
+
68
+ try:
69
+ logger.info("در حال ایجاد embeddings و ذخیره‌سازی در FAISS...")
70
+ embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
71
+ vector_db = FAISS.from_documents(texts, embeddings)
72
+ logger.info(f"✅ ذخیره‌سازی در FAISS با موفقیت انجام شد. تعداد اسناد: {vector_db.index.ntotal}")
73
+ return vector_db
74
+ except Exception as e:
75
+ logger.error(f"خطا در ایجاد embeddings یا ذخیره‌سازی در FAISS: {e}")
76
+ return None
 
 
77
 
78
  # پاسخ‌گویی بر اساس اسناد بارگذاری‌شده
79
  def chat_with_doc(query):
80
+ try:
81
+ global global_vector_db
82
+ if not global_vector_db:
83
+ return "❌ لطفاً یک فایل مرتبط آپلود کنید."
84
 
85
+ if not query.strip():
86
+ return "❌ لطفاً سوال خود را وارد کنید."
87
 
88
+ retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
89
+ docs = retriever.get_relevant_documents(query)
90
 
91
+ if len(docs) == 0:
92
+ return "هیچ اطلاعات مرتبطی یافت نشد."
93
 
94
+ context = "\n\n".join([doc.page_content for doc in docs])
95
+ logger.info(f"✅ اطلاعات مربوط به پرسش: {context}")
96
 
97
+ llm = ChatOpenAI(model_name="gpt-4", openai_api_key=openai_api_key)
98
+ response = llm.predict(f"""سوال: {query}\n\nاطلاعات مرتبط:\n{context}\n\nپاسخ:""")
99
 
100
+ final_response = f"پاسخ:\n{response}\n\nمنابع:\n"
101
+ for doc in docs:
102
+ final_response += f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}\n"
103
 
104
+ return final_response
105
+ except Exception as e:
106
+ logger.error(f"خطا در پاسخ‌گویی بر اساس سند: {e}")
107
+ return f"❌ خطایی رخ داده است: {e}"
108
 
109
  # ذخیره فایل آپلود شده
110
  def save_uploaded_file(file):
111
+ try:
112
+ file_name = os.path.basename(file)
113
+ file_path = os.path.join(UPLOAD_FOLDER, file_name)
114
+ shutil.copy(file, file_path)
115
+
116
+ global global_vector_db
117
+ global_vector_db = process_and_store_pdfs([file_path])
118
 
119
+ if global_vector_db:
120
+ save_database(global_vector_db)
121
+ logger.info(f"📂 تعداد اسناد در دیتابیس: {global_vector_db.index.ntotal}")
122
+ else:
123
+ logger.error("❌ دیتابیس برداری مقداردهی نشده است!")
124
 
125
+ return f"✅ فایل ذخیره شد: {file_path}"
126
+ except Exception as e:
127
+ return f"❌ خطا در ذخیره فایل: {e}"
128
 
129
  # دباگ موقت
130
  def debug_temp():
131
+ debug_results = []
132
+
133
+ # بررسی مقدار کلید API
134
+ if openai_api_key:
135
+ debug_results.append(f"✅ کلید API مقداردهی شده: {openai_api_key[:5]}****")
136
+ else:
137
+ debug_results.append("❌ کلید API مقداردهی نشده است!")
138
+
139
+ # بررسی فایل‌های PDF در مسیر آپلود
140
+ try:
141
+ pdf_files = [f for f in os.listdir(UPLOAD_FOLDER) if f.endswith(".pdf")]
142
+ if pdf_files:
143
+ file_paths = [os.path.join(UPLOAD_FOLDER, f) for f in pdf_files]
144
+ debug_results.append(f"✅ فایل‌های PDF در مسیر {UPLOAD_FOLDER}:")
145
+
146
+ # بررسی تعداد صفحات هر فایل
147
+ for file_path in file_paths:
148
+ try:
149
+ loader = PyPDFLoader(file_path)
150
+ documents = loader.load()
151
+ debug_results.append(f" - {os.path.basename(file_path)}: {len(documents)} صفحه")
152
+ except Exception as e:
153
+ debug_results.append(f" خطا در بررسی صفحات {file_path}: {str(e)}")
154
+ else:
155
+ debug_results.append(f"❌ هیچ فایل PDF در مسیر {UPLOAD_FOLDER} وجود ندارد.")
156
+ except Exception as e:
157
+ debug_results.append(f"❌ خطا در بررسی پوشه {UPLOAD_FOLDER}: {e}")
158
+
159
+ # بررسی وضعیت دیتابیس
160
+ try:
161
+ if os.path.exists(DATABASE_FILE):
162
+ debug_results.append(f" دیتابیس در مسیر {DATABASE_FILE} وجود دارد.")
163
+
164
+ # بررسی تعداد اسناد ذخیره شده
165
+ if global_vector_db:
166
+ debug_results.append(f" - تعداد اسناد در دیتابیس: {global_vector_db.index.ntotal}")
167
+ else:
168
+ debug_results.append("❌ دیتابیس در حافظه بارگذاری نشده است")
169
+ else:
170
+ debug_results.append(f"❌ دیتابیس در مسیر {DATABASE_FILE} وجود ندارد.")
171
+ except Exception as e:
172
+ debug_results.append(f"❌ خطا در بررسی دیتابیس: {e}")
173
+
174
+ return "\n".join(debug_results)
 
 
 
 
 
 
 
 
 
175
 
176
  # رابط کاربری با Gradio
177
  with gr.Blocks() as demo:
178
+ gr.Markdown("# هوش مصنوعی همراه کارشناسان توزیع برق ایران")
179
 
180
+ query = gr.Textbox(label="سوال خود را بپرسید", lines=2)
181
+ response = gr.Textbox(label="پاسخ", lines=10, interactive=False)
182
+ submit_btn = gr.Button("ارسال سوال")
183
 
184
+ file = gr.File(label="📎 آپلود فایل", file_types=[".pdf"])
185
+ upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
186
+ upload_btn = gr.Button("ارسال فایل")
187
 
188
+ debug_btn = gr.Button("🔍 بررسی دباگ موقت")
189
+ debug_output = gr.Textbox(label="نتایج دباگ", lines=10, interactive=False)
190
 
191
+ upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
192
+ debug_btn.click(debug_temp, outputs=debug_output)
193
 
194
+ demo.launch()