SimpleRAGLLM / app.py
Harsh4334632's picture
Update app.py
3a58f65 verified
raw
history blame
4.45 kB
import gradio as gr
from huggingface_hub import InferenceClient
from typing import List, Tuple
import fitz # PyMuPDF
from sentence_transformers import SentenceTransformer, util
import numpy as np
import faiss
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
# Placeholder for the app's state
class MyApp:
def __init__(self) -> None:
self.documents = []
self.embeddings = None
self.index = None
self.load_pdf("THEDIA1.pdf")
self.build_vector_db()
def load_pdf(self, file_path: str) -> None:
"""Extracts text from a PDF file and stores it in the app's documents."""
doc = fitz.open(file_path)
self.documents = []
for page_num in range(len(doc)):
page = doc[page_num]
text = page.get_text()
self.documents.append({"page": page_num + 1, "content": text})
print("PDF processed successfully!")
def build_vector_db(self) -> None:
"""Builds a vector database using the content of the PDF."""
model = SentenceTransformer('all-MiniLM-L6-v2')
self.embeddings = model.encode([doc["content"] for doc in self.documents])
self.index = faiss.IndexFlatL2(self.embeddings.shape[1])
self.index.add(np.array(self.embeddings))
print("Vector database built successfully!")
def search_documents(self, query: str, k: int = 3) -> List[str]:
"""Searches for relevant documents using vector similarity."""
model = SentenceTransformer('all-MiniLM-L6-v2')
query_embedding = model.encode([query])
D, I = self.index.search(np.array(query_embedding), k)
results = [self.documents[i]["content"] for i in I[0]]
return results if results else ["No relevant documents found."]
app = MyApp()
def respond(
message: str,
history: List[Tuple[str, str]],
system_message: str,
max_tokens: int,
temperature: float,
top_p: float,
):
system_message = "Welcome! As a painter bot, your role is to provide artistic inspiration and practical advice on painting techniques. Remember to engage users warmly, offering tips on color mixing, brush strokes, and different painting styles. Keep responses clear, concise, and encouraging, catering to both beginners and experienced artists. Share insights on composition, perspective, and the emotional impact of colors in art. Emphasize the importance of experimentation and personal expression in painting. Let's inspire creativity and enhance artistic skills together!"
messages = [{"role": "system", "content": system_message}]
for val in history:
if val[0]:
messages.append({"role": "user", "content": val[0]})
if val[1]:
messages.append({"role": "assistant", "content": val[1]})
messages.append({"role": "user", "content": message})
# RAG - Retrieve relevant documents
retrieved_docs = app.search_documents(message)
context = "\n".join(retrieved_docs)
messages.append({"role": "system", "content": "Relevant documents: " + context})
response = ""
for message in client.chat_completion(
messages,
max_tokens=100,
stream=True,
temperature=0.98,
top_p=0.7,
):
token = message.choices[0].delta.content
response += token
yield response
demo = gr.Blocks()
with demo:
gr.Markdown(
"‼️Disclaimer: This chatbot is based on a HOP book that is publicly available. and just to test RAG implementation.‼️"
)
chatbot = gr.ChatInterface(
respond,
examples=[
["What are some essential techniques for blending colors in acrylic painting?"],
["Can you recommend a beginner-friendly tutorial for learning oil painting?"],
["How can I achieve realistic textures like wood or glass in my watercolor paintings?"],
["What are the best practices for choosing a color palette for a landscape painting?"],
["Could you explain the process of creating depth and perspective in a painting?"],
["What are some innovative ways to use mixed media in abstract art?"],
["How do I protect and preserve my paintings for long-term display?"],
["What are some tips for overcoming artist's block and finding inspiration for new paintings?"]
],
title='Painter'
)
if __name__ == "__main__":
demo.launch()