MBilal-72's picture
Update app.py
09aa142 verified
raw
history blame
2.2 kB
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)