Reza-galaxy21 commited on
Commit
5913bc6
·
verified ·
1 Parent(s): 68cc812

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -117
app.py CHANGED
@@ -2,158 +2,92 @@ import os
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"
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
- logger.info(f"✅ تعداد اسناد بازیابی‌شده: {len(docs)}")
90
 
91
- if len(docs) == 0:
92
- return "هیچ اطلاعات مرتبطی یافت نشد."
93
 
94
- context = "\n\n".join([doc.page_content[:200] for doc in docs]) # نمایش ۲۰۰ کاراکتر اول از هر سند
95
- logger.info(f"📄 اسناد بازیابی‌شده:\n{context}")
96
 
97
- # تست جداگانه FAISS
98
- return f"🔍 نتایج جستجو از FAISS:\n{context}"
99
 
100
- llm = ChatOpenAI(model_name="gpt-4", openai_api_key=os.getenv("My_huggingface_key"))
101
- response = llm.predict(f"""سوال: {query}\n\nاطلاعات مرتبط:\n{context}\n\nپاسخ:""")
102
-
103
- final_response = f"پاسخ:\n{response}\n\nمنابع:\n"
104
- for doc in docs:
105
- final_response += f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}\n"
106
-
107
- return final_response
108
- except Exception as e:
109
- logger.error(f"خطا در پاسخ‌گویی بر اساس سند: {e}")
110
- return f"❌ خطایی رخ داده است: {e}"
111
-
112
- # ذخیره فایل آپلود شده
113
  def save_uploaded_file(file):
114
- try:
115
- file_name = os.path.basename(file)
116
- file_path = os.path.join(UPLOAD_FOLDER, file_name)
117
- shutil.copy(file, file_path)
118
-
119
- global global_vector_db
120
- global_vector_db = process_and_store_pdfs([file_path])
121
- if global_vector_db:
122
- save_database(global_vector_db)
123
-
124
- return f"✅ فایل ذخیره شد: {file_path}"
125
- except Exception as e:
126
- return f"❌ خطا در ذخیره فایل: {e}"
127
 
128
- # دباگ موقت
129
- def debug_temp():
130
- debug_results = []
131
 
132
- # بررسی مقدار کلید API
133
- openai_api_key = os.getenv("My_huggingface_key")
134
- if openai_api_key:
135
- debug_results.append(f"✅ کلید API مقداردهی شده: {openai_api_key[:5]}****")
136
- else:
137
- debug_results.append("❌ کلید API مقداردهی نشده است!")
138
 
139
- # بررسی وضعیت دیتابیس
140
- try:
141
- if os.path.exists(DATABASE_FILE):
142
- debug_results.append(f"✅ دیتابیس در مسیر {DATABASE_FILE} وجود دارد.")
143
- if global_vector_db:
144
- debug_results.append(f" - تعداد اسناد در دیتابیس: {global_vector_db.index.ntotal}")
145
- else:
146
- debug_results.append("❌ دیتابیس در حافظه بارگذاری نشده است")
147
- else:
148
- debug_results.append(f"❌ دیتابیس در مسیر {DATABASE_FILE} وجود ندارد.")
149
- except Exception as e:
150
- debug_results.append(f"❌ خطا در بررسی دیتابیس: {e}")
151
-
152
- return "\n".join(debug_results)
153
-
154
- # رابط کاربری با Gradio
155
  with gr.Blocks() as demo:
156
- gr.Markdown("# هوش مصنوعی همراه کارشناسان توزیع برق ایران")
157
 
158
  query = gr.Textbox(label="سوال خود را بپرسید", lines=2)
159
  response = gr.Textbox(label="پاسخ", lines=10, interactive=False)
@@ -163,11 +97,7 @@ with gr.Blocks() as demo:
163
  upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
164
  upload_btn = gr.Button("ارسال فایل")
165
 
166
- debug_btn = gr.Button("🔍 بررسی دباگ موقت")
167
- debug_output = gr.Textbox(label="نتایج دباگ", lines=10, interactive=False)
168
-
169
  submit_btn.click(chat_with_doc, inputs=[query], outputs=[response])
170
  upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
171
- debug_btn.click(debug_temp, outputs=debug_output)
172
 
173
  demo.launch()
 
2
  import shutil
3
  import logging
4
  import gradio as gr
