Reza-galaxy21 commited on
Commit
3ff18b8
·
verified ·
1 Parent(s): 1264347

Upload app (2).py

Browse files
Files changed (1) hide show
  1. app (2).py +208 -0
app (2).py ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 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
+ # بازیابی اسناد مرتبط
88
+ retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
89
+ docs = retriever.get_relevant_documents(query)
90
+
91
+ # لاگ‌گیری برای بررسی اسناد بازیابی شده
92
+ logger.info(f"تعداد اسناد بازیابی شده: {len(docs)}")
93
+ for doc in docs:
94
+ logger.info(f"سند بازیابی شده: {doc.page_content[:100]}...") # نمایش بخشی از متن سند
95
+
96
+ context = "\n\n".join([doc.page_content for doc in docs])
97
+
98
+ if not context:
99
+ return "هیچ اطلاعات مرتبطی یافت نشد."
100
+
101
+ # استفاده از مدل gpt-3.5-turbo به جای gpt-4 (در صورت عدم دسترسی به GPT-4)
102
+ llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=os.getenv("My_huggingface_key"))
103
+
104
+ # ساختار درخواست ساده‌تر
105
+ prompt = f"""سوال: {query}\n\nاطلاعات مرتبط:\n{context}\n\nلطفاً به سوال پاسخ دهید:"""
106
+ response = llm.predict(prompt)
107
+
108
+ final_response = f"پاسخ:\n{response}\n\nمنابع:\n"
109
+ for doc in docs:
110
+ final_response += f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}\n"
111
+
112
+ return final_response
113
+ except Exception as e:
114
+ logger.error(f"خطا در پاسخ‌گویی بر اساس سند: {e}")
115
+ return f"❌ خطایی رخ داده است: {e}"
116
+
117
+ # ذخیره فایل آپلود شده
118
+ def save_uploaded_file(file):
119
+ try:
120
+ file_name = os.path.basename(file)
121
+ file_path = os.path.join(UPLOAD_FOLDER, file_name)
122
+ shutil.copy(file, file_path)
123
+
124
+ global global_vector_db
125
+ global_vector_db = process_and_store_pdfs([file_path])
126
+ if global_vector_db:
127
+ save_database(global_vector_db)
128
+
129
+ return f"✅ فایل ذخیره شد: {file_path}"
130
+ except Exception as e:
131
+ return f"❌ خطا در ذخیره فایل: {e}"
132
+
133
+ # دباگ موقت
134
+ def debug_temp():
135
+ debug_results = []
136
+
137
+ # بررسی مقدار کلید API
138
+ openai_api_key = os.getenv("My_huggingface_key")
139
+ if openai_api_key:
140
+ debug_results.append(f"✅ کلید API مقداردهی شده: {openai_api_key[:5]}********")
141
+ else:
142
+ debug_results.append("❌ کلید API مقداردهی نشده است!")
143
+
144
+ # بررسی نسخه langchain_community
145
+ try:
146
+ import langchain_community
147
+ version = langchain_community.__version__
148
+ debug_results.append(f"✅ نسخه langchain_community: {version}")
149
+ except Exception as e:
150
+ debug_results.append(f"❌ خطا در بررسی نسخه langchain_community: {e}")
151
+
152
+ # بررسی فایل‌های PDF در مسیر آپلود
153
+ try:
154
+ pdf_files = [f for f in os.listdir(UPLOAD_FOLDER) if f.endswith(".pdf")]
155
+ if pdf_files:
156
+ file_paths = [os.path.join(UPLOAD_FOLDER, f) for f in pdf_files]
157
+ debug_results.append(f"✅ فایل‌های PDF در مسیر `{UPLOAD_FOLDER}`:")
158
+
159
+ # بررسی تعداد صفحات هر فایل
160
+ for file_path in file_paths:
161
+ try:
162
+ loader = PyPDFLoader(file_path) # استفاده از PyPDFLoader
163
+ documents = loader.load()
164
+ debug_results.append(f" - {os.path.basename(file_path)}: {len(documents)} صفحه")
165
+ except Exception as e:
166
+ debug_results.append(f"❌ خطا در بررسی صفحات {file_path}: {str(e)}")
167
+ else:
168
+ debug_results.append(f"❌ هیچ فایل PDF در مسیر `{UPLOAD_FOLDER}` وجود ندارد.")
169
+ except Exception as e:
170
+ debug_results.append(f"❌ خطا در بررسی پوشه `{UPLOAD_FOLDER}`: {e}")
171
+
172
+ # بررسی وضعیت دیتابیس
173
+ try:
174
+ if os.path.exists(DATABASE_FILE):
175
+ debug_results.append(f"✅ دیتابیس در مسیر `{DATABASE_FILE}` وجود دارد.")
176
+
177
+ # بررسی تعداد اسناد ذخیره شده
178
+ if global_vector_db:
179
+ debug_results.append(f" - تعداد اسناد در دیتابیس: {global_vector_db.index.ntotal}")
180
+ else:
181
+ debug_results.append("❌ دیتابیس در حافظه بارگذاری نشده است")
182
+ else:
183
+ debug_results.append(f"❌ دیتابیس در مسیر `{DATABASE_FILE}` وجود ندارد.")
184
+ except Exception as e:
185
+ debug_results.append(f"❌ خطا در بررسی دیتابیس: {e}")
186
+
187
+ return "\n".join(debug_results)
188
+
189
+ # رابط کاربری با Gradio
190
+ with gr.Blocks() as demo:
191
+ gr.Markdown("# هوش مصنوعی همراه کارشناسان توزیع برق ایران")
192
+
193
+ query = gr.Textbox(label="سوال خود را بپرسید", lines=2)
194
+ response = gr.Textbox(label="پاسخ", lines=10, interactive=False)
195
+ submit_btn = gr.Button("ارسال سوال")
196
+
197
+ file = gr.File(label="📎 آپلود فایل", file_types=[".pdf"])
198
+ upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
199
+ upload_btn = gr.Button("ارسال فایل")
200
+
201
+ debug_btn = gr.Button("🔍 بررسی دباگ موقت")
202
+ debug_output = gr.Textbox(label="نتایج دباگ", lines=10, interactive=False)
203
+
204
+ upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
205
+ submit_btn.click(chat_with_doc, inputs=[query], outputs=[response])
206
+ debug_btn.click(debug_temp, outputs=debug_output)
207
+
208
+ demo.launch()