import os import streamlit as st from groq import Groq from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.text_splitter import CharacterTextSplitter from langchain.document_loaders import TextLoader, PyPDFLoader from langchain.chains import RetrievalQA from langchain.llms.base import LLM from tempfile import NamedTemporaryFile # Load Groq API key from environment variable GROQ_API_KEY = os.getenv("GROQ_API_KEY") # Initialize Groq client groq_client = Groq(api_key=GROQ_API_KEY) # Define a basic LLM wrapper for Groq class GroqLLM(LLM): def __init__(self, model_name="llama3-8b-8192"): self.model_name = model_name def _call(self, prompt, stop=None): response = groq_client.chat.completions.create( model=self.model_name, messages=[{"role": "user", "content": prompt}], ) return response.choices[0].message.content.strip() @property def _llm_type(self): return "groq_llm" # Streamlit UI st.title("📚 RAG App with Groq + HuggingFace + Streamlit") st.write("Upload a PDF or TXT file, ask a question, and get answers powered by RAG.") uploaded_file = st.file_uploader("Upload your document", type=["pdf", "txt"]) if uploaded_file: with NamedTemporaryFile(delete=False) as tmp_file: tmp_file.write(uploaded_file.read()) tmp_path = tmp_file.name # Load document if uploaded_file.type == "application/pdf": loader = PyPDFLoader(tmp_path) else: loader = TextLoader(tmp_path) docs = loader.load() # Split into chunks splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200) texts = splitter.split_documents(docs) # Create embeddings and FAISS index embeddings = HuggingFaceEmbeddings() db = FAISS.from_documents(texts, embeddings) # RAG chain retriever = db.as_retriever() qa_chain = RetrievalQA.from_chain_type(llm=GroqLLM(), retriever=retriever) # Input box query = st.text_input("Ask something about the document:") if query: result = qa_chain.run(query) st.markdown("### 🧠 Answer:") st.success(result)