File size: 2,755 Bytes
6c14dd8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import os
from dotenv import load_dotenv
from PyPDF2 import PdfReader
from langchain_mistralai.chat_models import ChatMistralAI
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from htmltemp import css, botTemp, userTemp

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

def get_chunks(rawtxt):
    splitter=CharacterTextSplitter(
        separator="\n",
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks=splitter.split_text(rawtxt)
    return chunks

def get_vectorstore(chunks):
    openai_api_key = os.environ.get('OPENAI_API_KEY')
    embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key) 
    vectors=FAISS.from_texts(texts=chunks,embedding=embeddings)
    return vectors

def get_convo_chain(vector):
    llm = ChatMistralAI()  # Use ChatMistralAI instead of ChatOpenAI
    memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
    convo_chain = ConversationalRetrievalChain.from_llm(
        llm=llm,
        retriever=vector.as_retriever(),
        memory=memory
    )
    return convo_chain

def handle_inp(inp):
    response=st.session_state.conversation({'question':inp})
    st.session_state.chat_history= response['chat_history']

    for i, msg in enumerate(st.session_state.chat_history):
        if i%2==0:
            st.write(userTemp.replace("{{MSG}}",msg.content),unsafe_allow_html=True)
        else:
            st.write(botTemp.replace("{{MSG}}",msg.content),unsafe_allow_html=True)


def main():
    load_dotenv()
    st.set_page_config(page_title="PDF Chat", 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=None

    st.header("PDF Chat :books:")
    inp= st.text_input("Ask a question about the PDF:")
    if inp:
        handle_inp(inp)

    with st.sidebar:
        st.subheader("Your PDFs")
        docs=st.file_uploader("Upload your PDFs here",accept_multiple_files=True)
        if st.button("Upload"):
            with st.spinner("Processing"):
                rawtxt=get_text(docs)
                chunks=get_chunks(rawtxt)
                vectors=get_vectorstore(chunks)
                st.session_state.conversation=get_convo_chain(vectors)

if __name__ == "__main__":
    main()