Spaces:
Sleeping
Sleeping
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()
|