RAGify / app.py
bkbilal09's picture
Update app.py
efaa555 verified
import os
import faiss
import gradio as gr
from groq import Groq
from sentence_transformers import SentenceTransformer
from pypdf import PdfReader
# Use Hugging Face secret for API key
client = Groq(api_key=os.environ["GROQ_API_KEY"])
# Embedding model
embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Global FAISS index and chunks
index = None
chunks = []
# Chunking function
def chunk_text(text, chunk_size=200):
words = text.split()
return [" ".join(words[i:i+chunk_size]) for i in range(0, len(words), chunk_size)]
# Load and process uploaded file
def process_file(file):
global index, chunks
chunks = []
try:
if file.name.endswith(".pdf"):
reader = PdfReader(file.name)
for page in reader.pages:
text = page.extract_text()
if text:
chunks.extend(chunk_text(text))
else:
with open(file.name, "r", encoding="utf-8") as f:
text = f.read()
chunks.extend(chunk_text(text))
if not chunks:
return "โš ๏ธ No text found in file."
# Create embeddings
embeddings = embedder.encode(chunks)
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings)
return f"โœ… File processed successfully with {len(chunks)} chunks."
except Exception as e:
return f"โŒ Error processing file: {str(e)}"
# Retriever
def retrieve(query, k=3):
if index is None:
return ["โš ๏ธ No file uploaded yet."]
q_emb = embedder.encode([query])
D, I = index.search(q_emb, k)
return [chunks[i] for i in I[0]]
# RAG pipeline
def rag_pipeline(query):
retrieved = retrieve(query)
context = "\n".join(retrieved)
prompt = f"Answer the question using context:\n{context}\n\nQuestion: {query}\nAnswer:"
try:
response = client.chat.completions.create(
# โœ… Use a supported Groq model
model="llama-3.1-8b-instant",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
except Exception as e:
return f"โŒ Error generating answer: {str(e)}"
# Gradio UI with professional theme
with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="blue", secondary_hue="violet")) as demo:
gr.Markdown(
"""
# ๐ŸŒŸ RAGify Bilal
### Upload your document and ask smart questions
---
"""
)
with gr.Row():
with gr.Column(scale=1):
file_input = gr.File(label="๐Ÿ“‚ Upload PDF or Text File", file_types=[".pdf", ".txt"])
process_btn = gr.Button("๐Ÿš€ Process File")
status_output = gr.Textbox(label="Status", interactive=False)
with gr.Column(scale=2):
query_input = gr.Textbox(label="๐Ÿ’ฌ Ask a Question")
ask_btn = gr.Button("๐Ÿ” Get Answer")
answer_output = gr.Textbox(label="โœจ Answer", interactive=False)
process_btn.click(process_file, inputs=file_input, outputs=status_output)
ask_btn.click(rag_pipeline, inputs=query_input, outputs=answer_output)
demo.launch()