5
+ import fitz # PyMuPDF
6
+ import easyocr
7
  from langchain_community.embeddings import OpenAIEmbeddings
8
  from langchain_community.vectorstores import FAISS
 
9
 
 
10
  logging.basicConfig(level=logging.INFO)
11
  logger = logging.getLogger(__name__)
12
 
 
13
  UPLOAD_FOLDER = "uploaded_files"
14
  DATABASE_FILE = "/home/user/app/vector_database"
15
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
16
 
17
+ reader = easyocr.Reader(['fa', 'en'])
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
+ def extract_text_from_pdf(file_path):
20
+ """ استخراج متن از PDF با PyMuPDF + EasyOCR برای صفحات تصویری """
21
+ extracted_texts = []
22
+ doc = fitz.open(file_path)
23
+
24
+ for page_num in range(len(doc)):
25
+ page = doc[page_num]
26
+ text = page.get_text("text")
27
+
28
+ if not text.strip():
29
+ # اگر صفحه خالی بود، از OCR استفاده کن
30
+ logger.warning(f"🔍 صفحه {page_num+1} بدون متن است، OCR انجام می‌شود...")
31
+ img = page.get_pixmap()
32
+ text = reader.readtext(img.samples, detail=0, paragraph=True)
33
+ text = "\n".join(text)
34
+
35
+ extracted_texts.append(text)
36
 
37
+ return extracted_texts
38
 
 
39
  def process_and_store_pdfs(file_paths):
40
  texts = []
41
+
42
  for file_path in file_paths:
43
  try:
44
+ logger.info(f"📄 پردازش فایل: {file_path}")
45
  if file_path.endswith(".pdf"):
46
+ extracted_texts = extract_text_from_pdf(file_path)
47
+ for i, text in enumerate(extracted_texts):
48
+ texts.append({"page_content": text, "metadata": {"source": file_path, "page": i+1}})
49
+ logger.info(f"✅ تعداد صفحات پردازش شده: {len(extracted_texts)}")
50
  else:
51
+ logger.warning(f"فرمت فایل {file_path} پشتیبانی نمی‌شود.")
52
  except Exception as e:
53
+ logger.error(f"خطا در پردازش فایل {file_path}: {e}")
54
 
55
  try:
56
+ logger.info("🔍 ایجاد embeddings و ذخیره در FAISS...")
57
  openai_api_key = os.getenv("My_huggingface_key")
 
 
 
 
 
58
  embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
59
+
60
  vector_db = FAISS.from_documents(texts, embeddings)
61
+ logger.info(f"✅ ذخیره در FAISS انجام شد، تعداد اسناد: {vector_db.index.ntotal}")
62
  return vector_db
63
  except Exception as e:
64
+ logger.error(f"خطا در ذخیره FAISS: {e}")
65
  return None
66
 
 
67
  def chat_with_doc(query):
68
+ if not global_vector_db:
69
+ return "❌ لطفاً فایل مرتبط آپلود کنید."
 
 
 
 
 
 
 
 
 
 
70
 
71
+ retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
72
+ docs = retriever.get_relevant_documents(query)
73
 
74
+ if not docs:
75
+ return "هیچ اطلاعات مرتبطی یافت نشد."
76
 
77
+ context = "\n\n".join([doc["page_content"][:200] for doc in docs])
78
+ return f"🔍 نتایج جستجو از FAISS:\n{context}"
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  def save_uploaded_file(file):
81
+ file_path = os.path.join(UPLOAD_FOLDER, os.path.basename(file))
82
+ shutil.copy(file, file_path)
 
 
 
 
 
 
 
 
 
 
 
83
 
84
+ global global_vector_db
85
+ global_vector_db = process_and_store_pdfs([file_path])
 
86
 
87
+ return f"✅ فایل ذخیره شد: {file_path}"
 
 
 
 
 
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  with gr.Blocks() as demo:
90
+ gr.Markdown("# دستیار هوشمند توزیع برق")
91
 
92
  query = gr.Textbox(label="سوال خود را بپرسید", lines=2)
93
  response = gr.Textbox(label="پاسخ", lines=10, interactive=False)
 
97
  upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
98
  upload_btn = gr.Button("ارسال فایل")
99
 
 
 
 
100
  submit_btn.click(chat_with_doc, inputs=[query], outputs=[response])
101
  upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
 
102
 
103
  demo.launch()