File size: 4,040 Bytes
1978d38
 
 
abf687b
4848ec4
c34cebc
4848ec4
 
 
1978d38
 
 
8ae6f96
c34cebc
 
 
 
 
 
1978d38
 
 
 
 
 
 
c34cebc
1978d38
 
8ae6f96
 
c34cebc
 
 
 
 
1978d38
 
c34cebc
b222d40
c34cebc
 
 
 
 
 
 
 
 
 
1978d38
 
c34cebc
 
 
 
 
 
 
 
 
 
 
 
 
 
1978d38
 
 
 
c34cebc
1978d38
c34cebc
1978d38
 
 
 
c34cebc
1978d38
 
 
 
c34cebc
1978d38
 
 
 
 
 
 
 
 
c34cebc
 
 
 
 
 
 
 
1978d38
 
 
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
import streamlit as st
from dotenv import load_dotenv
from PyPDF2 import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceInstructEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.llms import HuggingFaceHub
from htmltemplates import css, bot_template, user_template

def get_text_chunks(text):
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200,
            length_function=len
        )
        chunks = text_splitter.split_text(text)
        return chunks

def get_pdf_text(pdf_docs):
    text = ""
    for pdf in pdf_docs:
        pdf_reader = PdfReader(pdf)
        for page in pdf_reader.pages:
            text += page.extract_text()
    return text

def get_vectorstore(text_chunks):
    try:
        embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl")
        vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
        return vectorstore
    except Exception as e:
        st.error(f"Error in get_vectorstore: {e}")
        return None

def get_conversation_chain(vectorstore):
    try:
        llm = HuggingFaceHub(repo_id="google/flan-t5-xxl", model_kwargs={"temperature": 0.8, "max_length": 512})
        memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
        conversation_chain = ConversationalRetrievalChain.from_llm(
            llm=llm,
            retriever=vectorstore.as_retriever(),
            memory=memory
        )
        return conversation_chain
    except Exception as e:
        st.error(f"Error in get_conversation_chain: {e}")
        return None

def handle_userinput(user_question):
    if st.session_state.conversation:
        try:
            response = st.session_state.conversation({"question": user_question})
            st.session_state.chat_history = response["chat_history"]

            for i, message in enumerate(st.session_state.chat_history):
                if i % 2 == 0:
                    st.write(user_template.replace("{{MSG}}", message["content"]), unsafe_allow_html=True)
                else:
                    st.write(bot_template.replace("{{MSG}}", message["content"]), unsafe_allow_html=True)
        except Exception as e:
            st.error(f"Error in handle_userinput: {e}")
    else:
        st.error("Conversation chain is not initialized. Please upload and process documents first.")

def main():
    load_dotenv()
    st.set_page_config(page_title="Chat with your PDFs", page_icon=":books:")

    st.write(css, unsafe_allow_html=True)

    if "conversation" not in st.session_state:
        st.session_state.conversation = None
    if "chat_history" not in st.session_state:
        st.session_state.chat_history = []

    st.header("Chat with your PDFs :books:")
    user_question = st.text_input("Ask a question about your documents:")
    if user_question:
        handle_userinput(user_question)

    with st.sidebar:
        st.subheader("Your Documents")
        pdf_docs = st.file_uploader("Upload your PDFs here", accept_multiple_files=True)
        if st.button("Enter"):
            with st.spinner("Processing"):
                # Get PDF text
                raw_text = get_pdf_text(pdf_docs)
                # Get text chunks
                text_chunks = get_text_chunks(raw_text)
                if text_chunks:
                    # Create vector store
                    vectorstore = get_vectorstore(text_chunks)
                    if vectorstore:
                        # Initialize conversation chain
                        st.session_state.conversation = get_conversation_chain(vectorstore)
                        if st.session_state.conversation:
                            st.success("Conversation chain initialized successfully.")

if __name__ == "__main__":
    main()