Reza-galaxy21 commited on
Commit
029ed15
·
verified ·
1 Parent(s): 39d435e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -92
app.py CHANGED
@@ -1,110 +1,118 @@
1
  import os
2
- import shutil
3
- import logging
4
  import gradio as gr
5
- from langchain_community.document_loaders import PyPDFLoader
 
 
 
6
  from langchain_openai 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
- embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
22
- if os.path.exists(DATABASE_FILE):
23
- logger.info(f"✅ دیتابیس بارگذاری شد: {DATABASE_FILE}")
24
- return FAISS.load_local(DATABASE_FILE, embeddings)
25
- else:
26
- logger.warning(f"❌ دیتابیس وجود ندارد. ایجاد دیتابیس جدید...")
27
- return FAISS.from_texts([""], embeddings)
28
-
29
- def save_database(vector_db):
30
- vector_db.save_local(DATABASE_FILE)
31
- logger.info(f"✅ دیتابیس ذخیره شد: {DATABASE_FILE}")
32
-
33
- global_vector_db = load_database()
34
-
35
- # پردازش PDF و اضافه به دیتابیس
36
- def process_and_store_pdfs(file_paths):
37
- texts, metadata = [], []
38
- for file_path in file_paths:
39
- if file_path.endswith(".pdf"):
40
- loader = PyPDFLoader(file_path)
41
- documents = loader.load()
42
- for doc in documents:
43
- texts.append(doc.page_content)
44
- metadata.append({"source": file_path, "page": doc.metadata["page_number"]})
45
- logger.info(f"✅ پردازش {len(documents)} صفحه از {file_path}")
46
-
47
- if texts:
48
- embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
49
- vector_db = FAISS.from_texts(texts, embeddings, metadatas=metadata)
50
- return vector_db
51
- return None
52
-
53
- # پاسخ‌گویی با نمایش منبع
54
- def chat_with_doc(query):
55
- global global_vector_db
56
- if not global_vector_db:
57
- return "<p style='color:red;'>❌ لطفاً یک فایل مرتبط آپلود کنید.</p>"
58
-
59
- retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
60
- docs = retriever.get_relevant_documents(query)
61
-
62
- if not docs:
63
- return "<p style='color:red;'>هیچ اطلاعات مرتبطی یافت نشد.</p>"
64
-
65
- context = "\n\n".join([f"[صفحه {doc.metadata['page']}] {doc.page_content}" for doc in docs])
66
- sources = "\n".join([f"📄 صفحه {doc.metadata['page']} - {doc.metadata['source']}" for doc in docs])
67
-
68
- llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=os.getenv("My_huggingface_key"))
69
- prompt = f"متن زیر از اسناد بازیابی شده است و باید فقط از آن برای پاسخ به سوال استفاده شود:\n\n{context}\n\nسوال: {query}\n\nلطفاً به سوال بر اساس اطلاعات موجود پاسخ دهید و منابع را نادیده نگیرید."
70
- response = llm.predict(prompt)
71
-
72
- return f"""
73
- <div style='max-height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>
74
- <h3 style='color:blue;'>پاسخ:</h3>
75
- <p>{response}</p>
76
- <h4 style='color:green;'>📌 منابع:</h4>
77
- <pre>{sources}</pre>
78
- </div>
79
- """
80
-
81
- # ذخیره فایل و به‌روزرسانی دیتابیس
82
  def save_uploaded_file(file):
83
- file_name = os.path.basename(file)
84
- file_path = os.path.join(UPLOAD_FOLDER, file_name)
85
- shutil.copy(file, file_path)
86
-
87
- global global_vector_db
88
- new_vector_db = process_and_store_pdfs([file_path])
89
- if new_vector_db:
90
- global_vector_db = new_vector_db
91
- save_database(global_vector_db)
92
- return f"✅ فایل ذخیره شد و به دیتابیس اضافه شد: {file_path}"
93
- return " خطا در پردازش فایل."
94
-
95
- # رابط کاربری Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  with gr.Blocks() as demo:
97
- gr.Markdown("# 🏭 هوش مصنوعی همراه کارشناسان توزیع برق ایران")
98
 
99
- query = gr.Textbox(label="🔍 سوال خود را بپرسید", lines=2)
100
- response = gr.HTML()
101
- submit_btn = gr.Button("ارسال سوال")
102
 
103
- file = gr.File(label="📎 آپلود فایل", file_types=[".pdf"])
104
- upload_status = gr.Textbox(label="وضعیت آپلود", interactive=False)
105
- upload_btn = gr.Button("ارسال فایل")
106
 
107
- upload_btn.click(save_uploaded_file, inputs=[file], outputs=[upload_status])
108
- submit_btn.click(chat_with_doc, inputs=[query], outputs=[response])
109
 
110
- demo.launch()
 
 
 
 
1
  import os
 
 
2
  import gradio as gr
3
+ import logging
4
+ from langchain.vectorstores import FAISS
5
+ from langchain_community.storage import InMemoryDocstore
6
+ from langchain_community.docstore import Document
7
  from langchain_openai import OpenAIEmbeddings
8
+ from langchain.schema import Document as LangchainDocument
9
+ from langchain.chat_models import ChatOpenAI
10
 
