File size: 4,247 Bytes
9fe2e05 dc99e66 b2c45d8 217583a b2c45d8 217583a b2c45d8 e3f5de5 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 8f34ab2 b2c45d8 886079d b2c45d8 49a9882 b2c45d8 5606c57 b2c45d8 49a9882 b2c45d8 5985f75 b2c45d8 9fe2e05 b2c45d8 c9690b4 9fe2e05 b2c45d8 9fe2e05 128e483 b2c45d8 128e483 b2c45d8 b8fecc5 b2c45d8 9fe2e05 128e483 f10d3cb b2c45d8 b8fecc5 128e483 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import streamlit as st
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import TogetherEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
import time
# --------------------------------------------
# 1. بارگذاری پی دی اف و ساخت امبدینگ چانکها (فقط یکبار و کش شده)
# --------------------------------------------
@st.cache_resource
def get_chunks_and_embeddings():
pdf_loader = PyPDFLoader('test1.pdf')
pages = pdf_loader.load_and_split(RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=0))
chunk_texts = [page.page_content for page in pages]
embeddings_model = TogetherEmbeddings(
api_key="0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979"
)
return chunk_texts, embeddings_model
# کش شده
chunk_texts, embeddings_model = get_chunks_and_embeddings()
# --------------------------------------------
# 2. ساختن امبدینگ چانکها با پروگرس بار
# --------------------------------------------
st.title("📄 Chat with your PDF (با پیدیاف خودت حرف بزن!)")
st.subheader("در حال آمادهسازی امبدینگ چانکها...")
progress_bar = st.progress(0)
all_embeddings = []
batch_size = 128
for i in range(0, len(chunk_texts), batch_size):
batch = chunk_texts[i:i+batch_size]
embedded = embeddings_model.embed_documents(batch)
all_embeddings.extend(embedded)
progress_bar.progress(min((i + batch_size) / len(chunk_texts), 1.0))
st.success("✅ همه چانکها آماده شدند!")
# --------------------------------------------
# 3. ساختن ایندکس FAISS از امبدینگها
# --------------------------------------------
vectorstore = FAISS.from_embeddings(all_embeddings, chunk_texts)
# --------------------------------------------
# 4. آماده سازی مدل LLM و چین
# --------------------------------------------
llm = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979',
model="meta-llama/Llama-3-70B-Instruct-Turbo-Free"
)
chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type='stuff',
retriever=vectorstore.as_retriever(search_kwargs={"k": 10}),
input_key='question'
)
# --------------------------------------------
# 5. چت بات Streamlit
# --------------------------------------------
if 'messages' not in st.session_state:
st.session_state.messages = []
if 'pending_prompt' not in st.session_state:
st.session_state.pending_prompt = None
# نمایش پیامهای قبلی
for msg in st.session_state.messages:
with st.chat_message(msg['role']):
st.markdown(f"🗨️ {msg['content']}", unsafe_allow_html=True)
# دریافت ورودی از کاربر
prompt = st.chat_input("چطور میتونم کمکت کنم؟")
if prompt:
st.session_state.messages.append({'role': 'user', 'content': prompt})
st.session_state.pending_prompt = prompt
st.rerun()
if st.session_state.pending_prompt:
with st.chat_message('ai'):
thinking = st.empty()
thinking.markdown("🤖 در حال فکر کردن...")
# اجرای جستجو در ایندکس برای پاسخ
response = chain.run(f"فقط به زبان فارسی پاسخ بده. سوال: {st.session_state.pending_prompt}")
answer = response.split("Helpful Answer:")[-1].strip()
if not answer:
answer = "متأسفم، اطلاعات دقیقی در این مورد ندارم."
thinking.empty()
full_response = ""
placeholder = st.empty()
# نمایش پاسخ به صورت تایپی
for word in answer.split():
full_response += word + " "
placeholder.markdown(full_response + "▌")
time.sleep(0.03)
placeholder.markdown(full_response)
st.session_state.messages.append({'role': 'ai', 'content': full_response})
st.session_state.pending_prompt = None
|