| import streamlit as st |
| from langchain.document_loaders import PyPDFLoader |
| from langchain.text_splitter import RecursiveCharacterTextSplitter |
| from langchain.vectorstores import Chroma |
| from langchain.embeddings import HuggingFaceEmbeddings |
| from langchain.chains import RetrievalQA |
| from langchain_google_genai import ChatGoogleGenerativeAI |
| import tempfile |
| import os |
| from dotenv import load_dotenv |
| from pydantic import SecretStr |
|
|
|
|
| load_dotenv() |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") |
|
|
| embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") |
|
|
| |
|
|
| st.title("π LangChain RAG Chatbot") |
|
|
| |
| if "chat_history" not in st.session_state: |
| st.session_state.chat_history = [] |
|
|
| if "qa_chain" not in st.session_state: |
| st.session_state.qa_chain = None |
|
|
| |
|
|
| st.subheader("Upload your PDF") |
| pdf_file = st.file_uploader("Upload", type="pdf") |
|
|
| if pdf_file is not None and st.session_state.qa_chain is None: |
| with st.spinner("π Processing document..."): |
| |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file: |
| tmp_file.write(pdf_file.read()) |
| tmp_path = tmp_file.name |
|
|
| |
| loader = PyPDFLoader(tmp_path) |
| documents = loader.load_and_split() |
|
|
| splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) |
| chunks = splitter.split_documents(documents) |
|
|
| |
| |
| vectordb = Chroma.from_documents( |
| chunks, embeddings, persist_directory="./chroma_db" |
| ) |
| retriever = vectordb.as_retriever() |
|
|
| |
| llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", api_key=SecretStr(GOOGLE_API_KEY) if GOOGLE_API_KEY else None) |
| qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever) |
|
|
| |
| st.session_state.qa_chain = qa_chain |
| st.success("β
Document processed and indexed!") |
|
|
| |
|
|
| if st.session_state.qa_chain: |
| st.subheader("π¬ Ask a question") |
|
|
| question = st.text_input("You:", key="user_input") |
|
|
| if question: |
| with st.spinner("π€ Generating answer..."): |
| answer = st.session_state.qa_chain.run(question) |
| st.session_state.chat_history.append({"user": question, "bot": answer}) |
|
|
| |
| for chat in st.session_state.chat_history: |
| st.markdown(f"π§ **You:** {chat['user']}") |
| st.markdown(f"π€ **Bot:** {chat['bot']}") |
|
|
| |
| if st.button("π Reset Chat"): |
| st.session_state.chat_history = [] |
| st.session_state.qa_chain = None |
| st.rerun() |
| else: |
| st.info("π Please upload a PDF to begin.") |
|
|