Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
from langchain_community.vectorstores import FAISS | |
from langchain.embeddings import HuggingFaceEmbeddings | |
from langchain.document_loaders import PyPDFLoader | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.chains import RetrievalQA | |
from langchain.chat_models import ChatGroq | |
from tempfile import NamedTemporaryFile | |
# Load Groq API Key securely (for Hugging Face secrets) | |
os.environ["GROQ_API_KEY"] = os.getenv("GROQ_API_KEY") | |
# Helper to process uploaded PDFs and build vectorstore | |
def process_pdfs(files): | |
all_docs = [] | |
for file in files: | |
with NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file: | |
temp_file.write(file.read()) | |
loader = PyPDFLoader(temp_file.name) | |
all_docs.extend(loader.load()) | |
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
chunks = splitter.split_documents(all_docs) | |
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") | |
vectorstore = FAISS.from_documents(chunks, embeddings) | |
retriever = vectorstore.as_retriever() | |
llm = ChatGroq(model_name="llama3-70b-8192", temperature=0) | |
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever) | |
return qa_chain | |
# Global chain (reset with new uploads) | |
qa_chain = None | |
# Upload + Process PDFs | |
def upload_pdfs(files): | |
global qa_chain | |
qa_chain = process_pdfs(files) | |
return "β PDFs uploaded and processed. Now ask your questions." | |
# Ask a question | |
def ask_question(query): | |
if qa_chain is None: | |
return "β Please upload Kaggle notebooks/competition PDFs first." | |
result = qa_chain.run(query) | |
return result | |
# Gradio UI | |
upload = gr.File(file_types=[".pdf"], file_count="multiple", label="Upload Kaggle PDFs") | |
btn_upload = gr.Button("Process PDFs") | |
question = gr.Textbox(label="Ask a question about uploaded notebooks") | |
answer = gr.Textbox(label="Assistant Answer") | |
with gr.Blocks() as app: | |
gr.Markdown("## π€ Kaggle Study Assistant\nUpload PDFs from Kaggle and ask intelligent questions.") | |
upload_output = gr.Textbox(visible=True) | |
btn_upload.click(fn=upload_pdfs, inputs=upload, outputs=upload_output) | |
question.submit(fn=ask_question, inputs=question, outputs=answer) | |
app.launch() | |