11
  # تنظیمات لاگ‌گیری
12
  logging.basicConfig(level=logging.INFO)
13
  logger = logging.getLogger(__name__)
14
 
15
+ # مسیر دیتابیس برداری و پوشه آپلود
 
16
  DATABASE_FILE = "/home/user/app/vector_database"
17
+ UPLOAD_FOLDER = "/home/user/app/uploaded_files"
18
+
19
+ # ایجاد پوشه در صورت عدم وجود
20
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
21
 
22
+ # بارگذاری دیتابیس
23
  def load_database():
24
+ try:
25
+ if os.path.exists(DATABASE_FILE):
26
+ embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
27
+ vector_db = FAISS.load_local(DATABASE_FILE, embeddings)
28
+ logger.info(f"✅ دیتابیس بارگذاری شد: {DATABASE_FILE}")
29
+ return vector_db
30
+ else:
31
+ logger.warning(f"❌ دیتابیس در مسیر `{DATABASE_FILE}` وجود ندارد. ایجاد دیتابیس جدید...")
32
+
33
+ embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("My_huggingface_key"))
34
+ index = FAISS.new_index(embeddings)
35
+ docstore = InMemoryDocstore()
36
+ index_to_docstore_id = {}
37
+
38
+ return FAISS(index, docstore, index_to_docstore_id, embeddings)
39
+
40
+ except Exception as e:
41
+ logger.error(f"❌ خطا در بارگذاری دیتابیس: {e}")
42
+ return None
43
+
44
+ # ذخیره فایل و پردازش آن
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  def save_uploaded_file(file):
46
+ try:
47
+ if not file:
48
+ return "❌ فایلی انتخاب نشده است."
49
+
50
+ file_name = os.path.basename(file.name)
51
+ file_path = os.path.join(UPLOAD_FOLDER, file_name)
52
+
53
+ with open(file_path, "wb") as f:
54
+ f.write(file.read())
55
+
56
+ logger.info(f" فایل ذخیره شد: {file_path}")
57
+
58
+ global global_vector_db
59
+ new_vector_db = process_and_store_pdfs([file_path])
60
+ if new_vector_db:
61
+ global_vector_db = new_vector_db
62
+ save_database(global_vector_db)
63
+ return f"✅ فایل پردازش و ذخیره شد: {file_path}"
64
+ else:
65
+ return "❌ خطا در پردازش فایل."
66
+
67
+ except Exception as e:
68
+ logger.error(f"❌ خطا در ذخیره فایل: {e}")
69
+ return f"❌ خطایی رخ داد: {e}"
70
+
71
+ # دریافت پاسخ از دیتابیس
72
+ def chat_with_doc(query):
73
+ try:
74
+ global global_vector_db
75
+ if not global_vector_db:
76
+ return "❌ لطفاً یک فایل مرتبط آپلود کنید."
77
+
78
+ if not query.strip():
79
+ return "❌ لطفاً سوال خود را وارد کنید."
80
+
81
+ retriever = global_vector_db.as_retriever(search_kwargs={"k": 5})
82
+ docs = retriever.get_relevant_documents(query)
83
+
84
+ logger.info(f"📄 تعداد اسناد بازیابی شده: {len(docs)}")
85
+
86
+ context = "\n\n".join([f"📜 {doc.page_content[:500]}...\n🔗 **منبع:** {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}" for doc in docs])
87
+
88
+ if not context:
89
+ return "هیچ اطلاعات مرتبطی یافت نشد."
90
+
91
+ llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=os.getenv("My_huggingface_key"))
92
+
93
+ prompt = f"""### سوال: {query}\n\n**🔍 اطلاعات مرتبط:**\n{context}\n\n**🤖 پاسخ:**"""
94
+ response = llm.predict(prompt)
95
+
96
+ return f"**📢 پاسخ:**\n{response}\n\n**📚 منابع:**\n" + "\n".join([f"- {doc.metadata.get('source', 'نامشخص')}, صفحه {doc.metadata.get('page', 'نامشخص')}" for doc in docs])
97
+
98
+ except Exception as e:
99
+ logger.error(f"❌ خطا در پاسخ‌گویی: {e}")
100
+ return f"❌ خطایی رخ داده است: {e}"
101
+
102
+ # رابط کاربری با Gradio
103
  with gr.Blocks() as demo:
104
+ gr.Markdown("### 🎛 **ابزار تحلیل اسناد توزیع برق**")
105
 
106
+ upload_button = gr.File(label="آپلود فایل PDF", type="file")
107
+ upload_output = gr.Textbox(label="نتیجه آپلود", interactive=False)
 
108
 
109
+ query_input = gr.Textbox(label="سوال خود را وارد کنید")
110
+ response_output = gr.HTML(label="📢 پاسخ", interactive=False)
 
111
 
112
+ upload_button.change(save_uploaded_file, inputs=upload_button, outputs=upload_output)
113
+ query_input.submit(chat_with_doc, inputs=query_input, outputs=response_output)
114
 
115
+ # اجرای برنامه
116
+ if __name__ == "__main__":
117
+ global_vector_db = load_database()
118
+ demo.launch()