CoolFace
Apppublic

Brahmadev619/PDF_Question_and_Answer

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
app.py105 linesDownload Raw Back to root
1import os2 3import streamlit as st4from dotenv import load_dotenv5from PyPDF2 import PdfReader6from langchain.text_splitter import CharacterTextSplitter7from langchain_openai import OpenAIEmbeddings8from langchain.vectorstores import FAISS9# from langchain_community.vectorstores import FAISS10from langchain.embeddings import HuggingFaceEmbeddings11from langchain.memory import ConversationBufferMemory12from langchain.chains import ConversationalRetrievalChain13from langchain.chat_models import ChatOpenAI14from htmlTemplates import css, bot_template, user_template15from langchain.embeddings import HuggingFaceInstructEmbeddings16from langchain.llms import HuggingFaceHub17import os18def get_pdf_text(pdf_doc):19    text = ""20    for pdf in pdf_doc:21        pdf_reader = PdfReader(pdf)22        for page in pdf_reader.pages:23            text += page.extract_text()24    return text25 26 27def get_text_chunk(row_text):28    text_splitter = CharacterTextSplitter(29        separator="\n",30        chunk_size = 1000,31        chunk_overlap = 200,32        length_function = len33    )34    chunk = text_splitter.split_text(row_text)35    return chunk36 37 38def get_vectorstore(text_chunk):39    embeddings = OpenAIEmbeddings(openai_api_key = os.getenv("OPENAI_API_KEY"))40    # embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl")41    vector = FAISS.from_texts(text_chunk,embeddings)42    return vector43 44 45def get_conversation_chain(vectorstores):46    llm = ChatOpenAI(openai_api_key = os.getenv("OPENAI_API_KEY"))47    # llm = HuggingFaceHub(repo_id="google/flan-t5-base", model_kwargs={"temperature":0.5, "max_length":512})48    memory = ConversationBufferMemory(memory_key = "chat_history",return_messages = True)49    conversation_chain = ConversationalRetrievalChain.from_llm(llm=llm,50                                                               retriever=vectorstores.as_retriever(),51                                                               memory=memory)52    return conversation_chain53 54 55def user_input(user_question):56    response = st.session_state.conversation({"question":user_question})57    st.session_state.chat_history = response["chat_history"]58 59    for indx, msg in enumerate(st.session_state.chat_history):60        if indx % 2==0:61            st.write(user_template.replace("{{MSG}}",msg.content), unsafe_allow_html=True)62        else:63            st.write(bot_template.replace("{{MSG}}", msg.content), unsafe_allow_html=True)64 65 66 67def main():68    # load secret key69    load_dotenv()70    71    # config the pg72    st.set_page_config(page_title="Chat with multiple PDFs" ,page_icon=":books:")73    st.write(css, unsafe_allow_html=True)74    if "conversation" not in st.session_state:75        st.session_state.conversation = None76 77    st.header("Chat with multiple PDFs :books:")78    user_question = st.text_input("Ask a question about your docs")79    if user_question:80        user_input(user_question)81 82    # st.write(user_template.replace("{{MSG}}","Hello Robot"), unsafe_allow_html=True)83    # st.write(bot_template.replace("{{MSG}}","Hello Human"), unsafe_allow_html=True)84 85    # create side bar86    with st.sidebar:87        st.subheader("Your Documents")88        pdf_doc = st.file_uploader(label="Upload your documents",accept_multiple_files=True)89        if st.button("Process"):90            with st.spinner(text="Processing"):91 92            # get pdf text93                row_text = get_pdf_text(pdf_doc)94            # get the text chunk95                text_chunk = get_text_chunk(row_text)96                # st.write(text_chunk)97            # create vecor store98                vectorstores = get_vectorstore(text_chunk)99                # st.write(vectorstores)100            # create conversation chain101                st.session_state.conversation = get_conversation_chain(vectorstores)102 103 104if __name__ == "__main__":105    main()