RAG_PDF / app.py
shahed125238's picture
Upload app.py
3477355 verified
Raw History Blame Contribute Delete
2.97 kB
import streamlit as st
from pypdf import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.chains.question_answering import load_qa_chain
import google.generativeai as genai
# Configure Gemini API
api_key = st.secrets["GOOGLE_API_KEY"]
genai.configure(api_key=api_key)
# Streamlit page config
st.set_page_config(page_title="PDF RAG Chatbot")
st.header("📄 Chat with PDF using Gemini AI")
# Extract text from PDFs
def get_pdf_text(pdf_docs):
text = ""
for pdf in pdf_docs:
pdf_reader = PdfReader(pdf)
for page in pdf_reader.pages:
extracted = page.extract_text()
if extracted:
text += extracted
return text
# Split text into chunks
def get_text_chunks(text):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_text(text)
return chunks
# Create vector store
def get_vector_store(text_chunks):
embeddings = GoogleGenerativeAIEmbeddings(
model="models/embedding-001",
google_api_key=api_key
)
vector_store = FAISS.from_texts(
text_chunks,
embedding=embeddings
)
vector_store.save_local("faiss_index")
# Create QA chain
def get_conversational_chain():
model = ChatGoogleGenerativeAI(
model="gemini-1.5-flash",
temperature=0.3,
google_api_key=api_key
)
chain = load_qa_chain(
model,
chain_type="stuff"
)
return chain
# Handle user question
def user_input(user_question):
embeddings = GoogleGenerativeAIEmbeddings(
model="models/embedding-001",
google_api_key=api_key
)
new_db = FAISS.load_local(
"faiss_index",
embeddings,
allow_dangerous_deserialization=True
)
docs = new_db.similarity_search(user_question)
chain = get_conversational_chain()
response = chain(
{
"input_documents": docs,
"question": user_question
},
return_only_outputs=True
)
st.subheader("🤖 Answer")
st.write(response["output_text"])
# Sidebar for PDF upload
with st.sidebar:
st.title("📚 Upload Your PDF Files")
pdf_docs = st.file_uploader(
"Upload PDF Files",
accept_multiple_files=True
)
if st.button("Submit & Process"):
with st.spinner("Processing PDFs..."):
raw_text = get_pdf_text(pdf_docs)
text_chunks = get_text_chunks(raw_text)
get_vector_store(text_chunks)
st.success("PDF Processing Complete!")
# User question input
user_question = st.text_input(
"Ask a Question from the Uploaded PDF Files"
)
if user_question:
user_input(user_question)