rehanafzal commited on
Commit
f9d8be7
·
verified ·
1 Parent(s): b5957dd

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +94 -0
app.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from groq import Groq
3
+ from langchain_community.embeddings import HuggingFaceEmbeddings
4
+ from langchain_community.vectorstores import FAISS
5
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
6
+ from PyPDF2 import PdfReader
7
+ import streamlit as st
8
+ from tempfile import NamedTemporaryFile
9
+
10
+ # Initialize Groq client
11
+ client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
12
+
13
+ # Function to extract text from a PDF
14
+ def extract_text_from_pdf(pdf_file_path):
15
+ pdf_reader = PdfReader(pdf_file_path)
16
+ text = ""
17
+ for page in pdf_reader.pages:
18
+ text += page.extract_text()
19
+ return text
20
+
21
+ # Function to split text into chunks
22
+ def chunk_text(text, chunk_size=500, chunk_overlap=50):
23
+ text_splitter = RecursiveCharacterTextSplitter(
24
+ chunk_size=chunk_size, chunk_overlap=chunk_overlap
25
+ )
26
+ return text_splitter.split_text(text)
27
+
28
+ # Function to create embeddings and store them in FAISS
29
+ def create_embeddings_and_store(chunks):
30
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
31
+ vector_db = FAISS.from_texts(chunks, embedding=embeddings)
32
+ return vector_db
33
+
34
+ # Function to query the vector database and interact with Groq
35
+ def query_vector_db(query, vector_db):
36
+ # Retrieve relevant documents
37
+ docs = vector_db.similarity_search(query, k=3)
38
+ context = "\n".join([doc.page_content for doc in docs])
39
+
40
+ # Interact with Groq API
41
+ chat_completion = client.chat.completions.create(
42
+ messages=[
43
+ {"role": "system", "content": f"Use the following context:\n{context}"},
44
+ {"role": "user", "content": query},
45
+ ],
46
+ model="llama3-8b-8192",
47
+ )
48
+ return chat_completion.choices[0].message.content
49
+
50
+ # Streamlit app
51
+ st.title("Interactive PDF Reader and Chat")
52
+
53
+ # Upload PDF
54
+ uploaded_file = st.file_uploader("Upload a PDF document", type=["pdf"])
55
+
56
+ if uploaded_file:
57
+ with NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file:
58
+ temp_file.write(uploaded_file.read())
59
+ pdf_path = temp_file.name
60
+
61
+ # Extract text, chunk it, and create embeddings
62
+ text = extract_text_from_pdf(pdf_path)
63
+ chunks = chunk_text(text)
64
+ vector_db = create_embeddings_and_store(chunks)
65
+
66
+ # State management for the chat
67
+ if "chat_history" not in st.session_state:
68
+ st.session_state.chat_history = []
69
+
70
+ # Display chat history
71
+ for i, chat in enumerate(st.session_state.chat_history):
72
+ st.write(f"**Query {i+1}:** {chat['query']}")
73
+ st.write(f"**Response:** {chat['response']}")
74
+ st.write("---")
75
+
76
+ # Add new query input dynamically
77
+ if "query_count" not in st.session_state:
78
+ st.session_state.query_count = 1
79
+
80
+ query_key = f"query_{st.session_state.query_count}"
81
+ user_query = st.text_input(f"Enter Query {st.session_state.query_count}:", key=query_key)
82
+
83
+ if user_query:
84
+ # Generate response
85
+ response = query_vector_db(user_query, vector_db)
86
+
87
+ # Append query and response to the chat history
88
+ st.session_state.chat_history.append({"query": user_query, "response": response})
89
+
90
+ # Increment query count for the next input box
91
+ st.session_state.query_count += 1
92
+
93
+ # Rerun to show the updated UI
94
+ st.experimental_rerun()