Download app.py from shahed125238/RAG_PDF: direct link, hf CLI and curl.
- Browser
- Download file 2.97 kB
-
https://huggingface.co/shahed125238/RAG_PDF/resolve/main/app.py
- Command line
-
hf download hf://shahed125238/RAG_PDF/app.py
-
curl -L -o app.py https://huggingface.co/shahed125238/RAG_PDF/resolve/main/app.py
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) | |