Reza-galaxy21 commited on
Commit
f3f311d
·
verified ·
1 Parent(s): 0c28942

Update app.py

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