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