Reza-galaxy21 commited on
Commit
fc7f76e
·
verified ·
1 Parent(s): b2064fc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -86
app.py CHANGED
@@ -1,103 +1,86 @@
1
  import os
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)
94
- submit_btn = gr.Button("ارسال سوال")
 
 
 
95
 
96
- file = gr.File(label="📎 آپلود فایل", file_types=[".pdf"])
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()
 
 
 
1
  import os
 
 
2
  import gradio as gr
3
+ import faiss
4
+ import pickle
5
+ import openai
6
+ from langchain.vectorstores import FAISS
7
+ from langchain.chains import RetrievalQA
8
+ from langchain.chat_models import ChatOpenAI
9
+ from langchain.schema import Document
10
+
11
+ # تنظیمات کلید API
12
+ openai.api_key = "sk-*****"
13
+
14
+ # مسیر دیتابیس برداری
15
+ DB_PATH = "/home/user/app/vector_database"
16
+
17
+ # مسیر فایل‌های آپلود شده
18
+ UPLOAD_DIR = "uploaded_files"
19
+ os.makedirs(UPLOAD_DIR, exist_ok=True)
20
+
21
+ # بارگذاری دیتابیس FAISS
22
+ def load_vector_database():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  try:
24
+ vector_db = FAISS.load_local(DB_PATH)
25
+ print("✅ دیتابیس FAISS بارگذاری شد.")
26
+ print(f"📄 تعداد اسناد ذخیره‌شده: {len(vector_db.index_to_docstore_id)}")
 
 
 
27
  return vector_db
28
  except Exception as e:
29
+ print("❌ خطا در بارگذاری دیتابیس:", str(e))
30
  return None
31
 
32
+ vector_db = load_vector_database()
 
 
33
 
34
+ # بررسی دیتابیس
35
+ if vector_db:
36
+ print(f"🔍 تعداد اسناد در دیتابیس: {len(vector_db.index_to_docstore_id)}")
37
+ else:
38
+ print("⚠️ دیتابیس برداری بارگذاری نشد!")
39
 
40
+ # تابع جستجو در دیتابیس
41
+ def search_documents(query):
42
+ if not vector_db:
43
+ return "❌ دیتابیس بارگذاری نشد!"
44
+
45
+ docs = vector_db.similarity_search(query, k=5)
46
  if not docs:
47
+ return "⚠️ هیچ سند مرتبطی یافت نشد."
48
+
49
+ print("🔍 نتایج جستجو:")
50
+ for i, doc in enumerate(docs):
51
+ print(f"{i+1}. {doc.page_content[:200]}") # نمایش ۲۰۰ کاراکتر اول هر سند
 
 
 
52
 
53
+ return docs
 
54
 
55
+ # تنظیم مدل LLM
56
+ llm = ChatOpenAI(model_name="gpt-4", openai_api_key=openai.api_key)
57
 
58
+ # تابع پاسخ به پرسش‌ها
59
+ def answer_question(query):
60
+ if not vector_db:
61
+ return "⚠️ دیتابیس بارگذاری نشده است!"
62
 
63
+ docs = search_documents(query)
64
+ if isinstance(docs, str): # اگر جستجو پیام خطا برگرداند
65
+ return docs
66
+
67
+ qa_chain = RetrievalQA.from_chain_type(llm, retriever=vector_db.as_retriever())
68
+ response = qa_chain.run(query)
69
 
70
+ print("📝 پاسخ مدل:", response)
71
+ return response
 
72
 
73
+ # ساخت رابط کاربری با Gradio
74
+ with gr.Blocks() as demo:
75
+ gr.Markdown("# 📄 ابزار تحلیل اسناد توزیع برق")
76
+
77
+ query_input = gr.Textbox(label="🔍 سوال خود را بپرسید")
78
+ submit_btn = gr.Button("📩 ارسال")
79
+
80
+ output_text = gr.Textbox(label="📝 پاسخ")
81
+
82
+ submit_btn.click(fn=answer_question, inputs=query_input, outputs=output_text)
83
 
84
+ # اجرای برنامه
85
+ if __name__ == "__main__":
86
+ demo.launch()