Upload 4 files
Browse files- app.py +104 -0
- htmltemplates.py +45 -0
- readme.md +2 -0
- requirement.txt +8 -0
app.py
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from dotenv import load_dotenv
|
3 |
+
from PyPDF2 import PdfReader
|
4 |
+
from langchain.text_splitter import CharacterTextSplitter
|
5 |
+
from langchain.embeddings import OpenAIEmbeddings, HuggingFaceInstructEmbeddings
|
6 |
+
from langchain.vectorstores import FAISS
|
7 |
+
from langchain.chat_models import ChatOpenAI
|
8 |
+
from langchain.memory import ConversationBufferMemory
|
9 |
+
from langchain.chains import ConversationalRetrievalChain
|
10 |
+
from htmlTemplates import css, bot_template, user_template
|
11 |
+
from langchain.llms import HuggingFaceHub
|
12 |
+
|
13 |
+
def get_pdf_text(pdf_docs):
|
14 |
+
text = ""
|
15 |
+
for pdf in pdf_docs:
|
16 |
+
pdf_reader = PdfReader(pdf)
|
17 |
+
for page in pdf_reader.pages:
|
18 |
+
text += page.extract_text()
|
19 |
+
return text
|
20 |
+
|
21 |
+
|
22 |
+
def get_text_chunks(text):
|
23 |
+
text_splitter = CharacterTextSplitter(
|
24 |
+
separator="\n",
|
25 |
+
chunk_size=1000,
|
26 |
+
chunk_overlap=200,
|
27 |
+
length_function=len
|
28 |
+
)
|
29 |
+
chunks = text_splitter.split_text(text)
|
30 |
+
return chunks
|
31 |
+
|
32 |
+
|
33 |
+
def get_vectorstore(text_chunks):
|
34 |
+
embeddings = OpenAIEmbeddings()
|
35 |
+
# embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl")
|
36 |
+
vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
|
37 |
+
return vectorstore
|
38 |
+
|
39 |
+
|
40 |
+
def get_conversation_chain(vectorstore):
|
41 |
+
llm = ChatOpenAI()
|
42 |
+
# llm = HuggingFaceHub(repo_id="google/flan-t5-xxl", model_kwargs={"temperature":0.5, "max_length":512})
|
43 |
+
|
44 |
+
memory = ConversationBufferMemory(
|
45 |
+
memory_key='chat_history', return_messages=True)
|
46 |
+
conversation_chain = ConversationalRetrievalChain.from_llm(
|
47 |
+
llm=llm,
|
48 |
+
retriever=vectorstore.as_retriever(),
|
49 |
+
memory=memory
|
50 |
+
)
|
51 |
+
return conversation_chain
|
52 |
+
|
53 |
+
|
54 |
+
def handle_userinput(user_question):
|
55 |
+
response = st.session_state.conversation({'question': user_question})
|
56 |
+
st.session_state.chat_history = response['chat_history']
|
57 |
+
|
58 |
+
for i, message in enumerate(st.session_state.chat_history):
|
59 |
+
if i % 2 == 0:
|
60 |
+
st.write(user_template.replace(
|
61 |
+
"{{MSG}}", message.content), unsafe_allow_html=True)
|
62 |
+
else:
|
63 |
+
st.write(bot_template.replace(
|
64 |
+
"{{MSG}}", message.content), unsafe_allow_html=True)
|
65 |
+
|
66 |
+
|
67 |
+
def main():
|
68 |
+
load_dotenv()
|
69 |
+
st.set_page_config(page_title="Chat with multiple PDFs",
|
70 |
+
page_icon=":books:")
|
71 |
+
st.write(css, unsafe_allow_html=True)
|
72 |
+
|
73 |
+
if "conversation" not in st.session_state:
|
74 |
+
st.session_state.conversation = None
|
75 |
+
if "chat_history" not in st.session_state:
|
76 |
+
st.session_state.chat_history = None
|
77 |
+
|
78 |
+
st.header("Chat with multiple PDFs :books:")
|
79 |
+
user_question = st.text_input("Ask a question about your documents:")
|
80 |
+
if user_question:
|
81 |
+
handle_userinput(user_question)
|
82 |
+
|
83 |
+
with st.sidebar:
|
84 |
+
st.subheader("Your documents")
|
85 |
+
pdf_docs = st.file_uploader(
|
86 |
+
"Upload your PDFs here and click on 'Process'", accept_multiple_files=True)
|
87 |
+
if st.button("Process"):
|
88 |
+
with st.spinner("Processing"):
|
89 |
+
# get pdf text
|
90 |
+
raw_text = get_pdf_text(pdf_docs)
|
91 |
+
|
92 |
+
# get the text chunks
|
93 |
+
text_chunks = get_text_chunks(raw_text)
|
94 |
+
|
95 |
+
# create vector store
|
96 |
+
vectorstore = get_vectorstore(text_chunks)
|
97 |
+
|
98 |
+
# create conversation chain
|
99 |
+
st.session_state.conversation = get_conversation_chain(
|
100 |
+
vectorstore)
|
101 |
+
|
102 |
+
|
103 |
+
if __name__ == '__main__':
|
104 |
+
main()
|
htmltemplates.py
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
css = '''
|
3 |
+
<style>
|
4 |
+
.chat-message {
|
5 |
+
padding: 1.5rem; border-radius: 0.5rem; margin-bottom: 1rem; display: flex
|
6 |
+
}
|
7 |
+
.chat-message.user {
|
8 |
+
background-color: #2b313e
|
9 |
+
}
|
10 |
+
.chat-message.bot {
|
11 |
+
background-color: #475063
|
12 |
+
}
|
13 |
+
.chat-message .avatar {
|
14 |
+
width: 20%;
|
15 |
+
}
|
16 |
+
.chat-message .avatar img {
|
17 |
+
max-width: 78px;
|
18 |
+
max-height: 78px;
|
19 |
+
border-radius: 50%;
|
20 |
+
object-fit: cover;
|
21 |
+
}
|
22 |
+
.chat-message .message {
|
23 |
+
width: 80%;
|
24 |
+
padding: 0 1.5rem;
|
25 |
+
color: #fff;
|
26 |
+
}
|
27 |
+
'''
|
28 |
+
|
29 |
+
bot_template = '''
|
30 |
+
<div class="chat-message bot">
|
31 |
+
<div class="avatar">
|
32 |
+
<img src="https://i.ibb.co/cN0nmSj/Screenshot-2023-05-28-at-02-37-21.png" style="max-height: 78px; max-width: 78px; border-radius: 50%; object-fit: cover;">
|
33 |
+
</div>
|
34 |
+
<div class="message">{{MSG}}</div>
|
35 |
+
</div>
|
36 |
+
'''
|
37 |
+
|
38 |
+
user_template = '''
|
39 |
+
<div class="chat-message user">
|
40 |
+
<div class="avatar">
|
41 |
+
<img src="https://i.ibb.co/rdZC7LZ/Photo-logo-1.png">
|
42 |
+
</div>
|
43 |
+
<div class="message">{{MSG}}</div>
|
44 |
+
</div>
|
45 |
+
'''
|
readme.md
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
he MultiPDF Chat App is a Python application that allows you to chat with multiple PDF documents. You can ask questions about the PDFs using natural language, and the application will provide relevant responses based on the content of the documents. This app utilizes a language model to generate accurate answers to your queries. Please note that the app will only respond to questions related to the loaded PDFs.
|
2 |
+
|
requirement.txt
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
langchain==0.0.184
|
2 |
+
PyPDF2==3.0.1
|
3 |
+
python-dotenv==1.0.0
|
4 |
+
streamlit==1.18.1
|
5 |
+
openai==0.27.6
|
6 |
+
faiss-cpu==1.7.4
|
7 |
+
altair==4
|
8 |
+
tiktoken==0.4.0
|