M17idd commited on
Commit
d287817
·
verified ·
1 Parent(s): 60c5e64

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -44
app.py CHANGED
@@ -1,85 +1,84 @@
1
  import streamlit as st
 
2
  from langchain.document_loaders import PyPDFLoader
3
  from langchain.text_splitter import RecursiveCharacterTextSplitter
4
  from langchain_together import TogetherEmbeddings
5
  from langchain.vectorstores import FAISS
6
  from langchain.chat_models import ChatOpenAI
7
  from langchain.chains import RetrievalQA
8
- import time
9
 
10
- # --------------------------------------------
11
- # 1. بارگذاری پی دی اف و ساخت امبدینگ چانک‌ها (فقط یکبار و کش شده)
12
- # --------------------------------------------
 
 
 
 
 
 
13
  @st.cache_resource
14
- def get_chunks_and_embeddings():
15
  pdf_loader = PyPDFLoader('test1.pdf')
16
- pages = pdf_loader.load_and_split(RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=0))
17
- chunk_texts = [page.page_content for page in pages]
 
18
 
19
- embeddings_model = TogetherEmbeddings(
20
  api_key="0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979"
21
  )
22
- return chunk_texts, embeddings_model
23
-
24
- # کش شده
25
- chunk_texts, embeddings_model = get_chunks_and_embeddings()
26
 
27
- # --------------------------------------------
28
- # 2. ساختن امبدینگ چانک‌ها با پروگرس بار
29
- # --------------------------------------------
30
- st.title("📄 Chat with your PDF (با پی‌دی‌اف خودت حرف بزن!)")
31
- st.subheader("در حال آماده‌سازی امبدینگ چانک‌ها...")
32
 
33
- progress_bar = st.progress(0)
34
- all_embeddings = []
35
- batch_size = 128
 
 
36
 
37
- for i in range(0, len(chunk_texts), batch_size):
38
- batch = chunk_texts[i:i+batch_size]
39
- embedded = embeddings_model.embed_documents(batch)
40
- all_embeddings.extend(embedded)
41
 
42
- progress_bar.progress(min((i + batch_size) / len(chunk_texts), 1.0))
 
43
 
44
- st.success("✅ همه چانک‌ها آماده شدند!")
 
 
45
 
46
- # --------------------------------------------
47
- # 3. ساختن ایندکس FAISS از امبدینگ‌ها
48
- # --------------------------------------------
49
- vectorstore = FAISS.from_embeddings(all_embeddings, chunk_texts)
50
-
51
- # --------------------------------------------
52
- # 4. آماده سازی مدل LLM و چین
53
- # --------------------------------------------
54
  llm = ChatOpenAI(
55
  base_url="https://api.together.xyz/v1",
56
  api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979',
57
  model="meta-llama/Llama-3-70B-Instruct-Turbo-Free"
58
  )
59
 
 
 
60
  chain = RetrievalQA.from_chain_type(
61
  llm=llm,
62
  chain_type='stuff',
63
- retriever=vectorstore.as_retriever(search_kwargs={"k": 10}),
64
  input_key='question'
65
  )
66
 
67
- # --------------------------------------------
68
- # 5. چت بات Streamlit
69
- # --------------------------------------------
70
  if 'messages' not in st.session_state:
71
  st.session_state.messages = []
72
 
73
  if 'pending_prompt' not in st.session_state:
74
  st.session_state.pending_prompt = None
75
 
76
- # نمایش پیام‌های قبلی
 
 
77
  for msg in st.session_state.messages:
78
  with st.chat_message(msg['role']):
79
  st.markdown(f"🗨️ {msg['content']}", unsafe_allow_html=True)
80
 
81
- # دریافت ورودی از کاربر
82
- prompt = st.chat_input("چطور میتونم کمکت کنم؟")
83
 
84
  if prompt:
85
  st.session_state.messages.append({'role': 'user', 'content': prompt})
@@ -91,8 +90,8 @@ if st.session_state.pending_prompt:
91
  thinking = st.empty()
92
  thinking.markdown("🤖 در حال فکر کردن...")
93
 
94
- # اجرای جستجو در ایندکس برای پاسخ
95
- response = chain.run(f"فقط به زبان فارسی پاسخ بده. سوال: {st.session_state.pending_prompt}")
96
  answer = response.split("Helpful Answer:")[-1].strip()
97
  if not answer:
98
  answer = "متأسفم، اطلاعات دقیقی در این مورد ندارم."
@@ -101,7 +100,6 @@ if st.session_state.pending_prompt:
101
  full_response = ""
