AskMyPDF / app.py
Ayesha003's picture
Update app.py
8f028b5 verified
import streamlit as st
import os
import faiss
import pickle
import time
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from dotenv import load_dotenv
from groq import Groq
# Load environment variables
load_dotenv()
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
# Initialize Groq client
client = Groq(api_key=GROQ_API_KEY)
# Streamlit UI
def main():
st.set_page_config(page_title="AskMyPdf", layout="wide")
st.title("📄 AskMyPdf - AI-Powered PDF Q&A")
# Sidebar
with st.sidebar:
st.header("How to Use")
st.markdown("1️⃣ Upload a PDF document")
st.markdown("2️⃣ Ask any question related to the document")
st.markdown("3️⃣ Get AI-powered answers instantly! 📌")
st.subheader("Settings")
theme = st.radio("Choose Theme:", ["Light", "Dark"], index=0)
st.subheader("Language")
language = st.selectbox("Select Language", ["English", "French", "Spanish", "German"], index=0)
st.subheader("Upload your PDF")
uploaded_file = st.file_uploader("Choose a PDF file", type=["pdf"])
if uploaded_file is not None:
st.success(f"Uploaded: {uploaded_file.name}")
# Save the uploaded file locally
file_path = os.path.join("temp_files", uploaded_file.name)
os.makedirs("temp_files", exist_ok=True) # Ensure the directory exists
with open(file_path, "wb") as f:
f.write(uploaded_file.getbuffer())
# Verify that the file exists before processing
if not os.path.exists(file_path):
st.error("Error: File was not saved properly. Please try again.")
return
# Progress Bar
progress_bar = st.progress(0)
with st.spinner("Processing your document..."):
time.sleep(1) # Simulating file processing
try:
loader = PyPDFLoader(file_path) # Pass the correct file path
documents = loader.load()
progress_bar.progress(25)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
progress_bar.progress(50)
embeddings = HuggingFaceEmbeddings()
vector_db = FAISS.from_documents(docs, embeddings)
progress_bar.progress(75)
faiss.write_index(vector_db.index, "faiss_index")
progress_bar.progress(100)
st.success("Document processed successfully!")
except Exception as e:
st.error(f"Error processing document: {e}")
return
st.subheader("Ask a Question")
query = st.text_input("Enter your question")
if st.button("Get Answer") and query:
with st.spinner("Generating response..."):
try:
docs = vector_db.similarity_search(query, k=5)
context = "\n".join([doc.page_content for doc in docs])
chat_completion = client.chat.completions.create(
messages=[{"role": "user", "content": context + "\n" + query}],
model="llama-3.3-70b-versatile",
)
response = chat_completion.choices[0].message.content
st.markdown("### Answer")
st.write(response)
except Exception as e:
st.error(f"Error generating response: {e}")
if __name__ == "__main__":
main()