File size: 3,368 Bytes
9fe2e05 d287817 dc99e66 60c5e64 b2c45d8 217583a b2c45d8 324f762 217583a d287817 e3f5de5 d287817 324f762 8f34ab2 324f762 8f34ab2 324f762 8f34ab2 324f762 99ed84f 324f762 5606c57 b2c45d8 49a9882 324f762 d287817 b2c45d8 324f762 5985f75 d287817 9fe2e05 d287817 c9690b4 9fe2e05 d287817 9fe2e05 128e483 b2c45d8 128e483 d287817 b2c45d8 b8fecc5 b2c45d8 9fe2e05 128e483 f10d3cb 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 |
import streamlit as st
import time
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_together import TogetherEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.indexes import VectorstoreIndexCreator
@st.cache_resource
def load_chunks_and_embeddings():
with st.spinner("در حال بارگذاری فایل و آمادهسازی... لطفاً صبور باشید 🙏"):
progress_bar = st.progress(0, text="در حال بارگذاری فایل PDF...")
pdf_loader = PyPDFLoader('test1.pdf')
pages = pdf_loader.load()
progress_bar.progress(30, text="صفحات PDF بارگذاری شد. در حال ایجاد مدل برداری...")
embeddings = TogetherEmbeddings(
api_key="0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979"
)
progress_bar.progress(60, text="مدل Embedding ساخته شد. در حال ایجاد ایندکس...")
index = VectorstoreIndexCreator(
embedding=embeddings,
text_splitter=RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=0)
).from_loaders([pdf_loader])
progress_bar.progress(100, text="بارگذاری کامل شد! ✅")
return index
llm = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979',
model="meta-llama/Llama-3-70B-Instruct-Turbo-Free"
)
index = load_chunks_and_embeddings()
chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type='stuff',
retriever=index.vectorstore.as_retriever(), input_key='question')
# --- 💬 چت بات
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
st.title("📄🤖 دستیار PDF شما")
# نمایش تاریخچه گفتگو
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("سوالی از PDF داری؟")
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
|