102
  placeholder = st.empty()
103
 
104
- # نمایش پاسخ به صورت تایپی
105
  for word in answer.split():
106
  full_response += word + " "
107
  placeholder.markdown(full_response + "▌")
 
1
  import streamlit as st
2
+ import time
3
  from langchain.document_loaders import PyPDFLoader
4
  from langchain.text_splitter import RecursiveCharacterTextSplitter
5
  from langchain_together import TogetherEmbeddings
6
  from langchain.vectorstores import FAISS
7
  from langchain.chat_models import ChatOpenAI
8
  from langchain.chains import RetrievalQA
 
9
 
10
+ # --- 📄 ساخت امبدینگ‌ها با batch 50 تایی
11
+ def batch_embed(texts, embeddings_model, batch_size=50):
12
+ all_embeddings = []
13
+ for i in range(0, len(texts), batch_size):
14
+ batch = texts[i:i+batch_size]
15
+ embs = embeddings_model.embed_documents([doc.page_content for doc in batch])
16
+ all_embeddings.extend(embs)
17
+ return all_embeddings
18
+
19
  @st.cache_resource
20
+ def load_chunks_and_embeddings():
21
  pdf_loader = PyPDFLoader('test1.pdf')
22
+ pages = pdf_loader.load()
23
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=0)
24
+ docs = text_splitter.split_documents(pages)
25
 
26
+ embeddings = TogetherEmbeddings(
27
  api_key="0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979"
28
  )
29
+
30
+ vectorstore = FAISS.from_documents([], embedding=embeddings) # اول خالی
 
 
31
 
32
+ # پروگرس بار
33
+ progress = st.progress(0, text="🔄 در حال پردازش چانک‌ها...")
34
+ total = len(docs)
 
 
35
 
36
+ batch_size = 50
37
+ for i in range(0, total, batch_size):
38
+ batch_docs = docs[i:i+batch_size]
39
+ embeddings_batch = embeddings.embed_documents([doc.page_content for doc in batch_docs])
40
+ vectorstore.add_embeddings(embeddings_batch, batch_docs)
41
 
42
+ progress.progress(min((i+batch_size)/total, 1.0))
 
 
 
43
 
44
+ progress.empty()
45
+ return vectorstore
46
 
47
+ # --- 🛠️ آماده کردن دیتابیس
48
+ with st.spinner("📚 در حال بارگذاری فایل و ساخت امبدینگ‌ها... لطفا صبور باشید"):
49
+ vectorstore = load_chunks_and_embeddings()
50
 
51
+ # --- 🤖 آماده سازی مدل LLM
 
 
 
 
 
 
 
52
  llm = ChatOpenAI(
53
  base_url="https://api.together.xyz/v1",
54
  api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979',
55
  model="meta-llama/Llama-3-70B-Instruct-Turbo-Free"
56
  )
57
 
58
+ retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 10})
59
+
60
  chain = RetrievalQA.from_chain_type(
61
  llm=llm,
62
  chain_type='stuff',
63
+ retriever=retriever,
64
  input_key='question'
65
  )
66
 
67
+ # --- 💬 چت بات
 
 
68
  if 'messages' not in st.session_state:
69
  st.session_state.messages = []
70
 
71
  if 'pending_prompt' not in st.session_state:
72
  st.session_state.pending_prompt = None
73
 
74
+ st.title("📄🤖 دستیار PDF شما")
75
+
76
+ # نمایش تاریخچه گفتگو
77
  for msg in st.session_state.messages:
78
  with st.chat_message(msg['role']):
79
  st.markdown(f"🗨️ {msg['content']}", unsafe_allow_html=True)
80
 
81
+ prompt = st.chat_input("سوالی از PDF داری؟")
 
82
 
83
  if prompt:
84
  st.session_state.messages.append({'role': 'user', 'content': prompt})
 
90
  thinking = st.empty()
91
  thinking.markdown("🤖 در حال فکر کردن...")
92
 
93
+ # اجرای جستجو در ایندکس
94
+ response = chain.run(f'فقط به زبان فارسی جواب بده. سوال: {st.session_state.pending_prompt}')
95
  answer = response.split("Helpful Answer:")[-1].strip()
96
  if not answer:
97
  answer = "متأسفم، اطلاعات دقیقی در این مورد ندارم."
 
100
  full_response = ""
101
  placeholder = st.empty()
102
 
 
103
  for word in answer.split():
104
  full_response += word + " "
105
  placeholder.markdown(full_response + "▌")